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