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};