1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Copyright (C) 2016 Intel Corporation.
5 ** Contact: https://www.qt.io/licensing/
6 **
7 ** This file is part of the QtCore module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see https://www.qt.io/terms-conditions. For further
16 ** information use the contact form at https://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 3 as published by the Free Software
21 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
22 ** packaging of this file. Please review the following information to
23 ** ensure the GNU Lesser General Public License version 3 requirements
24 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25 **
26 ** GNU General Public License Usage
27 ** Alternatively, this file may be used under the terms of the GNU
28 ** General Public License version 2.0 or (at your option) the GNU General
29 ** Public license version 3 or any later version approved by the KDE Free
30 ** Qt Foundation. The licenses are as published by the Free Software
31 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32 ** included in the packaging of this file. Please review the following
33 ** information to ensure the GNU General Public License requirements will
34 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35 ** https://www.gnu.org/licenses/gpl-3.0.html.
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 #include "qurl_p.h"
42 
43 #include <QtCore/qstringlist.h>
44 #include <algorithm>
45 
46 QT_BEGIN_NAMESPACE
47 
48 // needed by the punycode encoder/decoder
49 #define Q_MAXINT ((uint)((uint)(-1)>>1))
50 static const uint base = 36;
51 static const uint tmin = 1;
52 static const uint tmax = 26;
53 static const uint skew = 38;
54 static const uint damp = 700;
55 static const uint initial_bias = 72;
56 static const uint initial_n = 128;
57 
58 struct NameprepCaseFoldingEntry {
59     uint uc;
60     ushort mapping[4];
61 };
62 
operator <(uint one,const NameprepCaseFoldingEntry & other)63 inline bool operator<(uint one, const NameprepCaseFoldingEntry &other)
64 { return one < other.uc; }
65 
operator <(const NameprepCaseFoldingEntry & one,uint other)66 inline bool operator<(const NameprepCaseFoldingEntry &one, uint other)
67 { return one.uc < other; }
68 
69 static const NameprepCaseFoldingEntry NameprepCaseFolding[] = {
70 /*      { 0x0041, { 0x0061, 0x0000, 0x0000, 0x0000 } },
71         { 0x0042, { 0x0062, 0x0000, 0x0000, 0x0000 } },
72         { 0x0043, { 0x0063, 0x0000, 0x0000, 0x0000 } },
73         { 0x0044, { 0x0064, 0x0000, 0x0000, 0x0000 } },
74         { 0x0045, { 0x0065, 0x0000, 0x0000, 0x0000 } },
75         { 0x0046, { 0x0066, 0x0000, 0x0000, 0x0000 } },
76         { 0x0047, { 0x0067, 0x0000, 0x0000, 0x0000 } },
77         { 0x0048, { 0x0068, 0x0000, 0x0000, 0x0000 } },
78         { 0x0049, { 0x0069, 0x0000, 0x0000, 0x0000 } },
79         { 0x004A, { 0x006A, 0x0000, 0x0000, 0x0000 } },
80         { 0x004B, { 0x006B, 0x0000, 0x0000, 0x0000 } },
81         { 0x004C, { 0x006C, 0x0000, 0x0000, 0x0000 } },
82         { 0x004D, { 0x006D, 0x0000, 0x0000, 0x0000 } },
83         { 0x004E, { 0x006E, 0x0000, 0x0000, 0x0000 } },
84         { 0x004F, { 0x006F, 0x0000, 0x0000, 0x0000 } },
85         { 0x0050, { 0x0070, 0x0000, 0x0000, 0x0000 } },
86         { 0x0051, { 0x0071, 0x0000, 0x0000, 0x0000 } },
87         { 0x0052, { 0x0072, 0x0000, 0x0000, 0x0000 } },
88         { 0x0053, { 0x0073, 0x0000, 0x0000, 0x0000 } },
89         { 0x0054, { 0x0074, 0x0000, 0x0000, 0x0000 } },
90         { 0x0055, { 0x0075, 0x0000, 0x0000, 0x0000 } },
91         { 0x0056, { 0x0076, 0x0000, 0x0000, 0x0000 } },
92         { 0x0057, { 0x0077, 0x0000, 0x0000, 0x0000 } },
93         { 0x0058, { 0x0078, 0x0000, 0x0000, 0x0000 } },
94         { 0x0059, { 0x0079, 0x0000, 0x0000, 0x0000 } },
95         { 0x005A, { 0x007A, 0x0000, 0x0000, 0x0000 } },*/
96         { 0x00B5, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
97         { 0x00C0, { 0x00E0, 0x0000, 0x0000, 0x0000 } },
98         { 0x00C1, { 0x00E1, 0x0000, 0x0000, 0x0000 } },
99         { 0x00C2, { 0x00E2, 0x0000, 0x0000, 0x0000 } },
100         { 0x00C3, { 0x00E3, 0x0000, 0x0000, 0x0000 } },
101         { 0x00C4, { 0x00E4, 0x0000, 0x0000, 0x0000 } },
102         { 0x00C5, { 0x00E5, 0x0000, 0x0000, 0x0000 } },
103         { 0x00C6, { 0x00E6, 0x0000, 0x0000, 0x0000 } },
104         { 0x00C7, { 0x00E7, 0x0000, 0x0000, 0x0000 } },
105         { 0x00C8, { 0x00E8, 0x0000, 0x0000, 0x0000 } },
106         { 0x00C9, { 0x00E9, 0x0000, 0x0000, 0x0000 } },
107         { 0x00CA, { 0x00EA, 0x0000, 0x0000, 0x0000 } },
108         { 0x00CB, { 0x00EB, 0x0000, 0x0000, 0x0000 } },
109         { 0x00CC, { 0x00EC, 0x0000, 0x0000, 0x0000 } },
110         { 0x00CD, { 0x00ED, 0x0000, 0x0000, 0x0000 } },
111         { 0x00CE, { 0x00EE, 0x0000, 0x0000, 0x0000 } },
112         { 0x00CF, { 0x00EF, 0x0000, 0x0000, 0x0000 } },
113         { 0x00D0, { 0x00F0, 0x0000, 0x0000, 0x0000 } },
114         { 0x00D1, { 0x00F1, 0x0000, 0x0000, 0x0000 } },
115         { 0x00D2, { 0x00F2, 0x0000, 0x0000, 0x0000 } },
116         { 0x00D3, { 0x00F3, 0x0000, 0x0000, 0x0000 } },
117         { 0x00D4, { 0x00F4, 0x0000, 0x0000, 0x0000 } },
118         { 0x00D5, { 0x00F5, 0x0000, 0x0000, 0x0000 } },
119         { 0x00D6, { 0x00F6, 0x0000, 0x0000, 0x0000 } },
120         { 0x00D8, { 0x00F8, 0x0000, 0x0000, 0x0000 } },
121         { 0x00D9, { 0x00F9, 0x0000, 0x0000, 0x0000 } },
122         { 0x00DA, { 0x00FA, 0x0000, 0x0000, 0x0000 } },
123         { 0x00DB, { 0x00FB, 0x0000, 0x0000, 0x0000 } },
124         { 0x00DC, { 0x00FC, 0x0000, 0x0000, 0x0000 } },
125         { 0x00DD, { 0x00FD, 0x0000, 0x0000, 0x0000 } },
126         { 0x00DE, { 0x00FE, 0x0000, 0x0000, 0x0000 } },
127         { 0x00DF, { 0x0073, 0x0073, 0x0000, 0x0000 } },
128         { 0x0100, { 0x0101, 0x0000, 0x0000, 0x0000 } },
129         { 0x0102, { 0x0103, 0x0000, 0x0000, 0x0000 } },
130         { 0x0104, { 0x0105, 0x0000, 0x0000, 0x0000 } },
131         { 0x0106, { 0x0107, 0x0000, 0x0000, 0x0000 } },
132         { 0x0108, { 0x0109, 0x0000, 0x0000, 0x0000 } },
133         { 0x010A, { 0x010B, 0x0000, 0x0000, 0x0000 } },
134         { 0x010C, { 0x010D, 0x0000, 0x0000, 0x0000 } },
135         { 0x010E, { 0x010F, 0x0000, 0x0000, 0x0000 } },
136         { 0x0110, { 0x0111, 0x0000, 0x0000, 0x0000 } },
137         { 0x0112, { 0x0113, 0x0000, 0x0000, 0x0000 } },
138         { 0x0114, { 0x0115, 0x0000, 0x0000, 0x0000 } },
139         { 0x0116, { 0x0117, 0x0000, 0x0000, 0x0000 } },
140         { 0x0118, { 0x0119, 0x0000, 0x0000, 0x0000 } },
141         { 0x011A, { 0x011B, 0x0000, 0x0000, 0x0000 } },
142         { 0x011C, { 0x011D, 0x0000, 0x0000, 0x0000 } },
143         { 0x011E, { 0x011F, 0x0000, 0x0000, 0x0000 } },
144         { 0x0120, { 0x0121, 0x0000, 0x0000, 0x0000 } },
145         { 0x0122, { 0x0123, 0x0000, 0x0000, 0x0000 } },
146         { 0x0124, { 0x0125, 0x0000, 0x0000, 0x0000 } },
147         { 0x0126, { 0x0127, 0x0000, 0x0000, 0x0000 } },
148         { 0x0128, { 0x0129, 0x0000, 0x0000, 0x0000 } },
149         { 0x012A, { 0x012B, 0x0000, 0x0000, 0x0000 } },
150         { 0x012C, { 0x012D, 0x0000, 0x0000, 0x0000 } },
151         { 0x012E, { 0x012F, 0x0000, 0x0000, 0x0000 } },
152         { 0x0130, { 0x0069, 0x0307, 0x0000, 0x0000 } },
153         { 0x0132, { 0x0133, 0x0000, 0x0000, 0x0000 } },
154         { 0x0134, { 0x0135, 0x0000, 0x0000, 0x0000 } },
155         { 0x0136, { 0x0137, 0x0000, 0x0000, 0x0000 } },
156         { 0x0139, { 0x013A, 0x0000, 0x0000, 0x0000 } },
157         { 0x013B, { 0x013C, 0x0000, 0x0000, 0x0000 } },
158         { 0x013D, { 0x013E, 0x0000, 0x0000, 0x0000 } },
159         { 0x013F, { 0x0140, 0x0000, 0x0000, 0x0000 } },
160         { 0x0141, { 0x0142, 0x0000, 0x0000, 0x0000 } },
161         { 0x0143, { 0x0144, 0x0000, 0x0000, 0x0000 } },
162         { 0x0145, { 0x0146, 0x0000, 0x0000, 0x0000 } },
163         { 0x0147, { 0x0148, 0x0000, 0x0000, 0x0000 } },
164         { 0x0149, { 0x02BC, 0x006E, 0x0000, 0x0000 } },
165         { 0x014A, { 0x014B, 0x0000, 0x0000, 0x0000 } },
166         { 0x014C, { 0x014D, 0x0000, 0x0000, 0x0000 } },
167         { 0x014E, { 0x014F, 0x0000, 0x0000, 0x0000 } },
168         { 0x0150, { 0x0151, 0x0000, 0x0000, 0x0000 } },
169         { 0x0152, { 0x0153, 0x0000, 0x0000, 0x0000 } },
170         { 0x0154, { 0x0155, 0x0000, 0x0000, 0x0000 } },
171         { 0x0156, { 0x0157, 0x0000, 0x0000, 0x0000 } },
172         { 0x0158, { 0x0159, 0x0000, 0x0000, 0x0000 } },
173         { 0x015A, { 0x015B, 0x0000, 0x0000, 0x0000 } },
174         { 0x015C, { 0x015D, 0x0000, 0x0000, 0x0000 } },
175         { 0x015E, { 0x015F, 0x0000, 0x0000, 0x0000 } },
176         { 0x0160, { 0x0161, 0x0000, 0x0000, 0x0000 } },
177         { 0x0162, { 0x0163, 0x0000, 0x0000, 0x0000 } },
178         { 0x0164, { 0x0165, 0x0000, 0x0000, 0x0000 } },
179         { 0x0166, { 0x0167, 0x0000, 0x0000, 0x0000 } },
180         { 0x0168, { 0x0169, 0x0000, 0x0000, 0x0000 } },
181         { 0x016A, { 0x016B, 0x0000, 0x0000, 0x0000 } },
182         { 0x016C, { 0x016D, 0x0000, 0x0000, 0x0000 } },
183         { 0x016E, { 0x016F, 0x0000, 0x0000, 0x0000 } },
184         { 0x0170, { 0x0171, 0x0000, 0x0000, 0x0000 } },
185         { 0x0172, { 0x0173, 0x0000, 0x0000, 0x0000 } },
186         { 0x0174, { 0x0175, 0x0000, 0x0000, 0x0000 } },
187         { 0x0176, { 0x0177, 0x0000, 0x0000, 0x0000 } },
188         { 0x0178, { 0x00FF, 0x0000, 0x0000, 0x0000 } },
189         { 0x0179, { 0x017A, 0x0000, 0x0000, 0x0000 } },
190         { 0x017B, { 0x017C, 0x0000, 0x0000, 0x0000 } },
191         { 0x017D, { 0x017E, 0x0000, 0x0000, 0x0000 } },
192         { 0x017F, { 0x0073, 0x0000, 0x0000, 0x0000 } },
193         { 0x0181, { 0x0253, 0x0000, 0x0000, 0x0000 } },
194         { 0x0182, { 0x0183, 0x0000, 0x0000, 0x0000 } },
195         { 0x0184, { 0x0185, 0x0000, 0x0000, 0x0000 } },
196         { 0x0186, { 0x0254, 0x0000, 0x0000, 0x0000 } },
197         { 0x0187, { 0x0188, 0x0000, 0x0000, 0x0000 } },
198         { 0x0189, { 0x0256, 0x0000, 0x0000, 0x0000 } },
199         { 0x018A, { 0x0257, 0x0000, 0x0000, 0x0000 } },
200         { 0x018B, { 0x018C, 0x0000, 0x0000, 0x0000 } },
201         { 0x018E, { 0x01DD, 0x0000, 0x0000, 0x0000 } },
202         { 0x018F, { 0x0259, 0x0000, 0x0000, 0x0000 } },
203         { 0x0190, { 0x025B, 0x0000, 0x0000, 0x0000 } },
204         { 0x0191, { 0x0192, 0x0000, 0x0000, 0x0000 } },
205         { 0x0193, { 0x0260, 0x0000, 0x0000, 0x0000 } },
206         { 0x0194, { 0x0263, 0x0000, 0x0000, 0x0000 } },
207         { 0x0196, { 0x0269, 0x0000, 0x0000, 0x0000 } },
208         { 0x0197, { 0x0268, 0x0000, 0x0000, 0x0000 } },
209         { 0x0198, { 0x0199, 0x0000, 0x0000, 0x0000 } },
210         { 0x019C, { 0x026F, 0x0000, 0x0000, 0x0000 } },
211         { 0x019D, { 0x0272, 0x0000, 0x0000, 0x0000 } },
212         { 0x019F, { 0x0275, 0x0000, 0x0000, 0x0000 } },
213         { 0x01A0, { 0x01A1, 0x0000, 0x0000, 0x0000 } },
214         { 0x01A2, { 0x01A3, 0x0000, 0x0000, 0x0000 } },
215         { 0x01A4, { 0x01A5, 0x0000, 0x0000, 0x0000 } },
216         { 0x01A6, { 0x0280, 0x0000, 0x0000, 0x0000 } },
217         { 0x01A7, { 0x01A8, 0x0000, 0x0000, 0x0000 } },
218         { 0x01A9, { 0x0283, 0x0000, 0x0000, 0x0000 } },
219         { 0x01AC, { 0x01AD, 0x0000, 0x0000, 0x0000 } },
220         { 0x01AE, { 0x0288, 0x0000, 0x0000, 0x0000 } },
221         { 0x01AF, { 0x01B0, 0x0000, 0x0000, 0x0000 } },
222         { 0x01B1, { 0x028A, 0x0000, 0x0000, 0x0000 } },
223         { 0x01B2, { 0x028B, 0x0000, 0x0000, 0x0000 } },
224         { 0x01B3, { 0x01B4, 0x0000, 0x0000, 0x0000 } },
225         { 0x01B5, { 0x01B6, 0x0000, 0x0000, 0x0000 } },
226         { 0x01B7, { 0x0292, 0x0000, 0x0000, 0x0000 } },
227         { 0x01B8, { 0x01B9, 0x0000, 0x0000, 0x0000 } },
228         { 0x01BC, { 0x01BD, 0x0000, 0x0000, 0x0000 } },
229         { 0x01C4, { 0x01C6, 0x0000, 0x0000, 0x0000 } },
230         { 0x01C5, { 0x01C6, 0x0000, 0x0000, 0x0000 } },
231         { 0x01C7, { 0x01C9, 0x0000, 0x0000, 0x0000 } },
232         { 0x01C8, { 0x01C9, 0x0000, 0x0000, 0x0000 } },
233         { 0x01CA, { 0x01CC, 0x0000, 0x0000, 0x0000 } },
234         { 0x01CB, { 0x01CC, 0x0000, 0x0000, 0x0000 } },
235         { 0x01CD, { 0x01CE, 0x0000, 0x0000, 0x0000 } },
236         { 0x01CF, { 0x01D0, 0x0000, 0x0000, 0x0000 } },
237         { 0x01D1, { 0x01D2, 0x0000, 0x0000, 0x0000 } },
238         { 0x01D3, { 0x01D4, 0x0000, 0x0000, 0x0000 } },
239         { 0x01D5, { 0x01D6, 0x0000, 0x0000, 0x0000 } },
240         { 0x01D7, { 0x01D8, 0x0000, 0x0000, 0x0000 } },
241         { 0x01D9, { 0x01DA, 0x0000, 0x0000, 0x0000 } },
242         { 0x01DB, { 0x01DC, 0x0000, 0x0000, 0x0000 } },
243         { 0x01DE, { 0x01DF, 0x0000, 0x0000, 0x0000 } },
244         { 0x01E0, { 0x01E1, 0x0000, 0x0000, 0x0000 } },
245         { 0x01E2, { 0x01E3, 0x0000, 0x0000, 0x0000 } },
246         { 0x01E4, { 0x01E5, 0x0000, 0x0000, 0x0000 } },
247         { 0x01E6, { 0x01E7, 0x0000, 0x0000, 0x0000 } },
248         { 0x01E8, { 0x01E9, 0x0000, 0x0000, 0x0000 } },
249         { 0x01EA, { 0x01EB, 0x0000, 0x0000, 0x0000 } },
250         { 0x01EC, { 0x01ED, 0x0000, 0x0000, 0x0000 } },
251         { 0x01EE, { 0x01EF, 0x0000, 0x0000, 0x0000 } },
252         { 0x01F0, { 0x006A, 0x030C, 0x0000, 0x0000 } },
253         { 0x01F1, { 0x01F3, 0x0000, 0x0000, 0x0000 } },
254         { 0x01F2, { 0x01F3, 0x0000, 0x0000, 0x0000 } },
255         { 0x01F4, { 0x01F5, 0x0000, 0x0000, 0x0000 } },
256         { 0x01F6, { 0x0195, 0x0000, 0x0000, 0x0000 } },
257         { 0x01F7, { 0x01BF, 0x0000, 0x0000, 0x0000 } },
258         { 0x01F8, { 0x01F9, 0x0000, 0x0000, 0x0000 } },
259         { 0x01FA, { 0x01FB, 0x0000, 0x0000, 0x0000 } },
260         { 0x01FC, { 0x01FD, 0x0000, 0x0000, 0x0000 } },
261         { 0x01FE, { 0x01FF, 0x0000, 0x0000, 0x0000 } },
262         { 0x0200, { 0x0201, 0x0000, 0x0000, 0x0000 } },
263         { 0x0202, { 0x0203, 0x0000, 0x0000, 0x0000 } },
264         { 0x0204, { 0x0205, 0x0000, 0x0000, 0x0000 } },
265         { 0x0206, { 0x0207, 0x0000, 0x0000, 0x0000 } },
266         { 0x0208, { 0x0209, 0x0000, 0x0000, 0x0000 } },
267         { 0x020A, { 0x020B, 0x0000, 0x0000, 0x0000 } },
268         { 0x020C, { 0x020D, 0x0000, 0x0000, 0x0000 } },
269         { 0x020E, { 0x020F, 0x0000, 0x0000, 0x0000 } },
270         { 0x0210, { 0x0211, 0x0000, 0x0000, 0x0000 } },
271         { 0x0212, { 0x0213, 0x0000, 0x0000, 0x0000 } },
272         { 0x0214, { 0x0215, 0x0000, 0x0000, 0x0000 } },
273         { 0x0216, { 0x0217, 0x0000, 0x0000, 0x0000 } },
274         { 0x0218, { 0x0219, 0x0000, 0x0000, 0x0000 } },
275         { 0x021A, { 0x021B, 0x0000, 0x0000, 0x0000 } },
276         { 0x021C, { 0x021D, 0x0000, 0x0000, 0x0000 } },
277         { 0x021E, { 0x021F, 0x0000, 0x0000, 0x0000 } },
278         { 0x0220, { 0x019E, 0x0000, 0x0000, 0x0000 } },
279         { 0x0222, { 0x0223, 0x0000, 0x0000, 0x0000 } },
280         { 0x0224, { 0x0225, 0x0000, 0x0000, 0x0000 } },
281         { 0x0226, { 0x0227, 0x0000, 0x0000, 0x0000 } },
282         { 0x0228, { 0x0229, 0x0000, 0x0000, 0x0000 } },
283         { 0x022A, { 0x022B, 0x0000, 0x0000, 0x0000 } },
284         { 0x022C, { 0x022D, 0x0000, 0x0000, 0x0000 } },
285         { 0x022E, { 0x022F, 0x0000, 0x0000, 0x0000 } },
286         { 0x0230, { 0x0231, 0x0000, 0x0000, 0x0000 } },
287         { 0x0232, { 0x0233, 0x0000, 0x0000, 0x0000 } },
288         { 0x0345, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
289         { 0x037A, { 0x0020, 0x03B9, 0x0000, 0x0000 } },
290         { 0x0386, { 0x03AC, 0x0000, 0x0000, 0x0000 } },
291         { 0x0388, { 0x03AD, 0x0000, 0x0000, 0x0000 } },
292         { 0x0389, { 0x03AE, 0x0000, 0x0000, 0x0000 } },
293         { 0x038A, { 0x03AF, 0x0000, 0x0000, 0x0000 } },
294         { 0x038C, { 0x03CC, 0x0000, 0x0000, 0x0000 } },
295         { 0x038E, { 0x03CD, 0x0000, 0x0000, 0x0000 } },
296         { 0x038F, { 0x03CE, 0x0000, 0x0000, 0x0000 } },
297         { 0x0390, { 0x03B9, 0x0308, 0x0301, 0x0000 } },
298         { 0x0391, { 0x03B1, 0x0000, 0x0000, 0x0000 } },
299         { 0x0392, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
300         { 0x0393, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
301         { 0x0394, { 0x03B4, 0x0000, 0x0000, 0x0000 } },
302         { 0x0395, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
303         { 0x0396, { 0x03B6, 0x0000, 0x0000, 0x0000 } },
304         { 0x0397, { 0x03B7, 0x0000, 0x0000, 0x0000 } },
305         { 0x0398, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
306         { 0x0399, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
307         { 0x039A, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
308         { 0x039B, { 0x03BB, 0x0000, 0x0000, 0x0000 } },
309         { 0x039C, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
310         { 0x039D, { 0x03BD, 0x0000, 0x0000, 0x0000 } },
311         { 0x039E, { 0x03BE, 0x0000, 0x0000, 0x0000 } },
312         { 0x039F, { 0x03BF, 0x0000, 0x0000, 0x0000 } },
313         { 0x03A0, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
314         { 0x03A1, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
315         { 0x03A3, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
316         { 0x03A4, { 0x03C4, 0x0000, 0x0000, 0x0000 } },
317         { 0x03A5, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
318         { 0x03A6, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
319         { 0x03A7, { 0x03C7, 0x0000, 0x0000, 0x0000 } },
320         { 0x03A8, { 0x03C8, 0x0000, 0x0000, 0x0000 } },
321         { 0x03A9, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
322         { 0x03AA, { 0x03CA, 0x0000, 0x0000, 0x0000 } },
323         { 0x03AB, { 0x03CB, 0x0000, 0x0000, 0x0000 } },
324         { 0x03B0, { 0x03C5, 0x0308, 0x0301, 0x0000 } },
325         { 0x03C2, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
326         { 0x03D0, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
327         { 0x03D1, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
328         { 0x03D2, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
329         { 0x03D3, { 0x03CD, 0x0000, 0x0000, 0x0000 } },
330         { 0x03D4, { 0x03CB, 0x0000, 0x0000, 0x0000 } },
331         { 0x03D5, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
332         { 0x03D6, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
333         { 0x03D8, { 0x03D9, 0x0000, 0x0000, 0x0000 } },
334         { 0x03DA, { 0x03DB, 0x0000, 0x0000, 0x0000 } },
335         { 0x03DC, { 0x03DD, 0x0000, 0x0000, 0x0000 } },
336         { 0x03DE, { 0x03DF, 0x0000, 0x0000, 0x0000 } },
337         { 0x03E0, { 0x03E1, 0x0000, 0x0000, 0x0000 } },
338         { 0x03E2, { 0x03E3, 0x0000, 0x0000, 0x0000 } },
339         { 0x03E4, { 0x03E5, 0x0000, 0x0000, 0x0000 } },
340         { 0x03E6, { 0x03E7, 0x0000, 0x0000, 0x0000 } },
341         { 0x03E8, { 0x03E9, 0x0000, 0x0000, 0x0000 } },
342         { 0x03EA, { 0x03EB, 0x0000, 0x0000, 0x0000 } },
343         { 0x03EC, { 0x03ED, 0x0000, 0x0000, 0x0000 } },
344         { 0x03EE, { 0x03EF, 0x0000, 0x0000, 0x0000 } },
345         { 0x03F0, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
346         { 0x03F1, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
347         { 0x03F2, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
348         { 0x03F4, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
349         { 0x03F5, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
350         { 0x0400, { 0x0450, 0x0000, 0x0000, 0x0000 } },
351         { 0x0401, { 0x0451, 0x0000, 0x0000, 0x0000 } },
352         { 0x0402, { 0x0452, 0x0000, 0x0000, 0x0000 } },
353         { 0x0403, { 0x0453, 0x0000, 0x0000, 0x0000 } },
354         { 0x0404, { 0x0454, 0x0000, 0x0000, 0x0000 } },
355         { 0x0405, { 0x0455, 0x0000, 0x0000, 0x0000 } },
356         { 0x0406, { 0x0456, 0x0000, 0x0000, 0x0000 } },
357         { 0x0407, { 0x0457, 0x0000, 0x0000, 0x0000 } },
358         { 0x0408, { 0x0458, 0x0000, 0x0000, 0x0000 } },
359         { 0x0409, { 0x0459, 0x0000, 0x0000, 0x0000 } },
360         { 0x040A, { 0x045A, 0x0000, 0x0000, 0x0000 } },
361         { 0x040B, { 0x045B, 0x0000, 0x0000, 0x0000 } },
362         { 0x040C, { 0x045C, 0x0000, 0x0000, 0x0000 } },
363         { 0x040D, { 0x045D, 0x0000, 0x0000, 0x0000 } },
364         { 0x040E, { 0x045E, 0x0000, 0x0000, 0x0000 } },
365         { 0x040F, { 0x045F, 0x0000, 0x0000, 0x0000 } },
366         { 0x0410, { 0x0430, 0x0000, 0x0000, 0x0000 } },
367         { 0x0411, { 0x0431, 0x0000, 0x0000, 0x0000 } },
368         { 0x0412, { 0x0432, 0x0000, 0x0000, 0x0000 } },
369         { 0x0413, { 0x0433, 0x0000, 0x0000, 0x0000 } },
370         { 0x0414, { 0x0434, 0x0000, 0x0000, 0x0000 } },
371         { 0x0415, { 0x0435, 0x0000, 0x0000, 0x0000 } },
372         { 0x0416, { 0x0436, 0x0000, 0x0000, 0x0000 } },
373         { 0x0417, { 0x0437, 0x0000, 0x0000, 0x0000 } },
374         { 0x0418, { 0x0438, 0x0000, 0x0000, 0x0000 } },
375         { 0x0419, { 0x0439, 0x0000, 0x0000, 0x0000 } },
376         { 0x041A, { 0x043A, 0x0000, 0x0000, 0x0000 } },
377         { 0x041B, { 0x043B, 0x0000, 0x0000, 0x0000 } },
378         { 0x041C, { 0x043C, 0x0000, 0x0000, 0x0000 } },
379         { 0x041D, { 0x043D, 0x0000, 0x0000, 0x0000 } },
380         { 0x041E, { 0x043E, 0x0000, 0x0000, 0x0000 } },
381         { 0x041F, { 0x043F, 0x0000, 0x0000, 0x0000 } },
382         { 0x0420, { 0x0440, 0x0000, 0x0000, 0x0000 } },
383         { 0x0421, { 0x0441, 0x0000, 0x0000, 0x0000 } },
384         { 0x0422, { 0x0442, 0x0000, 0x0000, 0x0000 } },
385         { 0x0423, { 0x0443, 0x0000, 0x0000, 0x0000 } },
386         { 0x0424, { 0x0444, 0x0000, 0x0000, 0x0000 } },
387         { 0x0425, { 0x0445, 0x0000, 0x0000, 0x0000 } },
388         { 0x0426, { 0x0446, 0x0000, 0x0000, 0x0000 } },
389         { 0x0427, { 0x0447, 0x0000, 0x0000, 0x0000 } },
390         { 0x0428, { 0x0448, 0x0000, 0x0000, 0x0000 } },
391         { 0x0429, { 0x0449, 0x0000, 0x0000, 0x0000 } },
392         { 0x042A, { 0x044A, 0x0000, 0x0000, 0x0000 } },
393         { 0x042B, { 0x044B, 0x0000, 0x0000, 0x0000 } },
394         { 0x042C, { 0x044C, 0x0000, 0x0000, 0x0000 } },
395         { 0x042D, { 0x044D, 0x0000, 0x0000, 0x0000 } },
396         { 0x042E, { 0x044E, 0x0000, 0x0000, 0x0000 } },
397         { 0x042F, { 0x044F, 0x0000, 0x0000, 0x0000 } },
398         { 0x0460, { 0x0461, 0x0000, 0x0000, 0x0000 } },
399         { 0x0462, { 0x0463, 0x0000, 0x0000, 0x0000 } },
400         { 0x0464, { 0x0465, 0x0000, 0x0000, 0x0000 } },
401         { 0x0466, { 0x0467, 0x0000, 0x0000, 0x0000 } },
402         { 0x0468, { 0x0469, 0x0000, 0x0000, 0x0000 } },
403         { 0x046A, { 0x046B, 0x0000, 0x0000, 0x0000 } },
404         { 0x046C, { 0x046D, 0x0000, 0x0000, 0x0000 } },
405         { 0x046E, { 0x046F, 0x0000, 0x0000, 0x0000 } },
406         { 0x0470, { 0x0471, 0x0000, 0x0000, 0x0000 } },
407         { 0x0472, { 0x0473, 0x0000, 0x0000, 0x0000 } },
408         { 0x0474, { 0x0475, 0x0000, 0x0000, 0x0000 } },
409         { 0x0476, { 0x0477, 0x0000, 0x0000, 0x0000 } },
410         { 0x0478, { 0x0479, 0x0000, 0x0000, 0x0000 } },
411         { 0x047A, { 0x047B, 0x0000, 0x0000, 0x0000 } },
412         { 0x047C, { 0x047D, 0x0000, 0x0000, 0x0000 } },
413         { 0x047E, { 0x047F, 0x0000, 0x0000, 0x0000 } },
414         { 0x0480, { 0x0481, 0x0000, 0x0000, 0x0000 } },
415         { 0x048A, { 0x048B, 0x0000, 0x0000, 0x0000 } },
416         { 0x048C, { 0x048D, 0x0000, 0x0000, 0x0000 } },
417         { 0x048E, { 0x048F, 0x0000, 0x0000, 0x0000 } },
418         { 0x0490, { 0x0491, 0x0000, 0x0000, 0x0000 } },
419         { 0x0492, { 0x0493, 0x0000, 0x0000, 0x0000 } },
420         { 0x0494, { 0x0495, 0x0000, 0x0000, 0x0000 } },
421         { 0x0496, { 0x0497, 0x0000, 0x0000, 0x0000 } },
422         { 0x0498, { 0x0499, 0x0000, 0x0000, 0x0000 } },
423         { 0x049A, { 0x049B, 0x0000, 0x0000, 0x0000 } },
424         { 0x049C, { 0x049D, 0x0000, 0x0000, 0x0000 } },
425         { 0x049E, { 0x049F, 0x0000, 0x0000, 0x0000 } },
426         { 0x04A0, { 0x04A1, 0x0000, 0x0000, 0x0000 } },
427         { 0x04A2, { 0x04A3, 0x0000, 0x0000, 0x0000 } },
428         { 0x04A4, { 0x04A5, 0x0000, 0x0000, 0x0000 } },
429         { 0x04A6, { 0x04A7, 0x0000, 0x0000, 0x0000 } },
430         { 0x04A8, { 0x04A9, 0x0000, 0x0000, 0x0000 } },
431         { 0x04AA, { 0x04AB, 0x0000, 0x0000, 0x0000 } },
432         { 0x04AC, { 0x04AD, 0x0000, 0x0000, 0x0000 } },
433         { 0x04AE, { 0x04AF, 0x0000, 0x0000, 0x0000 } },
434         { 0x04B0, { 0x04B1, 0x0000, 0x0000, 0x0000 } },
435         { 0x04B2, { 0x04B3, 0x0000, 0x0000, 0x0000 } },
436         { 0x04B4, { 0x04B5, 0x0000, 0x0000, 0x0000 } },
437         { 0x04B6, { 0x04B7, 0x0000, 0x0000, 0x0000 } },
438         { 0x04B8, { 0x04B9, 0x0000, 0x0000, 0x0000 } },
439         { 0x04BA, { 0x04BB, 0x0000, 0x0000, 0x0000 } },
440         { 0x04BC, { 0x04BD, 0x0000, 0x0000, 0x0000 } },
441         { 0x04BE, { 0x04BF, 0x0000, 0x0000, 0x0000 } },
442         { 0x04C1, { 0x04C2, 0x0000, 0x0000, 0x0000 } },
443         { 0x04C3, { 0x04C4, 0x0000, 0x0000, 0x0000 } },
444         { 0x04C5, { 0x04C6, 0x0000, 0x0000, 0x0000 } },
445         { 0x04C7, { 0x04C8, 0x0000, 0x0000, 0x0000 } },
446         { 0x04C9, { 0x04CA, 0x0000, 0x0000, 0x0000 } },
447         { 0x04CB, { 0x04CC, 0x0000, 0x0000, 0x0000 } },
448         { 0x04CD, { 0x04CE, 0x0000, 0x0000, 0x0000 } },
449         { 0x04D0, { 0x04D1, 0x0000, 0x0000, 0x0000 } },
450         { 0x04D2, { 0x04D3, 0x0000, 0x0000, 0x0000 } },
451         { 0x04D4, { 0x04D5, 0x0000, 0x0000, 0x0000 } },
452         { 0x04D6, { 0x04D7, 0x0000, 0x0000, 0x0000 } },
453         { 0x04D8, { 0x04D9, 0x0000, 0x0000, 0x0000 } },
454         { 0x04DA, { 0x04DB, 0x0000, 0x0000, 0x0000 } },
455         { 0x04DC, { 0x04DD, 0x0000, 0x0000, 0x0000 } },
456         { 0x04DE, { 0x04DF, 0x0000, 0x0000, 0x0000 } },
457         { 0x04E0, { 0x04E1, 0x0000, 0x0000, 0x0000 } },
458         { 0x04E2, { 0x04E3, 0x0000, 0x0000, 0x0000 } },
459         { 0x04E4, { 0x04E5, 0x0000, 0x0000, 0x0000 } },
460         { 0x04E6, { 0x04E7, 0x0000, 0x0000, 0x0000 } },
461         { 0x04E8, { 0x04E9, 0x0000, 0x0000, 0x0000 } },
462         { 0x04EA, { 0x04EB, 0x0000, 0x0000, 0x0000 } },
463         { 0x04EC, { 0x04ED, 0x0000, 0x0000, 0x0000 } },
464         { 0x04EE, { 0x04EF, 0x0000, 0x0000, 0x0000 } },
465         { 0x04F0, { 0x04F1, 0x0000, 0x0000, 0x0000 } },
466         { 0x04F2, { 0x04F3, 0x0000, 0x0000, 0x0000 } },
467         { 0x04F4, { 0x04F5, 0x0000, 0x0000, 0x0000 } },
468         { 0x04F8, { 0x04F9, 0x0000, 0x0000, 0x0000 } },
469         { 0x0500, { 0x0501, 0x0000, 0x0000, 0x0000 } },
470         { 0x0502, { 0x0503, 0x0000, 0x0000, 0x0000 } },
471         { 0x0504, { 0x0505, 0x0000, 0x0000, 0x0000 } },
472         { 0x0506, { 0x0507, 0x0000, 0x0000, 0x0000 } },
473         { 0x0508, { 0x0509, 0x0000, 0x0000, 0x0000 } },
474         { 0x050A, { 0x050B, 0x0000, 0x0000, 0x0000 } },
475         { 0x050C, { 0x050D, 0x0000, 0x0000, 0x0000 } },
476         { 0x050E, { 0x050F, 0x0000, 0x0000, 0x0000 } },
477         { 0x0531, { 0x0561, 0x0000, 0x0000, 0x0000 } },
478         { 0x0532, { 0x0562, 0x0000, 0x0000, 0x0000 } },
479         { 0x0533, { 0x0563, 0x0000, 0x0000, 0x0000 } },
480         { 0x0534, { 0x0564, 0x0000, 0x0000, 0x0000 } },
481         { 0x0535, { 0x0565, 0x0000, 0x0000, 0x0000 } },
482         { 0x0536, { 0x0566, 0x0000, 0x0000, 0x0000 } },
483         { 0x0537, { 0x0567, 0x0000, 0x0000, 0x0000 } },
484         { 0x0538, { 0x0568, 0x0000, 0x0000, 0x0000 } },
485         { 0x0539, { 0x0569, 0x0000, 0x0000, 0x0000 } },
486         { 0x053A, { 0x056A, 0x0000, 0x0000, 0x0000 } },
487         { 0x053B, { 0x056B, 0x0000, 0x0000, 0x0000 } },
488         { 0x053C, { 0x056C, 0x0000, 0x0000, 0x0000 } },
489         { 0x053D, { 0x056D, 0x0000, 0x0000, 0x0000 } },
490         { 0x053E, { 0x056E, 0x0000, 0x0000, 0x0000 } },
491         { 0x053F, { 0x056F, 0x0000, 0x0000, 0x0000 } },
492         { 0x0540, { 0x0570, 0x0000, 0x0000, 0x0000 } },
493         { 0x0541, { 0x0571, 0x0000, 0x0000, 0x0000 } },
494         { 0x0542, { 0x0572, 0x0000, 0x0000, 0x0000 } },
495         { 0x0543, { 0x0573, 0x0000, 0x0000, 0x0000 } },
496         { 0x0544, { 0x0574, 0x0000, 0x0000, 0x0000 } },
497         { 0x0545, { 0x0575, 0x0000, 0x0000, 0x0000 } },
498         { 0x0546, { 0x0576, 0x0000, 0x0000, 0x0000 } },
499         { 0x0547, { 0x0577, 0x0000, 0x0000, 0x0000 } },
500         { 0x0548, { 0x0578, 0x0000, 0x0000, 0x0000 } },
501         { 0x0549, { 0x0579, 0x0000, 0x0000, 0x0000 } },
502         { 0x054A, { 0x057A, 0x0000, 0x0000, 0x0000 } },
503         { 0x054B, { 0x057B, 0x0000, 0x0000, 0x0000 } },
504         { 0x054C, { 0x057C, 0x0000, 0x0000, 0x0000 } },
505         { 0x054D, { 0x057D, 0x0000, 0x0000, 0x0000 } },
506         { 0x054E, { 0x057E, 0x0000, 0x0000, 0x0000 } },
507         { 0x054F, { 0x057F, 0x0000, 0x0000, 0x0000 } },
508         { 0x0550, { 0x0580, 0x0000, 0x0000, 0x0000 } },
509         { 0x0551, { 0x0581, 0x0000, 0x0000, 0x0000 } },
510         { 0x0552, { 0x0582, 0x0000, 0x0000, 0x0000 } },
511         { 0x0553, { 0x0583, 0x0000, 0x0000, 0x0000 } },
512         { 0x0554, { 0x0584, 0x0000, 0x0000, 0x0000 } },
513         { 0x0555, { 0x0585, 0x0000, 0x0000, 0x0000 } },
514         { 0x0556, { 0x0586, 0x0000, 0x0000, 0x0000 } },
515         { 0x0587, { 0x0565, 0x0582, 0x0000, 0x0000 } },
516         { 0x1E00, { 0x1E01, 0x0000, 0x0000, 0x0000 } },
517         { 0x1E02, { 0x1E03, 0x0000, 0x0000, 0x0000 } },
518         { 0x1E04, { 0x1E05, 0x0000, 0x0000, 0x0000 } },
519         { 0x1E06, { 0x1E07, 0x0000, 0x0000, 0x0000 } },
520         { 0x1E08, { 0x1E09, 0x0000, 0x0000, 0x0000 } },
521         { 0x1E0A, { 0x1E0B, 0x0000, 0x0000, 0x0000 } },
522         { 0x1E0C, { 0x1E0D, 0x0000, 0x0000, 0x0000 } },
523         { 0x1E0E, { 0x1E0F, 0x0000, 0x0000, 0x0000 } },
524         { 0x1E10, { 0x1E11, 0x0000, 0x0000, 0x0000 } },
525         { 0x1E12, { 0x1E13, 0x0000, 0x0000, 0x0000 } },
526         { 0x1E14, { 0x1E15, 0x0000, 0x0000, 0x0000 } },
527         { 0x1E16, { 0x1E17, 0x0000, 0x0000, 0x0000 } },
528         { 0x1E18, { 0x1E19, 0x0000, 0x0000, 0x0000 } },
529         { 0x1E1A, { 0x1E1B, 0x0000, 0x0000, 0x0000 } },
530         { 0x1E1C, { 0x1E1D, 0x0000, 0x0000, 0x0000 } },
531         { 0x1E1E, { 0x1E1F, 0x0000, 0x0000, 0x0000 } },
532         { 0x1E20, { 0x1E21, 0x0000, 0x0000, 0x0000 } },
533         { 0x1E22, { 0x1E23, 0x0000, 0x0000, 0x0000 } },
534         { 0x1E24, { 0x1E25, 0x0000, 0x0000, 0x0000 } },
535         { 0x1E26, { 0x1E27, 0x0000, 0x0000, 0x0000 } },
536         { 0x1E28, { 0x1E29, 0x0000, 0x0000, 0x0000 } },
537         { 0x1E2A, { 0x1E2B, 0x0000, 0x0000, 0x0000 } },
538         { 0x1E2C, { 0x1E2D, 0x0000, 0x0000, 0x0000 } },
539         { 0x1E2E, { 0x1E2F, 0x0000, 0x0000, 0x0000 } },
540         { 0x1E30, { 0x1E31, 0x0000, 0x0000, 0x0000 } },
541         { 0x1E32, { 0x1E33, 0x0000, 0x0000, 0x0000 } },
542         { 0x1E34, { 0x1E35, 0x0000, 0x0000, 0x0000 } },
543         { 0x1E36, { 0x1E37, 0x0000, 0x0000, 0x0000 } },
544         { 0x1E38, { 0x1E39, 0x0000, 0x0000, 0x0000 } },
545         { 0x1E3A, { 0x1E3B, 0x0000, 0x0000, 0x0000 } },
546         { 0x1E3C, { 0x1E3D, 0x0000, 0x0000, 0x0000 } },
547         { 0x1E3E, { 0x1E3F, 0x0000, 0x0000, 0x0000 } },
548         { 0x1E40, { 0x1E41, 0x0000, 0x0000, 0x0000 } },
549         { 0x1E42, { 0x1E43, 0x0000, 0x0000, 0x0000 } },
550         { 0x1E44, { 0x1E45, 0x0000, 0x0000, 0x0000 } },
551         { 0x1E46, { 0x1E47, 0x0000, 0x0000, 0x0000 } },
552         { 0x1E48, { 0x1E49, 0x0000, 0x0000, 0x0000 } },
553         { 0x1E4A, { 0x1E4B, 0x0000, 0x0000, 0x0000 } },
554         { 0x1E4C, { 0x1E4D, 0x0000, 0x0000, 0x0000 } },
555         { 0x1E4E, { 0x1E4F, 0x0000, 0x0000, 0x0000 } },
556         { 0x1E50, { 0x1E51, 0x0000, 0x0000, 0x0000 } },
557         { 0x1E52, { 0x1E53, 0x0000, 0x0000, 0x0000 } },
558         { 0x1E54, { 0x1E55, 0x0000, 0x0000, 0x0000 } },
559         { 0x1E56, { 0x1E57, 0x0000, 0x0000, 0x0000 } },
560         { 0x1E58, { 0x1E59, 0x0000, 0x0000, 0x0000 } },
561         { 0x1E5A, { 0x1E5B, 0x0000, 0x0000, 0x0000 } },
562         { 0x1E5C, { 0x1E5D, 0x0000, 0x0000, 0x0000 } },
563         { 0x1E5E, { 0x1E5F, 0x0000, 0x0000, 0x0000 } },
564         { 0x1E60, { 0x1E61, 0x0000, 0x0000, 0x0000 } },
565         { 0x1E62, { 0x1E63, 0x0000, 0x0000, 0x0000 } },
566         { 0x1E64, { 0x1E65, 0x0000, 0x0000, 0x0000 } },
567         { 0x1E66, { 0x1E67, 0x0000, 0x0000, 0x0000 } },
568         { 0x1E68, { 0x1E69, 0x0000, 0x0000, 0x0000 } },
569         { 0x1E6A, { 0x1E6B, 0x0000, 0x0000, 0x0000 } },
570         { 0x1E6C, { 0x1E6D, 0x0000, 0x0000, 0x0000 } },
571         { 0x1E6E, { 0x1E6F, 0x0000, 0x0000, 0x0000 } },
572         { 0x1E70, { 0x1E71, 0x0000, 0x0000, 0x0000 } },
573         { 0x1E72, { 0x1E73, 0x0000, 0x0000, 0x0000 } },
574         { 0x1E74, { 0x1E75, 0x0000, 0x0000, 0x0000 } },
575         { 0x1E76, { 0x1E77, 0x0000, 0x0000, 0x0000 } },
576         { 0x1E78, { 0x1E79, 0x0000, 0x0000, 0x0000 } },
577         { 0x1E7A, { 0x1E7B, 0x0000, 0x0000, 0x0000 } },
578         { 0x1E7C, { 0x1E7D, 0x0000, 0x0000, 0x0000 } },
579         { 0x1E7E, { 0x1E7F, 0x0000, 0x0000, 0x0000 } },
580         { 0x1E80, { 0x1E81, 0x0000, 0x0000, 0x0000 } },
581         { 0x1E82, { 0x1E83, 0x0000, 0x0000, 0x0000 } },
582         { 0x1E84, { 0x1E85, 0x0000, 0x0000, 0x0000 } },
583         { 0x1E86, { 0x1E87, 0x0000, 0x0000, 0x0000 } },
584         { 0x1E88, { 0x1E89, 0x0000, 0x0000, 0x0000 } },
585         { 0x1E8A, { 0x1E8B, 0x0000, 0x0000, 0x0000 } },
586         { 0x1E8C, { 0x1E8D, 0x0000, 0x0000, 0x0000 } },
587         { 0x1E8E, { 0x1E8F, 0x0000, 0x0000, 0x0000 } },
588         { 0x1E90, { 0x1E91, 0x0000, 0x0000, 0x0000 } },
589         { 0x1E92, { 0x1E93, 0x0000, 0x0000, 0x0000 } },
590         { 0x1E94, { 0x1E95, 0x0000, 0x0000, 0x0000 } },
591         { 0x1E96, { 0x0068, 0x0331, 0x0000, 0x0000 } },
592         { 0x1E97, { 0x0074, 0x0308, 0x0000, 0x0000 } },
593         { 0x1E98, { 0x0077, 0x030A, 0x0000, 0x0000 } },
594         { 0x1E99, { 0x0079, 0x030A, 0x0000, 0x0000 } },
595         { 0x1E9A, { 0x0061, 0x02BE, 0x0000, 0x0000 } },
596         { 0x1E9B, { 0x1E61, 0x0000, 0x0000, 0x0000 } },
597         { 0x1EA0, { 0x1EA1, 0x0000, 0x0000, 0x0000 } },
598         { 0x1EA2, { 0x1EA3, 0x0000, 0x0000, 0x0000 } },
599         { 0x1EA4, { 0x1EA5, 0x0000, 0x0000, 0x0000 } },
600         { 0x1EA6, { 0x1EA7, 0x0000, 0x0000, 0x0000 } },
601         { 0x1EA8, { 0x1EA9, 0x0000, 0x0000, 0x0000 } },
602         { 0x1EAA, { 0x1EAB, 0x0000, 0x0000, 0x0000 } },
603         { 0x1EAC, { 0x1EAD, 0x0000, 0x0000, 0x0000 } },
604         { 0x1EAE, { 0x1EAF, 0x0000, 0x0000, 0x0000 } },
605         { 0x1EB0, { 0x1EB1, 0x0000, 0x0000, 0x0000 } },
606         { 0x1EB2, { 0x1EB3, 0x0000, 0x0000, 0x0000 } },
607         { 0x1EB4, { 0x1EB5, 0x0000, 0x0000, 0x0000 } },
608         { 0x1EB6, { 0x1EB7, 0x0000, 0x0000, 0x0000 } },
609         { 0x1EB8, { 0x1EB9, 0x0000, 0x0000, 0x0000 } },
610         { 0x1EBA, { 0x1EBB, 0x0000, 0x0000, 0x0000 } },
611         { 0x1EBC, { 0x1EBD, 0x0000, 0x0000, 0x0000 } },
612         { 0x1EBE, { 0x1EBF, 0x0000, 0x0000, 0x0000 } },
613         { 0x1EC0, { 0x1EC1, 0x0000, 0x0000, 0x0000 } },
614         { 0x1EC2, { 0x1EC3, 0x0000, 0x0000, 0x0000 } },
615         { 0x1EC4, { 0x1EC5, 0x0000, 0x0000, 0x0000 } },
616         { 0x1EC6, { 0x1EC7, 0x0000, 0x0000, 0x0000 } },
617         { 0x1EC8, { 0x1EC9, 0x0000, 0x0000, 0x0000 } },
618         { 0x1ECA, { 0x1ECB, 0x0000, 0x0000, 0x0000 } },
619         { 0x1ECC, { 0x1ECD, 0x0000, 0x0000, 0x0000 } },
620         { 0x1ECE, { 0x1ECF, 0x0000, 0x0000, 0x0000 } },
621         { 0x1ED0, { 0x1ED1, 0x0000, 0x0000, 0x0000 } },
622         { 0x1ED2, { 0x1ED3, 0x0000, 0x0000, 0x0000 } },
623         { 0x1ED4, { 0x1ED5, 0x0000, 0x0000, 0x0000 } },
624         { 0x1ED6, { 0x1ED7, 0x0000, 0x0000, 0x0000 } },
625         { 0x1ED8, { 0x1ED9, 0x0000, 0x0000, 0x0000 } },
626         { 0x1EDA, { 0x1EDB, 0x0000, 0x0000, 0x0000 } },
627         { 0x1EDC, { 0x1EDD, 0x0000, 0x0000, 0x0000 } },
628         { 0x1EDE, { 0x1EDF, 0x0000, 0x0000, 0x0000 } },
629         { 0x1EE0, { 0x1EE1, 0x0000, 0x0000, 0x0000 } },
630         { 0x1EE2, { 0x1EE3, 0x0000, 0x0000, 0x0000 } },
631         { 0x1EE4, { 0x1EE5, 0x0000, 0x0000, 0x0000 } },
632         { 0x1EE6, { 0x1EE7, 0x0000, 0x0000, 0x0000 } },
633         { 0x1EE8, { 0x1EE9, 0x0000, 0x0000, 0x0000 } },
634         { 0x1EEA, { 0x1EEB, 0x0000, 0x0000, 0x0000 } },
635         { 0x1EEC, { 0x1EED, 0x0000, 0x0000, 0x0000 } },
636         { 0x1EEE, { 0x1EEF, 0x0000, 0x0000, 0x0000 } },
637         { 0x1EF0, { 0x1EF1, 0x0000, 0x0000, 0x0000 } },
638         { 0x1EF2, { 0x1EF3, 0x0000, 0x0000, 0x0000 } },
639         { 0x1EF4, { 0x1EF5, 0x0000, 0x0000, 0x0000 } },
640         { 0x1EF6, { 0x1EF7, 0x0000, 0x0000, 0x0000 } },
641         { 0x1EF8, { 0x1EF9, 0x0000, 0x0000, 0x0000 } },
642         { 0x1F08, { 0x1F00, 0x0000, 0x0000, 0x0000 } },
643         { 0x1F09, { 0x1F01, 0x0000, 0x0000, 0x0000 } },
644         { 0x1F0A, { 0x1F02, 0x0000, 0x0000, 0x0000 } },
645         { 0x1F0B, { 0x1F03, 0x0000, 0x0000, 0x0000 } },
646         { 0x1F0C, { 0x1F04, 0x0000, 0x0000, 0x0000 } },
647         { 0x1F0D, { 0x1F05, 0x0000, 0x0000, 0x0000 } },
648         { 0x1F0E, { 0x1F06, 0x0000, 0x0000, 0x0000 } },
649         { 0x1F0F, { 0x1F07, 0x0000, 0x0000, 0x0000 } },
650         { 0x1F18, { 0x1F10, 0x0000, 0x0000, 0x0000 } },
651         { 0x1F19, { 0x1F11, 0x0000, 0x0000, 0x0000 } },
652         { 0x1F1A, { 0x1F12, 0x0000, 0x0000, 0x0000 } },
653         { 0x1F1B, { 0x1F13, 0x0000, 0x0000, 0x0000 } },
654         { 0x1F1C, { 0x1F14, 0x0000, 0x0000, 0x0000 } },
655         { 0x1F1D, { 0x1F15, 0x0000, 0x0000, 0x0000 } },
656         { 0x1F28, { 0x1F20, 0x0000, 0x0000, 0x0000 } },
657         { 0x1F29, { 0x1F21, 0x0000, 0x0000, 0x0000 } },
658         { 0x1F2A, { 0x1F22, 0x0000, 0x0000, 0x0000 } },
659         { 0x1F2B, { 0x1F23, 0x0000, 0x0000, 0x0000 } },
660         { 0x1F2C, { 0x1F24, 0x0000, 0x0000, 0x0000 } },
661         { 0x1F2D, { 0x1F25, 0x0000, 0x0000, 0x0000 } },
662         { 0x1F2E, { 0x1F26, 0x0000, 0x0000, 0x0000 } },
663         { 0x1F2F, { 0x1F27, 0x0000, 0x0000, 0x0000 } },
664         { 0x1F38, { 0x1F30, 0x0000, 0x0000, 0x0000 } },
665         { 0x1F39, { 0x1F31, 0x0000, 0x0000, 0x0000 } },
666         { 0x1F3A, { 0x1F32, 0x0000, 0x0000, 0x0000 } },
667         { 0x1F3B, { 0x1F33, 0x0000, 0x0000, 0x0000 } },
668         { 0x1F3C, { 0x1F34, 0x0000, 0x0000, 0x0000 } },
669         { 0x1F3D, { 0x1F35, 0x0000, 0x0000, 0x0000 } },
670         { 0x1F3E, { 0x1F36, 0x0000, 0x0000, 0x0000 } },
671         { 0x1F3F, { 0x1F37, 0x0000, 0x0000, 0x0000 } },
672         { 0x1F48, { 0x1F40, 0x0000, 0x0000, 0x0000 } },
673         { 0x1F49, { 0x1F41, 0x0000, 0x0000, 0x0000 } },
674         { 0x1F4A, { 0x1F42, 0x0000, 0x0000, 0x0000 } },
675         { 0x1F4B, { 0x1F43, 0x0000, 0x0000, 0x0000 } },
676         { 0x1F4C, { 0x1F44, 0x0000, 0x0000, 0x0000 } },
677         { 0x1F4D, { 0x1F45, 0x0000, 0x0000, 0x0000 } },
678         { 0x1F50, { 0x03C5, 0x0313, 0x0000, 0x0000 } },
679         { 0x1F52, { 0x03C5, 0x0313, 0x0300, 0x0000 } },
680         { 0x1F54, { 0x03C5, 0x0313, 0x0301, 0x0000 } },
681         { 0x1F56, { 0x03C5, 0x0313, 0x0342, 0x0000 } },
682         { 0x1F59, { 0x1F51, 0x0000, 0x0000, 0x0000 } },
683         { 0x1F5B, { 0x1F53, 0x0000, 0x0000, 0x0000 } },
684         { 0x1F5D, { 0x1F55, 0x0000, 0x0000, 0x0000 } },
685         { 0x1F5F, { 0x1F57, 0x0000, 0x0000, 0x0000 } },
686         { 0x1F68, { 0x1F60, 0x0000, 0x0000, 0x0000 } },
687         { 0x1F69, { 0x1F61, 0x0000, 0x0000, 0x0000 } },
688         { 0x1F6A, { 0x1F62, 0x0000, 0x0000, 0x0000 } },
689         { 0x1F6B, { 0x1F63, 0x0000, 0x0000, 0x0000 } },
690         { 0x1F6C, { 0x1F64, 0x0000, 0x0000, 0x0000 } },
691         { 0x1F6D, { 0x1F65, 0x0000, 0x0000, 0x0000 } },
692         { 0x1F6E, { 0x1F66, 0x0000, 0x0000, 0x0000 } },
693         { 0x1F6F, { 0x1F67, 0x0000, 0x0000, 0x0000 } },
694         { 0x1F80, { 0x1F00, 0x03B9, 0x0000, 0x0000 } },
695         { 0x1F81, { 0x1F01, 0x03B9, 0x0000, 0x0000 } },
696         { 0x1F82, { 0x1F02, 0x03B9, 0x0000, 0x0000 } },
697         { 0x1F83, { 0x1F03, 0x03B9, 0x0000, 0x0000 } },
698         { 0x1F84, { 0x1F04, 0x03B9, 0x0000, 0x0000 } },
699         { 0x1F85, { 0x1F05, 0x03B9, 0x0000, 0x0000 } },
700         { 0x1F86, { 0x1F06, 0x03B9, 0x0000, 0x0000 } },
701         { 0x1F87, { 0x1F07, 0x03B9, 0x0000, 0x0000 } },
702         { 0x1F88, { 0x1F00, 0x03B9, 0x0000, 0x0000 } },
703         { 0x1F89, { 0x1F01, 0x03B9, 0x0000, 0x0000 } },
704         { 0x1F8A, { 0x1F02, 0x03B9, 0x0000, 0x0000 } },
705         { 0x1F8B, { 0x1F03, 0x03B9, 0x0000, 0x0000 } },
706         { 0x1F8C, { 0x1F04, 0x03B9, 0x0000, 0x0000 } },
707         { 0x1F8D, { 0x1F05, 0x03B9, 0x0000, 0x0000 } },
708         { 0x1F8E, { 0x1F06, 0x03B9, 0x0000, 0x0000 } },
709         { 0x1F8F, { 0x1F07, 0x03B9, 0x0000, 0x0000 } },
710         { 0x1F90, { 0x1F20, 0x03B9, 0x0000, 0x0000 } },
711         { 0x1F91, { 0x1F21, 0x03B9, 0x0000, 0x0000 } },
712         { 0x1F92, { 0x1F22, 0x03B9, 0x0000, 0x0000 } },
713         { 0x1F93, { 0x1F23, 0x03B9, 0x0000, 0x0000 } },
714         { 0x1F94, { 0x1F24, 0x03B9, 0x0000, 0x0000 } },
715         { 0x1F95, { 0x1F25, 0x03B9, 0x0000, 0x0000 } },
716         { 0x1F96, { 0x1F26, 0x03B9, 0x0000, 0x0000 } },
717         { 0x1F97, { 0x1F27, 0x03B9, 0x0000, 0x0000 } },
718         { 0x1F98, { 0x1F20, 0x03B9, 0x0000, 0x0000 } },
719         { 0x1F99, { 0x1F21, 0x03B9, 0x0000, 0x0000 } },
720         { 0x1F9A, { 0x1F22, 0x03B9, 0x0000, 0x0000 } },
721         { 0x1F9B, { 0x1F23, 0x03B9, 0x0000, 0x0000 } },
722         { 0x1F9C, { 0x1F24, 0x03B9, 0x0000, 0x0000 } },
723         { 0x1F9D, { 0x1F25, 0x03B9, 0x0000, 0x0000 } },
724         { 0x1F9E, { 0x1F26, 0x03B9, 0x0000, 0x0000 } },
725         { 0x1F9F, { 0x1F27, 0x03B9, 0x0000, 0x0000 } },
726         { 0x1FA0, { 0x1F60, 0x03B9, 0x0000, 0x0000 } },
727         { 0x1FA1, { 0x1F61, 0x03B9, 0x0000, 0x0000 } },
728         { 0x1FA2, { 0x1F62, 0x03B9, 0x0000, 0x0000 } },
729         { 0x1FA3, { 0x1F63, 0x03B9, 0x0000, 0x0000 } },
730         { 0x1FA4, { 0x1F64, 0x03B9, 0x0000, 0x0000 } },
731         { 0x1FA5, { 0x1F65, 0x03B9, 0x0000, 0x0000 } },
732         { 0x1FA6, { 0x1F66, 0x03B9, 0x0000, 0x0000 } },
733         { 0x1FA7, { 0x1F67, 0x03B9, 0x0000, 0x0000 } },
734         { 0x1FA8, { 0x1F60, 0x03B9, 0x0000, 0x0000 } },
735         { 0x1FA9, { 0x1F61, 0x03B9, 0x0000, 0x0000 } },
736         { 0x1FAA, { 0x1F62, 0x03B9, 0x0000, 0x0000 } },
737         { 0x1FAB, { 0x1F63, 0x03B9, 0x0000, 0x0000 } },
738         { 0x1FAC, { 0x1F64, 0x03B9, 0x0000, 0x0000 } },
739         { 0x1FAD, { 0x1F65, 0x03B9, 0x0000, 0x0000 } },
740         { 0x1FAE, { 0x1F66, 0x03B9, 0x0000, 0x0000 } },
741         { 0x1FAF, { 0x1F67, 0x03B9, 0x0000, 0x0000 } },
742         { 0x1FB2, { 0x1F70, 0x03B9, 0x0000, 0x0000 } },
743         { 0x1FB3, { 0x03B1, 0x03B9, 0x0000, 0x0000 } },
744         { 0x1FB4, { 0x03AC, 0x03B9, 0x0000, 0x0000 } },
745         { 0x1FB6, { 0x03B1, 0x0342, 0x0000, 0x0000 } },
746         { 0x1FB7, { 0x03B1, 0x0342, 0x03B9, 0x0000 } },
747         { 0x1FB8, { 0x1FB0, 0x0000, 0x0000, 0x0000 } },
748         { 0x1FB9, { 0x1FB1, 0x0000, 0x0000, 0x0000 } },
749         { 0x1FBA, { 0x1F70, 0x0000, 0x0000, 0x0000 } },
750         { 0x1FBB, { 0x1F71, 0x0000, 0x0000, 0x0000 } },
751         { 0x1FBC, { 0x03B1, 0x03B9, 0x0000, 0x0000 } },
752         { 0x1FBE, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
753         { 0x1FC2, { 0x1F74, 0x03B9, 0x0000, 0x0000 } },
754         { 0x1FC3, { 0x03B7, 0x03B9, 0x0000, 0x0000 } },
755         { 0x1FC4, { 0x03AE, 0x03B9, 0x0000, 0x0000 } },
756         { 0x1FC6, { 0x03B7, 0x0342, 0x0000, 0x0000 } },
757         { 0x1FC7, { 0x03B7, 0x0342, 0x03B9, 0x0000 } },
758         { 0x1FC8, { 0x1F72, 0x0000, 0x0000, 0x0000 } },
759         { 0x1FC9, { 0x1F73, 0x0000, 0x0000, 0x0000 } },
760         { 0x1FCA, { 0x1F74, 0x0000, 0x0000, 0x0000 } },
761         { 0x1FCB, { 0x1F75, 0x0000, 0x0000, 0x0000 } },
762         { 0x1FCC, { 0x03B7, 0x03B9, 0x0000, 0x0000 } },
763         { 0x1FD2, { 0x03B9, 0x0308, 0x0300, 0x0000 } },
764         { 0x1FD3, { 0x03B9, 0x0308, 0x0301, 0x0000 } },
765         { 0x1FD6, { 0x03B9, 0x0342, 0x0000, 0x0000 } },
766         { 0x1FD7, { 0x03B9, 0x0308, 0x0342, 0x0000 } },
767         { 0x1FD8, { 0x1FD0, 0x0000, 0x0000, 0x0000 } },
768         { 0x1FD9, { 0x1FD1, 0x0000, 0x0000, 0x0000 } },
769         { 0x1FDA, { 0x1F76, 0x0000, 0x0000, 0x0000 } },
770         { 0x1FDB, { 0x1F77, 0x0000, 0x0000, 0x0000 } },
771         { 0x1FE2, { 0x03C5, 0x0308, 0x0300, 0x0000 } },
772         { 0x1FE3, { 0x03C5, 0x0308, 0x0301, 0x0000 } },
773         { 0x1FE4, { 0x03C1, 0x0313, 0x0000, 0x0000 } },
774         { 0x1FE6, { 0x03C5, 0x0342, 0x0000, 0x0000 } },
775         { 0x1FE7, { 0x03C5, 0x0308, 0x0342, 0x0000 } },
776         { 0x1FE8, { 0x1FE0, 0x0000, 0x0000, 0x0000 } },
777         { 0x1FE9, { 0x1FE1, 0x0000, 0x0000, 0x0000 } },
778         { 0x1FEA, { 0x1F7A, 0x0000, 0x0000, 0x0000 } },
779         { 0x1FEB, { 0x1F7B, 0x0000, 0x0000, 0x0000 } },
780         { 0x1FEC, { 0x1FE5, 0x0000, 0x0000, 0x0000 } },
781         { 0x1FF2, { 0x1F7C, 0x03B9, 0x0000, 0x0000 } },
782         { 0x1FF3, { 0x03C9, 0x03B9, 0x0000, 0x0000 } },
783         { 0x1FF4, { 0x03CE, 0x03B9, 0x0000, 0x0000 } },
784         { 0x1FF6, { 0x03C9, 0x0342, 0x0000, 0x0000 } },
785         { 0x1FF7, { 0x03C9, 0x0342, 0x03B9, 0x0000 } },
786         { 0x1FF8, { 0x1F78, 0x0000, 0x0000, 0x0000 } },
787         { 0x1FF9, { 0x1F79, 0x0000, 0x0000, 0x0000 } },
788         { 0x1FFA, { 0x1F7C, 0x0000, 0x0000, 0x0000 } },
789         { 0x1FFB, { 0x1F7D, 0x0000, 0x0000, 0x0000 } },
790         { 0x1FFC, { 0x03C9, 0x03B9, 0x0000, 0x0000 } },
791         { 0x20A8, { 0x0072, 0x0073, 0x0000, 0x0000 } },
792         { 0x2102, { 0x0063, 0x0000, 0x0000, 0x0000 } },
793         { 0x2103, { 0x00B0, 0x0063, 0x0000, 0x0000 } },
794         { 0x2107, { 0x025B, 0x0000, 0x0000, 0x0000 } },
795         { 0x2109, { 0x00B0, 0x0066, 0x0000, 0x0000 } },
796         { 0x210B, { 0x0068, 0x0000, 0x0000, 0x0000 } },
797         { 0x210C, { 0x0068, 0x0000, 0x0000, 0x0000 } },
798         { 0x210D, { 0x0068, 0x0000, 0x0000, 0x0000 } },
799         { 0x2110, { 0x0069, 0x0000, 0x0000, 0x0000 } },
800         { 0x2111, { 0x0069, 0x0000, 0x0000, 0x0000 } },
801         { 0x2112, { 0x006C, 0x0000, 0x0000, 0x0000 } },
802         { 0x2115, { 0x006E, 0x0000, 0x0000, 0x0000 } },
803         { 0x2116, { 0x006E, 0x006F, 0x0000, 0x0000 } },
804         { 0x2119, { 0x0070, 0x0000, 0x0000, 0x0000 } },
805         { 0x211A, { 0x0071, 0x0000, 0x0000, 0x0000 } },
806         { 0x211B, { 0x0072, 0x0000, 0x0000, 0x0000 } },
807         { 0x211C, { 0x0072, 0x0000, 0x0000, 0x0000 } },
808         { 0x211D, { 0x0072, 0x0000, 0x0000, 0x0000 } },
809         { 0x2120, { 0x0073, 0x006D, 0x0000, 0x0000 } },
810         { 0x2121, { 0x0074, 0x0065, 0x006C, 0x0000 } },
811         { 0x2122, { 0x0074, 0x006D, 0x0000, 0x0000 } },
812         { 0x2124, { 0x007A, 0x0000, 0x0000, 0x0000 } },
813         { 0x2126, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
814         { 0x2128, { 0x007A, 0x0000, 0x0000, 0x0000 } },
815         { 0x212A, { 0x006B, 0x0000, 0x0000, 0x0000 } },
816         { 0x212B, { 0x00E5, 0x0000, 0x0000, 0x0000 } },
817         { 0x212C, { 0x0062, 0x0000, 0x0000, 0x0000 } },
818         { 0x212D, { 0x0063, 0x0000, 0x0000, 0x0000 } },
819         { 0x2130, { 0x0065, 0x0000, 0x0000, 0x0000 } },
820         { 0x2131, { 0x0066, 0x0000, 0x0000, 0x0000 } },
821         { 0x2133, { 0x006D, 0x0000, 0x0000, 0x0000 } },
822         { 0x213E, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
823         { 0x213F, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
824         { 0x2145, { 0x0064, 0x0000, 0x0000, 0x0000 } },
825         { 0x2160, { 0x2170, 0x0000, 0x0000, 0x0000 } },
826         { 0x2161, { 0x2171, 0x0000, 0x0000, 0x0000 } },
827         { 0x2162, { 0x2172, 0x0000, 0x0000, 0x0000 } },
828         { 0x2163, { 0x2173, 0x0000, 0x0000, 0x0000 } },
829         { 0x2164, { 0x2174, 0x0000, 0x0000, 0x0000 } },
830         { 0x2165, { 0x2175, 0x0000, 0x0000, 0x0000 } },
831         { 0x2166, { 0x2176, 0x0000, 0x0000, 0x0000 } },
832         { 0x2167, { 0x2177, 0x0000, 0x0000, 0x0000 } },
833         { 0x2168, { 0x2178, 0x0000, 0x0000, 0x0000 } },
834         { 0x2169, { 0x2179, 0x0000, 0x0000, 0x0000 } },
835         { 0x216A, { 0x217A, 0x0000, 0x0000, 0x0000 } },
836         { 0x216B, { 0x217B, 0x0000, 0x0000, 0x0000 } },
837         { 0x216C, { 0x217C, 0x0000, 0x0000, 0x0000 } },
838         { 0x216D, { 0x217D, 0x0000, 0x0000, 0x0000 } },
839         { 0x216E, { 0x217E, 0x0000, 0x0000, 0x0000 } },
840         { 0x216F, { 0x217F, 0x0000, 0x0000, 0x0000 } },
841         { 0x24B6, { 0x24D0, 0x0000, 0x0000, 0x0000 } },
842         { 0x24B7, { 0x24D1, 0x0000, 0x0000, 0x0000 } },
843         { 0x24B8, { 0x24D2, 0x0000, 0x0000, 0x0000 } },
844         { 0x24B9, { 0x24D3, 0x0000, 0x0000, 0x0000 } },
845         { 0x24BA, { 0x24D4, 0x0000, 0x0000, 0x0000 } },
846         { 0x24BB, { 0x24D5, 0x0000, 0x0000, 0x0000 } },
847         { 0x24BC, { 0x24D6, 0x0000, 0x0000, 0x0000 } },
848         { 0x24BD, { 0x24D7, 0x0000, 0x0000, 0x0000 } },
849         { 0x24BE, { 0x24D8, 0x0000, 0x0000, 0x0000 } },
850         { 0x24BF, { 0x24D9, 0x0000, 0x0000, 0x0000 } },
851         { 0x24C0, { 0x24DA, 0x0000, 0x0000, 0x0000 } },
852         { 0x24C1, { 0x24DB, 0x0000, 0x0000, 0x0000 } },
853         { 0x24C2, { 0x24DC, 0x0000, 0x0000, 0x0000 } },
854         { 0x24C3, { 0x24DD, 0x0000, 0x0000, 0x0000 } },
855         { 0x24C4, { 0x24DE, 0x0000, 0x0000, 0x0000 } },
856         { 0x24C5, { 0x24DF, 0x0000, 0x0000, 0x0000 } },
857         { 0x24C6, { 0x24E0, 0x0000, 0x0000, 0x0000 } },
858         { 0x24C7, { 0x24E1, 0x0000, 0x0000, 0x0000 } },
859         { 0x24C8, { 0x24E2, 0x0000, 0x0000, 0x0000 } },
860         { 0x24C9, { 0x24E3, 0x0000, 0x0000, 0x0000 } },
861         { 0x24CA, { 0x24E4, 0x0000, 0x0000, 0x0000 } },
862         { 0x24CB, { 0x24E5, 0x0000, 0x0000, 0x0000 } },
863         { 0x24CC, { 0x24E6, 0x0000, 0x0000, 0x0000 } },
864         { 0x24CD, { 0x24E7, 0x0000, 0x0000, 0x0000 } },
865         { 0x24CE, { 0x24E8, 0x0000, 0x0000, 0x0000 } },
866         { 0x24CF, { 0x24E9, 0x0000, 0x0000, 0x0000 } },
867         { 0x3371, { 0x0068, 0x0070, 0x0061, 0x0000 } },
868         { 0x3373, { 0x0061, 0x0075, 0x0000, 0x0000 } },
869         { 0x3375, { 0x006F, 0x0076, 0x0000, 0x0000 } },
870         { 0x3380, { 0x0070, 0x0061, 0x0000, 0x0000 } },
871         { 0x3381, { 0x006E, 0x0061, 0x0000, 0x0000 } },
872         { 0x3382, { 0x03BC, 0x0061, 0x0000, 0x0000 } },
873         { 0x3383, { 0x006D, 0x0061, 0x0000, 0x0000 } },
874         { 0x3384, { 0x006B, 0x0061, 0x0000, 0x0000 } },
875         { 0x3385, { 0x006B, 0x0062, 0x0000, 0x0000 } },
876         { 0x3386, { 0x006D, 0x0062, 0x0000, 0x0000 } },
877         { 0x3387, { 0x0067, 0x0062, 0x0000, 0x0000 } },
878         { 0x338A, { 0x0070, 0x0066, 0x0000, 0x0000 } },
879         { 0x338B, { 0x006E, 0x0066, 0x0000, 0x0000 } },
880         { 0x338C, { 0x03BC, 0x0066, 0x0000, 0x0000 } },
881         { 0x3390, { 0x0068, 0x007A, 0x0000, 0x0000 } },
882         { 0x3391, { 0x006B, 0x0068, 0x007A, 0x0000 } },
883         { 0x3392, { 0x006D, 0x0068, 0x007A, 0x0000 } },
884         { 0x3393, { 0x0067, 0x0068, 0x007A, 0x0000 } },
885         { 0x3394, { 0x0074, 0x0068, 0x007A, 0x0000 } },
886         { 0x33A9, { 0x0070, 0x0061, 0x0000, 0x0000 } },
887         { 0x33AA, { 0x006B, 0x0070, 0x0061, 0x0000 } },
888         { 0x33AB, { 0x006D, 0x0070, 0x0061, 0x0000 } },
889         { 0x33AC, { 0x0067, 0x0070, 0x0061, 0x0000 } },
890         { 0x33B4, { 0x0070, 0x0076, 0x0000, 0x0000 } },
891         { 0x33B5, { 0x006E, 0x0076, 0x0000, 0x0000 } },
892         { 0x33B6, { 0x03BC, 0x0076, 0x0000, 0x0000 } },
893         { 0x33B7, { 0x006D, 0x0076, 0x0000, 0x0000 } },
894         { 0x33B8, { 0x006B, 0x0076, 0x0000, 0x0000 } },
895         { 0x33B9, { 0x006D, 0x0076, 0x0000, 0x0000 } },
896         { 0x33BA, { 0x0070, 0x0077, 0x0000, 0x0000 } },
897         { 0x33BB, { 0x006E, 0x0077, 0x0000, 0x0000 } },
898         { 0x33BC, { 0x03BC, 0x0077, 0x0000, 0x0000 } },
899         { 0x33BD, { 0x006D, 0x0077, 0x0000, 0x0000 } },
900         { 0x33BE, { 0x006B, 0x0077, 0x0000, 0x0000 } },
901         { 0x33BF, { 0x006D, 0x0077, 0x0000, 0x0000 } },
902         { 0x33C0, { 0x006B, 0x03C9, 0x0000, 0x0000 } },
903         { 0x33C1, { 0x006D, 0x03C9, 0x0000, 0x0000 } },
904         { 0x33C3, { 0x0062, 0x0071, 0x0000, 0x0000 } },
905         { 0x33C6, { 0x0063, 0x2215, 0x006B, 0x0067 } },
906         { 0x33C7, { 0x0063, 0x006F, 0x002E, 0x0000 } },
907         { 0x33C8, { 0x0064, 0x0062, 0x0000, 0x0000 } },
908         { 0x33C9, { 0x0067, 0x0079, 0x0000, 0x0000 } },
909         { 0x33CB, { 0x0068, 0x0070, 0x0000, 0x0000 } },
910         { 0x33CD, { 0x006B, 0x006B, 0x0000, 0x0000 } },
911         { 0x33CE, { 0x006B, 0x006D, 0x0000, 0x0000 } },
912         { 0x33D7, { 0x0070, 0x0068, 0x0000, 0x0000 } },
913         { 0x33D9, { 0x0070, 0x0070, 0x006D, 0x0000 } },
914         { 0x33DA, { 0x0070, 0x0072, 0x0000, 0x0000 } },
915         { 0x33DC, { 0x0073, 0x0076, 0x0000, 0x0000 } },
916         { 0x33DD, { 0x0077, 0x0062, 0x0000, 0x0000 } },
917         { 0xFB00, { 0x0066, 0x0066, 0x0000, 0x0000 } },
918         { 0xFB01, { 0x0066, 0x0069, 0x0000, 0x0000 } },
919         { 0xFB02, { 0x0066, 0x006C, 0x0000, 0x0000 } },
920         { 0xFB03, { 0x0066, 0x0066, 0x0069, 0x0000 } },
921         { 0xFB04, { 0x0066, 0x0066, 0x006C, 0x0000 } },
922         { 0xFB05, { 0x0073, 0x0074, 0x0000, 0x0000 } },
923         { 0xFB06, { 0x0073, 0x0074, 0x0000, 0x0000 } },
924         { 0xFB13, { 0x0574, 0x0576, 0x0000, 0x0000 } },
925         { 0xFB14, { 0x0574, 0x0565, 0x0000, 0x0000 } },
926         { 0xFB15, { 0x0574, 0x056B, 0x0000, 0x0000 } },
927         { 0xFB16, { 0x057E, 0x0576, 0x0000, 0x0000 } },
928         { 0xFB17, { 0x0574, 0x056D, 0x0000, 0x0000 } },
929         { 0xFF21, { 0xFF41, 0x0000, 0x0000, 0x0000 } },
930         { 0xFF22, { 0xFF42, 0x0000, 0x0000, 0x0000 } },
931         { 0xFF23, { 0xFF43, 0x0000, 0x0000, 0x0000 } },
932         { 0xFF24, { 0xFF44, 0x0000, 0x0000, 0x0000 } },
933         { 0xFF25, { 0xFF45, 0x0000, 0x0000, 0x0000 } },
934         { 0xFF26, { 0xFF46, 0x0000, 0x0000, 0x0000 } },
935         { 0xFF27, { 0xFF47, 0x0000, 0x0000, 0x0000 } },
936         { 0xFF28, { 0xFF48, 0x0000, 0x0000, 0x0000 } },
937         { 0xFF29, { 0xFF49, 0x0000, 0x0000, 0x0000 } },
938         { 0xFF2A, { 0xFF4A, 0x0000, 0x0000, 0x0000 } },
939         { 0xFF2B, { 0xFF4B, 0x0000, 0x0000, 0x0000 } },
940         { 0xFF2C, { 0xFF4C, 0x0000, 0x0000, 0x0000 } },
941         { 0xFF2D, { 0xFF4D, 0x0000, 0x0000, 0x0000 } },
942         { 0xFF2E, { 0xFF4E, 0x0000, 0x0000, 0x0000 } },
943         { 0xFF2F, { 0xFF4F, 0x0000, 0x0000, 0x0000 } },
944         { 0xFF30, { 0xFF50, 0x0000, 0x0000, 0x0000 } },
945         { 0xFF31, { 0xFF51, 0x0000, 0x0000, 0x0000 } },
946         { 0xFF32, { 0xFF52, 0x0000, 0x0000, 0x0000 } },
947         { 0xFF33, { 0xFF53, 0x0000, 0x0000, 0x0000 } },
948         { 0xFF34, { 0xFF54, 0x0000, 0x0000, 0x0000 } },
949         { 0xFF35, { 0xFF55, 0x0000, 0x0000, 0x0000 } },
950         { 0xFF36, { 0xFF56, 0x0000, 0x0000, 0x0000 } },
951         { 0xFF37, { 0xFF57, 0x0000, 0x0000, 0x0000 } },
952         { 0xFF38, { 0xFF58, 0x0000, 0x0000, 0x0000 } },
953         { 0xFF39, { 0xFF59, 0x0000, 0x0000, 0x0000 } },
954         { 0xFF3A, { 0xFF5A, 0x0000, 0x0000, 0x0000 } },
955         { 0x10400, { 0xd801, 0xdc28, 0x0000, 0x0000 } },
956         { 0x10401, { 0xd801, 0xdc29, 0x0000, 0x0000 } },
957         { 0x10402, { 0xd801, 0xdc2A, 0x0000, 0x0000 } },
958         { 0x10403, { 0xd801, 0xdc2B, 0x0000, 0x0000 } },
959         { 0x10404, { 0xd801, 0xdc2C, 0x0000, 0x0000 } },
960         { 0x10405, { 0xd801, 0xdc2D, 0x0000, 0x0000 } },
961         { 0x10406, { 0xd801, 0xdc2E, 0x0000, 0x0000 } },
962         { 0x10407, { 0xd801, 0xdc2F, 0x0000, 0x0000 } },
963         { 0x10408, { 0xd801, 0xdc30, 0x0000, 0x0000 } },
964         { 0x10409, { 0xd801, 0xdc31, 0x0000, 0x0000 } },
965         { 0x1040A, { 0xd801, 0xdc32, 0x0000, 0x0000 } },
966         { 0x1040B, { 0xd801, 0xdc33, 0x0000, 0x0000 } },
967         { 0x1040C, { 0xd801, 0xdc34, 0x0000, 0x0000 } },
968         { 0x1040D, { 0xd801, 0xdc35, 0x0000, 0x0000 } },
969         { 0x1040E, { 0xd801, 0xdc36, 0x0000, 0x0000 } },
970         { 0x1040F, { 0xd801, 0xdc37, 0x0000, 0x0000 } },
971         { 0x10410, { 0xd801, 0xdc38, 0x0000, 0x0000 } },
972         { 0x10411, { 0xd801, 0xdc39, 0x0000, 0x0000 } },
973         { 0x10412, { 0xd801, 0xdc3A, 0x0000, 0x0000 } },
974         { 0x10413, { 0xd801, 0xdc3B, 0x0000, 0x0000 } },
975         { 0x10414, { 0xd801, 0xdc3C, 0x0000, 0x0000 } },
976         { 0x10415, { 0xd801, 0xdc3D, 0x0000, 0x0000 } },
977         { 0x10416, { 0xd801, 0xdc3E, 0x0000, 0x0000 } },
978         { 0x10417, { 0xd801, 0xdc3F, 0x0000, 0x0000 } },
979         { 0x10418, { 0xd801, 0xdc40, 0x0000, 0x0000 } },
980         { 0x10419, { 0xd801, 0xdc41, 0x0000, 0x0000 } },
981         { 0x1041A, { 0xd801, 0xdc42, 0x0000, 0x0000 } },
982         { 0x1041B, { 0xd801, 0xdc43, 0x0000, 0x0000 } },
983         { 0x1041C, { 0xd801, 0xdc44, 0x0000, 0x0000 } },
984         { 0x1041D, { 0xd801, 0xdc45, 0x0000, 0x0000 } },
985         { 0x1041E, { 0xd801, 0xdc46, 0x0000, 0x0000 } },
986         { 0x1041F, { 0xd801, 0xdc47, 0x0000, 0x0000 } },
987         { 0x10420, { 0xd801, 0xdc48, 0x0000, 0x0000 } },
988         { 0x10421, { 0xd801, 0xdc49, 0x0000, 0x0000 } },
989         { 0x10422, { 0xd801, 0xdc4A, 0x0000, 0x0000 } },
990         { 0x10423, { 0xd801, 0xdc4B, 0x0000, 0x0000 } },
991         { 0x10424, { 0xd801, 0xdc4C, 0x0000, 0x0000 } },
992         { 0x10425, { 0xd801, 0xdc4D, 0x0000, 0x0000 } },
993         { 0x1D400, { 0x0061, 0x0000, 0x0000, 0x0000 } },
994         { 0x1D401, { 0x0062, 0x0000, 0x0000, 0x0000 } },
995         { 0x1D402, { 0x0063, 0x0000, 0x0000, 0x0000 } },
996         { 0x1D403, { 0x0064, 0x0000, 0x0000, 0x0000 } },
997         { 0x1D404, { 0x0065, 0x0000, 0x0000, 0x0000 } },
998         { 0x1D405, { 0x0066, 0x0000, 0x0000, 0x0000 } },
999         { 0x1D406, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1000         { 0x1D407, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1001         { 0x1D408, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1002         { 0x1D409, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1003         { 0x1D40A, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1004         { 0x1D40B, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1005         { 0x1D40C, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1006         { 0x1D40D, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1007         { 0x1D40E, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1008         { 0x1D40F, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1009         { 0x1D410, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1010         { 0x1D411, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1011         { 0x1D412, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1012         { 0x1D413, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1013         { 0x1D414, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1014         { 0x1D415, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1015         { 0x1D416, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1016         { 0x1D417, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1017         { 0x1D418, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1018         { 0x1D419, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1019         { 0x1D434, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1020         { 0x1D435, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1021         { 0x1D436, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1022         { 0x1D437, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1023         { 0x1D438, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1024         { 0x1D439, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1025         { 0x1D43A, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1026         { 0x1D43B, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1027         { 0x1D43C, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1028         { 0x1D43D, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1029         { 0x1D43E, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1030         { 0x1D43F, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1031         { 0x1D440, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1032         { 0x1D441, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1033         { 0x1D442, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1034         { 0x1D443, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1035         { 0x1D444, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1036         { 0x1D445, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1037         { 0x1D446, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1038         { 0x1D447, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1039         { 0x1D448, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1040         { 0x1D449, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1041         { 0x1D44A, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1042         { 0x1D44B, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1043         { 0x1D44C, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1044         { 0x1D44D, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1045         { 0x1D468, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1046         { 0x1D469, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1047         { 0x1D46A, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1048         { 0x1D46B, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1049         { 0x1D46C, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1050         { 0x1D46D, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1051         { 0x1D46E, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1052         { 0x1D46F, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1053         { 0x1D470, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1054         { 0x1D471, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1055         { 0x1D472, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1056         { 0x1D473, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1057         { 0x1D474, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1058         { 0x1D475, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1059         { 0x1D476, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1060         { 0x1D477, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1061         { 0x1D478, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1062         { 0x1D479, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1063         { 0x1D47A, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1064         { 0x1D47B, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1065         { 0x1D47C, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1066         { 0x1D47D, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1067         { 0x1D47E, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1068         { 0x1D47F, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1069         { 0x1D480, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1070         { 0x1D481, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1071         { 0x1D49C, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1072         { 0x1D49E, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1073         { 0x1D49F, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1074         { 0x1D4A2, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1075         { 0x1D4A5, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1076         { 0x1D4A6, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1077         { 0x1D4A9, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1078         { 0x1D4AA, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1079         { 0x1D4AB, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1080         { 0x1D4AC, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1081         { 0x1D4AE, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1082         { 0x1D4AF, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1083         { 0x1D4B0, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1084         { 0x1D4B1, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1085         { 0x1D4B2, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1086         { 0x1D4B3, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1087         { 0x1D4B4, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1088         { 0x1D4B5, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1089         { 0x1D4D0, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1090         { 0x1D4D1, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1091         { 0x1D4D2, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1092         { 0x1D4D3, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1093         { 0x1D4D4, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1094         { 0x1D4D5, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1095         { 0x1D4D6, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1096         { 0x1D4D7, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1097         { 0x1D4D8, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1098         { 0x1D4D9, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1099         { 0x1D4DA, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1100         { 0x1D4DB, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1101         { 0x1D4DC, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1102         { 0x1D4DD, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1103         { 0x1D4DE, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1104         { 0x1D4DF, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1105         { 0x1D4E0, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1106         { 0x1D4E1, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1107         { 0x1D4E2, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1108         { 0x1D4E3, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1109         { 0x1D4E4, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1110         { 0x1D4E5, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1111         { 0x1D4E6, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1112         { 0x1D4E7, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1113         { 0x1D4E8, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1114         { 0x1D4E9, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1115         { 0x1D504, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1116         { 0x1D505, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1117         { 0x1D507, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1118         { 0x1D508, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1119         { 0x1D509, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1120         { 0x1D50A, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1121         { 0x1D50D, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1122         { 0x1D50E, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1123         { 0x1D50F, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1124         { 0x1D510, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1125         { 0x1D511, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1126         { 0x1D512, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1127         { 0x1D513, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1128         { 0x1D514, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1129         { 0x1D516, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1130         { 0x1D517, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1131         { 0x1D518, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1132         { 0x1D519, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1133         { 0x1D51A, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1134         { 0x1D51B, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1135         { 0x1D51C, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1136         { 0x1D538, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1137         { 0x1D539, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1138         { 0x1D53B, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1139         { 0x1D53C, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1140         { 0x1D53D, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1141         { 0x1D53E, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1142         { 0x1D540, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1143         { 0x1D541, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1144         { 0x1D542, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1145         { 0x1D543, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1146         { 0x1D544, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1147         { 0x1D546, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1148         { 0x1D54A, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1149         { 0x1D54B, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1150         { 0x1D54C, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1151         { 0x1D54D, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1152         { 0x1D54E, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1153         { 0x1D54F, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1154         { 0x1D550, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1155         { 0x1D56C, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1156         { 0x1D56D, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1157         { 0x1D56E, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1158         { 0x1D56F, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1159         { 0x1D570, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1160         { 0x1D571, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1161         { 0x1D572, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1162         { 0x1D573, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1163         { 0x1D574, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1164         { 0x1D575, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1165         { 0x1D576, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1166         { 0x1D577, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1167         { 0x1D578, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1168         { 0x1D579, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1169         { 0x1D57A, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1170         { 0x1D57B, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1171         { 0x1D57C, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1172         { 0x1D57D, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1173         { 0x1D57E, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1174         { 0x1D57F, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1175         { 0x1D580, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1176         { 0x1D581, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1177         { 0x1D582, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1178         { 0x1D583, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1179         { 0x1D584, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1180         { 0x1D585, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1181         { 0x1D5A0, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1182         { 0x1D5A1, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1183         { 0x1D5A2, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1184         { 0x1D5A3, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1185         { 0x1D5A4, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1186         { 0x1D5A5, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1187         { 0x1D5A6, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1188         { 0x1D5A7, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1189         { 0x1D5A8, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1190         { 0x1D5A9, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1191         { 0x1D5AA, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1192         { 0x1D5AB, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1193         { 0x1D5AC, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1194         { 0x1D5AD, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1195         { 0x1D5AE, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1196         { 0x1D5AF, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1197         { 0x1D5B0, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1198         { 0x1D5B1, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1199         { 0x1D5B2, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1200         { 0x1D5B3, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1201         { 0x1D5B4, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1202         { 0x1D5B5, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1203         { 0x1D5B6, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1204         { 0x1D5B7, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1205         { 0x1D5B8, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1206         { 0x1D5B9, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1207         { 0x1D5D4, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1208         { 0x1D5D5, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1209         { 0x1D5D6, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1210         { 0x1D5D7, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1211         { 0x1D5D8, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1212         { 0x1D5D9, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1213         { 0x1D5DA, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1214         { 0x1D5DB, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1215         { 0x1D5DC, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1216         { 0x1D5DD, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1217         { 0x1D5DE, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1218         { 0x1D5DF, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1219         { 0x1D5E0, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1220         { 0x1D5E1, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1221         { 0x1D5E2, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1222         { 0x1D5E3, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1223         { 0x1D5E4, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1224         { 0x1D5E5, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1225         { 0x1D5E6, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1226         { 0x1D5E7, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1227         { 0x1D5E8, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1228         { 0x1D5E9, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1229         { 0x1D5EA, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1230         { 0x1D5EB, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1231         { 0x1D5EC, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1232         { 0x1D5ED, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1233         { 0x1D608, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1234         { 0x1D609, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1235         { 0x1D60A, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1236         { 0x1D60B, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1237         { 0x1D60C, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1238         { 0x1D60D, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1239         { 0x1D60E, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1240         { 0x1D60F, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1241         { 0x1D610, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1242         { 0x1D611, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1243         { 0x1D612, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1244         { 0x1D613, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1245         { 0x1D614, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1246         { 0x1D615, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1247         { 0x1D616, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1248         { 0x1D617, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1249         { 0x1D618, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1250         { 0x1D619, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1251         { 0x1D61A, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1252         { 0x1D61B, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1253         { 0x1D61C, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1254         { 0x1D61D, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1255         { 0x1D61E, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1256         { 0x1D61F, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1257         { 0x1D620, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1258         { 0x1D621, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1259         { 0x1D63C, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1260         { 0x1D63D, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1261         { 0x1D63E, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1262         { 0x1D63F, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1263         { 0x1D640, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1264         { 0x1D641, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1265         { 0x1D642, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1266         { 0x1D643, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1267         { 0x1D644, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1268         { 0x1D645, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1269         { 0x1D646, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1270         { 0x1D647, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1271         { 0x1D648, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1272         { 0x1D649, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1273         { 0x1D64A, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1274         { 0x1D64B, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1275         { 0x1D64C, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1276         { 0x1D64D, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1277         { 0x1D64E, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1278         { 0x1D64F, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1279         { 0x1D650, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1280         { 0x1D651, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1281         { 0x1D652, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1282         { 0x1D653, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1283         { 0x1D654, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1284         { 0x1D655, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1285         { 0x1D670, { 0x0061, 0x0000, 0x0000, 0x0000 } },
1286         { 0x1D671, { 0x0062, 0x0000, 0x0000, 0x0000 } },
1287         { 0x1D672, { 0x0063, 0x0000, 0x0000, 0x0000 } },
1288         { 0x1D673, { 0x0064, 0x0000, 0x0000, 0x0000 } },
1289         { 0x1D674, { 0x0065, 0x0000, 0x0000, 0x0000 } },
1290         { 0x1D675, { 0x0066, 0x0000, 0x0000, 0x0000 } },
1291         { 0x1D676, { 0x0067, 0x0000, 0x0000, 0x0000 } },
1292         { 0x1D677, { 0x0068, 0x0000, 0x0000, 0x0000 } },
1293         { 0x1D678, { 0x0069, 0x0000, 0x0000, 0x0000 } },
1294         { 0x1D679, { 0x006A, 0x0000, 0x0000, 0x0000 } },
1295         { 0x1D67A, { 0x006B, 0x0000, 0x0000, 0x0000 } },
1296         { 0x1D67B, { 0x006C, 0x0000, 0x0000, 0x0000 } },
1297         { 0x1D67C, { 0x006D, 0x0000, 0x0000, 0x0000 } },
1298         { 0x1D67D, { 0x006E, 0x0000, 0x0000, 0x0000 } },
1299         { 0x1D67E, { 0x006F, 0x0000, 0x0000, 0x0000 } },
1300         { 0x1D67F, { 0x0070, 0x0000, 0x0000, 0x0000 } },
1301         { 0x1D680, { 0x0071, 0x0000, 0x0000, 0x0000 } },
1302         { 0x1D681, { 0x0072, 0x0000, 0x0000, 0x0000 } },
1303         { 0x1D682, { 0x0073, 0x0000, 0x0000, 0x0000 } },
1304         { 0x1D683, { 0x0074, 0x0000, 0x0000, 0x0000 } },
1305         { 0x1D684, { 0x0075, 0x0000, 0x0000, 0x0000 } },
1306         { 0x1D685, { 0x0076, 0x0000, 0x0000, 0x0000 } },
1307         { 0x1D686, { 0x0077, 0x0000, 0x0000, 0x0000 } },
1308         { 0x1D687, { 0x0078, 0x0000, 0x0000, 0x0000 } },
1309         { 0x1D688, { 0x0079, 0x0000, 0x0000, 0x0000 } },
1310         { 0x1D689, { 0x007A, 0x0000, 0x0000, 0x0000 } },
1311         { 0x1D6A8, { 0x03B1, 0x0000, 0x0000, 0x0000 } },
1312         { 0x1D6A9, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
1313         { 0x1D6AA, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
1314         { 0x1D6AB, { 0x03B4, 0x0000, 0x0000, 0x0000 } },
1315         { 0x1D6AC, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
1316         { 0x1D6AD, { 0x03B6, 0x0000, 0x0000, 0x0000 } },
1317         { 0x1D6AE, { 0x03B7, 0x0000, 0x0000, 0x0000 } },
1318         { 0x1D6AF, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1319         { 0x1D6B0, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
1320         { 0x1D6B1, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
1321         { 0x1D6B2, { 0x03BB, 0x0000, 0x0000, 0x0000 } },
1322         { 0x1D6B3, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
1323         { 0x1D6B4, { 0x03BD, 0x0000, 0x0000, 0x0000 } },
1324         { 0x1D6B5, { 0x03BE, 0x0000, 0x0000, 0x0000 } },
1325         { 0x1D6B6, { 0x03BF, 0x0000, 0x0000, 0x0000 } },
1326         { 0x1D6B7, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
1327         { 0x1D6B8, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
1328         { 0x1D6B9, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1329         { 0x1D6BA, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1330         { 0x1D6BB, { 0x03C4, 0x0000, 0x0000, 0x0000 } },
1331         { 0x1D6BC, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
1332         { 0x1D6BD, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
1333         { 0x1D6BE, { 0x03C7, 0x0000, 0x0000, 0x0000 } },
1334         { 0x1D6BF, { 0x03C8, 0x0000, 0x0000, 0x0000 } },
1335         { 0x1D6C0, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
1336         { 0x1D6D3, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1337         { 0x1D6E2, { 0x03B1, 0x0000, 0x0000, 0x0000 } },
1338         { 0x1D6E3, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
1339         { 0x1D6E4, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
1340         { 0x1D6E5, { 0x03B4, 0x0000, 0x0000, 0x0000 } },
1341         { 0x1D6E6, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
1342         { 0x1D6E7, { 0x03B6, 0x0000, 0x0000, 0x0000 } },
1343         { 0x1D6E8, { 0x03B7, 0x0000, 0x0000, 0x0000 } },
1344         { 0x1D6E9, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1345         { 0x1D6EA, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
1346         { 0x1D6EB, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
1347         { 0x1D6EC, { 0x03BB, 0x0000, 0x0000, 0x0000 } },
1348         { 0x1D6ED, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
1349         { 0x1D6EE, { 0x03BD, 0x0000, 0x0000, 0x0000 } },
1350         { 0x1D6EF, { 0x03BE, 0x0000, 0x0000, 0x0000 } },
1351         { 0x1D6F0, { 0x03BF, 0x0000, 0x0000, 0x0000 } },
1352         { 0x1D6F1, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
1353         { 0x1D6F2, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
1354         { 0x1D6F3, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1355         { 0x1D6F4, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1356         { 0x1D6F5, { 0x03C4, 0x0000, 0x0000, 0x0000 } },
1357         { 0x1D6F6, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
1358         { 0x1D6F7, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
1359         { 0x1D6F8, { 0x03C7, 0x0000, 0x0000, 0x0000 } },
1360         { 0x1D6F9, { 0x03C8, 0x0000, 0x0000, 0x0000 } },
1361         { 0x1D6FA, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
1362         { 0x1D70D, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1363         { 0x1D71C, { 0x03B1, 0x0000, 0x0000, 0x0000 } },
1364         { 0x1D71D, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
1365         { 0x1D71E, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
1366         { 0x1D71F, { 0x03B4, 0x0000, 0x0000, 0x0000 } },
1367         { 0x1D720, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
1368         { 0x1D721, { 0x03B6, 0x0000, 0x0000, 0x0000 } },
1369         { 0x1D722, { 0x03B7, 0x0000, 0x0000, 0x0000 } },
1370         { 0x1D723, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1371         { 0x1D724, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
1372         { 0x1D725, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
1373         { 0x1D726, { 0x03BB, 0x0000, 0x0000, 0x0000 } },
1374         { 0x1D727, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
1375         { 0x1D728, { 0x03BD, 0x0000, 0x0000, 0x0000 } },
1376         { 0x1D729, { 0x03BE, 0x0000, 0x0000, 0x0000 } },
1377         { 0x1D72A, { 0x03BF, 0x0000, 0x0000, 0x0000 } },
1378         { 0x1D72B, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
1379         { 0x1D72C, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
1380         { 0x1D72D, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1381         { 0x1D72E, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1382         { 0x1D72F, { 0x03C4, 0x0000, 0x0000, 0x0000 } },
1383         { 0x1D730, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
1384         { 0x1D731, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
1385         { 0x1D732, { 0x03C7, 0x0000, 0x0000, 0x0000 } },
1386         { 0x1D733, { 0x03C8, 0x0000, 0x0000, 0x0000 } },
1387         { 0x1D734, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
1388         { 0x1D747, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1389         { 0x1D756, { 0x03B1, 0x0000, 0x0000, 0x0000 } },
1390         { 0x1D757, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
1391         { 0x1D758, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
1392         { 0x1D759, { 0x03B4, 0x0000, 0x0000, 0x0000 } },
1393         { 0x1D75A, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
1394         { 0x1D75B, { 0x03B6, 0x0000, 0x0000, 0x0000 } },
1395         { 0x1D75C, { 0x03B7, 0x0000, 0x0000, 0x0000 } },
1396         { 0x1D75D, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1397         { 0x1D75E, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
1398         { 0x1D75F, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
1399         { 0x1D760, { 0x03BB, 0x0000, 0x0000, 0x0000 } },
1400         { 0x1D761, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
1401         { 0x1D762, { 0x03BD, 0x0000, 0x0000, 0x0000 } },
1402         { 0x1D763, { 0x03BE, 0x0000, 0x0000, 0x0000 } },
1403         { 0x1D764, { 0x03BF, 0x0000, 0x0000, 0x0000 } },
1404         { 0x1D765, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
1405         { 0x1D766, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
1406         { 0x1D767, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1407         { 0x1D768, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1408         { 0x1D769, { 0x03C4, 0x0000, 0x0000, 0x0000 } },
1409         { 0x1D76A, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
1410         { 0x1D76B, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
1411         { 0x1D76C, { 0x03C7, 0x0000, 0x0000, 0x0000 } },
1412         { 0x1D76D, { 0x03C8, 0x0000, 0x0000, 0x0000 } },
1413         { 0x1D76E, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
1414         { 0x1D781, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1415         { 0x1D790, { 0x03B1, 0x0000, 0x0000, 0x0000 } },
1416         { 0x1D791, { 0x03B2, 0x0000, 0x0000, 0x0000 } },
1417         { 0x1D792, { 0x03B3, 0x0000, 0x0000, 0x0000 } },
1418         { 0x1D793, { 0x03B4, 0x0000, 0x0000, 0x0000 } },
1419         { 0x1D794, { 0x03B5, 0x0000, 0x0000, 0x0000 } },
1420         { 0x1D795, { 0x03B6, 0x0000, 0x0000, 0x0000 } },
1421         { 0x1D796, { 0x03B7, 0x0000, 0x0000, 0x0000 } },
1422         { 0x1D797, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1423         { 0x1D798, { 0x03B9, 0x0000, 0x0000, 0x0000 } },
1424         { 0x1D799, { 0x03BA, 0x0000, 0x0000, 0x0000 } },
1425         { 0x1D79A, { 0x03BB, 0x0000, 0x0000, 0x0000 } },
1426         { 0x1D79B, { 0x03BC, 0x0000, 0x0000, 0x0000 } },
1427         { 0x1D79C, { 0x03BD, 0x0000, 0x0000, 0x0000 } },
1428         { 0x1D79D, { 0x03BE, 0x0000, 0x0000, 0x0000 } },
1429         { 0x1D79E, { 0x03BF, 0x0000, 0x0000, 0x0000 } },
1430         { 0x1D79F, { 0x03C0, 0x0000, 0x0000, 0x0000 } },
1431         { 0x1D7A0, { 0x03C1, 0x0000, 0x0000, 0x0000 } },
1432         { 0x1D7A1, { 0x03B8, 0x0000, 0x0000, 0x0000 } },
1433         { 0x1D7A2, { 0x03C3, 0x0000, 0x0000, 0x0000 } },
1434         { 0x1D7A3, { 0x03C4, 0x0000, 0x0000, 0x0000 } },
1435         { 0x1D7A4, { 0x03C5, 0x0000, 0x0000, 0x0000 } },
1436         { 0x1D7A5, { 0x03C6, 0x0000, 0x0000, 0x0000 } },
1437         { 0x1D7A6, { 0x03C7, 0x0000, 0x0000, 0x0000 } },
1438         { 0x1D7A7, { 0x03C8, 0x0000, 0x0000, 0x0000 } },
1439         { 0x1D7A8, { 0x03C9, 0x0000, 0x0000, 0x0000 } },
1440         { 0x1D7BB, { 0x03C3, 0x0000, 0x0000, 0x0000 } }
1441 };
1442 
mapToLowerCase(QString * str,int from)1443 static void mapToLowerCase(QString *str, int from)
1444 {
1445     int N = sizeof(NameprepCaseFolding) / sizeof(NameprepCaseFolding[0]);
1446 
1447     ushort *d = nullptr;
1448     for (int i = from; i < str->size(); ++i) {
1449         uint uc = str->at(i).unicode();
1450         if (uc < 0x80) {
1451             if (uc <= 'Z' && uc >= 'A') {
1452                 if (!d)
1453                     d = reinterpret_cast<ushort *>(str->data());
1454                 d[i] = (uc | 0x20);
1455             }
1456         } else {
1457             if (QChar(uc).isHighSurrogate() && i < str->size() - 1) {
1458                 ushort low = str->at(i + 1).unicode();
1459                 if (QChar(low).isLowSurrogate()) {
1460                     uc = QChar::surrogateToUcs4(uc, low);
1461                     ++i;
1462                 }
1463             }
1464             const NameprepCaseFoldingEntry *entry = std::lower_bound(NameprepCaseFolding,
1465                                                                      NameprepCaseFolding + N,
1466                                                                      uc);
1467             if ((entry != NameprepCaseFolding + N) && !(uc < *entry)) {
1468                 int l = 1;
1469                 while (l < 4 && entry->mapping[l])
1470                     ++l;
1471                 if (l > 1 || uc > 0xffff) {
1472                     if (uc <= 0xffff)
1473                         str->replace(i, 1, reinterpret_cast<const QChar *>(&entry->mapping[0]), l);
1474                     else
1475                         str->replace(--i, 2, reinterpret_cast<const QChar *>(&entry->mapping[0]), l);
1476                     i += l - 1;
1477                     d = nullptr;
1478                 } else {
1479                     if (!d)
1480                         d = reinterpret_cast<ushort *>(str->data());
1481                     d[i] = entry->mapping[0];
1482                 }
1483             }
1484         }
1485     }
1486 }
1487 
isMappedToNothing(uint uc)1488 static bool isMappedToNothing(uint uc)
1489 {
1490     if (uc < 0xad)
1491         return false;
1492     switch (uc) {
1493     case 0x00AD: case 0x034F: case 0x1806: case 0x180B: case 0x180C: case 0x180D:
1494     case 0x200B: case 0x200C: case 0x200D: case 0x2060: case 0xFE00: case 0xFE01:
1495     case 0xFE02: case 0xFE03: case 0xFE04: case 0xFE05: case 0xFE06: case 0xFE07:
1496     case 0xFE08: case 0xFE09: case 0xFE0A: case 0xFE0B: case 0xFE0C: case 0xFE0D:
1497     case 0xFE0E: case 0xFE0F: case 0xFEFF:
1498         return true;
1499     default:
1500         return false;
1501     }
1502 }
1503 
1504 
containsProhibitedOuptut(const QString * str,int from)1505 static bool containsProhibitedOuptut(const QString *str, int from)
1506 {
1507     const ushort *in = reinterpret_cast<const ushort *>(str->begin() + from);
1508     const ushort *end = (const ushort *)str->data() + str->size();
1509     for ( ; in < end; ++in) {
1510         uint uc = *in;
1511         if (QChar(uc).isHighSurrogate() && in < end - 1) {
1512             ushort low = *(in + 1);
1513             if (QChar(low).isLowSurrogate()) {
1514                 ++in;
1515                 uc = QChar::surrogateToUcs4(uc, low);
1516             } else {
1517                 // unpaired surrogates are prohibited
1518                 return true;
1519             }
1520         }
1521         if (uc <= 0xFFFF) {
1522             if (uc < 0x80 ||
1523                 !(uc <= 0x009F
1524                 || uc == 0x00A0
1525                 || uc == 0x0340
1526                 || uc == 0x0341
1527                 || uc == 0x06DD
1528                 || uc == 0x070F
1529                 || uc == 0x1680
1530                 || uc == 0x180E
1531                 || (uc >= 0x2000 && uc <= 0x200F)
1532                 || (uc >= 0x2028 && uc <= 0x202F)
1533                 || uc == 0x205F
1534                 || (uc >= 0x2060 && uc <= 0x2063)
1535                 || (uc >= 0x206A && uc <= 0x206F)
1536                 || (uc >= 0x2FF0 && uc <= 0x2FFB)
1537                 || uc == 0x3000
1538                 || (uc >= 0xD800 && uc <= 0xDFFF)
1539                 || (uc >= 0xE000 && uc <= 0xF8FF)
1540                 || (uc >= 0xFDD0 && uc <= 0xFDEF)
1541                 || uc == 0xFEFF
1542                 || (uc >= 0xFFF9 && uc <= 0xFFFF))) {
1543                 continue;
1544             }
1545         } else {
1546             if (!((uc >= 0x1D173 && uc <= 0x1D17A)
1547                 || (uc >= 0x1FFFE && uc <= 0x1FFFF)
1548                 || (uc >= 0x2FFFE && uc <= 0x2FFFF)
1549                 || (uc >= 0x3FFFE && uc <= 0x3FFFF)
1550                 || (uc >= 0x4FFFE && uc <= 0x4FFFF)
1551                 || (uc >= 0x5FFFE && uc <= 0x5FFFF)
1552                 || (uc >= 0x6FFFE && uc <= 0x6FFFF)
1553                 || (uc >= 0x7FFFE && uc <= 0x7FFFF)
1554                 || (uc >= 0x8FFFE && uc <= 0x8FFFF)
1555                 || (uc >= 0x9FFFE && uc <= 0x9FFFF)
1556                 || (uc >= 0xAFFFE && uc <= 0xAFFFF)
1557                 || (uc >= 0xBFFFE && uc <= 0xBFFFF)
1558                 || (uc >= 0xCFFFE && uc <= 0xCFFFF)
1559                 || (uc >= 0xDFFFE && uc <= 0xDFFFF)
1560                 || uc == 0xE0001
1561                 || (uc >= 0xE0020 && uc <= 0xE007F)
1562                 || (uc >= 0xEFFFE && uc <= 0xEFFFF)
1563                 || (uc >= 0xF0000 && uc <= 0xFFFFD)
1564                 || (uc >= 0xFFFFE && uc <= 0xFFFFF)
1565                 || (uc >= 0x100000 && uc <= 0x10FFFD)
1566                 || (uc >= 0x10FFFE && uc <= 0x10FFFF))) {
1567                 continue;
1568             }
1569         }
1570         return true;
1571     }
1572     return false;
1573 }
1574 
isBidirectionalRorAL(uint uc)1575 static bool isBidirectionalRorAL(uint uc)
1576 {
1577     if (uc < 0x5b0)
1578         return false;
1579     return uc == 0x05BE
1580         || uc == 0x05C0
1581         || uc == 0x05C3
1582         || (uc >= 0x05D0 && uc <= 0x05EA)
1583         || (uc >= 0x05F0 && uc <= 0x05F4)
1584         || uc == 0x061B
1585         || uc == 0x061F
1586         || (uc >= 0x0621 && uc <= 0x063A)
1587         || (uc >= 0x0640 && uc <= 0x064A)
1588         || (uc >= 0x066D && uc <= 0x066F)
1589         || (uc >= 0x0671 && uc <= 0x06D5)
1590         || uc == 0x06DD
1591         || (uc >= 0x06E5 && uc <= 0x06E6)
1592         || (uc >= 0x06FA && uc <= 0x06FE)
1593         || (uc >= 0x0700 && uc <= 0x070D)
1594         || uc == 0x0710
1595         || (uc >= 0x0712 && uc <= 0x072C)
1596         || (uc >= 0x0780 && uc <= 0x07A5)
1597         || uc == 0x07B1
1598         || uc == 0x200F
1599         || uc == 0xFB1D
1600         || (uc >= 0xFB1F && uc <= 0xFB28)
1601         || (uc >= 0xFB2A && uc <= 0xFB36)
1602         || (uc >= 0xFB38 && uc <= 0xFB3C)
1603         || uc == 0xFB3E
1604         || (uc >= 0xFB40 && uc <= 0xFB41)
1605         || (uc >= 0xFB43 && uc <= 0xFB44)
1606         || (uc >= 0xFB46 && uc <= 0xFBB1)
1607         || (uc >= 0xFBD3 && uc <= 0xFD3D)
1608         || (uc >= 0xFD50 && uc <= 0xFD8F)
1609         || (uc >= 0xFD92 && uc <= 0xFDC7)
1610         || (uc >= 0xFDF0 && uc <= 0xFDFC)
1611         || (uc >= 0xFE70 && uc <= 0xFE74)
1612         || (uc >= 0xFE76 && uc <= 0xFEFC);
1613 }
1614 
isBidirectionalL(uint uc)1615 static bool isBidirectionalL(uint uc)
1616 {
1617     if (uc < 0xaa)
1618         return (uc >= 0x0041 && uc <= 0x005A)
1619             || (uc >= 0x0061 && uc <= 0x007A);
1620 
1621     if (uc == 0x00AA
1622         || uc == 0x00B5
1623         || uc == 0x00BA
1624         || (uc >= 0x00C0 && uc <= 0x00D6)
1625         || (uc >= 0x00D8 && uc <= 0x00F6)
1626         || (uc >= 0x00F8 && uc <= 0x0220)
1627         || (uc >= 0x0222 && uc <= 0x0233)
1628         || (uc >= 0x0250 && uc <= 0x02AD)
1629         || (uc >= 0x02B0 && uc <= 0x02B8)
1630         || (uc >= 0x02BB && uc <= 0x02C1)
1631         || (uc >= 0x02D0 && uc <= 0x02D1)
1632         || (uc >= 0x02E0 && uc <= 0x02E4)
1633         || uc == 0x02EE
1634         || uc == 0x037A
1635         || uc == 0x0386
1636         || (uc >= 0x0388 && uc <= 0x038A)) {
1637         return true;
1638     }
1639 
1640     if (uc == 0x038C
1641         || (uc >= 0x038E && uc <= 0x03A1)
1642         || (uc >= 0x03A3 && uc <= 0x03CE)
1643         || (uc >= 0x03D0 && uc <= 0x03F5)
1644         || (uc >= 0x0400 && uc <= 0x0482)
1645         || (uc >= 0x048A && uc <= 0x04CE)
1646         || (uc >= 0x04D0 && uc <= 0x04F5)
1647         || (uc >= 0x04F8 && uc <= 0x04F9)
1648         || (uc >= 0x0500 && uc <= 0x050F)
1649         || (uc >= 0x0531 && uc <= 0x0556)
1650         || (uc >= 0x0559 && uc <= 0x055F)
1651         || (uc >= 0x0561 && uc <= 0x0587)
1652         || uc == 0x0589
1653         || uc == 0x0903
1654         || (uc >= 0x0905 && uc <= 0x0939)
1655         || (uc >= 0x093D && uc <= 0x0940)
1656         || (uc >= 0x0949 && uc <= 0x094C)
1657         || uc == 0x0950) {
1658         return true;
1659     }
1660 
1661     if ((uc >= 0x0958 && uc <= 0x0961)
1662         || (uc >= 0x0964 && uc <= 0x0970)
1663         || (uc >= 0x0982 && uc <= 0x0983)
1664         || (uc >= 0x0985 && uc <= 0x098C)
1665         || (uc >= 0x098F && uc <= 0x0990)
1666         || (uc >= 0x0993 && uc <= 0x09A8)
1667         || (uc >= 0x09AA && uc <= 0x09B0)
1668         || uc == 0x09B2
1669         || (uc >= 0x09B6 && uc <= 0x09B9)
1670         || (uc >= 0x09BE && uc <= 0x09C0)
1671         || (uc >= 0x09C7 && uc <= 0x09C8)
1672         || (uc >= 0x09CB && uc <= 0x09CC)
1673         || uc == 0x09D7
1674         || (uc >= 0x09DC && uc <= 0x09DD)
1675         || (uc >= 0x09DF && uc <= 0x09E1)
1676         || (uc >= 0x09E6 && uc <= 0x09F1)
1677         || (uc >= 0x09F4 && uc <= 0x09FA)
1678         || (uc >= 0x0A05 && uc <= 0x0A0A)
1679         || (uc >= 0x0A0F && uc <= 0x0A10)
1680         || (uc >= 0x0A13 && uc <= 0x0A28)
1681         || (uc >= 0x0A2A && uc <= 0x0A30)
1682         || (uc >= 0x0A32 && uc <= 0x0A33)) {
1683         return true;
1684     }
1685 
1686     if ((uc >= 0x0A35 && uc <= 0x0A36)
1687         || (uc >= 0x0A38 && uc <= 0x0A39)
1688         || (uc >= 0x0A3E && uc <= 0x0A40)
1689         || (uc >= 0x0A59 && uc <= 0x0A5C)
1690         || uc == 0x0A5E
1691         || (uc >= 0x0A66 && uc <= 0x0A6F)
1692         || (uc >= 0x0A72 && uc <= 0x0A74)
1693         || uc == 0x0A83
1694         || (uc >= 0x0A85 && uc <= 0x0A8B)
1695         || uc == 0x0A8D
1696         || (uc >= 0x0A8F && uc <= 0x0A91)
1697         || (uc >= 0x0A93 && uc <= 0x0AA8)
1698         || (uc >= 0x0AAA && uc <= 0x0AB0)
1699         || (uc >= 0x0AB2 && uc <= 0x0AB3)
1700         || (uc >= 0x0AB5 && uc <= 0x0AB9)
1701         || (uc >= 0x0ABD && uc <= 0x0AC0)
1702         || uc == 0x0AC9
1703         || (uc >= 0x0ACB && uc <= 0x0ACC)
1704         || uc == 0x0AD0
1705         || uc == 0x0AE0
1706         || (uc >= 0x0AE6 && uc <= 0x0AEF)
1707         || (uc >= 0x0B02 && uc <= 0x0B03)
1708         || (uc >= 0x0B05 && uc <= 0x0B0C)
1709         || (uc >= 0x0B0F && uc <= 0x0B10)
1710         || (uc >= 0x0B13 && uc <= 0x0B28)
1711         || (uc >= 0x0B2A && uc <= 0x0B30)) {
1712         return true;
1713     }
1714 
1715     if ((uc >= 0x0B32 && uc <= 0x0B33)
1716         || (uc >= 0x0B36 && uc <= 0x0B39)
1717         || (uc >= 0x0B3D && uc <= 0x0B3E)
1718         || uc == 0x0B40
1719         || (uc >= 0x0B47 && uc <= 0x0B48)
1720         || (uc >= 0x0B4B && uc <= 0x0B4C)
1721         || uc == 0x0B57
1722         || (uc >= 0x0B5C && uc <= 0x0B5D)
1723         || (uc >= 0x0B5F && uc <= 0x0B61)
1724         || (uc >= 0x0B66 && uc <= 0x0B70)
1725         || uc == 0x0B83
1726         || (uc >= 0x0B85 && uc <= 0x0B8A)
1727         || (uc >= 0x0B8E && uc <= 0x0B90)
1728         || (uc >= 0x0B92 && uc <= 0x0B95)
1729         || (uc >= 0x0B99 && uc <= 0x0B9A)
1730         || uc == 0x0B9C
1731         || (uc >= 0x0B9E && uc <= 0x0B9F)
1732         || (uc >= 0x0BA3 && uc <= 0x0BA4)
1733         || (uc >= 0x0BA8 && uc <= 0x0BAA)
1734         || (uc >= 0x0BAE && uc <= 0x0BB5)
1735         || (uc >= 0x0BB7 && uc <= 0x0BB9)
1736         || (uc >= 0x0BBE && uc <= 0x0BBF)
1737         || (uc >= 0x0BC1 && uc <= 0x0BC2)
1738         || (uc >= 0x0BC6 && uc <= 0x0BC8)
1739         || (uc >= 0x0BCA && uc <= 0x0BCC)
1740         || uc == 0x0BD7
1741         || (uc >= 0x0BE7 && uc <= 0x0BF2)
1742         || (uc >= 0x0C01 && uc <= 0x0C03)
1743         || (uc >= 0x0C05 && uc <= 0x0C0C)
1744         || (uc >= 0x0C0E && uc <= 0x0C10)
1745         || (uc >= 0x0C12 && uc <= 0x0C28)
1746         || (uc >= 0x0C2A && uc <= 0x0C33)
1747         || (uc >= 0x0C35 && uc <= 0x0C39)) {
1748         return true;
1749     }
1750     if ((uc >= 0x0C41 && uc <= 0x0C44)
1751         || (uc >= 0x0C60 && uc <= 0x0C61)
1752         || (uc >= 0x0C66 && uc <= 0x0C6F)
1753         || (uc >= 0x0C82 && uc <= 0x0C83)
1754         || (uc >= 0x0C85 && uc <= 0x0C8C)
1755         || (uc >= 0x0C8E && uc <= 0x0C90)
1756         || (uc >= 0x0C92 && uc <= 0x0CA8)
1757         || (uc >= 0x0CAA && uc <= 0x0CB3)
1758         || (uc >= 0x0CB5 && uc <= 0x0CB9)
1759         || uc == 0x0CBE
1760         || (uc >= 0x0CC0 && uc <= 0x0CC4)
1761         || (uc >= 0x0CC7 && uc <= 0x0CC8)
1762         || (uc >= 0x0CCA && uc <= 0x0CCB)
1763         || (uc >= 0x0CD5 && uc <= 0x0CD6)
1764         || uc == 0x0CDE
1765         || (uc >= 0x0CE0 && uc <= 0x0CE1)
1766         || (uc >= 0x0CE6 && uc <= 0x0CEF)
1767         || (uc >= 0x0D02 && uc <= 0x0D03)
1768         || (uc >= 0x0D05 && uc <= 0x0D0C)
1769         || (uc >= 0x0D0E && uc <= 0x0D10)
1770         || (uc >= 0x0D12 && uc <= 0x0D28)
1771         || (uc >= 0x0D2A && uc <= 0x0D39)
1772         || (uc >= 0x0D3E && uc <= 0x0D40)
1773         || (uc >= 0x0D46 && uc <= 0x0D48)
1774         || (uc >= 0x0D4A && uc <= 0x0D4C)
1775         || uc == 0x0D57
1776         || (uc >= 0x0D60 && uc <= 0x0D61)
1777         || (uc >= 0x0D66 && uc <= 0x0D6F)
1778         || (uc >= 0x0D82 && uc <= 0x0D83)
1779         || (uc >= 0x0D85 && uc <= 0x0D96)
1780         || (uc >= 0x0D9A && uc <= 0x0DB1)
1781         || (uc >= 0x0DB3 && uc <= 0x0DBB)
1782         || uc == 0x0DBD) {
1783         return true;
1784     }
1785     if ((uc >= 0x0DC0 && uc <= 0x0DC6)
1786         || (uc >= 0x0DCF && uc <= 0x0DD1)
1787         || (uc >= 0x0DD8 && uc <= 0x0DDF)
1788         || (uc >= 0x0DF2 && uc <= 0x0DF4)
1789         || (uc >= 0x0E01 && uc <= 0x0E30)
1790         || (uc >= 0x0E32 && uc <= 0x0E33)
1791         || (uc >= 0x0E40 && uc <= 0x0E46)
1792         || (uc >= 0x0E4F && uc <= 0x0E5B)
1793         || (uc >= 0x0E81 && uc <= 0x0E82)
1794         || uc == 0x0E84
1795         || (uc >= 0x0E87 && uc <= 0x0E88)
1796         || uc == 0x0E8A
1797         || uc == 0x0E8D
1798         || (uc >= 0x0E94 && uc <= 0x0E97)
1799         || (uc >= 0x0E99 && uc <= 0x0E9F)
1800         || (uc >= 0x0EA1 && uc <= 0x0EA3)
1801         || uc == 0x0EA5
1802         || uc == 0x0EA7
1803         || (uc >= 0x0EAA && uc <= 0x0EAB)
1804         || (uc >= 0x0EAD && uc <= 0x0EB0)
1805         || (uc >= 0x0EB2 && uc <= 0x0EB3)
1806         || uc == 0x0EBD
1807         || (uc >= 0x0EC0 && uc <= 0x0EC4)
1808         || uc == 0x0EC6
1809         || (uc >= 0x0ED0 && uc <= 0x0ED9)
1810         || (uc >= 0x0EDC && uc <= 0x0EDD)
1811         || (uc >= 0x0F00 && uc <= 0x0F17)
1812         || (uc >= 0x0F1A && uc <= 0x0F34)
1813         || uc == 0x0F36
1814         || uc == 0x0F38
1815         || (uc >= 0x0F3E && uc <= 0x0F47)
1816         || (uc >= 0x0F49 && uc <= 0x0F6A)
1817         || uc == 0x0F7F
1818         || uc == 0x0F85
1819         || (uc >= 0x0F88 && uc <= 0x0F8B)
1820         || (uc >= 0x0FBE && uc <= 0x0FC5)
1821         || (uc >= 0x0FC7 && uc <= 0x0FCC)
1822         || uc == 0x0FCF) {
1823         return true;
1824     }
1825 
1826     if ((uc >= 0x1000 && uc <= 0x1021)
1827         || (uc >= 0x1023 && uc <= 0x1027)
1828         || (uc >= 0x1029 && uc <= 0x102A)
1829         || uc == 0x102C
1830         || uc == 0x1031
1831         || uc == 0x1038
1832         || (uc >= 0x1040 && uc <= 0x1057)
1833         || (uc >= 0x10A0 && uc <= 0x10C5)
1834         || (uc >= 0x10D0 && uc <= 0x10F8)
1835         || uc == 0x10FB
1836         || (uc >= 0x1100 && uc <= 0x1159)
1837         || (uc >= 0x115F && uc <= 0x11A2)
1838         || (uc >= 0x11A8 && uc <= 0x11F9)
1839         || (uc >= 0x1200 && uc <= 0x1206)
1840         || (uc >= 0x1208 && uc <= 0x1246)
1841         || uc == 0x1248
1842         || (uc >= 0x124A && uc <= 0x124D)
1843         || (uc >= 0x1250 && uc <= 0x1256)
1844         || uc == 0x1258
1845         || (uc >= 0x125A && uc <= 0x125D)
1846         || (uc >= 0x1260 && uc <= 0x1286)
1847         || uc == 0x1288
1848         || (uc >= 0x128A && uc <= 0x128D)
1849         || (uc >= 0x1290 && uc <= 0x12AE)
1850         || uc == 0x12B0
1851         || (uc >= 0x12B2 && uc <= 0x12B5)
1852         || (uc >= 0x12B8 && uc <= 0x12BE)
1853         || uc == 0x12C0
1854         || (uc >= 0x12C2 && uc <= 0x12C5)
1855         || (uc >= 0x12C8 && uc <= 0x12CE)
1856         || (uc >= 0x12D0 && uc <= 0x12D6)
1857         || (uc >= 0x12D8 && uc <= 0x12EE)
1858         || (uc >= 0x12F0 && uc <= 0x130E)
1859         || uc == 0x1310) {
1860         return true;
1861     }
1862 
1863     if ((uc >= 0x1312 && uc <= 0x1315)
1864         || (uc >= 0x1318 && uc <= 0x131E)
1865         || (uc >= 0x1320 && uc <= 0x1346)
1866         || (uc >= 0x1348 && uc <= 0x135A)
1867         || (uc >= 0x1361 && uc <= 0x137C)
1868         || (uc >= 0x13A0 && uc <= 0x13F4)
1869         || (uc >= 0x1401 && uc <= 0x1676)
1870         || (uc >= 0x1681 && uc <= 0x169A)
1871         || (uc >= 0x16A0 && uc <= 0x16F0)
1872         || (uc >= 0x1700 && uc <= 0x170C)
1873         || (uc >= 0x170E && uc <= 0x1711)
1874         || (uc >= 0x1720 && uc <= 0x1731)
1875         || (uc >= 0x1735 && uc <= 0x1736)
1876         || (uc >= 0x1740 && uc <= 0x1751)
1877         || (uc >= 0x1760 && uc <= 0x176C)
1878         || (uc >= 0x176E && uc <= 0x1770)
1879         || (uc >= 0x1780 && uc <= 0x17B6)
1880         || (uc >= 0x17BE && uc <= 0x17C5)
1881         || (uc >= 0x17C7 && uc <= 0x17C8)
1882         || (uc >= 0x17D4 && uc <= 0x17DA)
1883         || uc == 0x17DC
1884         || (uc >= 0x17E0 && uc <= 0x17E9)
1885         || (uc >= 0x1810 && uc <= 0x1819)
1886         || (uc >= 0x1820 && uc <= 0x1877)
1887         || (uc >= 0x1880 && uc <= 0x18A8)
1888         || (uc >= 0x1E00 && uc <= 0x1E9B)
1889         || (uc >= 0x1EA0 && uc <= 0x1EF9)
1890         || (uc >= 0x1F00 && uc <= 0x1F15)
1891         || (uc >= 0x1F18 && uc <= 0x1F1D)
1892         || (uc >= 0x1F20 && uc <= 0x1F45)
1893         || (uc >= 0x1F48 && uc <= 0x1F4D)
1894         || (uc >= 0x1F50 && uc <= 0x1F57)
1895         || uc == 0x1F59
1896         || uc == 0x1F5B
1897         || uc == 0x1F5D) {
1898         return true;
1899     }
1900 
1901     if ((uc >= 0x1F5F && uc <= 0x1F7D)
1902         || (uc >= 0x1F80 && uc <= 0x1FB4)
1903         || (uc >= 0x1FB6 && uc <= 0x1FBC)
1904         || uc == 0x1FBE
1905         || (uc >= 0x1FC2 && uc <= 0x1FC4)
1906         || (uc >= 0x1FC6 && uc <= 0x1FCC)
1907         || (uc >= 0x1FD0 && uc <= 0x1FD3)
1908         || (uc >= 0x1FD6 && uc <= 0x1FDB)
1909         || (uc >= 0x1FE0 && uc <= 0x1FEC)
1910         || (uc >= 0x1FF2 && uc <= 0x1FF4)
1911         || (uc >= 0x1FF6 && uc <= 0x1FFC)
1912         || uc == 0x200E
1913         || uc == 0x2071
1914         || uc == 0x207F
1915         || uc == 0x2102
1916         || uc == 0x2107
1917         || (uc >= 0x210A && uc <= 0x2113)
1918         || uc == 0x2115
1919         || (uc >= 0x2119 && uc <= 0x211D)) {
1920         return true;
1921     }
1922 
1923     if (uc == 0x2124
1924         || uc == 0x2126
1925         || uc == 0x2128
1926         || (uc >= 0x212A && uc <= 0x212D)
1927         || (uc >= 0x212F && uc <= 0x2131)
1928         || (uc >= 0x2133 && uc <= 0x2139)
1929         || (uc >= 0x213D && uc <= 0x213F)
1930         || (uc >= 0x2145 && uc <= 0x2149)
1931         || (uc >= 0x2160 && uc <= 0x2183)
1932         || (uc >= 0x2336 && uc <= 0x237A)
1933         || uc == 0x2395
1934         || (uc >= 0x249C && uc <= 0x24E9)
1935         || (uc >= 0x3005 && uc <= 0x3007)
1936         || (uc >= 0x3021 && uc <= 0x3029)
1937         || (uc >= 0x3031 && uc <= 0x3035)
1938         || (uc >= 0x3038 && uc <= 0x303C)
1939         || (uc >= 0x3041 && uc <= 0x3096)
1940         || (uc >= 0x309D && uc <= 0x309F)
1941         || (uc >= 0x30A1 && uc <= 0x30FA)) {
1942         return true;
1943     }
1944 
1945     if ((uc >= 0x30FC && uc <= 0x30FF)
1946         || (uc >= 0x3105 && uc <= 0x312C)
1947         || (uc >= 0x3131 && uc <= 0x318E)
1948         || (uc >= 0x3190 && uc <= 0x31B7)
1949         || (uc >= 0x31F0 && uc <= 0x321C)
1950         || (uc >= 0x3220 && uc <= 0x3243)) {
1951         return true;
1952     }
1953 
1954     if ((uc >= 0x3260 && uc <= 0x327B)
1955         || (uc >= 0x327F && uc <= 0x32B0)
1956         || (uc >= 0x32C0 && uc <= 0x32CB)
1957         || (uc >= 0x32D0 && uc <= 0x32FE)
1958         || (uc >= 0x3300 && uc <= 0x3376)
1959         || (uc >= 0x337B && uc <= 0x33DD)) {
1960         return true;
1961     }
1962     if  ((uc >= 0x33E0 && uc <= 0x33FE)
1963          || (uc >= 0x3400 && uc <= 0x4DB5)
1964          || (uc >= 0x4E00 && uc <= 0x9FA5)
1965          || (uc >= 0xA000 && uc <= 0xA48C)
1966          || (uc >= 0xAC00 && uc <= 0xD7A3)
1967          || (uc >= 0xD800 && uc <= 0xFA2D)
1968          || (uc >= 0xFA30 && uc <= 0xFA6A)
1969          || (uc >= 0xFB00 && uc <= 0xFB06)
1970          || (uc >= 0xFB13 && uc <= 0xFB17)
1971          || (uc >= 0xFF21 && uc <= 0xFF3A)
1972          || (uc >= 0xFF41 && uc <= 0xFF5A)
1973          || (uc >= 0xFF66 && uc <= 0xFFBE)
1974          || (uc >= 0xFFC2 && uc <= 0xFFC7)
1975          || (uc >= 0xFFCA && uc <= 0xFFCF)
1976          || (uc >= 0xFFD2 && uc <= 0xFFD7)
1977          || (uc >= 0xFFDA && uc <= 0xFFDC)) {
1978         return true;
1979     }
1980 
1981     if ((uc >= 0x10300 && uc <= 0x1031E)
1982        || (uc >= 0x10320 && uc <= 0x10323)
1983        || (uc >= 0x10330 && uc <= 0x1034A)
1984        || (uc >= 0x10400 && uc <= 0x10425)
1985        || (uc >= 0x10428 && uc <= 0x1044D)
1986        || (uc >= 0x1D000 && uc <= 0x1D0F5)
1987        || (uc >= 0x1D100 && uc <= 0x1D126)
1988        || (uc >= 0x1D12A && uc <= 0x1D166)
1989        || (uc >= 0x1D16A && uc <= 0x1D172)
1990        || (uc >= 0x1D183 && uc <= 0x1D184)
1991        || (uc >= 0x1D18C && uc <= 0x1D1A9)
1992        || (uc >= 0x1D1AE && uc <= 0x1D1DD)
1993        || (uc >= 0x1D400 && uc <= 0x1D454)
1994        || (uc >= 0x1D456 && uc <= 0x1D49C)
1995        || (uc >= 0x1D49E && uc <= 0x1D49F)
1996        || uc == 0x1D4A2
1997        || (uc >= 0x1D4A5 && uc <= 0x1D4A6)
1998        || (uc >= 0x1D4A9 && uc <= 0x1D4AC)
1999        || (uc >= 0x1D4AE && uc <= 0x1D4B9)
2000        || uc == 0x1D4BB
2001        || (uc >= 0x1D4BD && uc <= 0x1D4C0)
2002        || (uc >= 0x1D4C2 && uc <= 0x1D4C3)
2003        || (uc >= 0x1D4C5 && uc <= 0x1D505)
2004        || (uc >= 0x1D507 && uc <= 0x1D50A)
2005        || (uc >= 0x1D50D && uc <= 0x1D514)
2006        || (uc >= 0x1D516 && uc <= 0x1D51C)
2007        || (uc >= 0x1D51E && uc <= 0x1D539)
2008        || (uc >= 0x1D53B && uc <= 0x1D53E)
2009        || (uc >= 0x1D540 && uc <= 0x1D544)
2010        || uc == 0x1D546
2011        || (uc >= 0x1D54A && uc <= 0x1D550)
2012        || (uc >= 0x1D552 && uc <= 0x1D6A3)
2013        || (uc >= 0x1D6A8 && uc <= 0x1D7C9)
2014        || (uc >= 0x20000 && uc <= 0x2A6D6)
2015        || (uc >= 0x2F800 && uc <= 0x2FA1D)
2016        || (uc >= 0xF0000 && uc <= 0xFFFFD)
2017        || (uc >= 0x100000 && uc <= 0x10FFFD)) {
2018         return true;
2019     }
2020 
2021     return false;
2022 }
2023 
qt_nameprep(QString * source,int from)2024 Q_AUTOTEST_EXPORT bool qt_nameprep(QString *source, int from)
2025 {
2026     QChar *src = source->data(); // causes a detach, so we're sure the only one using it
2027     QChar *out = src + from;
2028     const QChar *e = src + source->size();
2029 
2030     for ( ; out < e; ++out) {
2031         ushort uc = out->unicode();
2032         if (uc >= 0x80) {
2033             break;
2034         } else if (uc >= 'A' && uc <= 'Z') {
2035             *out = QChar(uc | 0x20);
2036         }
2037     }
2038     if (out == e)
2039         return true;    // everything was mapped easily (lowercased, actually)
2040     int firstNonAscii = out - src;
2041 
2042     // Characters unassigned in Unicode 3.2 are not allowed in "stored string" scheme
2043     // but allowed in "query" scheme
2044     // (Table A.1)
2045     const bool isUnassignedAllowed = false; // ###
2046     // Characters commonly mapped to nothing are simply removed
2047     // (Table B.1)
2048     const QChar *in = out;
2049     for ( ; in < e; ++in) {
2050         uint uc = in->unicode();
2051         if (QChar(uc).isHighSurrogate() && in < e - 1) {
2052             ushort low = in[1].unicode();
2053             if (QChar(low).isLowSurrogate()) {
2054                 ++in;
2055                 uc = QChar::surrogateToUcs4(uc, low);
2056             }
2057         }
2058         if (!isUnassignedAllowed) {
2059             QChar::UnicodeVersion version = QChar::unicodeVersion(uc);
2060             if (version == QChar::Unicode_Unassigned || version > QChar::Unicode_3_2) {
2061                 source->resize(from); // not allowed, clear the label
2062                 return false;
2063             }
2064         }
2065         if (!isMappedToNothing(uc)) {
2066             if (uc <= 0xFFFF) {
2067                 *out++ = *in;
2068             } else {
2069                 *out++ = in[-1];
2070                 *out++ = in[0];
2071             }
2072         }
2073     }
2074     if (out != in)
2075         source->truncate(out - src);
2076 
2077     // Map to lowercase (Table B.2)
2078     mapToLowerCase(source, firstNonAscii);
2079 
2080     // Normalize to Unicode 3.2 form KC
2081     extern void qt_string_normalize(QString *data, QString::NormalizationForm mode,
2082                                     QChar::UnicodeVersion version, int from);
2083     qt_string_normalize(source, QString::NormalizationForm_KC, QChar::Unicode_3_2,
2084                         firstNonAscii > from ? firstNonAscii - 1 : from);
2085 
2086     // Strip prohibited output
2087     if (containsProhibitedOuptut(source, firstNonAscii)) {
2088         source->resize(from);
2089         return false;
2090     }
2091 
2092     // Check for valid bidirectional characters
2093     bool containsLCat = false;
2094     bool containsRandALCat = false;
2095     src = source->data();
2096     e = src + source->size();
2097     for (in = src + from; in < e && (!containsLCat || !containsRandALCat); ++in) {
2098         uint uc = in->unicode();
2099         if (QChar(uc).isHighSurrogate() && in < e - 1) {
2100             ushort low = in[1].unicode();
2101             if (QChar(low).isLowSurrogate()) {
2102                 ++in;
2103                 uc = QChar::surrogateToUcs4(uc, low);
2104             }
2105         }
2106         if (isBidirectionalL(uc))
2107             containsLCat = true;
2108         else if (isBidirectionalRorAL(uc))
2109             containsRandALCat = true;
2110     }
2111     if (containsRandALCat) {
2112         if (containsLCat || (!isBidirectionalRorAL(src[from].unicode())
2113                              || !isBidirectionalRorAL(e[-1].unicode()))) {
2114             source->resize(from); // not allowed, clear the label
2115             return false;
2116         }
2117     }
2118 
2119     return true;
2120 }
2121 
qt_find_nonstd3(const QChar * uc,int len,Qt::CaseSensitivity cs)2122 static const QChar *qt_find_nonstd3(const QChar *uc, int len, Qt::CaseSensitivity cs)
2123 {
2124     if (len > 63)
2125         return uc;
2126 
2127     for (int i = 0; i < len; ++i) {
2128         ushort c = uc[i].unicode();
2129         if (c == '-' && (i == 0 || i == len - 1))
2130             return uc + i;
2131 
2132         // verifying the absence of non-LDH is the same as verifying that
2133         // only LDH is present
2134         if (cs == Qt::CaseInsensitive && (c >= 'A' && c <= 'Z'))
2135             continue;
2136         if (c == '-' || (c >= '0' && c <= '9')
2137             || (c >= 'a' && c <= 'z')
2138             //underscore is not supposed to be allowed, but other browser accept it (QTBUG-7434)
2139             || c == '_')
2140             continue;
2141 
2142         return uc + i;
2143     }
2144 
2145     return nullptr;
2146 }
2147 
qt_check_std3rules(const QChar * uc,int len)2148 Q_AUTOTEST_EXPORT bool qt_check_std3rules(const QChar *uc, int len)
2149 {
2150     return qt_find_nonstd3(uc, len, Qt::CaseInsensitive) == nullptr;
2151 }
2152 
qt_check_nameprepped_std3(const QChar * in,int len)2153 static bool qt_check_nameprepped_std3(const QChar *in, int len)
2154 {
2155     // fast path: check for lowercase ASCII
2156     const QChar *firstNonAscii = qt_find_nonstd3(in, len, Qt::CaseSensitive);
2157     if (firstNonAscii == nullptr) {
2158         // everything was lowercase ASCII, digits or hyphen
2159         return true;
2160     }
2161 
2162     const QChar *e = in + len;
2163     QString origin = QString::fromRawData(firstNonAscii, e - firstNonAscii);
2164     QString copy = origin;
2165     qt_nameprep(&copy, 0);
2166     return origin == copy;
2167 }
2168 
encodeDigit(uint digit)2169 static inline uint encodeDigit(uint digit)
2170 {
2171   return digit + 22 + 75 * (digit < 26);
2172 }
2173 
adapt(uint delta,uint numpoints,bool firsttime)2174 static inline uint adapt(uint delta, uint numpoints, bool firsttime)
2175 {
2176     delta /= (firsttime ? damp : 2);
2177     delta += (delta / numpoints);
2178 
2179     uint k = 0;
2180     for (; delta > ((base - tmin) * tmax) / 2; k += base)
2181         delta /= (base - tmin);
2182 
2183     return k + (((base - tmin + 1) * delta) / (delta + skew));
2184 }
2185 
appendEncode(QString * output,uint & delta,uint & bias,uint & b,uint & h)2186 static inline void appendEncode(QString* output, uint& delta, uint& bias, uint& b, uint& h)
2187 {
2188     uint qq;
2189     uint k;
2190     uint t;
2191 
2192     // insert the variable length delta integer; fail on
2193     // overflow.
2194     for (qq = delta, k = base;; k += base) {
2195         // stop generating digits when the threshold is
2196         // detected.
2197         t = (k <= bias) ? tmin : (k >= bias + tmax) ? tmax : k - bias;
2198         if (qq < t) break;
2199 
2200         *output += QChar(encodeDigit(t + (qq - t) % (base - t)));
2201         qq = (qq - t) / (base - t);
2202     }
2203 
2204     *output += QChar(encodeDigit(qq));
2205     bias = adapt(delta, h + 1, h == b);
2206     delta = 0;
2207     ++h;
2208 }
2209 
qt_punycodeEncoder(const QChar * s,int ucLength,QString * output)2210 Q_AUTOTEST_EXPORT void qt_punycodeEncoder(const QChar *s, int ucLength, QString *output)
2211 {
2212     uint n = initial_n;
2213     uint delta = 0;
2214     uint bias = initial_bias;
2215 
2216     int outLen = output->length();
2217     output->resize(outLen + ucLength);
2218 
2219     QChar *d = output->data() + outLen;
2220     bool skipped = false;
2221     // copy all basic code points verbatim to output.
2222     for (uint j = 0; j < (uint) ucLength; ++j) {
2223         if (s[j].unicode() < 0x80)
2224             *d++ = s[j];
2225         else
2226             skipped = true;
2227     }
2228 
2229     // if there were only basic code points, just return them
2230     // directly; don't do any encoding.
2231     if (!skipped)
2232         return;
2233 
2234     output->truncate(d - output->constData());
2235     int copied = output->size() - outLen;
2236 
2237     // h and b now contain the number of basic code points in input.
2238     uint b = copied;
2239     uint h = copied;
2240 
2241     // if basic code points were copied, add the delimiter character.
2242     if (h > 0)
2243         *output += QChar(0x2d);
2244 
2245     // while there are still unprocessed non-basic code points left in
2246     // the input string...
2247     while (h < (uint) ucLength) {
2248         // find the character in the input string with the lowest
2249         // unicode value.
2250         uint m = Q_MAXINT;
2251         uint j;
2252         for (j = 0; j < (uint) ucLength; ++j) {
2253             if (s[j].unicode() >= n && s[j].unicode() < m)
2254                 m = (uint) s[j].unicode();
2255         }
2256 
2257         // reject out-of-bounds unicode characters
2258         if (m - n > (Q_MAXINT - delta) / (h + 1)) {
2259             output->truncate(outLen);
2260             return; // punycode_overflow
2261         }
2262 
2263         delta += (m - n) * (h + 1);
2264         n = m;
2265 
2266         // for each code point in the input string
2267         for (j = 0; j < (uint) ucLength; ++j) {
2268 
2269             // increase delta until we reach the character with the
2270             // lowest unicode code. fail if delta overflows.
2271             if (s[j].unicode() < n) {
2272                 ++delta;
2273                 if (!delta) {
2274                     output->truncate(outLen);
2275                     return; // punycode_overflow
2276                 }
2277             }
2278 
2279             // if j is the index of the character with the lowest
2280             // unicode code...
2281             if (s[j].unicode() == n) {
2282                 appendEncode(output, delta, bias, b, h);
2283             }
2284         }
2285 
2286         ++delta;
2287         ++n;
2288     }
2289 
2290     // prepend ACE prefix
2291     output->insert(outLen, QLatin1String("xn--"));
2292     return;
2293 }
2294 
qt_punycodeDecoder(const QString & pc)2295 Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc)
2296 {
2297     uint n = initial_n;
2298     uint i = 0;
2299     uint bias = initial_bias;
2300 
2301     // strip any ACE prefix
2302     int start = pc.startsWith(QLatin1String("xn--")) ? 4 : 0;
2303     if (!start)
2304         return pc;
2305 
2306     // find the last delimiter character '-' in the input array. copy
2307     // all data before this delimiter directly to the output array.
2308     int delimiterPos = pc.lastIndexOf(QChar(0x2d));
2309     QString output = delimiterPos < 4 ?
2310                      QString() : pc.mid(start, delimiterPos - start);
2311 
2312     // if a delimiter was found, skip to the position after it;
2313     // otherwise start at the front of the input string. everything
2314     // before the delimiter is assumed to be basic code points.
2315     uint cnt = delimiterPos + 1;
2316 
2317     // loop through the rest of the input string, inserting non-basic
2318     // characters into output as we go.
2319     while (cnt < (uint) pc.size()) {
2320         uint oldi = i;
2321         uint w = 1;
2322 
2323         // find the next index for inserting a non-basic character.
2324         for (uint k = base; cnt < (uint) pc.size(); k += base) {
2325             // grab a character from the punycode input and find its
2326             // delta digit (each digit code is part of the
2327             // variable-length integer delta)
2328             uint digit = pc.at(cnt++).unicode();
2329             if (digit - 48 < 10) digit -= 22;
2330             else if (digit - 65 < 26) digit -= 65;
2331             else if (digit - 97 < 26) digit -= 97;
2332             else digit = base;
2333 
2334             // reject out of range digits
2335             if (digit >= base || digit > (Q_MAXINT - i) / w)
2336                 return QStringLiteral("");
2337 
2338             i += (digit * w);
2339 
2340             // detect threshold to stop reading delta digits
2341             uint t;
2342             if (k <= bias) t = tmin;
2343             else if (k >= bias + tmax) t = tmax;
2344             else t = k - bias;
2345             if (digit < t) break;
2346 
2347             w *= (base - t);
2348         }
2349 
2350         // find new bias and calculate the next non-basic code
2351         // character.
2352         bias = adapt(i - oldi, output.length() + 1, oldi == 0);
2353         n += i / (output.length() + 1);
2354 
2355         // allow the deltas to wrap around
2356         i %= (output.length() + 1);
2357 
2358         // insert the character n at position i
2359         output.insert((uint) i, QChar((ushort) n));
2360         ++i;
2361     }
2362 
2363     return output;
2364 }
2365 
2366 static const char * const idn_whitelist[] = {
2367     "ac", "ar", "asia", "at",
2368     "biz", "br",
2369     "cat", "ch", "cl", "cn", "com",
2370     "de", "dk",
2371     "es",
2372     "fi",
2373     "gr",
2374     "hu",
2375     "il", "info", "io", "is", "ir",
2376     "jp",
2377     "kr",
2378     "li", "lt", "lu", "lv",
2379     "museum",
2380     "name", "net", "no", "nu", "nz",
2381     "org",
2382     "pl", "pr",
2383     "se", "sh",
2384     "tel", "th", "tm", "tw",
2385     "ua",
2386     "vn",
2387     "xn--fiqs8s",               // China
2388     "xn--fiqz9s",               // China
2389     "xn--fzc2c9e2c",            // Sri Lanka
2390     "xn--j6w193g",              // Hong Kong
2391     "xn--kprw13d",              // Taiwan
2392     "xn--kpry57d",              // Taiwan
2393     "xn--mgba3a4f16a",          // Iran
2394     "xn--mgba3a4fra",           // Iran
2395     "xn--mgbaam7a8h",           // UAE
2396     "xn--mgbayh7gpa",           // Jordan
2397     "xn--mgberp4a5d4ar",        // Saudi Arabia
2398     "xn--ogbpf8fl",             // Syria
2399     "xn--p1ai",                 // Russian Federation
2400     "xn--wgbh1c",               // Egypt
2401     "xn--wgbl6a",               // Qatar
2402     "xn--xkc2al3hye2a"          // Sri Lanka
2403 };
2404 static const size_t idn_whitelist_size = sizeof idn_whitelist / sizeof *idn_whitelist;
2405 
2406 static QStringList *user_idn_whitelist = nullptr;
2407 
lessThan(const QChar * a,int l,const char * c)2408 static bool lessThan(const QChar *a, int l, const char *c)
2409 {
2410     const ushort *uc = (const ushort *)a;
2411     const ushort *e = uc + l;
2412 
2413     if (!c || *c == 0)
2414         return false;
2415 
2416     while (*c) {
2417         if (uc == e || *uc != *c)
2418             break;
2419         ++uc;
2420         ++c;
2421     }
2422     return (uc == e ? *c : *uc < *c);
2423 }
2424 
equal(const QChar * a,int l,const char * b)2425 static bool equal(const QChar *a, int l, const char *b)
2426 {
2427     while (l && a->unicode() && *b) {
2428         if (*a != QLatin1Char(*b))
2429             return false;
2430         ++a;
2431         ++b;
2432         --l;
2433     }
2434     return l == 0;
2435 }
2436 
qt_is_idn_enabled(const QString & domain)2437 static bool qt_is_idn_enabled(const QString &domain)
2438 {
2439     int idx = domain.lastIndexOf(QLatin1Char('.'));
2440     if (idx == -1)
2441         return false;
2442 
2443     int len = domain.size() - idx - 1;
2444     QString tldString = qt_ACE_do(QString::fromRawData(domain.constData() + idx + 1, len), ToAceOnly, ForbidLeadingDot);
2445     len = tldString.size();
2446 
2447     const QChar *tld = tldString.constData();
2448 
2449     if (user_idn_whitelist)
2450         return user_idn_whitelist->contains(tldString);
2451 
2452     int l = 0;
2453     int r = idn_whitelist_size - 1;
2454     int i = (l + r + 1) / 2;
2455 
2456     while (r != l) {
2457         if (lessThan(tld, len, idn_whitelist[i]))
2458             r = i - 1;
2459         else
2460             l = i;
2461         i = (l + r + 1) / 2;
2462     }
2463     return equal(tld, len, idn_whitelist[i]);
2464 }
2465 
isDotDelimiter(ushort uc)2466 static inline bool isDotDelimiter(ushort uc)
2467 {
2468     // IDNA / rfc3490 describes these four delimiters used for
2469     // separating labels in unicode international domain
2470     // names.
2471     return uc == 0x2e || uc == 0x3002 || uc == 0xff0e || uc == 0xff61;
2472 }
2473 
nextDotDelimiter(const QString & domain,int from=0)2474 static int nextDotDelimiter(const QString &domain, int from = 0)
2475 {
2476     const QChar *b = domain.unicode();
2477     const QChar *ch = b + from;
2478     const QChar *e = b + domain.length();
2479     while (ch < e) {
2480         if (isDotDelimiter(ch->unicode()))
2481             break;
2482         else
2483             ++ch;
2484     }
2485     return ch - b;
2486 }
2487 
qt_ACE_do(const QString & domain,AceOperation op,AceLeadingDot dot)2488 QString qt_ACE_do(const QString &domain, AceOperation op, AceLeadingDot dot)
2489 {
2490     if (domain.isEmpty())
2491         return domain;
2492 
2493     QString result;
2494     result.reserve(domain.length());
2495 
2496     const bool isIdnEnabled = op == NormalizeAce ? qt_is_idn_enabled(domain) : false;
2497     int lastIdx = 0;
2498     QString aceForm; // this variable is here for caching
2499 
2500     while (1) {
2501         int idx = nextDotDelimiter(domain, lastIdx);
2502         int labelLength = idx - lastIdx;
2503         if (labelLength == 0) {
2504             if (idx == domain.length())
2505                 break;
2506             if (dot == ForbidLeadingDot || idx > 0)
2507                 return QString(); // two delimiters in a row -- empty label not allowed
2508         }
2509 
2510         // RFC 3490 says, about the ToASCII operation:
2511         //   3. If the UseSTD3ASCIIRules flag is set, then perform these checks:
2512         //
2513         //     (a) Verify the absence of non-LDH ASCII code points; that is, the
2514         //         absence of 0..2C, 2E..2F, 3A..40, 5B..60, and 7B..7F.
2515         //
2516         //     (b) Verify the absence of leading and trailing hyphen-minus; that
2517         //         is, the absence of U+002D at the beginning and end of the
2518         //         sequence.
2519         // and:
2520         //   8. Verify that the number of code points is in the range 1 to 63
2521         //      inclusive.
2522 
2523         // copy the label to the destination, which also serves as our scratch area, lowercasing it
2524         int prevLen = result.size();
2525         bool simple = true;
2526         result.resize(prevLen + labelLength);
2527         {
2528             QChar *out = result.data() + prevLen;
2529             const QChar *in = domain.constData() + lastIdx;
2530             const QChar *e = in + labelLength;
2531             for (; in < e; ++in, ++out) {
2532                 ushort uc = in->unicode();
2533                 if (uc > 0x7f)
2534                     simple = false;
2535                 if (uc >= 'A' && uc <= 'Z')
2536                     *out = QChar(uc | 0x20);
2537                 else
2538                     *out = *in;
2539             }
2540         }
2541 
2542         if (simple && labelLength > 6) {
2543             // ACE form domains contain only ASCII characters, but we can't consider them simple
2544             // is this an ACE form?
2545             // the shortest valid ACE domain is 6 characters long (U+0080 would be 1, but it's not allowed)
2546             static const ushort acePrefixUtf16[] = { 'x', 'n', '-', '-' };
2547             if (memcmp(result.constData() + prevLen, acePrefixUtf16, sizeof acePrefixUtf16) == 0)
2548                 simple = false;
2549         }
2550 
2551         if (simple) {
2552             // fastest case: this is the common case (non IDN-domains)
2553             // so we're done
2554             if (!qt_check_std3rules(result.constData() + prevLen, labelLength))
2555                 return QString();
2556         } else {
2557             // Punycode encoding and decoding cannot be done in-place
2558             // That means we need one or two temporaries
2559             if (!qt_nameprep(&result, prevLen))
2560                 return QString();   // failed
2561             labelLength = result.length() - prevLen;
2562             int toReserve = labelLength + 4 + 6; // "xn--" plus some extra bytes
2563             aceForm.resize(0);
2564             if (toReserve > aceForm.capacity())
2565                 aceForm.reserve(toReserve);
2566             qt_punycodeEncoder(result.constData() + prevLen, result.size() - prevLen, &aceForm);
2567 
2568             // We use resize()+memcpy() here because we're overwriting the data we've copied
2569             bool appended = false;
2570             if (isIdnEnabled) {
2571                 QString tmp = qt_punycodeDecoder(aceForm);
2572                 if (tmp.isEmpty())
2573                     return QString(); // shouldn't happen, since we've just punycode-encoded it
2574                 if (qt_check_nameprepped_std3(tmp.constData(), tmp.size())) {
2575                     result.resize(prevLen + tmp.size());
2576                     memcpy(result.data() + prevLen, tmp.constData(), tmp.size() * sizeof(QChar));
2577                     appended = true;
2578                 }
2579             }
2580 
2581             if (!appended) {
2582                 result.resize(prevLen + aceForm.size());
2583                 memcpy(result.data() + prevLen, aceForm.constData(), aceForm.size() * sizeof(QChar));
2584             }
2585 
2586             if (!qt_check_std3rules(aceForm.constData(), aceForm.size()))
2587                 return QString();
2588         }
2589 
2590 
2591         lastIdx = idx + 1;
2592         if (lastIdx < domain.size() + 1)
2593             result += QLatin1Char('.');
2594         else
2595             break;
2596     }
2597     return result;
2598 }
2599 
2600 /*!
2601     \since 4.2
2602 
2603     Returns the current whitelist of top-level domains that are allowed
2604     to have non-ASCII characters in their compositions.
2605 
2606     See setIdnWhitelist() for the rationale of this list.
2607 */
idnWhitelist()2608 QStringList QUrl::idnWhitelist()
2609 {
2610     if (user_idn_whitelist)
2611         return *user_idn_whitelist;
2612     QStringList list;
2613     list.reserve(idn_whitelist_size);
2614     unsigned int i = 0;
2615     while (i < idn_whitelist_size) {
2616         list << QLatin1String(idn_whitelist[i]);
2617         ++i;
2618     }
2619     return list;
2620 }
2621 
2622 /*!
2623     \since 4.2
2624 
2625     Sets the whitelist of Top-Level Domains (TLDs) that are allowed to have
2626     non-ASCII characters in domains to the value of \a list.
2627 
2628     Note that if you call this function, you need to do so \e before
2629     you start any threads that might access idnWhitelist().
2630 
2631     Qt comes with a default list that contains the Internet top-level domains
2632     that have published support for Internationalized Domain Names (IDNs)
2633     and rules to guarantee that no deception can happen between similarly-looking
2634     characters (such as the Latin lowercase letter \c 'a' and the Cyrillic
2635     equivalent, which in most fonts are visually identical).
2636 
2637     This list is periodically maintained, as registrars publish new rules.
2638 
2639     This function is provided for those who need to manipulate the list, in
2640     order to add or remove a TLD. It is not recommended to change its value
2641     for purposes other than testing, as it may expose users to security risks.
2642 */
setIdnWhitelist(const QStringList & list)2643 void QUrl::setIdnWhitelist(const QStringList &list)
2644 {
2645     if (!user_idn_whitelist)
2646         user_idn_whitelist = new QStringList;
2647     *user_idn_whitelist = list;
2648 }
2649 
2650 QT_END_NAMESPACE
2651