1/* 2 * noVNC: HTML5 VNC client 3 * Copyright (C) 2011 Joel Martin 4 * Licensed under LGPL-2 or any later version (see LICENSE.txt) 5 */ 6 7/*jslint browser: true, white: false, bitwise: false */ 8/*global window, Util */ 9 10 11// 12// Keyboard event handler 13// 14 15function Keyboard(defaults) { 16"use strict"; 17 18var that = {}, // Public API methods 19 conf = {}, // Configuration attributes 20 21 keyDownList = []; // List of depressed keys 22 // (even if they are happy) 23 24// Configuration attributes 25Util.conf_defaults(conf, that, defaults, [ 26 ['target', 'wo', 'dom', document, 'DOM element that captures keyboard input'], 27 ['focused', 'rw', 'bool', true, 'Capture and send key events'], 28 29 ['onKeyPress', 'rw', 'func', null, 'Handler for key press/release'] 30 ]); 31 32 33// 34// Private functions 35// 36 37// From the event keyCode return the keysym value for keys that need 38// to be suppressed otherwise they may trigger unintended browser 39// actions 40function getKeysymSpecial(evt) { 41 var keysym = null; 42 43 switch ( evt.keyCode ) { 44 // These generate a keyDown and keyPress in Firefox and Opera 45 case 8 : keysym = 0xFF08; break; // BACKSPACE 46 case 13 : keysym = 0xFF0D; break; // ENTER 47 48 // This generates a keyDown and keyPress in Opera 49 case 9 : keysym = 0xFF09; break; // TAB 50 default : break; 51 } 52 53 if (evt.type === 'keydown') { 54 switch ( evt.keyCode ) { 55 case 27 : keysym = 0xFF1B; break; // ESCAPE 56 case 46 : keysym = 0xFFFF; break; // DELETE 57 58 case 36 : keysym = 0xFF50; break; // HOME 59 case 35 : keysym = 0xFF57; break; // END 60 case 33 : keysym = 0xFF55; break; // PAGE_UP 61 case 34 : keysym = 0xFF56; break; // PAGE_DOWN 62 case 45 : keysym = 0xFF63; break; // INSERT 63 // '-' during keyPress 64 case 37 : keysym = 0xFF51; break; // LEFT 65 case 38 : keysym = 0xFF52; break; // UP 66 case 39 : keysym = 0xFF53; break; // RIGHT 67 case 40 : keysym = 0xFF54; break; // DOWN 68 case 16 : keysym = 0xFFE1; break; // SHIFT 69 case 17 : keysym = 0xFFE3; break; // CONTROL 70 //case 18 : keysym = 0xFFE7; break; // Left Meta (Mac Option) 71 case 18 : keysym = 0xFFE9; break; // Left ALT (Mac Command) 72 73 case 112 : keysym = 0xFFBE; break; // F1 74 case 113 : keysym = 0xFFBF; break; // F2 75 case 114 : keysym = 0xFFC0; break; // F3 76 case 115 : keysym = 0xFFC1; break; // F4 77 case 116 : keysym = 0xFFC2; break; // F5 78 case 117 : keysym = 0xFFC3; break; // F6 79 case 118 : keysym = 0xFFC4; break; // F7 80 case 119 : keysym = 0xFFC5; break; // F8 81 case 120 : keysym = 0xFFC6; break; // F9 82 case 121 : keysym = 0xFFC7; break; // F10 83 case 122 : keysym = 0xFFC8; break; // F11 84 case 123 : keysym = 0xFFC9; break; // F12 85 86 default : break; 87 } 88 } 89 90 if ((!keysym) && (evt.ctrlKey || evt.altKey)) { 91 if ((typeof(evt.which) !== "undefined") && (evt.which > 0)) { 92 keysym = evt.which; 93 } else { 94 // IE9 always 95 // Firefox and Opera when ctrl/alt + special 96 Util.Warn("which not set, using keyCode"); 97 keysym = evt.keyCode; 98 } 99 100 /* Remap symbols */ 101 switch (keysym) { 102 case 186 : keysym = 59; break; // ; (IE) 103 case 187 : keysym = 61; break; // = (IE) 104 case 188 : keysym = 44; break; // , (Mozilla, IE) 105 case 109 : // - (Mozilla, Opera) 106 if (Util.Engine.gecko || Util.Engine.presto) { 107 keysym = 45; } 108 break; 109 case 189 : keysym = 45; break; // - (IE) 110 case 190 : keysym = 46; break; // . (Mozilla, IE) 111 case 191 : keysym = 47; break; // / (Mozilla, IE) 112 case 192 : keysym = 96; break; // ` (Mozilla, IE) 113 case 219 : keysym = 91; break; // [ (Mozilla, IE) 114 case 220 : keysym = 92; break; // \ (Mozilla, IE) 115 case 221 : keysym = 93; break; // ] (Mozilla, IE) 116 case 222 : keysym = 39; break; // ' (Mozilla, IE) 117 } 118 119 /* Remap shifted and unshifted keys */ 120 if (!!evt.shiftKey) { 121 switch (keysym) { 122 case 48 : keysym = 41 ; break; // ) (shifted 0) 123 case 49 : keysym = 33 ; break; // ! (shifted 1) 124 case 50 : keysym = 64 ; break; // @ (shifted 2) 125 case 51 : keysym = 35 ; break; // # (shifted 3) 126 case 52 : keysym = 36 ; break; // $ (shifted 4) 127 case 53 : keysym = 37 ; break; // % (shifted 5) 128 case 54 : keysym = 94 ; break; // ^ (shifted 6) 129 case 55 : keysym = 38 ; break; // & (shifted 7) 130 case 56 : keysym = 42 ; break; // * (shifted 8) 131 case 57 : keysym = 40 ; break; // ( (shifted 9) 132 133 case 59 : keysym = 58 ; break; // : (shifted `) 134 case 61 : keysym = 43 ; break; // + (shifted ;) 135 case 44 : keysym = 60 ; break; // < (shifted ,) 136 case 45 : keysym = 95 ; break; // _ (shifted -) 137 case 46 : keysym = 62 ; break; // > (shifted .) 138 case 47 : keysym = 63 ; break; // ? (shifted /) 139 case 96 : keysym = 126; break; // ~ (shifted `) 140 case 91 : keysym = 123; break; // { (shifted [) 141 case 92 : keysym = 124; break; // | (shifted \) 142 case 93 : keysym = 125; break; // } (shifted ]) 143 case 39 : keysym = 34 ; break; // " (shifted ') 144 } 145 } else if ((keysym >= 65) && (keysym <=90)) { 146 /* Remap unshifted A-Z */ 147 keysym += 32; 148 } else if (evt.keyLocation === 3) { 149 // numpad keys 150 switch (keysym) { 151 case 96 : keysym = 48; break; // 0 152 case 97 : keysym = 49; break; // 1 153 case 98 : keysym = 50; break; // 2 154 case 99 : keysym = 51; break; // 3 155 case 100: keysym = 52; break; // 4 156 case 101: keysym = 53; break; // 5 157 case 102: keysym = 54; break; // 6 158 case 103: keysym = 55; break; // 7 159 case 104: keysym = 56; break; // 8 160 case 105: keysym = 57; break; // 9 161 case 109: keysym = 45; break; // - 162 case 110: keysym = 46; break; // . 163 case 111: keysym = 47; break; // / 164 } 165 } 166 } 167 168 return keysym; 169} 170 171/* Translate DOM keyPress event to keysym value */ 172function getKeysym(evt) { 173 var keysym, msg; 174 175 if (typeof(evt.which) !== "undefined") { 176 // WebKit, Firefox, Opera 177 keysym = evt.which; 178 } else { 179 // IE9 180 Util.Warn("which not set, using keyCode"); 181 keysym = evt.keyCode; 182 } 183 184 if ((keysym > 255) && (keysym < 0xFF00)) { 185 msg = "Mapping character code " + keysym; 186 // Map Unicode outside Latin 1 to X11 keysyms 187 keysym = unicodeTable[keysym]; 188 if (typeof(keysym) === 'undefined') { 189 keysym = 0; 190 } 191 Util.Debug(msg + " to " + keysym); 192 } 193 194 return keysym; 195} 196 197function show_keyDownList(kind) { 198 var c; 199 var msg = "keyDownList (" + kind + "):\n"; 200 for (c = 0; c < keyDownList.length; c++) { 201 msg = msg + " " + c + " - keyCode: " + keyDownList[c].keyCode + 202 " - which: " + keyDownList[c].which + "\n"; 203 } 204 Util.Debug(msg); 205} 206 207function copyKeyEvent(evt) { 208 var members = ['type', 'keyCode', 'charCode', 'which', 209 'altKey', 'ctrlKey', 'shiftKey', 210 'keyLocation', 'keyIdentifier'], i, obj = {}; 211 for (i = 0; i < members.length; i++) { 212 if (typeof(evt[members[i]]) !== "undefined") { 213 obj[members[i]] = evt[members[i]]; 214 } 215 } 216 return obj; 217} 218 219function pushKeyEvent(fevt) { 220 keyDownList.push(fevt); 221} 222 223function getKeyEvent(keyCode, pop) { 224 var i, fevt = null; 225 for (i = keyDownList.length-1; i >= 0; i--) { 226 if (keyDownList[i].keyCode === keyCode) { 227 if ((typeof(pop) !== "undefined") && (pop)) { 228 fevt = keyDownList.splice(i, 1)[0]; 229 } else { 230 fevt = keyDownList[i]; 231 } 232 break; 233 } 234 } 235 return fevt; 236} 237 238function ignoreKeyEvent(evt) { 239 // Blarg. Some keys have a different keyCode on keyDown vs keyUp 240 if (evt.keyCode === 229) { 241 // French AZERTY keyboard dead key. 242 // Lame thing is that the respective keyUp is 219 so we can't 243 // properly ignore the keyUp event 244 return true; 245 } 246 return false; 247} 248 249 250// 251// Key Event Handling: 252// 253// There are several challenges when dealing with key events: 254// - The meaning and use of keyCode, charCode and which depends on 255// both the browser and the event type (keyDown/Up vs keyPress). 256// - We cannot automatically determine the keyboard layout 257// - The keyDown and keyUp events have a keyCode value that has not 258// been translated by modifier keys. 259// - The keyPress event has a translated (for layout and modifiers) 260// character code but the attribute containing it differs. keyCode 261// contains the translated value in WebKit (Chrome/Safari), Opera 262// 11 and IE9. charCode contains the value in WebKit and Firefox. 263// The which attribute contains the value on WebKit, Firefox and 264// Opera 11. 265// - The keyDown/Up keyCode value indicates (sort of) the physical 266// key was pressed but only for standard US layout. On a US 267// keyboard, the '-' and '_' characters are on the same key and 268// generate a keyCode value of 189. But on an AZERTY keyboard even 269// though they are different physical keys they both still 270// generate a keyCode of 189! 271// - To prevent a key event from propagating to the browser and 272// causing unwanted default actions (such as closing a tab, 273// opening a menu, shifting focus, etc) we must suppress this 274// event in both keyDown and keyPress because not all key strokes 275// generate on a keyPress event. Also, in WebKit and IE9 276// suppressing the keyDown prevents a keyPress but other browsers 277// still generated a keyPress even if keyDown is suppressed. 278// 279// For safe key events, we wait until the keyPress event before 280// reporting a key down event. For unsafe key events, we report a key 281// down event when the keyDown event fires and we suppress any further 282// actions (including keyPress). 283// 284// In order to report a key up event that matches what we reported 285// for the key down event, we keep a list of keys that are currently 286// down. When the keyDown event happens, we add the key event to the 287// list. If it is a safe key event, then we update the which attribute 288// in the most recent item on the list when we received a keyPress 289// event (keyPress should immediately follow keyDown). When we 290// received a keyUp event we search for the event on the list with 291// a matching keyCode and we report the character code using the value 292// in the 'which' attribute that was stored with that key. 293// 294 295function onKeyDown(e) { 296 if (! conf.focused) { 297 return true; 298 } 299 var fevt = null, evt = (e ? e : window.event), 300 keysym = null, suppress = false; 301 //Util.Debug("onKeyDown kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which); 302 303 fevt = copyKeyEvent(evt); 304 305 keysym = getKeysymSpecial(evt); 306 // Save keysym decoding for use in keyUp 307 fevt.keysym = keysym; 308 if (keysym) { 309 // If it is a key or key combination that might trigger 310 // browser behaviors or it has no corresponding keyPress 311 // event, then send it immediately 312 if (conf.onKeyPress && !ignoreKeyEvent(evt)) { 313 Util.Debug("onKeyPress down, keysym: " + keysym + 314 " (onKeyDown key: " + evt.keyCode + 315 ", which: " + evt.which + ")"); 316 conf.onKeyPress(keysym, 1, evt); 317 } 318 suppress = true; 319 } 320 321 if (! ignoreKeyEvent(evt)) { 322 // Add it to the list of depressed keys 323 pushKeyEvent(fevt); 324 //show_keyDownList('down'); 325 } 326 327 if (suppress) { 328 // Suppress bubbling/default actions 329 Util.stopEvent(e); 330 return false; 331 } else { 332 // Allow the event to bubble and become a keyPress event which 333 // will have the character code translated 334 return true; 335 } 336} 337 338function onKeyPress(e) { 339 if (! conf.focused) { 340 return true; 341 } 342 var evt = (e ? e : window.event), 343 kdlen = keyDownList.length, keysym = null; 344 //Util.Debug("onKeyPress kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which); 345 346 if (((evt.which !== "undefined") && (evt.which === 0)) || 347 (getKeysymSpecial(evt))) { 348 // Firefox and Opera generate a keyPress event even if keyDown 349 // is suppressed. But the keys we want to suppress will have 350 // either: 351 // - the which attribute set to 0 352 // - getKeysymSpecial() will identify it 353 Util.Debug("Ignoring special key in keyPress"); 354 Util.stopEvent(e); 355 return false; 356 } 357 358 keysym = getKeysym(evt); 359 360 // Modify the the which attribute in the depressed keys list so 361 // that the keyUp event will be able to have the character code 362 // translation available. 363 if (kdlen > 0) { 364 keyDownList[kdlen-1].keysym = keysym; 365 } else { 366 Util.Warn("keyDownList empty when keyPress triggered"); 367 } 368 369 //show_keyDownList('press'); 370 371 // Send the translated keysym 372 if (conf.onKeyPress && (keysym > 0)) { 373 Util.Debug("onKeyPress down, keysym: " + keysym + 374 " (onKeyPress key: " + evt.keyCode + 375 ", which: " + evt.which + ")"); 376 conf.onKeyPress(keysym, 1, evt); 377 } 378 379 // Stop keypress events just in case 380 Util.stopEvent(e); 381 return false; 382} 383 384function onKeyUp(e) { 385 if (! conf.focused) { 386 return true; 387 } 388 var fevt = null, evt = (e ? e : window.event), keysym; 389 //Util.Debug("onKeyUp kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which); 390 391 fevt = getKeyEvent(evt.keyCode, true); 392 393 if (fevt) { 394 keysym = fevt.keysym; 395 } else { 396 Util.Warn("Key event (keyCode = " + evt.keyCode + 397 ") not found on keyDownList"); 398 keysym = 0; 399 } 400 401 //show_keyDownList('up'); 402 403 if (conf.onKeyPress && (keysym > 0)) { 404 //Util.Debug("keyPress up, keysym: " + keysym + 405 // " (key: " + evt.keyCode + ", which: " + evt.which + ")"); 406 Util.Debug("onKeyPress up, keysym: " + keysym + 407 " (onKeyPress key: " + evt.keyCode + 408 ", which: " + evt.which + ")"); 409 conf.onKeyPress(keysym, 0, evt); 410 } 411 Util.stopEvent(e); 412 return false; 413} 414 415function allKeysUp() { 416 Util.Debug(">> Keyboard.allKeysUp"); 417 if (keyDownList.length > 0) { 418 Util.Info("Releasing pressed/down keys"); 419 } 420 var i, keysym, fevt = null; 421 for (i = keyDownList.length-1; i >= 0; i--) { 422 fevt = keyDownList.splice(i, 1)[0]; 423 keysym = fevt.keysym; 424 if (conf.onKeyPress && (keysym > 0)) { 425 Util.Debug("allKeysUp, keysym: " + keysym + 426 " (keyCode: " + fevt.keyCode + 427 ", which: " + fevt.which + ")"); 428 conf.onKeyPress(keysym, 0, fevt); 429 } 430 } 431 Util.Debug("<< Keyboard.allKeysUp"); 432 return; 433} 434 435// 436// Public API interface functions 437// 438 439that.grab = function() { 440 //Util.Debug(">> Keyboard.grab"); 441 var c = conf.target; 442 443 Util.addEvent(c, 'keydown', onKeyDown); 444 Util.addEvent(c, 'keyup', onKeyUp); 445 Util.addEvent(c, 'keypress', onKeyPress); 446 447 // Release (key up) if window loses focus 448 Util.addEvent(window, 'blur', allKeysUp); 449 450 //Util.Debug("<< Keyboard.grab"); 451}; 452 453that.ungrab = function() { 454 //Util.Debug(">> Keyboard.ungrab"); 455 var c = conf.target; 456 457 Util.removeEvent(c, 'keydown', onKeyDown); 458 Util.removeEvent(c, 'keyup', onKeyUp); 459 Util.removeEvent(c, 'keypress', onKeyPress); 460 Util.removeEvent(window, 'blur', allKeysUp); 461 462 // Release (key up) all keys that are in a down state 463 allKeysUp(); 464 465 //Util.Debug(">> Keyboard.ungrab"); 466}; 467 468return that; // Return the public API interface 469 470} // End of Keyboard() 471 472 473// 474// Mouse event handler 475// 476 477function Mouse(defaults) { 478"use strict"; 479 480var that = {}, // Public API methods 481 conf = {}; // Configuration attributes 482 483// Configuration attributes 484Util.conf_defaults(conf, that, defaults, [ 485 ['target', 'ro', 'dom', document, 'DOM element that captures mouse input'], 486 ['focused', 'rw', 'bool', true, 'Capture and send mouse clicks/movement'], 487 ['scale', 'rw', 'float', 1.0, 'Viewport scale factor 0.0 - 1.0'], 488 489 ['onMouseButton', 'rw', 'func', null, 'Handler for mouse button click/release'], 490 ['onMouseMove', 'rw', 'func', null, 'Handler for mouse movement'], 491 ['touchButton', 'rw', 'int', 1, 'Button mask (1, 2, 4) for touch devices (0 means ignore clicks)'] 492 ]); 493 494 495// 496// Private functions 497// 498 499function onMouseButton(e, down) { 500 var evt, pos, bmask; 501 if (! conf.focused) { 502 return true; 503 } 504 evt = (e ? e : window.event); 505 pos = Util.getEventPosition(e, conf.target, conf.scale); 506 if (e.touches || e.changedTouches) { 507 // Touch device 508 bmask = conf.touchButton; 509 // If bmask is set 510 } else if (evt.which) { 511 /* everything except IE */ 512 bmask = 1 << evt.button; 513 } else { 514 /* IE including 9 */ 515 bmask = (evt.button & 0x1) + // Left 516 (evt.button & 0x2) * 2 + // Right 517 (evt.button & 0x4) / 2; // Middle 518 } 519 //Util.Debug("mouse " + pos.x + "," + pos.y + " down: " + down + 520 // " bmask: " + bmask + "(evt.button: " + evt.button + ")"); 521 if (bmask > 0 && conf.onMouseButton) { 522 Util.Debug("onMouseButton " + (down ? "down" : "up") + 523 ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask); 524 conf.onMouseButton(pos.x, pos.y, down, bmask); 525 } 526 Util.stopEvent(e); 527 return false; 528} 529 530function onMouseDown(e) { 531 onMouseButton(e, 1); 532} 533 534function onMouseUp(e) { 535 onMouseButton(e, 0); 536} 537 538function onMouseWheel(e) { 539 var evt, pos, bmask, wheelData; 540 if (! conf.focused) { 541 return true; 542 } 543 evt = (e ? e : window.event); 544 pos = Util.getEventPosition(e, conf.target, conf.scale); 545 wheelData = evt.detail ? evt.detail * -1 : evt.wheelDelta / 40; 546 if (wheelData > 0) { 547 bmask = 1 << 3; 548 } else { 549 bmask = 1 << 4; 550 } 551 //Util.Debug('mouse scroll by ' + wheelData + ':' + pos.x + "," + pos.y); 552 if (conf.onMouseButton) { 553 conf.onMouseButton(pos.x, pos.y, 1, bmask); 554 conf.onMouseButton(pos.x, pos.y, 0, bmask); 555 } 556 Util.stopEvent(e); 557 return false; 558} 559 560function onMouseMove(e) { 561 var evt, pos; 562 if (! conf.focused) { 563 return true; 564 } 565 evt = (e ? e : window.event); 566 pos = Util.getEventPosition(e, conf.target, conf.scale); 567 //Util.Debug('mouse ' + evt.which + '/' + evt.button + ' up:' + pos.x + "," + pos.y); 568 if (conf.onMouseMove) { 569 conf.onMouseMove(pos.x, pos.y); 570 } 571 Util.stopEvent(e); 572 return false; 573} 574 575function onMouseDisable(e) { 576 var evt, pos; 577 if (! conf.focused) { 578 return true; 579 } 580 evt = (e ? e : window.event); 581 pos = Util.getEventPosition(e, conf.target, conf.scale); 582 /* Stop propagation if inside canvas area */ 583 if ((pos.x >= 0) && (pos.y >= 0) && 584 (pos.x < conf.target.offsetWidth) && 585 (pos.y < conf.target.offsetHeight)) { 586 //Util.Debug("mouse event disabled"); 587 Util.stopEvent(e); 588 return false; 589 } 590 //Util.Debug("mouse event not disabled"); 591 return true; 592} 593 594// 595// Public API interface functions 596// 597 598that.grab = function() { 599 //Util.Debug(">> Mouse.grab"); 600 var c = conf.target; 601 602 if ('ontouchstart' in document.documentElement) { 603 Util.addEvent(c, 'touchstart', onMouseDown); 604 Util.addEvent(c, 'touchend', onMouseUp); 605 Util.addEvent(c, 'touchmove', onMouseMove); 606 } else { 607 Util.addEvent(c, 'mousedown', onMouseDown); 608 Util.addEvent(c, 'mouseup', onMouseUp); 609 Util.addEvent(c, 'mousemove', onMouseMove); 610 Util.addEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel', 611 onMouseWheel); 612 } 613 614 /* Work around right and middle click browser behaviors */ 615 Util.addEvent(document, 'click', onMouseDisable); 616 Util.addEvent(document.body, 'contextmenu', onMouseDisable); 617 618 //Util.Debug("<< Mouse.grab"); 619}; 620 621that.ungrab = function() { 622 //Util.Debug(">> Mouse.ungrab"); 623 var c = conf.target; 624 625 if ('ontouchstart' in document.documentElement) { 626 Util.removeEvent(c, 'touchstart', onMouseDown); 627 Util.removeEvent(c, 'touchend', onMouseUp); 628 Util.removeEvent(c, 'touchmove', onMouseMove); 629 } else { 630 Util.removeEvent(c, 'mousedown', onMouseDown); 631 Util.removeEvent(c, 'mouseup', onMouseUp); 632 Util.removeEvent(c, 'mousemove', onMouseMove); 633 Util.removeEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel', 634 onMouseWheel); 635 } 636 637 /* Work around right and middle click browser behaviors */ 638 Util.removeEvent(document, 'click', onMouseDisable); 639 Util.removeEvent(document.body, 'contextmenu', onMouseDisable); 640 641 //Util.Debug(">> Mouse.ungrab"); 642}; 643 644return that; // Return the public API interface 645 646} // End of Mouse() 647 648 649/* 650 * Browser keypress to X11 keysym for Unicode characters > U+00FF 651 */ 652unicodeTable = { 653 0x0104 : 0x01a1, 654 0x02D8 : 0x01a2, 655 0x0141 : 0x01a3, 656 0x013D : 0x01a5, 657 0x015A : 0x01a6, 658 0x0160 : 0x01a9, 659 0x015E : 0x01aa, 660 0x0164 : 0x01ab, 661 0x0179 : 0x01ac, 662 0x017D : 0x01ae, 663 0x017B : 0x01af, 664 0x0105 : 0x01b1, 665 0x02DB : 0x01b2, 666 0x0142 : 0x01b3, 667 0x013E : 0x01b5, 668 0x015B : 0x01b6, 669 0x02C7 : 0x01b7, 670 0x0161 : 0x01b9, 671 0x015F : 0x01ba, 672 0x0165 : 0x01bb, 673 0x017A : 0x01bc, 674 0x02DD : 0x01bd, 675 0x017E : 0x01be, 676 0x017C : 0x01bf, 677 0x0154 : 0x01c0, 678 0x0102 : 0x01c3, 679 0x0139 : 0x01c5, 680 0x0106 : 0x01c6, 681 0x010C : 0x01c8, 682 0x0118 : 0x01ca, 683 0x011A : 0x01cc, 684 0x010E : 0x01cf, 685 0x0110 : 0x01d0, 686 0x0143 : 0x01d1, 687 0x0147 : 0x01d2, 688 0x0150 : 0x01d5, 689 0x0158 : 0x01d8, 690 0x016E : 0x01d9, 691 0x0170 : 0x01db, 692 0x0162 : 0x01de, 693 0x0155 : 0x01e0, 694 0x0103 : 0x01e3, 695 0x013A : 0x01e5, 696 0x0107 : 0x01e6, 697 0x010D : 0x01e8, 698 0x0119 : 0x01ea, 699 0x011B : 0x01ec, 700 0x010F : 0x01ef, 701 0x0111 : 0x01f0, 702 0x0144 : 0x01f1, 703 0x0148 : 0x01f2, 704 0x0151 : 0x01f5, 705 0x0171 : 0x01fb, 706 0x0159 : 0x01f8, 707 0x016F : 0x01f9, 708 0x0163 : 0x01fe, 709 0x02D9 : 0x01ff, 710 0x0126 : 0x02a1, 711 0x0124 : 0x02a6, 712 0x0130 : 0x02a9, 713 0x011E : 0x02ab, 714 0x0134 : 0x02ac, 715 0x0127 : 0x02b1, 716 0x0125 : 0x02b6, 717 0x0131 : 0x02b9, 718 0x011F : 0x02bb, 719 0x0135 : 0x02bc, 720 0x010A : 0x02c5, 721 0x0108 : 0x02c6, 722 0x0120 : 0x02d5, 723 0x011C : 0x02d8, 724 0x016C : 0x02dd, 725 0x015C : 0x02de, 726 0x010B : 0x02e5, 727 0x0109 : 0x02e6, 728 0x0121 : 0x02f5, 729 0x011D : 0x02f8, 730 0x016D : 0x02fd, 731 0x015D : 0x02fe, 732 0x0138 : 0x03a2, 733 0x0156 : 0x03a3, 734 0x0128 : 0x03a5, 735 0x013B : 0x03a6, 736 0x0112 : 0x03aa, 737 0x0122 : 0x03ab, 738 0x0166 : 0x03ac, 739 0x0157 : 0x03b3, 740 0x0129 : 0x03b5, 741 0x013C : 0x03b6, 742 0x0113 : 0x03ba, 743 0x0123 : 0x03bb, 744 0x0167 : 0x03bc, 745 0x014A : 0x03bd, 746 0x014B : 0x03bf, 747 0x0100 : 0x03c0, 748 0x012E : 0x03c7, 749 0x0116 : 0x03cc, 750 0x012A : 0x03cf, 751 0x0145 : 0x03d1, 752 0x014C : 0x03d2, 753 0x0136 : 0x03d3, 754 0x0172 : 0x03d9, 755 0x0168 : 0x03dd, 756 0x016A : 0x03de, 757 0x0101 : 0x03e0, 758 0x012F : 0x03e7, 759 0x0117 : 0x03ec, 760 0x012B : 0x03ef, 761 0x0146 : 0x03f1, 762 0x014D : 0x03f2, 763 0x0137 : 0x03f3, 764 0x0173 : 0x03f9, 765 0x0169 : 0x03fd, 766 0x016B : 0x03fe, 767 0x1E02 : 0x1001e02, 768 0x1E03 : 0x1001e03, 769 0x1E0A : 0x1001e0a, 770 0x1E80 : 0x1001e80, 771 0x1E82 : 0x1001e82, 772 0x1E0B : 0x1001e0b, 773 0x1EF2 : 0x1001ef2, 774 0x1E1E : 0x1001e1e, 775 0x1E1F : 0x1001e1f, 776 0x1E40 : 0x1001e40, 777 0x1E41 : 0x1001e41, 778 0x1E56 : 0x1001e56, 779 0x1E81 : 0x1001e81, 780 0x1E57 : 0x1001e57, 781 0x1E83 : 0x1001e83, 782 0x1E60 : 0x1001e60, 783 0x1EF3 : 0x1001ef3, 784 0x1E84 : 0x1001e84, 785 0x1E85 : 0x1001e85, 786 0x1E61 : 0x1001e61, 787 0x0174 : 0x1000174, 788 0x1E6A : 0x1001e6a, 789 0x0176 : 0x1000176, 790 0x0175 : 0x1000175, 791 0x1E6B : 0x1001e6b, 792 0x0177 : 0x1000177, 793 0x0152 : 0x13bc, 794 0x0153 : 0x13bd, 795 0x0178 : 0x13be, 796 0x203E : 0x047e, 797 0x3002 : 0x04a1, 798 0x300C : 0x04a2, 799 0x300D : 0x04a3, 800 0x3001 : 0x04a4, 801 0x30FB : 0x04a5, 802 0x30F2 : 0x04a6, 803 0x30A1 : 0x04a7, 804 0x30A3 : 0x04a8, 805 0x30A5 : 0x04a9, 806 0x30A7 : 0x04aa, 807 0x30A9 : 0x04ab, 808 0x30E3 : 0x04ac, 809 0x30E5 : 0x04ad, 810 0x30E7 : 0x04ae, 811 0x30C3 : 0x04af, 812 0x30FC : 0x04b0, 813 0x30A2 : 0x04b1, 814 0x30A4 : 0x04b2, 815 0x30A6 : 0x04b3, 816 0x30A8 : 0x04b4, 817 0x30AA : 0x04b5, 818 0x30AB : 0x04b6, 819 0x30AD : 0x04b7, 820 0x30AF : 0x04b8, 821 0x30B1 : 0x04b9, 822 0x30B3 : 0x04ba, 823 0x30B5 : 0x04bb, 824 0x30B7 : 0x04bc, 825 0x30B9 : 0x04bd, 826 0x30BB : 0x04be, 827 0x30BD : 0x04bf, 828 0x30BF : 0x04c0, 829 0x30C1 : 0x04c1, 830 0x30C4 : 0x04c2, 831 0x30C6 : 0x04c3, 832 0x30C8 : 0x04c4, 833 0x30CA : 0x04c5, 834 0x30CB : 0x04c6, 835 0x30CC : 0x04c7, 836 0x30CD : 0x04c8, 837 0x30CE : 0x04c9, 838 0x30CF : 0x04ca, 839 0x30D2 : 0x04cb, 840 0x30D5 : 0x04cc, 841 0x30D8 : 0x04cd, 842 0x30DB : 0x04ce, 843 0x30DE : 0x04cf, 844 0x30DF : 0x04d0, 845 0x30E0 : 0x04d1, 846 0x30E1 : 0x04d2, 847 0x30E2 : 0x04d3, 848 0x30E4 : 0x04d4, 849 0x30E6 : 0x04d5, 850 0x30E8 : 0x04d6, 851 0x30E9 : 0x04d7, 852 0x30EA : 0x04d8, 853 0x30EB : 0x04d9, 854 0x30EC : 0x04da, 855 0x30ED : 0x04db, 856 0x30EF : 0x04dc, 857 0x30F3 : 0x04dd, 858 0x309B : 0x04de, 859 0x309C : 0x04df, 860 0x06F0 : 0x10006f0, 861 0x06F1 : 0x10006f1, 862 0x06F2 : 0x10006f2, 863 0x06F3 : 0x10006f3, 864 0x06F4 : 0x10006f4, 865 0x06F5 : 0x10006f5, 866 0x06F6 : 0x10006f6, 867 0x06F7 : 0x10006f7, 868 0x06F8 : 0x10006f8, 869 0x06F9 : 0x10006f9, 870 0x066A : 0x100066a, 871 0x0670 : 0x1000670, 872 0x0679 : 0x1000679, 873 0x067E : 0x100067e, 874 0x0686 : 0x1000686, 875 0x0688 : 0x1000688, 876 0x0691 : 0x1000691, 877 0x060C : 0x05ac, 878 0x06D4 : 0x10006d4, 879 0x0660 : 0x1000660, 880 0x0661 : 0x1000661, 881 0x0662 : 0x1000662, 882 0x0663 : 0x1000663, 883 0x0664 : 0x1000664, 884 0x0665 : 0x1000665, 885 0x0666 : 0x1000666, 886 0x0667 : 0x1000667, 887 0x0668 : 0x1000668, 888 0x0669 : 0x1000669, 889 0x061B : 0x05bb, 890 0x061F : 0x05bf, 891 0x0621 : 0x05c1, 892 0x0622 : 0x05c2, 893 0x0623 : 0x05c3, 894 0x0624 : 0x05c4, 895 0x0625 : 0x05c5, 896 0x0626 : 0x05c6, 897 0x0627 : 0x05c7, 898 0x0628 : 0x05c8, 899 0x0629 : 0x05c9, 900 0x062A : 0x05ca, 901 0x062B : 0x05cb, 902 0x062C : 0x05cc, 903 0x062D : 0x05cd, 904 0x062E : 0x05ce, 905 0x062F : 0x05cf, 906 0x0630 : 0x05d0, 907 0x0631 : 0x05d1, 908 0x0632 : 0x05d2, 909 0x0633 : 0x05d3, 910 0x0634 : 0x05d4, 911 0x0635 : 0x05d5, 912 0x0636 : 0x05d6, 913 0x0637 : 0x05d7, 914 0x0638 : 0x05d8, 915 0x0639 : 0x05d9, 916 0x063A : 0x05da, 917 0x0640 : 0x05e0, 918 0x0641 : 0x05e1, 919 0x0642 : 0x05e2, 920 0x0643 : 0x05e3, 921 0x0644 : 0x05e4, 922 0x0645 : 0x05e5, 923 0x0646 : 0x05e6, 924 0x0647 : 0x05e7, 925 0x0648 : 0x05e8, 926 0x0649 : 0x05e9, 927 0x064A : 0x05ea, 928 0x064B : 0x05eb, 929 0x064C : 0x05ec, 930 0x064D : 0x05ed, 931 0x064E : 0x05ee, 932 0x064F : 0x05ef, 933 0x0650 : 0x05f0, 934 0x0651 : 0x05f1, 935 0x0652 : 0x05f2, 936 0x0653 : 0x1000653, 937 0x0654 : 0x1000654, 938 0x0655 : 0x1000655, 939 0x0698 : 0x1000698, 940 0x06A4 : 0x10006a4, 941 0x06A9 : 0x10006a9, 942 0x06AF : 0x10006af, 943 0x06BA : 0x10006ba, 944 0x06BE : 0x10006be, 945 0x06CC : 0x10006cc, 946 0x06D2 : 0x10006d2, 947 0x06C1 : 0x10006c1, 948 0x0492 : 0x1000492, 949 0x0493 : 0x1000493, 950 0x0496 : 0x1000496, 951 0x0497 : 0x1000497, 952 0x049A : 0x100049a, 953 0x049B : 0x100049b, 954 0x049C : 0x100049c, 955 0x049D : 0x100049d, 956 0x04A2 : 0x10004a2, 957 0x04A3 : 0x10004a3, 958 0x04AE : 0x10004ae, 959 0x04AF : 0x10004af, 960 0x04B0 : 0x10004b0, 961 0x04B1 : 0x10004b1, 962 0x04B2 : 0x10004b2, 963 0x04B3 : 0x10004b3, 964 0x04B6 : 0x10004b6, 965 0x04B7 : 0x10004b7, 966 0x04B8 : 0x10004b8, 967 0x04B9 : 0x10004b9, 968 0x04BA : 0x10004ba, 969 0x04BB : 0x10004bb, 970 0x04D8 : 0x10004d8, 971 0x04D9 : 0x10004d9, 972 0x04E2 : 0x10004e2, 973 0x04E3 : 0x10004e3, 974 0x04E8 : 0x10004e8, 975 0x04E9 : 0x10004e9, 976 0x04EE : 0x10004ee, 977 0x04EF : 0x10004ef, 978 0x0452 : 0x06a1, 979 0x0453 : 0x06a2, 980 0x0451 : 0x06a3, 981 0x0454 : 0x06a4, 982 0x0455 : 0x06a5, 983 0x0456 : 0x06a6, 984 0x0457 : 0x06a7, 985 0x0458 : 0x06a8, 986 0x0459 : 0x06a9, 987 0x045A : 0x06aa, 988 0x045B : 0x06ab, 989 0x045C : 0x06ac, 990 0x0491 : 0x06ad, 991 0x045E : 0x06ae, 992 0x045F : 0x06af, 993 0x2116 : 0x06b0, 994 0x0402 : 0x06b1, 995 0x0403 : 0x06b2, 996 0x0401 : 0x06b3, 997 0x0404 : 0x06b4, 998 0x0405 : 0x06b5, 999 0x0406 : 0x06b6, 1000 0x0407 : 0x06b7, 1001 0x0408 : 0x06b8, 1002 0x0409 : 0x06b9, 1003 0x040A : 0x06ba, 1004 0x040B : 0x06bb, 1005 0x040C : 0x06bc, 1006 0x0490 : 0x06bd, 1007 0x040E : 0x06be, 1008 0x040F : 0x06bf, 1009 0x044E : 0x06c0, 1010 0x0430 : 0x06c1, 1011 0x0431 : 0x06c2, 1012 0x0446 : 0x06c3, 1013 0x0434 : 0x06c4, 1014 0x0435 : 0x06c5, 1015 0x0444 : 0x06c6, 1016 0x0433 : 0x06c7, 1017 0x0445 : 0x06c8, 1018 0x0438 : 0x06c9, 1019 0x0439 : 0x06ca, 1020 0x043A : 0x06cb, 1021 0x043B : 0x06cc, 1022 0x043C : 0x06cd, 1023 0x043D : 0x06ce, 1024 0x043E : 0x06cf, 1025 0x043F : 0x06d0, 1026 0x044F : 0x06d1, 1027 0x0440 : 0x06d2, 1028 0x0441 : 0x06d3, 1029 0x0442 : 0x06d4, 1030 0x0443 : 0x06d5, 1031 0x0436 : 0x06d6, 1032 0x0432 : 0x06d7, 1033 0x044C : 0x06d8, 1034 0x044B : 0x06d9, 1035 0x0437 : 0x06da, 1036 0x0448 : 0x06db, 1037 0x044D : 0x06dc, 1038 0x0449 : 0x06dd, 1039 0x0447 : 0x06de, 1040 0x044A : 0x06df, 1041 0x042E : 0x06e0, 1042 0x0410 : 0x06e1, 1043 0x0411 : 0x06e2, 1044 0x0426 : 0x06e3, 1045 0x0414 : 0x06e4, 1046 0x0415 : 0x06e5, 1047 0x0424 : 0x06e6, 1048 0x0413 : 0x06e7, 1049 0x0425 : 0x06e8, 1050 0x0418 : 0x06e9, 1051 0x0419 : 0x06ea, 1052 0x041A : 0x06eb, 1053 0x041B : 0x06ec, 1054 0x041C : 0x06ed, 1055 0x041D : 0x06ee, 1056 0x041E : 0x06ef, 1057 0x041F : 0x06f0, 1058 0x042F : 0x06f1, 1059 0x0420 : 0x06f2, 1060 0x0421 : 0x06f3, 1061 0x0422 : 0x06f4, 1062 0x0423 : 0x06f5, 1063 0x0416 : 0x06f6, 1064 0x0412 : 0x06f7, 1065 0x042C : 0x06f8, 1066 0x042B : 0x06f9, 1067 0x0417 : 0x06fa, 1068 0x0428 : 0x06fb, 1069 0x042D : 0x06fc, 1070 0x0429 : 0x06fd, 1071 0x0427 : 0x06fe, 1072 0x042A : 0x06ff, 1073 0x0386 : 0x07a1, 1074 0x0388 : 0x07a2, 1075 0x0389 : 0x07a3, 1076 0x038A : 0x07a4, 1077 0x03AA : 0x07a5, 1078 0x038C : 0x07a7, 1079 0x038E : 0x07a8, 1080 0x03AB : 0x07a9, 1081 0x038F : 0x07ab, 1082 0x0385 : 0x07ae, 1083 0x2015 : 0x07af, 1084 0x03AC : 0x07b1, 1085 0x03AD : 0x07b2, 1086 0x03AE : 0x07b3, 1087 0x03AF : 0x07b4, 1088 0x03CA : 0x07b5, 1089 0x0390 : 0x07b6, 1090 0x03CC : 0x07b7, 1091 0x03CD : 0x07b8, 1092 0x03CB : 0x07b9, 1093 0x03B0 : 0x07ba, 1094 0x03CE : 0x07bb, 1095 0x0391 : 0x07c1, 1096 0x0392 : 0x07c2, 1097 0x0393 : 0x07c3, 1098 0x0394 : 0x07c4, 1099 0x0395 : 0x07c5, 1100 0x0396 : 0x07c6, 1101 0x0397 : 0x07c7, 1102 0x0398 : 0x07c8, 1103 0x0399 : 0x07c9, 1104 0x039A : 0x07ca, 1105 0x039B : 0x07cb, 1106 0x039C : 0x07cc, 1107 0x039D : 0x07cd, 1108 0x039E : 0x07ce, 1109 0x039F : 0x07cf, 1110 0x03A0 : 0x07d0, 1111 0x03A1 : 0x07d1, 1112 0x03A3 : 0x07d2, 1113 0x03A4 : 0x07d4, 1114 0x03A5 : 0x07d5, 1115 0x03A6 : 0x07d6, 1116 0x03A7 : 0x07d7, 1117 0x03A8 : 0x07d8, 1118 0x03A9 : 0x07d9, 1119 0x03B1 : 0x07e1, 1120 0x03B2 : 0x07e2, 1121 0x03B3 : 0x07e3, 1122 0x03B4 : 0x07e4, 1123 0x03B5 : 0x07e5, 1124 0x03B6 : 0x07e6, 1125 0x03B7 : 0x07e7, 1126 0x03B8 : 0x07e8, 1127 0x03B9 : 0x07e9, 1128 0x03BA : 0x07ea, 1129 0x03BB : 0x07eb, 1130 0x03BC : 0x07ec, 1131 0x03BD : 0x07ed, 1132 0x03BE : 0x07ee, 1133 0x03BF : 0x07ef, 1134 0x03C0 : 0x07f0, 1135 0x03C1 : 0x07f1, 1136 0x03C3 : 0x07f2, 1137 0x03C2 : 0x07f3, 1138 0x03C4 : 0x07f4, 1139 0x03C5 : 0x07f5, 1140 0x03C6 : 0x07f6, 1141 0x03C7 : 0x07f7, 1142 0x03C8 : 0x07f8, 1143 0x03C9 : 0x07f9, 1144 0x23B7 : 0x08a1, 1145 0x2320 : 0x08a4, 1146 0x2321 : 0x08a5, 1147 0x23A1 : 0x08a7, 1148 0x23A3 : 0x08a8, 1149 0x23A4 : 0x08a9, 1150 0x23A6 : 0x08aa, 1151 0x239B : 0x08ab, 1152 0x239D : 0x08ac, 1153 0x239E : 0x08ad, 1154 0x23A0 : 0x08ae, 1155 0x23A8 : 0x08af, 1156 0x23AC : 0x08b0, 1157 0x2264 : 0x08bc, 1158 0x2260 : 0x08bd, 1159 0x2265 : 0x08be, 1160 0x222B : 0x08bf, 1161 0x2234 : 0x08c0, 1162 0x221D : 0x08c1, 1163 0x221E : 0x08c2, 1164 0x2207 : 0x08c5, 1165 0x223C : 0x08c8, 1166 0x2243 : 0x08c9, 1167 0x21D4 : 0x08cd, 1168 0x21D2 : 0x08ce, 1169 0x2261 : 0x08cf, 1170 0x221A : 0x08d6, 1171 0x2282 : 0x08da, 1172 0x2283 : 0x08db, 1173 0x2229 : 0x08dc, 1174 0x222A : 0x08dd, 1175 0x2227 : 0x08de, 1176 0x2228 : 0x08df, 1177 0x2202 : 0x08ef, 1178 0x0192 : 0x08f6, 1179 0x2190 : 0x08fb, 1180 0x2191 : 0x08fc, 1181 0x2192 : 0x08fd, 1182 0x2193 : 0x08fe, 1183 0x25C6 : 0x09e0, 1184 0x2592 : 0x09e1, 1185 0x2409 : 0x09e2, 1186 0x240C : 0x09e3, 1187 0x240D : 0x09e4, 1188 0x240A : 0x09e5, 1189 0x2424 : 0x09e8, 1190 0x240B : 0x09e9, 1191 0x2518 : 0x09ea, 1192 0x2510 : 0x09eb, 1193 0x250C : 0x09ec, 1194 0x2514 : 0x09ed, 1195 0x253C : 0x09ee, 1196 0x23BA : 0x09ef, 1197 0x23BB : 0x09f0, 1198 0x2500 : 0x09f1, 1199 0x23BC : 0x09f2, 1200 0x23BD : 0x09f3, 1201 0x251C : 0x09f4, 1202 0x2524 : 0x09f5, 1203 0x2534 : 0x09f6, 1204 0x252C : 0x09f7, 1205 0x2502 : 0x09f8, 1206 0x2003 : 0x0aa1, 1207 0x2002 : 0x0aa2, 1208 0x2004 : 0x0aa3, 1209 0x2005 : 0x0aa4, 1210 0x2007 : 0x0aa5, 1211 0x2008 : 0x0aa6, 1212 0x2009 : 0x0aa7, 1213 0x200A : 0x0aa8, 1214 0x2014 : 0x0aa9, 1215 0x2013 : 0x0aaa, 1216 0x2026 : 0x0aae, 1217 0x2025 : 0x0aaf, 1218 0x2153 : 0x0ab0, 1219 0x2154 : 0x0ab1, 1220 0x2155 : 0x0ab2, 1221 0x2156 : 0x0ab3, 1222 0x2157 : 0x0ab4, 1223 0x2158 : 0x0ab5, 1224 0x2159 : 0x0ab6, 1225 0x215A : 0x0ab7, 1226 0x2105 : 0x0ab8, 1227 0x2012 : 0x0abb, 1228 0x215B : 0x0ac3, 1229 0x215C : 0x0ac4, 1230 0x215D : 0x0ac5, 1231 0x215E : 0x0ac6, 1232 0x2122 : 0x0ac9, 1233 0x2018 : 0x0ad0, 1234 0x2019 : 0x0ad1, 1235 0x201C : 0x0ad2, 1236 0x201D : 0x0ad3, 1237 0x211E : 0x0ad4, 1238 0x2032 : 0x0ad6, 1239 0x2033 : 0x0ad7, 1240 0x271D : 0x0ad9, 1241 0x2663 : 0x0aec, 1242 0x2666 : 0x0aed, 1243 0x2665 : 0x0aee, 1244 0x2720 : 0x0af0, 1245 0x2020 : 0x0af1, 1246 0x2021 : 0x0af2, 1247 0x2713 : 0x0af3, 1248 0x2717 : 0x0af4, 1249 0x266F : 0x0af5, 1250 0x266D : 0x0af6, 1251 0x2642 : 0x0af7, 1252 0x2640 : 0x0af8, 1253 0x260E : 0x0af9, 1254 0x2315 : 0x0afa, 1255 0x2117 : 0x0afb, 1256 0x2038 : 0x0afc, 1257 0x201A : 0x0afd, 1258 0x201E : 0x0afe, 1259 0x22A4 : 0x0bc2, 1260 0x230A : 0x0bc4, 1261 0x2218 : 0x0bca, 1262 0x2395 : 0x0bcc, 1263 0x22A5 : 0x0bce, 1264 0x25CB : 0x0bcf, 1265 0x2308 : 0x0bd3, 1266 0x22A3 : 0x0bdc, 1267 0x22A2 : 0x0bfc, 1268 0x2017 : 0x0cdf, 1269 0x05D0 : 0x0ce0, 1270 0x05D1 : 0x0ce1, 1271 0x05D2 : 0x0ce2, 1272 0x05D3 : 0x0ce3, 1273 0x05D4 : 0x0ce4, 1274 0x05D5 : 0x0ce5, 1275 0x05D6 : 0x0ce6, 1276 0x05D7 : 0x0ce7, 1277 0x05D8 : 0x0ce8, 1278 0x05D9 : 0x0ce9, 1279 0x05DA : 0x0cea, 1280 0x05DB : 0x0ceb, 1281 0x05DC : 0x0cec, 1282 0x05DD : 0x0ced, 1283 0x05DE : 0x0cee, 1284 0x05DF : 0x0cef, 1285 0x05E0 : 0x0cf0, 1286 0x05E1 : 0x0cf1, 1287 0x05E2 : 0x0cf2, 1288 0x05E3 : 0x0cf3, 1289 0x05E4 : 0x0cf4, 1290 0x05E5 : 0x0cf5, 1291 0x05E6 : 0x0cf6, 1292 0x05E7 : 0x0cf7, 1293 0x05E8 : 0x0cf8, 1294 0x05E9 : 0x0cf9, 1295 0x05EA : 0x0cfa, 1296 0x0E01 : 0x0da1, 1297 0x0E02 : 0x0da2, 1298 0x0E03 : 0x0da3, 1299 0x0E04 : 0x0da4, 1300 0x0E05 : 0x0da5, 1301 0x0E06 : 0x0da6, 1302 0x0E07 : 0x0da7, 1303 0x0E08 : 0x0da8, 1304 0x0E09 : 0x0da9, 1305 0x0E0A : 0x0daa, 1306 0x0E0B : 0x0dab, 1307 0x0E0C : 0x0dac, 1308 0x0E0D : 0x0dad, 1309 0x0E0E : 0x0dae, 1310 0x0E0F : 0x0daf, 1311 0x0E10 : 0x0db0, 1312 0x0E11 : 0x0db1, 1313 0x0E12 : 0x0db2, 1314 0x0E13 : 0x0db3, 1315 0x0E14 : 0x0db4, 1316 0x0E15 : 0x0db5, 1317 0x0E16 : 0x0db6, 1318 0x0E17 : 0x0db7, 1319 0x0E18 : 0x0db8, 1320 0x0E19 : 0x0db9, 1321 0x0E1A : 0x0dba, 1322 0x0E1B : 0x0dbb, 1323 0x0E1C : 0x0dbc, 1324 0x0E1D : 0x0dbd, 1325 0x0E1E : 0x0dbe, 1326 0x0E1F : 0x0dbf, 1327 0x0E20 : 0x0dc0, 1328 0x0E21 : 0x0dc1, 1329 0x0E22 : 0x0dc2, 1330 0x0E23 : 0x0dc3, 1331 0x0E24 : 0x0dc4, 1332 0x0E25 : 0x0dc5, 1333 0x0E26 : 0x0dc6, 1334 0x0E27 : 0x0dc7, 1335 0x0E28 : 0x0dc8, 1336 0x0E29 : 0x0dc9, 1337 0x0E2A : 0x0dca, 1338 0x0E2B : 0x0dcb, 1339 0x0E2C : 0x0dcc, 1340 0x0E2D : 0x0dcd, 1341 0x0E2E : 0x0dce, 1342 0x0E2F : 0x0dcf, 1343 0x0E30 : 0x0dd0, 1344 0x0E31 : 0x0dd1, 1345 0x0E32 : 0x0dd2, 1346 0x0E33 : 0x0dd3, 1347 0x0E34 : 0x0dd4, 1348 0x0E35 : 0x0dd5, 1349 0x0E36 : 0x0dd6, 1350 0x0E37 : 0x0dd7, 1351 0x0E38 : 0x0dd8, 1352 0x0E39 : 0x0dd9, 1353 0x0E3A : 0x0dda, 1354 0x0E3F : 0x0ddf, 1355 0x0E40 : 0x0de0, 1356 0x0E41 : 0x0de1, 1357 0x0E42 : 0x0de2, 1358 0x0E43 : 0x0de3, 1359 0x0E44 : 0x0de4, 1360 0x0E45 : 0x0de5, 1361 0x0E46 : 0x0de6, 1362 0x0E47 : 0x0de7, 1363 0x0E48 : 0x0de8, 1364 0x0E49 : 0x0de9, 1365 0x0E4A : 0x0dea, 1366 0x0E4B : 0x0deb, 1367 0x0E4C : 0x0dec, 1368 0x0E4D : 0x0ded, 1369 0x0E50 : 0x0df0, 1370 0x0E51 : 0x0df1, 1371 0x0E52 : 0x0df2, 1372 0x0E53 : 0x0df3, 1373 0x0E54 : 0x0df4, 1374 0x0E55 : 0x0df5, 1375 0x0E56 : 0x0df6, 1376 0x0E57 : 0x0df7, 1377 0x0E58 : 0x0df8, 1378 0x0E59 : 0x0df9, 1379 0x0587 : 0x1000587, 1380 0x0589 : 0x1000589, 1381 0x055D : 0x100055d, 1382 0x058A : 0x100058a, 1383 0x055C : 0x100055c, 1384 0x055B : 0x100055b, 1385 0x055E : 0x100055e, 1386 0x0531 : 0x1000531, 1387 0x0561 : 0x1000561, 1388 0x0532 : 0x1000532, 1389 0x0562 : 0x1000562, 1390 0x0533 : 0x1000533, 1391 0x0563 : 0x1000563, 1392 0x0534 : 0x1000534, 1393 0x0564 : 0x1000564, 1394 0x0535 : 0x1000535, 1395 0x0565 : 0x1000565, 1396 0x0536 : 0x1000536, 1397 0x0566 : 0x1000566, 1398 0x0537 : 0x1000537, 1399 0x0567 : 0x1000567, 1400 0x0538 : 0x1000538, 1401 0x0568 : 0x1000568, 1402 0x0539 : 0x1000539, 1403 0x0569 : 0x1000569, 1404 0x053A : 0x100053a, 1405 0x056A : 0x100056a, 1406 0x053B : 0x100053b, 1407 0x056B : 0x100056b, 1408 0x053C : 0x100053c, 1409 0x056C : 0x100056c, 1410 0x053D : 0x100053d, 1411 0x056D : 0x100056d, 1412 0x053E : 0x100053e, 1413 0x056E : 0x100056e, 1414 0x053F : 0x100053f, 1415 0x056F : 0x100056f, 1416 0x0540 : 0x1000540, 1417 0x0570 : 0x1000570, 1418 0x0541 : 0x1000541, 1419 0x0571 : 0x1000571, 1420 0x0542 : 0x1000542, 1421 0x0572 : 0x1000572, 1422 0x0543 : 0x1000543, 1423 0x0573 : 0x1000573, 1424 0x0544 : 0x1000544, 1425 0x0574 : 0x1000574, 1426 0x0545 : 0x1000545, 1427 0x0575 : 0x1000575, 1428 0x0546 : 0x1000546, 1429 0x0576 : 0x1000576, 1430 0x0547 : 0x1000547, 1431 0x0577 : 0x1000577, 1432 0x0548 : 0x1000548, 1433 0x0578 : 0x1000578, 1434 0x0549 : 0x1000549, 1435 0x0579 : 0x1000579, 1436 0x054A : 0x100054a, 1437 0x057A : 0x100057a, 1438 0x054B : 0x100054b, 1439 0x057B : 0x100057b, 1440 0x054C : 0x100054c, 1441 0x057C : 0x100057c, 1442 0x054D : 0x100054d, 1443 0x057D : 0x100057d, 1444 0x054E : 0x100054e, 1445 0x057E : 0x100057e, 1446 0x054F : 0x100054f, 1447 0x057F : 0x100057f, 1448 0x0550 : 0x1000550, 1449 0x0580 : 0x1000580, 1450 0x0551 : 0x1000551, 1451 0x0581 : 0x1000581, 1452 0x0552 : 0x1000552, 1453 0x0582 : 0x1000582, 1454 0x0553 : 0x1000553, 1455 0x0583 : 0x1000583, 1456 0x0554 : 0x1000554, 1457 0x0584 : 0x1000584, 1458 0x0555 : 0x1000555, 1459 0x0585 : 0x1000585, 1460 0x0556 : 0x1000556, 1461 0x0586 : 0x1000586, 1462 0x055A : 0x100055a, 1463 0x10D0 : 0x10010d0, 1464 0x10D1 : 0x10010d1, 1465 0x10D2 : 0x10010d2, 1466 0x10D3 : 0x10010d3, 1467 0x10D4 : 0x10010d4, 1468 0x10D5 : 0x10010d5, 1469 0x10D6 : 0x10010d6, 1470 0x10D7 : 0x10010d7, 1471 0x10D8 : 0x10010d8, 1472 0x10D9 : 0x10010d9, 1473 0x10DA : 0x10010da, 1474 0x10DB : 0x10010db, 1475 0x10DC : 0x10010dc, 1476 0x10DD : 0x10010dd, 1477 0x10DE : 0x10010de, 1478 0x10DF : 0x10010df, 1479 0x10E0 : 0x10010e0, 1480 0x10E1 : 0x10010e1, 1481 0x10E2 : 0x10010e2, 1482 0x10E3 : 0x10010e3, 1483 0x10E4 : 0x10010e4, 1484 0x10E5 : 0x10010e5, 1485 0x10E6 : 0x10010e6, 1486 0x10E7 : 0x10010e7, 1487 0x10E8 : 0x10010e8, 1488 0x10E9 : 0x10010e9, 1489 0x10EA : 0x10010ea, 1490 0x10EB : 0x10010eb, 1491 0x10EC : 0x10010ec, 1492 0x10ED : 0x10010ed, 1493 0x10EE : 0x10010ee, 1494 0x10EF : 0x10010ef, 1495 0x10F0 : 0x10010f0, 1496 0x10F1 : 0x10010f1, 1497 0x10F2 : 0x10010f2, 1498 0x10F3 : 0x10010f3, 1499 0x10F4 : 0x10010f4, 1500 0x10F5 : 0x10010f5, 1501 0x10F6 : 0x10010f6, 1502 0x1E8A : 0x1001e8a, 1503 0x012C : 0x100012c, 1504 0x01B5 : 0x10001b5, 1505 0x01E6 : 0x10001e6, 1506 0x01D2 : 0x10001d1, 1507 0x019F : 0x100019f, 1508 0x1E8B : 0x1001e8b, 1509 0x012D : 0x100012d, 1510 0x01B6 : 0x10001b6, 1511 0x01E7 : 0x10001e7, 1512 0x01D2 : 0x10001d2, 1513 0x0275 : 0x1000275, 1514 0x018F : 0x100018f, 1515 0x0259 : 0x1000259, 1516 0x1E36 : 0x1001e36, 1517 0x1E37 : 0x1001e37, 1518 0x1EA0 : 0x1001ea0, 1519 0x1EA1 : 0x1001ea1, 1520 0x1EA2 : 0x1001ea2, 1521 0x1EA3 : 0x1001ea3, 1522 0x1EA4 : 0x1001ea4, 1523 0x1EA5 : 0x1001ea5, 1524 0x1EA6 : 0x1001ea6, 1525 0x1EA7 : 0x1001ea7, 1526 0x1EA8 : 0x1001ea8, 1527 0x1EA9 : 0x1001ea9, 1528 0x1EAA : 0x1001eaa, 1529 0x1EAB : 0x1001eab, 1530 0x1EAC : 0x1001eac, 1531 0x1EAD : 0x1001ead, 1532 0x1EAE : 0x1001eae, 1533 0x1EAF : 0x1001eaf, 1534 0x1EB0 : 0x1001eb0, 1535 0x1EB1 : 0x1001eb1, 1536 0x1EB2 : 0x1001eb2, 1537 0x1EB3 : 0x1001eb3, 1538 0x1EB4 : 0x1001eb4, 1539 0x1EB5 : 0x1001eb5, 1540 0x1EB6 : 0x1001eb6, 1541 0x1EB7 : 0x1001eb7, 1542 0x1EB8 : 0x1001eb8, 1543 0x1EB9 : 0x1001eb9, 1544 0x1EBA : 0x1001eba, 1545 0x1EBB : 0x1001ebb, 1546 0x1EBC : 0x1001ebc, 1547 0x1EBD : 0x1001ebd, 1548 0x1EBE : 0x1001ebe, 1549 0x1EBF : 0x1001ebf, 1550 0x1EC0 : 0x1001ec0, 1551 0x1EC1 : 0x1001ec1, 1552 0x1EC2 : 0x1001ec2, 1553 0x1EC3 : 0x1001ec3, 1554 0x1EC4 : 0x1001ec4, 1555 0x1EC5 : 0x1001ec5, 1556 0x1EC6 : 0x1001ec6, 1557 0x1EC7 : 0x1001ec7, 1558 0x1EC8 : 0x1001ec8, 1559 0x1EC9 : 0x1001ec9, 1560 0x1ECA : 0x1001eca, 1561 0x1ECB : 0x1001ecb, 1562 0x1ECC : 0x1001ecc, 1563 0x1ECD : 0x1001ecd, 1564 0x1ECE : 0x1001ece, 1565 0x1ECF : 0x1001ecf, 1566 0x1ED0 : 0x1001ed0, 1567 0x1ED1 : 0x1001ed1, 1568 0x1ED2 : 0x1001ed2, 1569 0x1ED3 : 0x1001ed3, 1570 0x1ED4 : 0x1001ed4, 1571 0x1ED5 : 0x1001ed5, 1572 0x1ED6 : 0x1001ed6, 1573 0x1ED7 : 0x1001ed7, 1574 0x1ED8 : 0x1001ed8, 1575 0x1ED9 : 0x1001ed9, 1576 0x1EDA : 0x1001eda, 1577 0x1EDB : 0x1001edb, 1578 0x1EDC : 0x1001edc, 1579 0x1EDD : 0x1001edd, 1580 0x1EDE : 0x1001ede, 1581 0x1EDF : 0x1001edf, 1582 0x1EE0 : 0x1001ee0, 1583 0x1EE1 : 0x1001ee1, 1584 0x1EE2 : 0x1001ee2, 1585 0x1EE3 : 0x1001ee3, 1586 0x1EE4 : 0x1001ee4, 1587 0x1EE5 : 0x1001ee5, 1588 0x1EE6 : 0x1001ee6, 1589 0x1EE7 : 0x1001ee7, 1590 0x1EE8 : 0x1001ee8, 1591 0x1EE9 : 0x1001ee9, 1592 0x1EEA : 0x1001eea, 1593 0x1EEB : 0x1001eeb, 1594 0x1EEC : 0x1001eec, 1595 0x1EED : 0x1001eed, 1596 0x1EEE : 0x1001eee, 1597 0x1EEF : 0x1001eef, 1598 0x1EF0 : 0x1001ef0, 1599 0x1EF1 : 0x1001ef1, 1600 0x1EF4 : 0x1001ef4, 1601 0x1EF5 : 0x1001ef5, 1602 0x1EF6 : 0x1001ef6, 1603 0x1EF7 : 0x1001ef7, 1604 0x1EF8 : 0x1001ef8, 1605 0x1EF9 : 0x1001ef9, 1606 0x01A0 : 0x10001a0, 1607 0x01A1 : 0x10001a1, 1608 0x01AF : 0x10001af, 1609 0x01B0 : 0x10001b0, 1610 0x20A0 : 0x10020a0, 1611 0x20A1 : 0x10020a1, 1612 0x20A2 : 0x10020a2, 1613 0x20A3 : 0x10020a3, 1614 0x20A4 : 0x10020a4, 1615 0x20A5 : 0x10020a5, 1616 0x20A6 : 0x10020a6, 1617 0x20A7 : 0x10020a7, 1618 0x20A8 : 0x10020a8, 1619 0x20A9 : 0x10020a9, 1620 0x20AA : 0x10020aa, 1621 0x20AB : 0x10020ab, 1622 0x20AC : 0x20ac, 1623 0x2070 : 0x1002070, 1624 0x2074 : 0x1002074, 1625 0x2075 : 0x1002075, 1626 0x2076 : 0x1002076, 1627 0x2077 : 0x1002077, 1628 0x2078 : 0x1002078, 1629 0x2079 : 0x1002079, 1630 0x2080 : 0x1002080, 1631 0x2081 : 0x1002081, 1632 0x2082 : 0x1002082, 1633 0x2083 : 0x1002083, 1634 0x2084 : 0x1002084, 1635 0x2085 : 0x1002085, 1636 0x2086 : 0x1002086, 1637 0x2087 : 0x1002087, 1638 0x2088 : 0x1002088, 1639 0x2089 : 0x1002089, 1640 0x2202 : 0x1002202, 1641 0x2205 : 0x1002205, 1642 0x2208 : 0x1002208, 1643 0x2209 : 0x1002209, 1644 0x220B : 0x100220B, 1645 0x221A : 0x100221A, 1646 0x221B : 0x100221B, 1647 0x221C : 0x100221C, 1648 0x222C : 0x100222C, 1649 0x222D : 0x100222D, 1650 0x2235 : 0x1002235, 1651 0x2245 : 0x1002248, 1652 0x2247 : 0x1002247, 1653 0x2262 : 0x1002262, 1654 0x2263 : 0x1002263, 1655 0x2800 : 0x1002800, 1656 0x2801 : 0x1002801, 1657 0x2802 : 0x1002802, 1658 0x2803 : 0x1002803, 1659 0x2804 : 0x1002804, 1660 0x2805 : 0x1002805, 1661 0x2806 : 0x1002806, 1662 0x2807 : 0x1002807, 1663 0x2808 : 0x1002808, 1664 0x2809 : 0x1002809, 1665 0x280a : 0x100280a, 1666 0x280b : 0x100280b, 1667 0x280c : 0x100280c, 1668 0x280d : 0x100280d, 1669 0x280e : 0x100280e, 1670 0x280f : 0x100280f, 1671 0x2810 : 0x1002810, 1672 0x2811 : 0x1002811, 1673 0x2812 : 0x1002812, 1674 0x2813 : 0x1002813, 1675 0x2814 : 0x1002814, 1676 0x2815 : 0x1002815, 1677 0x2816 : 0x1002816, 1678 0x2817 : 0x1002817, 1679 0x2818 : 0x1002818, 1680 0x2819 : 0x1002819, 1681 0x281a : 0x100281a, 1682 0x281b : 0x100281b, 1683 0x281c : 0x100281c, 1684 0x281d : 0x100281d, 1685 0x281e : 0x100281e, 1686 0x281f : 0x100281f, 1687 0x2820 : 0x1002820, 1688 0x2821 : 0x1002821, 1689 0x2822 : 0x1002822, 1690 0x2823 : 0x1002823, 1691 0x2824 : 0x1002824, 1692 0x2825 : 0x1002825, 1693 0x2826 : 0x1002826, 1694 0x2827 : 0x1002827, 1695 0x2828 : 0x1002828, 1696 0x2829 : 0x1002829, 1697 0x282a : 0x100282a, 1698 0x282b : 0x100282b, 1699 0x282c : 0x100282c, 1700 0x282d : 0x100282d, 1701 0x282e : 0x100282e, 1702 0x282f : 0x100282f, 1703 0x2830 : 0x1002830, 1704 0x2831 : 0x1002831, 1705 0x2832 : 0x1002832, 1706 0x2833 : 0x1002833, 1707 0x2834 : 0x1002834, 1708 0x2835 : 0x1002835, 1709 0x2836 : 0x1002836, 1710 0x2837 : 0x1002837, 1711 0x2838 : 0x1002838, 1712 0x2839 : 0x1002839, 1713 0x283a : 0x100283a, 1714 0x283b : 0x100283b, 1715 0x283c : 0x100283c, 1716 0x283d : 0x100283d, 1717 0x283e : 0x100283e, 1718 0x283f : 0x100283f, 1719 0x2840 : 0x1002840, 1720 0x2841 : 0x1002841, 1721 0x2842 : 0x1002842, 1722 0x2843 : 0x1002843, 1723 0x2844 : 0x1002844, 1724 0x2845 : 0x1002845, 1725 0x2846 : 0x1002846, 1726 0x2847 : 0x1002847, 1727 0x2848 : 0x1002848, 1728 0x2849 : 0x1002849, 1729 0x284a : 0x100284a, 1730 0x284b : 0x100284b, 1731 0x284c : 0x100284c, 1732 0x284d : 0x100284d, 1733 0x284e : 0x100284e, 1734 0x284f : 0x100284f, 1735 0x2850 : 0x1002850, 1736 0x2851 : 0x1002851, 1737 0x2852 : 0x1002852, 1738 0x2853 : 0x1002853, 1739 0x2854 : 0x1002854, 1740 0x2855 : 0x1002855, 1741 0x2856 : 0x1002856, 1742 0x2857 : 0x1002857, 1743 0x2858 : 0x1002858, 1744 0x2859 : 0x1002859, 1745 0x285a : 0x100285a, 1746 0x285b : 0x100285b, 1747 0x285c : 0x100285c, 1748 0x285d : 0x100285d, 1749 0x285e : 0x100285e, 1750 0x285f : 0x100285f, 1751 0x2860 : 0x1002860, 1752 0x2861 : 0x1002861, 1753 0x2862 : 0x1002862, 1754 0x2863 : 0x1002863, 1755 0x2864 : 0x1002864, 1756 0x2865 : 0x1002865, 1757 0x2866 : 0x1002866, 1758 0x2867 : 0x1002867, 1759 0x2868 : 0x1002868, 1760 0x2869 : 0x1002869, 1761 0x286a : 0x100286a, 1762 0x286b : 0x100286b, 1763 0x286c : 0x100286c, 1764 0x286d : 0x100286d, 1765 0x286e : 0x100286e, 1766 0x286f : 0x100286f, 1767 0x2870 : 0x1002870, 1768 0x2871 : 0x1002871, 1769 0x2872 : 0x1002872, 1770 0x2873 : 0x1002873, 1771 0x2874 : 0x1002874, 1772 0x2875 : 0x1002875, 1773 0x2876 : 0x1002876, 1774 0x2877 : 0x1002877, 1775 0x2878 : 0x1002878, 1776 0x2879 : 0x1002879, 1777 0x287a : 0x100287a, 1778 0x287b : 0x100287b, 1779 0x287c : 0x100287c, 1780 0x287d : 0x100287d, 1781 0x287e : 0x100287e, 1782 0x287f : 0x100287f, 1783 0x2880 : 0x1002880, 1784 0x2881 : 0x1002881, 1785 0x2882 : 0x1002882, 1786 0x2883 : 0x1002883, 1787 0x2884 : 0x1002884, 1788 0x2885 : 0x1002885, 1789 0x2886 : 0x1002886, 1790 0x2887 : 0x1002887, 1791 0x2888 : 0x1002888, 1792 0x2889 : 0x1002889, 1793 0x288a : 0x100288a, 1794 0x288b : 0x100288b, 1795 0x288c : 0x100288c, 1796 0x288d : 0x100288d, 1797 0x288e : 0x100288e, 1798 0x288f : 0x100288f, 1799 0x2890 : 0x1002890, 1800 0x2891 : 0x1002891, 1801 0x2892 : 0x1002892, 1802 0x2893 : 0x1002893, 1803 0x2894 : 0x1002894, 1804 0x2895 : 0x1002895, 1805 0x2896 : 0x1002896, 1806 0x2897 : 0x1002897, 1807 0x2898 : 0x1002898, 1808 0x2899 : 0x1002899, 1809 0x289a : 0x100289a, 1810 0x289b : 0x100289b, 1811 0x289c : 0x100289c, 1812 0x289d : 0x100289d, 1813 0x289e : 0x100289e, 1814 0x289f : 0x100289f, 1815 0x28a0 : 0x10028a0, 1816 0x28a1 : 0x10028a1, 1817 0x28a2 : 0x10028a2, 1818 0x28a3 : 0x10028a3, 1819 0x28a4 : 0x10028a4, 1820 0x28a5 : 0x10028a5, 1821 0x28a6 : 0x10028a6, 1822 0x28a7 : 0x10028a7, 1823 0x28a8 : 0x10028a8, 1824 0x28a9 : 0x10028a9, 1825 0x28aa : 0x10028aa, 1826 0x28ab : 0x10028ab, 1827 0x28ac : 0x10028ac, 1828 0x28ad : 0x10028ad, 1829 0x28ae : 0x10028ae, 1830 0x28af : 0x10028af, 1831 0x28b0 : 0x10028b0, 1832 0x28b1 : 0x10028b1, 1833 0x28b2 : 0x10028b2, 1834 0x28b3 : 0x10028b3, 1835 0x28b4 : 0x10028b4, 1836 0x28b5 : 0x10028b5, 1837 0x28b6 : 0x10028b6, 1838 0x28b7 : 0x10028b7, 1839 0x28b8 : 0x10028b8, 1840 0x28b9 : 0x10028b9, 1841 0x28ba : 0x10028ba, 1842 0x28bb : 0x10028bb, 1843 0x28bc : 0x10028bc, 1844 0x28bd : 0x10028bd, 1845 0x28be : 0x10028be, 1846 0x28bf : 0x10028bf, 1847 0x28c0 : 0x10028c0, 1848 0x28c1 : 0x10028c1, 1849 0x28c2 : 0x10028c2, 1850 0x28c3 : 0x10028c3, 1851 0x28c4 : 0x10028c4, 1852 0x28c5 : 0x10028c5, 1853 0x28c6 : 0x10028c6, 1854 0x28c7 : 0x10028c7, 1855 0x28c8 : 0x10028c8, 1856 0x28c9 : 0x10028c9, 1857 0x28ca : 0x10028ca, 1858 0x28cb : 0x10028cb, 1859 0x28cc : 0x10028cc, 1860 0x28cd : 0x10028cd, 1861 0x28ce : 0x10028ce, 1862 0x28cf : 0x10028cf, 1863 0x28d0 : 0x10028d0, 1864 0x28d1 : 0x10028d1, 1865 0x28d2 : 0x10028d2, 1866 0x28d3 : 0x10028d3, 1867 0x28d4 : 0x10028d4, 1868 0x28d5 : 0x10028d5, 1869 0x28d6 : 0x10028d6, 1870 0x28d7 : 0x10028d7, 1871 0x28d8 : 0x10028d8, 1872 0x28d9 : 0x10028d9, 1873 0x28da : 0x10028da, 1874 0x28db : 0x10028db, 1875 0x28dc : 0x10028dc, 1876 0x28dd : 0x10028dd, 1877 0x28de : 0x10028de, 1878 0x28df : 0x10028df, 1879 0x28e0 : 0x10028e0, 1880 0x28e1 : 0x10028e1, 1881 0x28e2 : 0x10028e2, 1882 0x28e3 : 0x10028e3, 1883 0x28e4 : 0x10028e4, 1884 0x28e5 : 0x10028e5, 1885 0x28e6 : 0x10028e6, 1886 0x28e7 : 0x10028e7, 1887 0x28e8 : 0x10028e8, 1888 0x28e9 : 0x10028e9, 1889 0x28ea : 0x10028ea, 1890 0x28eb : 0x10028eb, 1891 0x28ec : 0x10028ec, 1892 0x28ed : 0x10028ed, 1893 0x28ee : 0x10028ee, 1894 0x28ef : 0x10028ef, 1895 0x28f0 : 0x10028f0, 1896 0x28f1 : 0x10028f1, 1897 0x28f2 : 0x10028f2, 1898 0x28f3 : 0x10028f3, 1899 0x28f4 : 0x10028f4, 1900 0x28f5 : 0x10028f5, 1901 0x28f6 : 0x10028f6, 1902 0x28f7 : 0x10028f7, 1903 0x28f8 : 0x10028f8, 1904 0x28f9 : 0x10028f9, 1905 0x28fa : 0x10028fa, 1906 0x28fb : 0x10028fb, 1907 0x28fc : 0x10028fc, 1908 0x28fd : 0x10028fd, 1909 0x28fe : 0x10028fe, 1910 0x28ff : 0x10028ff 1911};