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