1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang // Encoding: UTF-8
3*8af74909SZhong Yang /** @file CaseConvert.cxx
4*8af74909SZhong Yang ** Case fold characters and convert them to upper or lower case.
5*8af74909SZhong Yang ** Tables automatically regenerated by scripts/GenerateCaseConvert.py
6*8af74909SZhong Yang ** Should only be rarely regenerated for new versions of Unicode.
7*8af74909SZhong Yang **/
8*8af74909SZhong Yang // Copyright 2013 by Neil Hodgson <[email protected]>
9*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
10*8af74909SZhong Yang
11*8af74909SZhong Yang #include <cassert>
12*8af74909SZhong Yang #include <cstring>
13*8af74909SZhong Yang
14*8af74909SZhong Yang #include <stdexcept>
15*8af74909SZhong Yang #include <string>
16*8af74909SZhong Yang #include <string_view>
17*8af74909SZhong Yang #include <vector>
18*8af74909SZhong Yang #include <algorithm>
19*8af74909SZhong Yang
20*8af74909SZhong Yang #include "CaseConvert.h"
21*8af74909SZhong Yang #include "UniConversion.h"
22*8af74909SZhong Yang
23*8af74909SZhong Yang using namespace Scintilla;
24*8af74909SZhong Yang
25*8af74909SZhong Yang namespace {
26*8af74909SZhong Yang // Use an unnamed namespace to protect the declarations from name conflicts
27*8af74909SZhong Yang
28*8af74909SZhong Yang // Unicode code points are ordered by groups and follow patterns.
29*8af74909SZhong Yang // Most characters (pitch==1) are in ranges for a particular alphabet and their
30*8af74909SZhong Yang // upper case forms are a fixed distance away.
31*8af74909SZhong Yang // Another pattern (pitch==2) is where each lower case letter is preceded by
32*8af74909SZhong Yang // the upper case form. These are also grouped into ranges.
33*8af74909SZhong Yang
34*8af74909SZhong Yang int symmetricCaseConversionRanges[] = {
35*8af74909SZhong Yang //lower, upper, range length, range pitch
36*8af74909SZhong Yang //++Autogenerated -- start of section automatically generated
37*8af74909SZhong Yang //**\(\*\n\)
38*8af74909SZhong Yang 97,65,26,1,
39*8af74909SZhong Yang 224,192,23,1,
40*8af74909SZhong Yang 248,216,7,1,
41*8af74909SZhong Yang 257,256,24,2,
42*8af74909SZhong Yang 314,313,8,2,
43*8af74909SZhong Yang 331,330,23,2,
44*8af74909SZhong Yang 462,461,8,2,
45*8af74909SZhong Yang 479,478,9,2,
46*8af74909SZhong Yang 505,504,20,2,
47*8af74909SZhong Yang 547,546,9,2,
48*8af74909SZhong Yang 583,582,5,2,
49*8af74909SZhong Yang 945,913,17,1,
50*8af74909SZhong Yang 963,931,9,1,
51*8af74909SZhong Yang 985,984,12,2,
52*8af74909SZhong Yang 1072,1040,32,1,
53*8af74909SZhong Yang 1104,1024,16,1,
54*8af74909SZhong Yang 1121,1120,17,2,
55*8af74909SZhong Yang 1163,1162,27,2,
56*8af74909SZhong Yang 1218,1217,7,2,
57*8af74909SZhong Yang 1233,1232,48,2,
58*8af74909SZhong Yang 1377,1329,38,1,
59*8af74909SZhong Yang 4304,7312,43,1,
60*8af74909SZhong Yang 7681,7680,75,2,
61*8af74909SZhong Yang 7841,7840,48,2,
62*8af74909SZhong Yang 7936,7944,8,1,
63*8af74909SZhong Yang 7952,7960,6,1,
64*8af74909SZhong Yang 7968,7976,8,1,
65*8af74909SZhong Yang 7984,7992,8,1,
66*8af74909SZhong Yang 8000,8008,6,1,
67*8af74909SZhong Yang 8032,8040,8,1,
68*8af74909SZhong Yang 8560,8544,16,1,
69*8af74909SZhong Yang 9424,9398,26,1,
70*8af74909SZhong Yang 11312,11264,47,1,
71*8af74909SZhong Yang 11393,11392,50,2,
72*8af74909SZhong Yang 11520,4256,38,1,
73*8af74909SZhong Yang 42561,42560,23,2,
74*8af74909SZhong Yang 42625,42624,14,2,
75*8af74909SZhong Yang 42787,42786,7,2,
76*8af74909SZhong Yang 42803,42802,31,2,
77*8af74909SZhong Yang 42879,42878,5,2,
78*8af74909SZhong Yang 42903,42902,10,2,
79*8af74909SZhong Yang 42933,42932,6,2,
80*8af74909SZhong Yang 65345,65313,26,1,
81*8af74909SZhong Yang 66600,66560,40,1,
82*8af74909SZhong Yang 66776,66736,36,1,
83*8af74909SZhong Yang 68800,68736,51,1,
84*8af74909SZhong Yang 71872,71840,32,1,
85*8af74909SZhong Yang 93792,93760,32,1,
86*8af74909SZhong Yang 125218,125184,34,1,
87*8af74909SZhong Yang
88*8af74909SZhong Yang //--Autogenerated -- end of section automatically generated
89*8af74909SZhong Yang };
90*8af74909SZhong Yang
91*8af74909SZhong Yang // Code points that are symmetric but don't fit into a range of similar characters
92*8af74909SZhong Yang // are listed here.
93*8af74909SZhong Yang
94*8af74909SZhong Yang int symmetricCaseConversions[] = {
95*8af74909SZhong Yang //lower, upper
96*8af74909SZhong Yang //++Autogenerated -- start of section automatically generated
97*8af74909SZhong Yang //**1 \(\*\n\)
98*8af74909SZhong Yang 255,376,
99*8af74909SZhong Yang 307,306,
100*8af74909SZhong Yang 309,308,
101*8af74909SZhong Yang 311,310,
102*8af74909SZhong Yang 378,377,
103*8af74909SZhong Yang 380,379,
104*8af74909SZhong Yang 382,381,
105*8af74909SZhong Yang 384,579,
106*8af74909SZhong Yang 387,386,
107*8af74909SZhong Yang 389,388,
108*8af74909SZhong Yang 392,391,
109*8af74909SZhong Yang 396,395,
110*8af74909SZhong Yang 402,401,
111*8af74909SZhong Yang 405,502,
112*8af74909SZhong Yang 409,408,
113*8af74909SZhong Yang 410,573,
114*8af74909SZhong Yang 414,544,
115*8af74909SZhong Yang 417,416,
116*8af74909SZhong Yang 419,418,
117*8af74909SZhong Yang 421,420,
118*8af74909SZhong Yang 424,423,
119*8af74909SZhong Yang 429,428,
120*8af74909SZhong Yang 432,431,
121*8af74909SZhong Yang 436,435,
122*8af74909SZhong Yang 438,437,
123*8af74909SZhong Yang 441,440,
124*8af74909SZhong Yang 445,444,
125*8af74909SZhong Yang 447,503,
126*8af74909SZhong Yang 454,452,
127*8af74909SZhong Yang 457,455,
128*8af74909SZhong Yang 460,458,
129*8af74909SZhong Yang 477,398,
130*8af74909SZhong Yang 499,497,
131*8af74909SZhong Yang 501,500,
132*8af74909SZhong Yang 572,571,
133*8af74909SZhong Yang 575,11390,
134*8af74909SZhong Yang 576,11391,
135*8af74909SZhong Yang 578,577,
136*8af74909SZhong Yang 592,11375,
137*8af74909SZhong Yang 593,11373,
138*8af74909SZhong Yang 594,11376,
139*8af74909SZhong Yang 595,385,
140*8af74909SZhong Yang 596,390,
141*8af74909SZhong Yang 598,393,
142*8af74909SZhong Yang 599,394,
143*8af74909SZhong Yang 601,399,
144*8af74909SZhong Yang 603,400,
145*8af74909SZhong Yang 604,42923,
146*8af74909SZhong Yang 608,403,
147*8af74909SZhong Yang 609,42924,
148*8af74909SZhong Yang 611,404,
149*8af74909SZhong Yang 613,42893,
150*8af74909SZhong Yang 614,42922,
151*8af74909SZhong Yang 616,407,
152*8af74909SZhong Yang 617,406,
153*8af74909SZhong Yang 618,42926,
154*8af74909SZhong Yang 619,11362,
155*8af74909SZhong Yang 620,42925,
156*8af74909SZhong Yang 623,412,
157*8af74909SZhong Yang 625,11374,
158*8af74909SZhong Yang 626,413,
159*8af74909SZhong Yang 629,415,
160*8af74909SZhong Yang 637,11364,
161*8af74909SZhong Yang 640,422,
162*8af74909SZhong Yang 642,42949,
163*8af74909SZhong Yang 643,425,
164*8af74909SZhong Yang 647,42929,
165*8af74909SZhong Yang 648,430,
166*8af74909SZhong Yang 649,580,
167*8af74909SZhong Yang 650,433,
168*8af74909SZhong Yang 651,434,
169*8af74909SZhong Yang 652,581,
170*8af74909SZhong Yang 658,439,
171*8af74909SZhong Yang 669,42930,
172*8af74909SZhong Yang 670,42928,
173*8af74909SZhong Yang 881,880,
174*8af74909SZhong Yang 883,882,
175*8af74909SZhong Yang 887,886,
176*8af74909SZhong Yang 891,1021,
177*8af74909SZhong Yang 892,1022,
178*8af74909SZhong Yang 893,1023,
179*8af74909SZhong Yang 940,902,
180*8af74909SZhong Yang 941,904,
181*8af74909SZhong Yang 942,905,
182*8af74909SZhong Yang 943,906,
183*8af74909SZhong Yang 972,908,
184*8af74909SZhong Yang 973,910,
185*8af74909SZhong Yang 974,911,
186*8af74909SZhong Yang 983,975,
187*8af74909SZhong Yang 1010,1017,
188*8af74909SZhong Yang 1011,895,
189*8af74909SZhong Yang 1016,1015,
190*8af74909SZhong Yang 1019,1018,
191*8af74909SZhong Yang 1231,1216,
192*8af74909SZhong Yang 4349,7357,
193*8af74909SZhong Yang 4350,7358,
194*8af74909SZhong Yang 4351,7359,
195*8af74909SZhong Yang 7545,42877,
196*8af74909SZhong Yang 7549,11363,
197*8af74909SZhong Yang 7566,42950,
198*8af74909SZhong Yang 8017,8025,
199*8af74909SZhong Yang 8019,8027,
200*8af74909SZhong Yang 8021,8029,
201*8af74909SZhong Yang 8023,8031,
202*8af74909SZhong Yang 8048,8122,
203*8af74909SZhong Yang 8049,8123,
204*8af74909SZhong Yang 8050,8136,
205*8af74909SZhong Yang 8051,8137,
206*8af74909SZhong Yang 8052,8138,
207*8af74909SZhong Yang 8053,8139,
208*8af74909SZhong Yang 8054,8154,
209*8af74909SZhong Yang 8055,8155,
210*8af74909SZhong Yang 8056,8184,
211*8af74909SZhong Yang 8057,8185,
212*8af74909SZhong Yang 8058,8170,
213*8af74909SZhong Yang 8059,8171,
214*8af74909SZhong Yang 8060,8186,
215*8af74909SZhong Yang 8061,8187,
216*8af74909SZhong Yang 8112,8120,
217*8af74909SZhong Yang 8113,8121,
218*8af74909SZhong Yang 8144,8152,
219*8af74909SZhong Yang 8145,8153,
220*8af74909SZhong Yang 8160,8168,
221*8af74909SZhong Yang 8161,8169,
222*8af74909SZhong Yang 8165,8172,
223*8af74909SZhong Yang 8526,8498,
224*8af74909SZhong Yang 8580,8579,
225*8af74909SZhong Yang 11361,11360,
226*8af74909SZhong Yang 11365,570,
227*8af74909SZhong Yang 11366,574,
228*8af74909SZhong Yang 11368,11367,
229*8af74909SZhong Yang 11370,11369,
230*8af74909SZhong Yang 11372,11371,
231*8af74909SZhong Yang 11379,11378,
232*8af74909SZhong Yang 11382,11381,
233*8af74909SZhong Yang 11500,11499,
234*8af74909SZhong Yang 11502,11501,
235*8af74909SZhong Yang 11507,11506,
236*8af74909SZhong Yang 11559,4295,
237*8af74909SZhong Yang 11565,4301,
238*8af74909SZhong Yang 42874,42873,
239*8af74909SZhong Yang 42876,42875,
240*8af74909SZhong Yang 42892,42891,
241*8af74909SZhong Yang 42897,42896,
242*8af74909SZhong Yang 42899,42898,
243*8af74909SZhong Yang 42900,42948,
244*8af74909SZhong Yang 42947,42946,
245*8af74909SZhong Yang 43859,42931,
246*8af74909SZhong Yang
247*8af74909SZhong Yang //--Autogenerated -- end of section automatically generated
248*8af74909SZhong Yang };
249*8af74909SZhong Yang
250*8af74909SZhong Yang // Characters that have complex case conversions are listed here.
251*8af74909SZhong Yang // This includes cases where more than one character is needed for a conversion,
252*8af74909SZhong Yang // folding is different to lowering, or (as appropriate) upper(lower(x)) != x or
253*8af74909SZhong Yang // lower(upper(x)) != x.
254*8af74909SZhong Yang
255*8af74909SZhong Yang const char *complexCaseConversions =
256*8af74909SZhong Yang // Original | Folded | Upper | Lower |
257*8af74909SZhong Yang //++Autogenerated -- start of section automatically generated
258*8af74909SZhong Yang //**2 \(\*\n\)
259*8af74909SZhong Yang "\xc2\xb5|\xce\xbc|\xce\x9c||"
260*8af74909SZhong Yang "\xc3\x9f|ss|SS||"
261*8af74909SZhong Yang "\xc4\xb0|i\xcc\x87||i\xcc\x87|"
262*8af74909SZhong Yang "\xc4\xb1||I||"
263*8af74909SZhong Yang "\xc5\x89|\xca\xbcn|\xca\xbcN||"
264*8af74909SZhong Yang "\xc5\xbf|s|S||"
265*8af74909SZhong Yang "\xc7\x85|\xc7\x86|\xc7\x84|\xc7\x86|"
266*8af74909SZhong Yang "\xc7\x88|\xc7\x89|\xc7\x87|\xc7\x89|"
267*8af74909SZhong Yang "\xc7\x8b|\xc7\x8c|\xc7\x8a|\xc7\x8c|"
268*8af74909SZhong Yang "\xc7\xb0|j\xcc\x8c|J\xcc\x8c||"
269*8af74909SZhong Yang "\xc7\xb2|\xc7\xb3|\xc7\xb1|\xc7\xb3|"
270*8af74909SZhong Yang "\xcd\x85|\xce\xb9|\xce\x99||"
271*8af74909SZhong Yang "\xce\x90|\xce\xb9\xcc\x88\xcc\x81|\xce\x99\xcc\x88\xcc\x81||"
272*8af74909SZhong Yang "\xce\xb0|\xcf\x85\xcc\x88\xcc\x81|\xce\xa5\xcc\x88\xcc\x81||"
273*8af74909SZhong Yang "\xcf\x82|\xcf\x83|\xce\xa3||"
274*8af74909SZhong Yang "\xcf\x90|\xce\xb2|\xce\x92||"
275*8af74909SZhong Yang "\xcf\x91|\xce\xb8|\xce\x98||"
276*8af74909SZhong Yang "\xcf\x95|\xcf\x86|\xce\xa6||"
277*8af74909SZhong Yang "\xcf\x96|\xcf\x80|\xce\xa0||"
278*8af74909SZhong Yang "\xcf\xb0|\xce\xba|\xce\x9a||"
279*8af74909SZhong Yang "\xcf\xb1|\xcf\x81|\xce\xa1||"
280*8af74909SZhong Yang "\xcf\xb4|\xce\xb8||\xce\xb8|"
281*8af74909SZhong Yang "\xcf\xb5|\xce\xb5|\xce\x95||"
282*8af74909SZhong Yang "\xd6\x87|\xd5\xa5\xd6\x82|\xd4\xb5\xd5\x92||"
283*8af74909SZhong Yang "\xe1\x8e\xa0|||\xea\xad\xb0|"
284*8af74909SZhong Yang "\xe1\x8e\xa1|||\xea\xad\xb1|"
285*8af74909SZhong Yang "\xe1\x8e\xa2|||\xea\xad\xb2|"
286*8af74909SZhong Yang "\xe1\x8e\xa3|||\xea\xad\xb3|"
287*8af74909SZhong Yang "\xe1\x8e\xa4|||\xea\xad\xb4|"
288*8af74909SZhong Yang "\xe1\x8e\xa5|||\xea\xad\xb5|"
289*8af74909SZhong Yang "\xe1\x8e\xa6|||\xea\xad\xb6|"
290*8af74909SZhong Yang "\xe1\x8e\xa7|||\xea\xad\xb7|"
291*8af74909SZhong Yang "\xe1\x8e\xa8|||\xea\xad\xb8|"
292*8af74909SZhong Yang "\xe1\x8e\xa9|||\xea\xad\xb9|"
293*8af74909SZhong Yang "\xe1\x8e\xaa|||\xea\xad\xba|"
294*8af74909SZhong Yang "\xe1\x8e\xab|||\xea\xad\xbb|"
295*8af74909SZhong Yang "\xe1\x8e\xac|||\xea\xad\xbc|"
296*8af74909SZhong Yang "\xe1\x8e\xad|||\xea\xad\xbd|"
297*8af74909SZhong Yang "\xe1\x8e\xae|||\xea\xad\xbe|"
298*8af74909SZhong Yang "\xe1\x8e\xaf|||\xea\xad\xbf|"
299*8af74909SZhong Yang "\xe1\x8e\xb0|||\xea\xae\x80|"
300*8af74909SZhong Yang "\xe1\x8e\xb1|||\xea\xae\x81|"
301*8af74909SZhong Yang "\xe1\x8e\xb2|||\xea\xae\x82|"
302*8af74909SZhong Yang "\xe1\x8e\xb3|||\xea\xae\x83|"
303*8af74909SZhong Yang "\xe1\x8e\xb4|||\xea\xae\x84|"
304*8af74909SZhong Yang "\xe1\x8e\xb5|||\xea\xae\x85|"
305*8af74909SZhong Yang "\xe1\x8e\xb6|||\xea\xae\x86|"
306*8af74909SZhong Yang "\xe1\x8e\xb7|||\xea\xae\x87|"
307*8af74909SZhong Yang "\xe1\x8e\xb8|||\xea\xae\x88|"
308*8af74909SZhong Yang "\xe1\x8e\xb9|||\xea\xae\x89|"
309*8af74909SZhong Yang "\xe1\x8e\xba|||\xea\xae\x8a|"
310*8af74909SZhong Yang "\xe1\x8e\xbb|||\xea\xae\x8b|"
311*8af74909SZhong Yang "\xe1\x8e\xbc|||\xea\xae\x8c|"
312*8af74909SZhong Yang "\xe1\x8e\xbd|||\xea\xae\x8d|"
313*8af74909SZhong Yang "\xe1\x8e\xbe|||\xea\xae\x8e|"
314*8af74909SZhong Yang "\xe1\x8e\xbf|||\xea\xae\x8f|"
315*8af74909SZhong Yang "\xe1\x8f\x80|||\xea\xae\x90|"
316*8af74909SZhong Yang "\xe1\x8f\x81|||\xea\xae\x91|"
317*8af74909SZhong Yang "\xe1\x8f\x82|||\xea\xae\x92|"
318*8af74909SZhong Yang "\xe1\x8f\x83|||\xea\xae\x93|"
319*8af74909SZhong Yang "\xe1\x8f\x84|||\xea\xae\x94|"
320*8af74909SZhong Yang "\xe1\x8f\x85|||\xea\xae\x95|"
321*8af74909SZhong Yang "\xe1\x8f\x86|||\xea\xae\x96|"
322*8af74909SZhong Yang "\xe1\x8f\x87|||\xea\xae\x97|"
323*8af74909SZhong Yang "\xe1\x8f\x88|||\xea\xae\x98|"
324*8af74909SZhong Yang "\xe1\x8f\x89|||\xea\xae\x99|"
325*8af74909SZhong Yang "\xe1\x8f\x8a|||\xea\xae\x9a|"
326*8af74909SZhong Yang "\xe1\x8f\x8b|||\xea\xae\x9b|"
327*8af74909SZhong Yang "\xe1\x8f\x8c|||\xea\xae\x9c|"
328*8af74909SZhong Yang "\xe1\x8f\x8d|||\xea\xae\x9d|"
329*8af74909SZhong Yang "\xe1\x8f\x8e|||\xea\xae\x9e|"
330*8af74909SZhong Yang "\xe1\x8f\x8f|||\xea\xae\x9f|"
331*8af74909SZhong Yang "\xe1\x8f\x90|||\xea\xae\xa0|"
332*8af74909SZhong Yang "\xe1\x8f\x91|||\xea\xae\xa1|"
333*8af74909SZhong Yang "\xe1\x8f\x92|||\xea\xae\xa2|"
334*8af74909SZhong Yang "\xe1\x8f\x93|||\xea\xae\xa3|"
335*8af74909SZhong Yang "\xe1\x8f\x94|||\xea\xae\xa4|"
336*8af74909SZhong Yang "\xe1\x8f\x95|||\xea\xae\xa5|"
337*8af74909SZhong Yang "\xe1\x8f\x96|||\xea\xae\xa6|"
338*8af74909SZhong Yang "\xe1\x8f\x97|||\xea\xae\xa7|"
339*8af74909SZhong Yang "\xe1\x8f\x98|||\xea\xae\xa8|"
340*8af74909SZhong Yang "\xe1\x8f\x99|||\xea\xae\xa9|"
341*8af74909SZhong Yang "\xe1\x8f\x9a|||\xea\xae\xaa|"
342*8af74909SZhong Yang "\xe1\x8f\x9b|||\xea\xae\xab|"
343*8af74909SZhong Yang "\xe1\x8f\x9c|||\xea\xae\xac|"
344*8af74909SZhong Yang "\xe1\x8f\x9d|||\xea\xae\xad|"
345*8af74909SZhong Yang "\xe1\x8f\x9e|||\xea\xae\xae|"
346*8af74909SZhong Yang "\xe1\x8f\x9f|||\xea\xae\xaf|"
347*8af74909SZhong Yang "\xe1\x8f\xa0|||\xea\xae\xb0|"
348*8af74909SZhong Yang "\xe1\x8f\xa1|||\xea\xae\xb1|"
349*8af74909SZhong Yang "\xe1\x8f\xa2|||\xea\xae\xb2|"
350*8af74909SZhong Yang "\xe1\x8f\xa3|||\xea\xae\xb3|"
351*8af74909SZhong Yang "\xe1\x8f\xa4|||\xea\xae\xb4|"
352*8af74909SZhong Yang "\xe1\x8f\xa5|||\xea\xae\xb5|"
353*8af74909SZhong Yang "\xe1\x8f\xa6|||\xea\xae\xb6|"
354*8af74909SZhong Yang "\xe1\x8f\xa7|||\xea\xae\xb7|"
355*8af74909SZhong Yang "\xe1\x8f\xa8|||\xea\xae\xb8|"
356*8af74909SZhong Yang "\xe1\x8f\xa9|||\xea\xae\xb9|"
357*8af74909SZhong Yang "\xe1\x8f\xaa|||\xea\xae\xba|"
358*8af74909SZhong Yang "\xe1\x8f\xab|||\xea\xae\xbb|"
359*8af74909SZhong Yang "\xe1\x8f\xac|||\xea\xae\xbc|"
360*8af74909SZhong Yang "\xe1\x8f\xad|||\xea\xae\xbd|"
361*8af74909SZhong Yang "\xe1\x8f\xae|||\xea\xae\xbe|"
362*8af74909SZhong Yang "\xe1\x8f\xaf|||\xea\xae\xbf|"
363*8af74909SZhong Yang "\xe1\x8f\xb0|||\xe1\x8f\xb8|"
364*8af74909SZhong Yang "\xe1\x8f\xb1|||\xe1\x8f\xb9|"
365*8af74909SZhong Yang "\xe1\x8f\xb2|||\xe1\x8f\xba|"
366*8af74909SZhong Yang "\xe1\x8f\xb3|||\xe1\x8f\xbb|"
367*8af74909SZhong Yang "\xe1\x8f\xb4|||\xe1\x8f\xbc|"
368*8af74909SZhong Yang "\xe1\x8f\xb5|||\xe1\x8f\xbd|"
369*8af74909SZhong Yang "\xe1\x8f\xb8|\xe1\x8f\xb0|\xe1\x8f\xb0||"
370*8af74909SZhong Yang "\xe1\x8f\xb9|\xe1\x8f\xb1|\xe1\x8f\xb1||"
371*8af74909SZhong Yang "\xe1\x8f\xba|\xe1\x8f\xb2|\xe1\x8f\xb2||"
372*8af74909SZhong Yang "\xe1\x8f\xbb|\xe1\x8f\xb3|\xe1\x8f\xb3||"
373*8af74909SZhong Yang "\xe1\x8f\xbc|\xe1\x8f\xb4|\xe1\x8f\xb4||"
374*8af74909SZhong Yang "\xe1\x8f\xbd|\xe1\x8f\xb5|\xe1\x8f\xb5||"
375*8af74909SZhong Yang "\xe1\xb2\x80|\xd0\xb2|\xd0\x92||"
376*8af74909SZhong Yang "\xe1\xb2\x81|\xd0\xb4|\xd0\x94||"
377*8af74909SZhong Yang "\xe1\xb2\x82|\xd0\xbe|\xd0\x9e||"
378*8af74909SZhong Yang "\xe1\xb2\x83|\xd1\x81|\xd0\xa1||"
379*8af74909SZhong Yang "\xe1\xb2\x84|\xd1\x82|\xd0\xa2||"
380*8af74909SZhong Yang "\xe1\xb2\x85|\xd1\x82|\xd0\xa2||"
381*8af74909SZhong Yang "\xe1\xb2\x86|\xd1\x8a|\xd0\xaa||"
382*8af74909SZhong Yang "\xe1\xb2\x87|\xd1\xa3|\xd1\xa2||"
383*8af74909SZhong Yang "\xe1\xb2\x88|\xea\x99\x8b|\xea\x99\x8a||"
384*8af74909SZhong Yang "\xe1\xba\x96|h\xcc\xb1|H\xcc\xb1||"
385*8af74909SZhong Yang "\xe1\xba\x97|t\xcc\x88|T\xcc\x88||"
386*8af74909SZhong Yang "\xe1\xba\x98|w\xcc\x8a|W\xcc\x8a||"
387*8af74909SZhong Yang "\xe1\xba\x99|y\xcc\x8a|Y\xcc\x8a||"
388*8af74909SZhong Yang "\xe1\xba\x9a|a\xca\xbe|A\xca\xbe||"
389*8af74909SZhong Yang "\xe1\xba\x9b|\xe1\xb9\xa1|\xe1\xb9\xa0||"
390*8af74909SZhong Yang "\xe1\xba\x9e|ss||\xc3\x9f|"
391*8af74909SZhong Yang "\xe1\xbd\x90|\xcf\x85\xcc\x93|\xce\xa5\xcc\x93||"
392*8af74909SZhong Yang "\xe1\xbd\x92|\xcf\x85\xcc\x93\xcc\x80|\xce\xa5\xcc\x93\xcc\x80||"
393*8af74909SZhong Yang "\xe1\xbd\x94|\xcf\x85\xcc\x93\xcc\x81|\xce\xa5\xcc\x93\xcc\x81||"
394*8af74909SZhong Yang "\xe1\xbd\x96|\xcf\x85\xcc\x93\xcd\x82|\xce\xa5\xcc\x93\xcd\x82||"
395*8af74909SZhong Yang "\xe1\xbe\x80|\xe1\xbc\x80\xce\xb9|\xe1\xbc\x88\xce\x99||"
396*8af74909SZhong Yang "\xe1\xbe\x81|\xe1\xbc\x81\xce\xb9|\xe1\xbc\x89\xce\x99||"
397*8af74909SZhong Yang "\xe1\xbe\x82|\xe1\xbc\x82\xce\xb9|\xe1\xbc\x8a\xce\x99||"
398*8af74909SZhong Yang "\xe1\xbe\x83|\xe1\xbc\x83\xce\xb9|\xe1\xbc\x8b\xce\x99||"
399*8af74909SZhong Yang "\xe1\xbe\x84|\xe1\xbc\x84\xce\xb9|\xe1\xbc\x8c\xce\x99||"
400*8af74909SZhong Yang "\xe1\xbe\x85|\xe1\xbc\x85\xce\xb9|\xe1\xbc\x8d\xce\x99||"
401*8af74909SZhong Yang "\xe1\xbe\x86|\xe1\xbc\x86\xce\xb9|\xe1\xbc\x8e\xce\x99||"
402*8af74909SZhong Yang "\xe1\xbe\x87|\xe1\xbc\x87\xce\xb9|\xe1\xbc\x8f\xce\x99||"
403*8af74909SZhong Yang "\xe1\xbe\x88|\xe1\xbc\x80\xce\xb9|\xe1\xbc\x88\xce\x99|\xe1\xbe\x80|"
404*8af74909SZhong Yang "\xe1\xbe\x89|\xe1\xbc\x81\xce\xb9|\xe1\xbc\x89\xce\x99|\xe1\xbe\x81|"
405*8af74909SZhong Yang "\xe1\xbe\x8a|\xe1\xbc\x82\xce\xb9|\xe1\xbc\x8a\xce\x99|\xe1\xbe\x82|"
406*8af74909SZhong Yang "\xe1\xbe\x8b|\xe1\xbc\x83\xce\xb9|\xe1\xbc\x8b\xce\x99|\xe1\xbe\x83|"
407*8af74909SZhong Yang "\xe1\xbe\x8c|\xe1\xbc\x84\xce\xb9|\xe1\xbc\x8c\xce\x99|\xe1\xbe\x84|"
408*8af74909SZhong Yang "\xe1\xbe\x8d|\xe1\xbc\x85\xce\xb9|\xe1\xbc\x8d\xce\x99|\xe1\xbe\x85|"
409*8af74909SZhong Yang "\xe1\xbe\x8e|\xe1\xbc\x86\xce\xb9|\xe1\xbc\x8e\xce\x99|\xe1\xbe\x86|"
410*8af74909SZhong Yang "\xe1\xbe\x8f|\xe1\xbc\x87\xce\xb9|\xe1\xbc\x8f\xce\x99|\xe1\xbe\x87|"
411*8af74909SZhong Yang "\xe1\xbe\x90|\xe1\xbc\xa0\xce\xb9|\xe1\xbc\xa8\xce\x99||"
412*8af74909SZhong Yang "\xe1\xbe\x91|\xe1\xbc\xa1\xce\xb9|\xe1\xbc\xa9\xce\x99||"
413*8af74909SZhong Yang "\xe1\xbe\x92|\xe1\xbc\xa2\xce\xb9|\xe1\xbc\xaa\xce\x99||"
414*8af74909SZhong Yang "\xe1\xbe\x93|\xe1\xbc\xa3\xce\xb9|\xe1\xbc\xab\xce\x99||"
415*8af74909SZhong Yang "\xe1\xbe\x94|\xe1\xbc\xa4\xce\xb9|\xe1\xbc\xac\xce\x99||"
416*8af74909SZhong Yang "\xe1\xbe\x95|\xe1\xbc\xa5\xce\xb9|\xe1\xbc\xad\xce\x99||"
417*8af74909SZhong Yang "\xe1\xbe\x96|\xe1\xbc\xa6\xce\xb9|\xe1\xbc\xae\xce\x99||"
418*8af74909SZhong Yang "\xe1\xbe\x97|\xe1\xbc\xa7\xce\xb9|\xe1\xbc\xaf\xce\x99||"
419*8af74909SZhong Yang "\xe1\xbe\x98|\xe1\xbc\xa0\xce\xb9|\xe1\xbc\xa8\xce\x99|\xe1\xbe\x90|"
420*8af74909SZhong Yang "\xe1\xbe\x99|\xe1\xbc\xa1\xce\xb9|\xe1\xbc\xa9\xce\x99|\xe1\xbe\x91|"
421*8af74909SZhong Yang "\xe1\xbe\x9a|\xe1\xbc\xa2\xce\xb9|\xe1\xbc\xaa\xce\x99|\xe1\xbe\x92|"
422*8af74909SZhong Yang "\xe1\xbe\x9b|\xe1\xbc\xa3\xce\xb9|\xe1\xbc\xab\xce\x99|\xe1\xbe\x93|"
423*8af74909SZhong Yang "\xe1\xbe\x9c|\xe1\xbc\xa4\xce\xb9|\xe1\xbc\xac\xce\x99|\xe1\xbe\x94|"
424*8af74909SZhong Yang "\xe1\xbe\x9d|\xe1\xbc\xa5\xce\xb9|\xe1\xbc\xad\xce\x99|\xe1\xbe\x95|"
425*8af74909SZhong Yang "\xe1\xbe\x9e|\xe1\xbc\xa6\xce\xb9|\xe1\xbc\xae\xce\x99|\xe1\xbe\x96|"
426*8af74909SZhong Yang "\xe1\xbe\x9f|\xe1\xbc\xa7\xce\xb9|\xe1\xbc\xaf\xce\x99|\xe1\xbe\x97|"
427*8af74909SZhong Yang "\xe1\xbe\xa0|\xe1\xbd\xa0\xce\xb9|\xe1\xbd\xa8\xce\x99||"
428*8af74909SZhong Yang "\xe1\xbe\xa1|\xe1\xbd\xa1\xce\xb9|\xe1\xbd\xa9\xce\x99||"
429*8af74909SZhong Yang "\xe1\xbe\xa2|\xe1\xbd\xa2\xce\xb9|\xe1\xbd\xaa\xce\x99||"
430*8af74909SZhong Yang "\xe1\xbe\xa3|\xe1\xbd\xa3\xce\xb9|\xe1\xbd\xab\xce\x99||"
431*8af74909SZhong Yang "\xe1\xbe\xa4|\xe1\xbd\xa4\xce\xb9|\xe1\xbd\xac\xce\x99||"
432*8af74909SZhong Yang "\xe1\xbe\xa5|\xe1\xbd\xa5\xce\xb9|\xe1\xbd\xad\xce\x99||"
433*8af74909SZhong Yang "\xe1\xbe\xa6|\xe1\xbd\xa6\xce\xb9|\xe1\xbd\xae\xce\x99||"
434*8af74909SZhong Yang "\xe1\xbe\xa7|\xe1\xbd\xa7\xce\xb9|\xe1\xbd\xaf\xce\x99||"
435*8af74909SZhong Yang "\xe1\xbe\xa8|\xe1\xbd\xa0\xce\xb9|\xe1\xbd\xa8\xce\x99|\xe1\xbe\xa0|"
436*8af74909SZhong Yang "\xe1\xbe\xa9|\xe1\xbd\xa1\xce\xb9|\xe1\xbd\xa9\xce\x99|\xe1\xbe\xa1|"
437*8af74909SZhong Yang "\xe1\xbe\xaa|\xe1\xbd\xa2\xce\xb9|\xe1\xbd\xaa\xce\x99|\xe1\xbe\xa2|"
438*8af74909SZhong Yang "\xe1\xbe\xab|\xe1\xbd\xa3\xce\xb9|\xe1\xbd\xab\xce\x99|\xe1\xbe\xa3|"
439*8af74909SZhong Yang "\xe1\xbe\xac|\xe1\xbd\xa4\xce\xb9|\xe1\xbd\xac\xce\x99|\xe1\xbe\xa4|"
440*8af74909SZhong Yang "\xe1\xbe\xad|\xe1\xbd\xa5\xce\xb9|\xe1\xbd\xad\xce\x99|\xe1\xbe\xa5|"
441*8af74909SZhong Yang "\xe1\xbe\xae|\xe1\xbd\xa6\xce\xb9|\xe1\xbd\xae\xce\x99|\xe1\xbe\xa6|"
442*8af74909SZhong Yang "\xe1\xbe\xaf|\xe1\xbd\xa7\xce\xb9|\xe1\xbd\xaf\xce\x99|\xe1\xbe\xa7|"
443*8af74909SZhong Yang "\xe1\xbe\xb2|\xe1\xbd\xb0\xce\xb9|\xe1\xbe\xba\xce\x99||"
444*8af74909SZhong Yang "\xe1\xbe\xb3|\xce\xb1\xce\xb9|\xce\x91\xce\x99||"
445*8af74909SZhong Yang "\xe1\xbe\xb4|\xce\xac\xce\xb9|\xce\x86\xce\x99||"
446*8af74909SZhong Yang "\xe1\xbe\xb6|\xce\xb1\xcd\x82|\xce\x91\xcd\x82||"
447*8af74909SZhong Yang "\xe1\xbe\xb7|\xce\xb1\xcd\x82\xce\xb9|\xce\x91\xcd\x82\xce\x99||"
448*8af74909SZhong Yang "\xe1\xbe\xbc|\xce\xb1\xce\xb9|\xce\x91\xce\x99|\xe1\xbe\xb3|"
449*8af74909SZhong Yang "\xe1\xbe\xbe|\xce\xb9|\xce\x99||"
450*8af74909SZhong Yang "\xe1\xbf\x82|\xe1\xbd\xb4\xce\xb9|\xe1\xbf\x8a\xce\x99||"
451*8af74909SZhong Yang "\xe1\xbf\x83|\xce\xb7\xce\xb9|\xce\x97\xce\x99||"
452*8af74909SZhong Yang "\xe1\xbf\x84|\xce\xae\xce\xb9|\xce\x89\xce\x99||"
453*8af74909SZhong Yang "\xe1\xbf\x86|\xce\xb7\xcd\x82|\xce\x97\xcd\x82||"
454*8af74909SZhong Yang "\xe1\xbf\x87|\xce\xb7\xcd\x82\xce\xb9|\xce\x97\xcd\x82\xce\x99||"
455*8af74909SZhong Yang "\xe1\xbf\x8c|\xce\xb7\xce\xb9|\xce\x97\xce\x99|\xe1\xbf\x83|"
456*8af74909SZhong Yang "\xe1\xbf\x92|\xce\xb9\xcc\x88\xcc\x80|\xce\x99\xcc\x88\xcc\x80||"
457*8af74909SZhong Yang "\xe1\xbf\x93|\xce\xb9\xcc\x88\xcc\x81|\xce\x99\xcc\x88\xcc\x81||"
458*8af74909SZhong Yang "\xe1\xbf\x96|\xce\xb9\xcd\x82|\xce\x99\xcd\x82||"
459*8af74909SZhong Yang "\xe1\xbf\x97|\xce\xb9\xcc\x88\xcd\x82|\xce\x99\xcc\x88\xcd\x82||"
460*8af74909SZhong Yang "\xe1\xbf\xa2|\xcf\x85\xcc\x88\xcc\x80|\xce\xa5\xcc\x88\xcc\x80||"
461*8af74909SZhong Yang "\xe1\xbf\xa3|\xcf\x85\xcc\x88\xcc\x81|\xce\xa5\xcc\x88\xcc\x81||"
462*8af74909SZhong Yang "\xe1\xbf\xa4|\xcf\x81\xcc\x93|\xce\xa1\xcc\x93||"
463*8af74909SZhong Yang "\xe1\xbf\xa6|\xcf\x85\xcd\x82|\xce\xa5\xcd\x82||"
464*8af74909SZhong Yang "\xe1\xbf\xa7|\xcf\x85\xcc\x88\xcd\x82|\xce\xa5\xcc\x88\xcd\x82||"
465*8af74909SZhong Yang "\xe1\xbf\xb2|\xe1\xbd\xbc\xce\xb9|\xe1\xbf\xba\xce\x99||"
466*8af74909SZhong Yang "\xe1\xbf\xb3|\xcf\x89\xce\xb9|\xce\xa9\xce\x99||"
467*8af74909SZhong Yang "\xe1\xbf\xb4|\xcf\x8e\xce\xb9|\xce\x8f\xce\x99||"
468*8af74909SZhong Yang "\xe1\xbf\xb6|\xcf\x89\xcd\x82|\xce\xa9\xcd\x82||"
469*8af74909SZhong Yang "\xe1\xbf\xb7|\xcf\x89\xcd\x82\xce\xb9|\xce\xa9\xcd\x82\xce\x99||"
470*8af74909SZhong Yang "\xe1\xbf\xbc|\xcf\x89\xce\xb9|\xce\xa9\xce\x99|\xe1\xbf\xb3|"
471*8af74909SZhong Yang "\xe2\x84\xa6|\xcf\x89||\xcf\x89|"
472*8af74909SZhong Yang "\xe2\x84\xaa|k||k|"
473*8af74909SZhong Yang "\xe2\x84\xab|\xc3\xa5||\xc3\xa5|"
474*8af74909SZhong Yang "\xea\xad\xb0|\xe1\x8e\xa0|\xe1\x8e\xa0||"
475*8af74909SZhong Yang "\xea\xad\xb1|\xe1\x8e\xa1|\xe1\x8e\xa1||"
476*8af74909SZhong Yang "\xea\xad\xb2|\xe1\x8e\xa2|\xe1\x8e\xa2||"
477*8af74909SZhong Yang "\xea\xad\xb3|\xe1\x8e\xa3|\xe1\x8e\xa3||"
478*8af74909SZhong Yang "\xea\xad\xb4|\xe1\x8e\xa4|\xe1\x8e\xa4||"
479*8af74909SZhong Yang "\xea\xad\xb5|\xe1\x8e\xa5|\xe1\x8e\xa5||"
480*8af74909SZhong Yang "\xea\xad\xb6|\xe1\x8e\xa6|\xe1\x8e\xa6||"
481*8af74909SZhong Yang "\xea\xad\xb7|\xe1\x8e\xa7|\xe1\x8e\xa7||"
482*8af74909SZhong Yang "\xea\xad\xb8|\xe1\x8e\xa8|\xe1\x8e\xa8||"
483*8af74909SZhong Yang "\xea\xad\xb9|\xe1\x8e\xa9|\xe1\x8e\xa9||"
484*8af74909SZhong Yang "\xea\xad\xba|\xe1\x8e\xaa|\xe1\x8e\xaa||"
485*8af74909SZhong Yang "\xea\xad\xbb|\xe1\x8e\xab|\xe1\x8e\xab||"
486*8af74909SZhong Yang "\xea\xad\xbc|\xe1\x8e\xac|\xe1\x8e\xac||"
487*8af74909SZhong Yang "\xea\xad\xbd|\xe1\x8e\xad|\xe1\x8e\xad||"
488*8af74909SZhong Yang "\xea\xad\xbe|\xe1\x8e\xae|\xe1\x8e\xae||"
489*8af74909SZhong Yang "\xea\xad\xbf|\xe1\x8e\xaf|\xe1\x8e\xaf||"
490*8af74909SZhong Yang "\xea\xae\x80|\xe1\x8e\xb0|\xe1\x8e\xb0||"
491*8af74909SZhong Yang "\xea\xae\x81|\xe1\x8e\xb1|\xe1\x8e\xb1||"
492*8af74909SZhong Yang "\xea\xae\x82|\xe1\x8e\xb2|\xe1\x8e\xb2||"
493*8af74909SZhong Yang "\xea\xae\x83|\xe1\x8e\xb3|\xe1\x8e\xb3||"
494*8af74909SZhong Yang "\xea\xae\x84|\xe1\x8e\xb4|\xe1\x8e\xb4||"
495*8af74909SZhong Yang "\xea\xae\x85|\xe1\x8e\xb5|\xe1\x8e\xb5||"
496*8af74909SZhong Yang "\xea\xae\x86|\xe1\x8e\xb6|\xe1\x8e\xb6||"
497*8af74909SZhong Yang "\xea\xae\x87|\xe1\x8e\xb7|\xe1\x8e\xb7||"
498*8af74909SZhong Yang "\xea\xae\x88|\xe1\x8e\xb8|\xe1\x8e\xb8||"
499*8af74909SZhong Yang "\xea\xae\x89|\xe1\x8e\xb9|\xe1\x8e\xb9||"
500*8af74909SZhong Yang "\xea\xae\x8a|\xe1\x8e\xba|\xe1\x8e\xba||"
501*8af74909SZhong Yang "\xea\xae\x8b|\xe1\x8e\xbb|\xe1\x8e\xbb||"
502*8af74909SZhong Yang "\xea\xae\x8c|\xe1\x8e\xbc|\xe1\x8e\xbc||"
503*8af74909SZhong Yang "\xea\xae\x8d|\xe1\x8e\xbd|\xe1\x8e\xbd||"
504*8af74909SZhong Yang "\xea\xae\x8e|\xe1\x8e\xbe|\xe1\x8e\xbe||"
505*8af74909SZhong Yang "\xea\xae\x8f|\xe1\x8e\xbf|\xe1\x8e\xbf||"
506*8af74909SZhong Yang "\xea\xae\x90|\xe1\x8f\x80|\xe1\x8f\x80||"
507*8af74909SZhong Yang "\xea\xae\x91|\xe1\x8f\x81|\xe1\x8f\x81||"
508*8af74909SZhong Yang "\xea\xae\x92|\xe1\x8f\x82|\xe1\x8f\x82||"
509*8af74909SZhong Yang "\xea\xae\x93|\xe1\x8f\x83|\xe1\x8f\x83||"
510*8af74909SZhong Yang "\xea\xae\x94|\xe1\x8f\x84|\xe1\x8f\x84||"
511*8af74909SZhong Yang "\xea\xae\x95|\xe1\x8f\x85|\xe1\x8f\x85||"
512*8af74909SZhong Yang "\xea\xae\x96|\xe1\x8f\x86|\xe1\x8f\x86||"
513*8af74909SZhong Yang "\xea\xae\x97|\xe1\x8f\x87|\xe1\x8f\x87||"
514*8af74909SZhong Yang "\xea\xae\x98|\xe1\x8f\x88|\xe1\x8f\x88||"
515*8af74909SZhong Yang "\xea\xae\x99|\xe1\x8f\x89|\xe1\x8f\x89||"
516*8af74909SZhong Yang "\xea\xae\x9a|\xe1\x8f\x8a|\xe1\x8f\x8a||"
517*8af74909SZhong Yang "\xea\xae\x9b|\xe1\x8f\x8b|\xe1\x8f\x8b||"
518*8af74909SZhong Yang "\xea\xae\x9c|\xe1\x8f\x8c|\xe1\x8f\x8c||"
519*8af74909SZhong Yang "\xea\xae\x9d|\xe1\x8f\x8d|\xe1\x8f\x8d||"
520*8af74909SZhong Yang "\xea\xae\x9e|\xe1\x8f\x8e|\xe1\x8f\x8e||"
521*8af74909SZhong Yang "\xea\xae\x9f|\xe1\x8f\x8f|\xe1\x8f\x8f||"
522*8af74909SZhong Yang "\xea\xae\xa0|\xe1\x8f\x90|\xe1\x8f\x90||"
523*8af74909SZhong Yang "\xea\xae\xa1|\xe1\x8f\x91|\xe1\x8f\x91||"
524*8af74909SZhong Yang "\xea\xae\xa2|\xe1\x8f\x92|\xe1\x8f\x92||"
525*8af74909SZhong Yang "\xea\xae\xa3|\xe1\x8f\x93|\xe1\x8f\x93||"
526*8af74909SZhong Yang "\xea\xae\xa4|\xe1\x8f\x94|\xe1\x8f\x94||"
527*8af74909SZhong Yang "\xea\xae\xa5|\xe1\x8f\x95|\xe1\x8f\x95||"
528*8af74909SZhong Yang "\xea\xae\xa6|\xe1\x8f\x96|\xe1\x8f\x96||"
529*8af74909SZhong Yang "\xea\xae\xa7|\xe1\x8f\x97|\xe1\x8f\x97||"
530*8af74909SZhong Yang "\xea\xae\xa8|\xe1\x8f\x98|\xe1\x8f\x98||"
531*8af74909SZhong Yang "\xea\xae\xa9|\xe1\x8f\x99|\xe1\x8f\x99||"
532*8af74909SZhong Yang "\xea\xae\xaa|\xe1\x8f\x9a|\xe1\x8f\x9a||"
533*8af74909SZhong Yang "\xea\xae\xab|\xe1\x8f\x9b|\xe1\x8f\x9b||"
534*8af74909SZhong Yang "\xea\xae\xac|\xe1\x8f\x9c|\xe1\x8f\x9c||"
535*8af74909SZhong Yang "\xea\xae\xad|\xe1\x8f\x9d|\xe1\x8f\x9d||"
536*8af74909SZhong Yang "\xea\xae\xae|\xe1\x8f\x9e|\xe1\x8f\x9e||"
537*8af74909SZhong Yang "\xea\xae\xaf|\xe1\x8f\x9f|\xe1\x8f\x9f||"
538*8af74909SZhong Yang "\xea\xae\xb0|\xe1\x8f\xa0|\xe1\x8f\xa0||"
539*8af74909SZhong Yang "\xea\xae\xb1|\xe1\x8f\xa1|\xe1\x8f\xa1||"
540*8af74909SZhong Yang "\xea\xae\xb2|\xe1\x8f\xa2|\xe1\x8f\xa2||"
541*8af74909SZhong Yang "\xea\xae\xb3|\xe1\x8f\xa3|\xe1\x8f\xa3||"
542*8af74909SZhong Yang "\xea\xae\xb4|\xe1\x8f\xa4|\xe1\x8f\xa4||"
543*8af74909SZhong Yang "\xea\xae\xb5|\xe1\x8f\xa5|\xe1\x8f\xa5||"
544*8af74909SZhong Yang "\xea\xae\xb6|\xe1\x8f\xa6|\xe1\x8f\xa6||"
545*8af74909SZhong Yang "\xea\xae\xb7|\xe1\x8f\xa7|\xe1\x8f\xa7||"
546*8af74909SZhong Yang "\xea\xae\xb8|\xe1\x8f\xa8|\xe1\x8f\xa8||"
547*8af74909SZhong Yang "\xea\xae\xb9|\xe1\x8f\xa9|\xe1\x8f\xa9||"
548*8af74909SZhong Yang "\xea\xae\xba|\xe1\x8f\xaa|\xe1\x8f\xaa||"
549*8af74909SZhong Yang "\xea\xae\xbb|\xe1\x8f\xab|\xe1\x8f\xab||"
550*8af74909SZhong Yang "\xea\xae\xbc|\xe1\x8f\xac|\xe1\x8f\xac||"
551*8af74909SZhong Yang "\xea\xae\xbd|\xe1\x8f\xad|\xe1\x8f\xad||"
552*8af74909SZhong Yang "\xea\xae\xbe|\xe1\x8f\xae|\xe1\x8f\xae||"
553*8af74909SZhong Yang "\xea\xae\xbf|\xe1\x8f\xaf|\xe1\x8f\xaf||"
554*8af74909SZhong Yang "\xef\xac\x80|ff|FF||"
555*8af74909SZhong Yang "\xef\xac\x81|fi|FI||"
556*8af74909SZhong Yang "\xef\xac\x82|fl|FL||"
557*8af74909SZhong Yang "\xef\xac\x83|ffi|FFI||"
558*8af74909SZhong Yang "\xef\xac\x84|ffl|FFL||"
559*8af74909SZhong Yang "\xef\xac\x85|st|ST||"
560*8af74909SZhong Yang "\xef\xac\x86|st|ST||"
561*8af74909SZhong Yang "\xef\xac\x93|\xd5\xb4\xd5\xb6|\xd5\x84\xd5\x86||"
562*8af74909SZhong Yang "\xef\xac\x94|\xd5\xb4\xd5\xa5|\xd5\x84\xd4\xb5||"
563*8af74909SZhong Yang "\xef\xac\x95|\xd5\xb4\xd5\xab|\xd5\x84\xd4\xbb||"
564*8af74909SZhong Yang "\xef\xac\x96|\xd5\xbe\xd5\xb6|\xd5\x8e\xd5\x86||"
565*8af74909SZhong Yang "\xef\xac\x97|\xd5\xb4\xd5\xad|\xd5\x84\xd4\xbd||"
566*8af74909SZhong Yang
567*8af74909SZhong Yang //--Autogenerated -- end of section automatically generated
568*8af74909SZhong Yang ;
569*8af74909SZhong Yang
570*8af74909SZhong Yang class CaseConverter : public ICaseConverter {
571*8af74909SZhong Yang // Maximum length of a case conversion result is 6 bytes in UTF-8
572*8af74909SZhong Yang enum { maxConversionLength=6 };
573*8af74909SZhong Yang struct ConversionString {
574*8af74909SZhong Yang char conversion[maxConversionLength+1];
ConversionString__anon0ba1ab710111::CaseConverter::ConversionString575*8af74909SZhong Yang ConversionString() noexcept : conversion{} {
576*8af74909SZhong Yang }
577*8af74909SZhong Yang };
578*8af74909SZhong Yang // Conversions are initially store in a vector of structs but then decomposed into
579*8af74909SZhong Yang // parallel arrays as that is about 10% faster to search.
580*8af74909SZhong Yang struct CharacterConversion {
581*8af74909SZhong Yang int character;
582*8af74909SZhong Yang ConversionString conversion;
CharacterConversion__anon0ba1ab710111::CaseConverter::CharacterConversion583*8af74909SZhong Yang CharacterConversion() noexcept : character(0) {
584*8af74909SZhong Yang // Empty case: NUL -> "".
585*8af74909SZhong Yang }
CharacterConversion__anon0ba1ab710111::CaseConverter::CharacterConversion586*8af74909SZhong Yang CharacterConversion(int character_, std::string_view conversion_) noexcept : character(character_) {
587*8af74909SZhong Yang assert(conversion_.length() <= maxConversionLength);
588*8af74909SZhong Yang conversion_.copy(conversion.conversion, conversion_.length());
589*8af74909SZhong Yang }
operator <__anon0ba1ab710111::CaseConverter::CharacterConversion590*8af74909SZhong Yang bool operator<(const CharacterConversion &other) const noexcept {
591*8af74909SZhong Yang return character < other.character;
592*8af74909SZhong Yang }
593*8af74909SZhong Yang };
594*8af74909SZhong Yang typedef std::vector<CharacterConversion> CharacterToConversion;
595*8af74909SZhong Yang CharacterToConversion characterToConversion;
596*8af74909SZhong Yang // The parallel arrays
597*8af74909SZhong Yang std::vector<int> characters;
598*8af74909SZhong Yang std::vector<ConversionString> conversions;
599*8af74909SZhong Yang
600*8af74909SZhong Yang public:
CaseConverter()601*8af74909SZhong Yang CaseConverter() noexcept {
602*8af74909SZhong Yang }
603*8af74909SZhong Yang virtual ~CaseConverter() = default;
Initialised() const604*8af74909SZhong Yang bool Initialised() const noexcept {
605*8af74909SZhong Yang return !characters.empty();
606*8af74909SZhong Yang }
Add(int character,const char * conversion)607*8af74909SZhong Yang void Add(int character, const char *conversion) {
608*8af74909SZhong Yang characterToConversion.emplace_back(character, conversion);
609*8af74909SZhong Yang }
Find(int character)610*8af74909SZhong Yang const char *Find(int character) {
611*8af74909SZhong Yang const std::vector<int>::iterator it = std::lower_bound(characters.begin(), characters.end(), character);
612*8af74909SZhong Yang if (it == characters.end())
613*8af74909SZhong Yang return nullptr;
614*8af74909SZhong Yang else if (*it == character)
615*8af74909SZhong Yang return conversions[it - characters.begin()].conversion;
616*8af74909SZhong Yang else
617*8af74909SZhong Yang return nullptr;
618*8af74909SZhong Yang }
CaseConvertString(char * converted,size_t sizeConverted,const char * mixed,size_t lenMixed)619*8af74909SZhong Yang size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed) override {
620*8af74909SZhong Yang size_t lenConverted = 0;
621*8af74909SZhong Yang size_t mixedPos = 0;
622*8af74909SZhong Yang unsigned char bytes[UTF8MaxBytes + 1]{};
623*8af74909SZhong Yang while (mixedPos < lenMixed) {
624*8af74909SZhong Yang const unsigned char leadByte = mixed[mixedPos];
625*8af74909SZhong Yang const char *caseConverted = nullptr;
626*8af74909SZhong Yang size_t lenMixedChar = 1;
627*8af74909SZhong Yang if (UTF8IsAscii(leadByte)) {
628*8af74909SZhong Yang caseConverted = Find(leadByte);
629*8af74909SZhong Yang } else {
630*8af74909SZhong Yang bytes[0] = leadByte;
631*8af74909SZhong Yang const int widthCharBytes = UTF8BytesOfLead[leadByte];
632*8af74909SZhong Yang for (int b=1; b<widthCharBytes; b++) {
633*8af74909SZhong Yang bytes[b] = (mixedPos+b < lenMixed) ? mixed[mixedPos+b] : 0;
634*8af74909SZhong Yang }
635*8af74909SZhong Yang const int classified = UTF8Classify(bytes, widthCharBytes);
636*8af74909SZhong Yang if (!(classified & UTF8MaskInvalid)) {
637*8af74909SZhong Yang // valid UTF-8
638*8af74909SZhong Yang lenMixedChar = classified & UTF8MaskWidth;
639*8af74909SZhong Yang const int character = UnicodeFromUTF8(bytes);
640*8af74909SZhong Yang caseConverted = Find(character);
641*8af74909SZhong Yang }
642*8af74909SZhong Yang }
643*8af74909SZhong Yang if (caseConverted) {
644*8af74909SZhong Yang // Character has a conversion so copy that conversion in
645*8af74909SZhong Yang while (*caseConverted) {
646*8af74909SZhong Yang converted[lenConverted++] = *caseConverted++;
647*8af74909SZhong Yang if (lenConverted >= sizeConverted)
648*8af74909SZhong Yang return 0;
649*8af74909SZhong Yang }
650*8af74909SZhong Yang } else {
651*8af74909SZhong Yang // Character has no conversion so copy the input to output
652*8af74909SZhong Yang for (size_t i=0; i<lenMixedChar; i++) {
653*8af74909SZhong Yang converted[lenConverted++] = mixed[mixedPos+i];
654*8af74909SZhong Yang if (lenConverted >= sizeConverted)
655*8af74909SZhong Yang return 0;
656*8af74909SZhong Yang }
657*8af74909SZhong Yang }
658*8af74909SZhong Yang mixedPos += lenMixedChar;
659*8af74909SZhong Yang }
660*8af74909SZhong Yang return lenConverted;
661*8af74909SZhong Yang }
FinishedAdding()662*8af74909SZhong Yang void FinishedAdding() {
663*8af74909SZhong Yang std::sort(characterToConversion.begin(), characterToConversion.end());
664*8af74909SZhong Yang characters.reserve(characterToConversion.size());
665*8af74909SZhong Yang conversions.reserve(characterToConversion.size());
666*8af74909SZhong Yang for (const CharacterConversion &chConv : characterToConversion) {
667*8af74909SZhong Yang characters.push_back(chConv.character);
668*8af74909SZhong Yang conversions.push_back(chConv.conversion);
669*8af74909SZhong Yang }
670*8af74909SZhong Yang // Empty the original calculated data completely
671*8af74909SZhong Yang CharacterToConversion().swap(characterToConversion);
672*8af74909SZhong Yang }
673*8af74909SZhong Yang };
674*8af74909SZhong Yang
675*8af74909SZhong Yang CaseConverter caseConvFold;
676*8af74909SZhong Yang CaseConverter caseConvUp;
677*8af74909SZhong Yang CaseConverter caseConvLow;
678*8af74909SZhong Yang
AddSymmetric(enum CaseConversion conversion,int lower,int upper)679*8af74909SZhong Yang void AddSymmetric(enum CaseConversion conversion, int lower,int upper) {
680*8af74909SZhong Yang char lowerUTF8[UTF8MaxBytes+1];
681*8af74909SZhong Yang UTF8FromUTF32Character(lower, lowerUTF8);
682*8af74909SZhong Yang char upperUTF8[UTF8MaxBytes+1];
683*8af74909SZhong Yang UTF8FromUTF32Character(upper, upperUTF8);
684*8af74909SZhong Yang
685*8af74909SZhong Yang switch (conversion) {
686*8af74909SZhong Yang case CaseConversionFold:
687*8af74909SZhong Yang caseConvFold.Add(upper, lowerUTF8);
688*8af74909SZhong Yang break;
689*8af74909SZhong Yang case CaseConversionUpper:
690*8af74909SZhong Yang caseConvUp.Add(lower, upperUTF8);
691*8af74909SZhong Yang break;
692*8af74909SZhong Yang case CaseConversionLower:
693*8af74909SZhong Yang caseConvLow.Add(upper, lowerUTF8);
694*8af74909SZhong Yang break;
695*8af74909SZhong Yang }
696*8af74909SZhong Yang }
697*8af74909SZhong Yang
SetupConversions(enum CaseConversion conversion)698*8af74909SZhong Yang void SetupConversions(enum CaseConversion conversion) {
699*8af74909SZhong Yang // First initialize for the symmetric ranges
700*8af74909SZhong Yang for (size_t i=0; i<std::size(symmetricCaseConversionRanges);) {
701*8af74909SZhong Yang const int lower = symmetricCaseConversionRanges[i++];
702*8af74909SZhong Yang const int upper = symmetricCaseConversionRanges[i++];
703*8af74909SZhong Yang const int length = symmetricCaseConversionRanges[i++];
704*8af74909SZhong Yang const int pitch = symmetricCaseConversionRanges[i++];
705*8af74909SZhong Yang for (int j=0; j<length*pitch; j+=pitch) {
706*8af74909SZhong Yang AddSymmetric(conversion, lower+j, upper+j);
707*8af74909SZhong Yang }
708*8af74909SZhong Yang }
709*8af74909SZhong Yang // Add the symmetric singletons
710*8af74909SZhong Yang for (size_t i=0; i<std::size(symmetricCaseConversions);) {
711*8af74909SZhong Yang const int lower = symmetricCaseConversions[i++];
712*8af74909SZhong Yang const int upper = symmetricCaseConversions[i++];
713*8af74909SZhong Yang AddSymmetric(conversion, lower, upper);
714*8af74909SZhong Yang }
715*8af74909SZhong Yang // Add the complex cases
716*8af74909SZhong Yang const char *sComplex = complexCaseConversions;
717*8af74909SZhong Yang while (*sComplex) {
718*8af74909SZhong Yang // Longest ligature is 3 character so 5 for safety
719*8af74909SZhong Yang constexpr size_t lenUTF8 = 5*UTF8MaxBytes+1;
720*8af74909SZhong Yang unsigned char originUTF8[lenUTF8]{};
721*8af74909SZhong Yang char foldedUTF8[lenUTF8]{};
722*8af74909SZhong Yang char lowerUTF8[lenUTF8]{};
723*8af74909SZhong Yang char upperUTF8[lenUTF8]{};
724*8af74909SZhong Yang size_t i = 0;
725*8af74909SZhong Yang while (*sComplex && *sComplex != '|') {
726*8af74909SZhong Yang originUTF8[i++] = *sComplex;
727*8af74909SZhong Yang sComplex++;
728*8af74909SZhong Yang }
729*8af74909SZhong Yang sComplex++;
730*8af74909SZhong Yang originUTF8[i] = 0;
731*8af74909SZhong Yang i = 0;
732*8af74909SZhong Yang while (*sComplex && *sComplex != '|') {
733*8af74909SZhong Yang foldedUTF8[i++] = *sComplex;
734*8af74909SZhong Yang sComplex++;
735*8af74909SZhong Yang }
736*8af74909SZhong Yang sComplex++;
737*8af74909SZhong Yang foldedUTF8[i] = 0;
738*8af74909SZhong Yang i = 0;
739*8af74909SZhong Yang while (*sComplex && *sComplex != '|') {
740*8af74909SZhong Yang upperUTF8[i++] = *sComplex;
741*8af74909SZhong Yang sComplex++;
742*8af74909SZhong Yang }
743*8af74909SZhong Yang sComplex++;
744*8af74909SZhong Yang upperUTF8[i] = 0;
745*8af74909SZhong Yang i = 0;
746*8af74909SZhong Yang while (*sComplex && *sComplex != '|') {
747*8af74909SZhong Yang lowerUTF8[i++] = *sComplex;
748*8af74909SZhong Yang sComplex++;
749*8af74909SZhong Yang }
750*8af74909SZhong Yang sComplex++;
751*8af74909SZhong Yang lowerUTF8[i] = 0;
752*8af74909SZhong Yang
753*8af74909SZhong Yang const int character = UnicodeFromUTF8(originUTF8);
754*8af74909SZhong Yang
755*8af74909SZhong Yang if (conversion == CaseConversionFold && foldedUTF8[0]) {
756*8af74909SZhong Yang caseConvFold.Add(character, foldedUTF8);
757*8af74909SZhong Yang }
758*8af74909SZhong Yang
759*8af74909SZhong Yang if (conversion == CaseConversionUpper && upperUTF8[0]) {
760*8af74909SZhong Yang caseConvUp.Add(character, upperUTF8);
761*8af74909SZhong Yang }
762*8af74909SZhong Yang
763*8af74909SZhong Yang if (conversion == CaseConversionLower && lowerUTF8[0]) {
764*8af74909SZhong Yang caseConvLow.Add(character, lowerUTF8);
765*8af74909SZhong Yang }
766*8af74909SZhong Yang }
767*8af74909SZhong Yang
768*8af74909SZhong Yang switch (conversion) {
769*8af74909SZhong Yang case CaseConversionFold:
770*8af74909SZhong Yang caseConvFold.FinishedAdding();
771*8af74909SZhong Yang break;
772*8af74909SZhong Yang case CaseConversionUpper:
773*8af74909SZhong Yang caseConvUp.FinishedAdding();
774*8af74909SZhong Yang break;
775*8af74909SZhong Yang case CaseConversionLower:
776*8af74909SZhong Yang caseConvLow.FinishedAdding();
777*8af74909SZhong Yang break;
778*8af74909SZhong Yang }
779*8af74909SZhong Yang }
780*8af74909SZhong Yang
ConverterForConversion(enum CaseConversion conversion)781*8af74909SZhong Yang CaseConverter *ConverterForConversion(enum CaseConversion conversion) noexcept {
782*8af74909SZhong Yang switch (conversion) {
783*8af74909SZhong Yang case CaseConversionFold:
784*8af74909SZhong Yang return &caseConvFold;
785*8af74909SZhong Yang case CaseConversionUpper:
786*8af74909SZhong Yang return &caseConvUp;
787*8af74909SZhong Yang case CaseConversionLower:
788*8af74909SZhong Yang return &caseConvLow;
789*8af74909SZhong Yang }
790*8af74909SZhong Yang return nullptr;
791*8af74909SZhong Yang }
792*8af74909SZhong Yang
793*8af74909SZhong Yang }
794*8af74909SZhong Yang
795*8af74909SZhong Yang namespace Scintilla {
796*8af74909SZhong Yang
ConverterFor(enum CaseConversion conversion)797*8af74909SZhong Yang ICaseConverter *ConverterFor(enum CaseConversion conversion) {
798*8af74909SZhong Yang CaseConverter *pCaseConv = ConverterForConversion(conversion);
799*8af74909SZhong Yang if (!pCaseConv->Initialised())
800*8af74909SZhong Yang SetupConversions(conversion);
801*8af74909SZhong Yang return pCaseConv;
802*8af74909SZhong Yang }
803*8af74909SZhong Yang
CaseConvert(int character,enum CaseConversion conversion)804*8af74909SZhong Yang const char *CaseConvert(int character, enum CaseConversion conversion) {
805*8af74909SZhong Yang CaseConverter *pCaseConv = ConverterForConversion(conversion);
806*8af74909SZhong Yang if (!pCaseConv->Initialised())
807*8af74909SZhong Yang SetupConversions(conversion);
808*8af74909SZhong Yang return pCaseConv->Find(character);
809*8af74909SZhong Yang }
810*8af74909SZhong Yang
CaseConvertString(char * converted,size_t sizeConverted,const char * mixed,size_t lenMixed,enum CaseConversion conversion)811*8af74909SZhong Yang size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed, enum CaseConversion conversion) {
812*8af74909SZhong Yang CaseConverter *pCaseConv = ConverterForConversion(conversion);
813*8af74909SZhong Yang if (!pCaseConv->Initialised())
814*8af74909SZhong Yang SetupConversions(conversion);
815*8af74909SZhong Yang return pCaseConv->CaseConvertString(converted, sizeConverted, mixed, lenMixed);
816*8af74909SZhong Yang }
817*8af74909SZhong Yang
CaseConvertString(const std::string & s,enum CaseConversion conversion)818*8af74909SZhong Yang std::string CaseConvertString(const std::string &s, enum CaseConversion conversion) {
819*8af74909SZhong Yang std::string retMapped(s.length() * maxExpansionCaseConversion, 0);
820*8af74909SZhong Yang const size_t lenMapped = CaseConvertString(&retMapped[0], retMapped.length(), s.c_str(), s.length(),
821*8af74909SZhong Yang conversion);
822*8af74909SZhong Yang retMapped.resize(lenMapped);
823*8af74909SZhong Yang return retMapped;
824*8af74909SZhong Yang }
825*8af74909SZhong Yang
826*8af74909SZhong Yang }
827