xref: /MusicPlayer2/scintilla/lexlib/CharacterCategory.cxx (revision 443d2d2511be730d1b1dd3181942b7fa6539aa1a)
1 // Scintilla source code edit control
2 /** @file CharacterCategory.cxx
3  ** Returns the Unicode general category of a character.
4  ** Table automatically regenerated by scripts/GenerateCharacterCategory.py
5  ** Should only be rarely regenerated for new versions of Unicode.
6  **/
7 // Copyright 2013 by Neil Hodgson <[email protected]>
8 // The License.txt file describes the conditions under which this software may be distributed.
9 
10 #include <vector>
11 #include <algorithm>
12 #include <iterator>
13 
14 #include "CharacterCategory.h"
15 
16 namespace Scintilla {
17 
18 namespace {
19 	// Use an unnamed namespace to protect the declarations from name conflicts
20 
21 const int catRanges[] = {
22 //++Autogenerated -- start of section automatically generated
23 // Created with Python 3.8.0,  Unicode 12.1.0
24 25,
25 1046,
26 1073,
27 1171,
28 1201,
29 1293,
30 1326,
31 1361,
32 1394,
33 1425,
34 1452,
35 1489,
36 1544,
37 1873,
38 1938,
39 2033,
40 2080,
41 2925,
42 2961,
43 2990,
44 3028,
45 3051,
46 3092,
47 3105,
48 3949,
49 3986,
50 4014,
51 4050,
52 4089,
53 5142,
54 5169,
55 5203,
56 5333,
57 5361,
58 5396,
59 5429,
60 5444,
61 5487,
62 5522,
63 5562,
64 5589,
65 5620,
66 5653,
67 5682,
68 5706,
69 5780,
70 5793,
71 5841,
72 5908,
73 5930,
74 5956,
75 6000,
76 6026,
77 6129,
78 6144,
79 6898,
80 6912,
81 7137,
82 7922,
83 7937,
84 8192,
85 8225,
86 8256,
87 8289,
88 8320,
89 8353,
90 8384,
91 8417,
92 8448,
93 8481,
94 8512,
95 8545,
96 8576,
97 8609,
98 8640,
99 8673,
100 8704,
101 8737,
102 8768,
103 8801,
104 8832,
105 8865,
106 8896,
107 8929,
108 8960,
109 8993,
110 9024,
111 9057,
112 9088,
113 9121,
114 9152,
115 9185,
116 9216,
117 9249,
118 9280,
119 9313,
120 9344,
121 9377,
122 9408,
123 9441,
124 9472,
125 9505,
126 9536,
127 9569,
128 9600,
129 9633,
130 9664,
131 9697,
132 9728,
133 9761,
134 9792,
135 9825,
136 9856,
137 9889,
138 9920,
139 9953,
140 10016,
141 10049,
142 10080,
143 10113,
144 10144,
145 10177,
146 10208,
147 10241,
148 10272,
149 10305,
150 10336,
151 10369,
152 10400,
153 10433,
154 10464,
155 10497,
156 10560,
157 10593,
158 10624,
159 10657,
160 10688,
161 10721,
162 10752,
163 10785,
164 10816,
165 10849,
166 10880,
167 10913,
168 10944,
169 10977,
170 11008,
171 11041,
172 11072,
173 11105,
174 11136,
175 11169,
176 11200,
177 11233,
178 11264,
179 11297,
180 11328,
181 11361,
182 11392,
183 11425,
184 11456,
185 11489,
186 11520,
187 11553,
188 11584,
189 11617,
190 11648,
191 11681,
192 11712,
193 11745,
194 11776,
195 11809,
196 11840,
197 11873,
198 11904,
199 11937,
200 11968,
201 12001,
202 12032,
203 12097,
204 12128,
205 12161,
206 12192,
207 12225,
208 12320,
209 12385,
210 12416,
211 12449,
212 12480,
213 12545,
214 12576,
215 12673,
216 12736,
217 12865,
218 12896,
219 12961,
220 12992,
221 13089,
222 13184,
223 13249,
224 13280,
225 13345,
226 13376,
227 13409,
228 13440,
229 13473,
230 13504,
231 13569,
232 13600,
233 13633,
234 13696,
235 13729,
236 13760,
237 13825,
238 13856,
239 13953,
240 13984,
241 14017,
242 14048,
243 14113,
244 14180,
245 14208,
246 14241,
247 14340,
248 14464,
249 14498,
250 14529,
251 14560,
252 14594,
253 14625,
254 14656,
255 14690,
256 14721,
257 14752,
258 14785,
259 14816,
260 14849,
261 14880,
262 14913,
263 14944,
264 14977,
265 15008,
266 15041,
267 15072,
268 15105,
269 15136,
270 15169,
271 15200,
272 15233,
273 15296,
274 15329,
275 15360,
276 15393,
277 15424,
278 15457,
279 15488,
280 15521,
281 15552,
282 15585,
283 15616,
284 15649,
285 15680,
286 15713,
287 15744,
288 15777,
289 15808,
290 15841,
291 15904,
292 15938,
293 15969,
294 16000,
295 16033,
296 16064,
297 16161,
298 16192,
299 16225,
300 16256,
301 16289,
302 16320,
303 16353,
304 16384,
305 16417,
306 16448,
307 16481,
308 16512,
309 16545,
310 16576,
311 16609,
312 16640,
313 16673,
314 16704,
315 16737,
316 16768,
317 16801,
318 16832,
319 16865,
320 16896,
321 16929,
322 16960,
323 16993,
324 17024,
325 17057,
326 17088,
327 17121,
328 17152,
329 17185,
330 17216,
331 17249,
332 17280,
333 17313,
334 17344,
335 17377,
336 17408,
337 17441,
338 17472,
339 17505,
340 17536,
341 17569,
342 17600,
343 17633,
344 17664,
345 17697,
346 17728,
347 17761,
348 17792,
349 17825,
350 17856,
351 17889,
352 17920,
353 17953,
354 17984,
355 18017,
356 18240,
357 18305,
358 18336,
359 18401,
360 18464,
361 18497,
362 18528,
363 18657,
364 18688,
365 18721,
366 18752,
367 18785,
368 18816,
369 18849,
370 18880,
371 18913,
372 21124,
373 21153,
374 22019,
375 22612,
376 22723,
377 23124,
378 23555,
379 23732,
380 23939,
381 23988,
382 24003,
383 24052,
384 24581,
385 28160,
386 28193,
387 28224,
388 28257,
389 28291,
390 28340,
391 28352,
392 28385,
393 28445,
394 28483,
395 28513,
396 28625,
397 28640,
398 28701,
399 28820,
400 28864,
401 28913,
402 28928,
403 29053,
404 29056,
405 29117,
406 29120,
407 29185,
408 29216,
409 29789,
410 29792,
411 30081,
412 31200,
413 31233,
414 31296,
415 31393,
416 31488,
417 31521,
418 31552,
419 31585,
420 31616,
421 31649,
422 31680,
423 31713,
424 31744,
425 31777,
426 31808,
427 31841,
428 31872,
429 31905,
430 31936,
431 31969,
432 32000,
433 32033,
434 32064,
435 32097,
436 32128,
437 32161,
438 32192,
439 32225,
440 32384,
441 32417,
442 32466,
443 32480,
444 32513,
445 32544,
446 32609,
447 32672,
448 34305,
449 35840,
450 35873,
451 35904,
452 35937,
453 35968,
454 36001,
455 36032,
456 36065,
457 36096,
458 36129,
459 36160,
460 36193,
461 36224,
462 36257,
463 36288,
464 36321,
465 36352,
466 36385,
467 36416,
468 36449,
469 36480,
470 36513,
471 36544,
472 36577,
473 36608,
474 36641,
475 36672,
476 36705,
477 36736,
478 36769,
479 36800,
480 36833,
481 36864,
482 36897,
483 36949,
484 36965,
485 37127,
486 37184,
487 37217,
488 37248,
489 37281,
490 37312,
491 37345,
492 37376,
493 37409,
494 37440,
495 37473,
496 37504,
497 37537,
498 37568,
499 37601,
500 37632,
501 37665,
502 37696,
503 37729,
504 37760,
505 37793,
506 37824,
507 37857,
508 37888,
509 37921,
510 37952,
511 37985,
512 38016,
513 38049,
514 38080,
515 38113,
516 38144,
517 38177,
518 38208,
519 38241,
520 38272,
521 38305,
522 38336,
523 38369,
524 38400,
525 38433,
526 38464,
527 38497,
528 38528,
529 38561,
530 38592,
531 38625,
532 38656,
533 38689,
534 38720,
535 38753,
536 38784,
537 38817,
538 38848,
539 38881,
540 38912,
541 38977,
542 39008,
543 39041,
544 39072,
545 39105,
546 39136,
547 39169,
548 39200,
549 39233,
550 39264,
551 39297,
552 39328,
553 39361,
554 39424,
555 39457,
556 39488,
557 39521,
558 39552,
559 39585,
560 39616,
561 39649,
562 39680,
563 39713,
564 39744,
565 39777,
566 39808,
567 39841,
568 39872,
569 39905,
570 39936,
571 39969,
572 40000,
573 40033,
574 40064,
575 40097,
576 40128,
577 40161,
578 40192,
579 40225,
580 40256,
581 40289,
582 40320,
583 40353,
584 40384,
585 40417,
586 40448,
587 40481,
588 40512,
589 40545,
590 40576,
591 40609,
592 40640,
593 40673,
594 40704,
595 40737,
596 40768,
597 40801,
598 40832,
599 40865,
600 40896,
601 40929,
602 40960,
603 40993,
604 41024,
605 41057,
606 41088,
607 41121,
608 41152,
609 41185,
610 41216,
611 41249,
612 41280,
613 41313,
614 41344,
615 41377,
616 41408,
617 41441,
618 41472,
619 41505,
620 41536,
621 41569,
622 41600,
623 41633,
624 41664,
625 41697,
626 41728,
627 41761,
628 41792,
629 41825,
630 41856,
631 41889,
632 41920,
633 41953,
634 41984,
635 42017,
636 42048,
637 42081,
638 42112,
639 42145,
640 42176,
641 42209,
642 42240,
643 42273,
644 42304,
645 42337,
646 42368,
647 42401,
648 42432,
649 42465,
650 42525,
651 42528,
652 43773,
653 43811,
654 43857,
655 44033,
656 45361,
657 45388,
658 45437,
659 45493,
660 45555,
661 45597,
662 45605,
663 47052,
664 47077,
665 47121,
666 47141,
667 47217,
668 47237,
669 47313,
670 47333,
671 47389,
672 47620,
673 48509,
674 48612,
675 48753,
676 48829,
677 49178,
678 49362,
679 49457,
680 49523,
681 49553,
682 49621,
683 49669,
684 50033,
685 50074,
686 50109,
687 50129,
688 50180,
689 51203,
690 51236,
691 51557,
692 52232,
693 52561,
694 52676,
695 52741,
696 52772,
697 55953,
698 55972,
699 56005,
700 56250,
701 56277,
702 56293,
703 56483,
704 56549,
705 56629,
706 56645,
707 56772,
708 56840,
709 57156,
710 57269,
711 57316,
712 57361,
713 57821,
714 57850,
715 57860,
716 57893,
717 57924,
718 58885,
719 59773,
720 59812,
721 62661,
722 63012,
723 63069,
724 63496,
725 63812,
726 64869,
727 65155,
728 65237,
729 65265,
730 65347,
731 65405,
732 65445,
733 65491,
734 65540,
735 66245,
736 66371,
737 66405,
738 66691,
739 66725,
740 66819,
741 66853,
742 67037,
743 67089,
744 67581,
745 67588,
746 68389,
747 68509,
748 68561,
749 68605,
750 68612,
751 68989,
752 70660,
753 71357,
754 71364,
755 71645,
756 72293,
757 72794,
758 72805,
759 73830,
760 73860,
761 75589,
762 75622,
763 75653,
764 75684,
765 75718,
766 75813,
767 76070,
768 76197,
769 76230,
770 76292,
771 76325,
772 76548,
773 76869,
774 76945,
775 77000,
776 77329,
777 77347,
778 77380,
779 77861,
780 77894,
781 77981,
782 77988,
783 78269,
784 78308,
785 78397,
786 78436,
787 79165,
788 79172,
789 79421,
790 79428,
791 79485,
792 79556,
793 79709,
794 79749,
795 79780,
796 79814,
797 79909,
798 80061,
799 80102,
800 80189,
801 80230,
802 80293,
803 80324,
804 80381,
805 80614,
806 80669,
807 80772,
808 80861,
809 80868,
810 80965,
811 81053,
812 81096,
813 81412,
814 81491,
815 81546,
816 81749,
817 81779,
818 81796,
819 81841,
820 81861,
821 81917,
822 81957,
823 82022,
824 82077,
825 82084,
826 82301,
827 82404,
828 82493,
829 82532,
830 83261,
831 83268,
832 83517,
833 83524,
834 83613,
835 83620,
836 83709,
837 83716,
838 83805,
839 83845,
840 83901,
841 83910,
842 84005,
843 84093,
844 84197,
845 84285,
846 84325,
847 84445,
848 84517,
849 84573,
850 84772,
851 84925,
852 84932,
853 84989,
854 85192,
855 85509,
856 85572,
857 85669,
858 85713,
859 85757,
860 86053,
861 86118,
862 86173,
863 86180,
864 86493,
865 86500,
866 86621,
867 86628,
868 87357,
869 87364,
870 87613,
871 87620,
872 87709,
873 87716,
874 87901,
875 87941,
876 87972,
877 88006,
878 88101,
879 88285,
880 88293,
881 88358,
882 88413,
883 88422,
884 88485,
885 88541,
886 88580,
887 88637,
888 89092,
889 89157,
890 89245,
891 89288,
892 89617,
893 89651,
894 89693,
895 89892,
896 89925,
897 90141,
898 90149,
899 90182,
900 90269,
901 90276,
902 90557,
903 90596,
904 90685,
905 90724,
906 91453,
907 91460,
908 91709,
909 91716,
910 91805,
911 91812,
912 91997,
913 92037,
914 92068,
915 92102,
916 92133,
917 92166,
918 92197,
919 92349,
920 92390,
921 92477,
922 92518,
923 92581,
924 92637,
925 92869,
926 92902,
927 92957,
928 93060,
929 93149,
930 93156,
931 93253,
932 93341,
933 93384,
934 93717,
935 93732,
936 93770,
937 93981,
938 94277,
939 94308,
940 94365,
941 94372,
942 94589,
943 94660,
944 94781,
945 94788,
946 94941,
947 95012,
948 95101,
949 95108,
950 95165,
951 95172,
952 95261,
953 95332,
954 95421,
955 95492,
956 95613,
957 95684,
958 96093,
959 96198,
960 96261,
961 96294,
962 96381,
963 96454,
964 96573,
965 96582,
966 96677,
967 96733,
968 96772,
969 96829,
970 96998,
971 97053,
972 97480,
973 97802,
974 97909,
975 98099,
976 98133,
977 98173,
978 98309,
979 98342,
980 98437,
981 98468,
982 98749,
983 98756,
984 98877,
985 98884,
986 99645,
987 99652,
988 100189,
989 100260,
990 100293,
991 100390,
992 100541,
993 100549,
994 100669,
995 100677,
996 100829,
997 101029,
998 101117,
999 101124,
1000 101245,
1001 101380,
1002 101445,
1003 101533,
1004 101576,
1005 101917,
1006 102129,
1007 102154,
1008 102389,
1009 102404,
1010 102437,
1011 102470,
1012 102545,
1013 102564,
1014 102845,
1015 102852,
1016 102973,
1017 102980,
1018 103741,
1019 103748,
1020 104093,
1021 104100,
1022 104285,
1023 104325,
1024 104356,
1025 104390,
1026 104421,
1027 104454,
1028 104637,
1029 104645,
1030 104678,
1031 104765,
1032 104774,
1033 104837,
1034 104925,
1035 105126,
1036 105213,
1037 105412,
1038 105469,
1039 105476,
1040 105541,
1041 105629,
1042 105672,
1043 106013,
1044 106020,
1045 106109,
1046 106501,
1047 106566,
1048 106653,
1049 106660,
1050 106941,
1051 106948,
1052 107069,
1053 107076,
1054 108389,
1055 108452,
1056 108486,
1057 108581,
1058 108733,
1059 108742,
1060 108861,
1061 108870,
1062 108965,
1063 108996,
1064 109045,
1065 109085,
1066 109188,
1067 109286,
1068 109322,
1069 109540,
1070 109637,
1071 109725,
1072 109768,
1073 110090,
1074 110389,
1075 110404,
1076 110621,
1077 110662,
1078 110749,
1079 110756,
1080 111357,
1081 111428,
1082 112221,
1083 112228,
1084 112541,
1085 112548,
1086 112605,
1087 112644,
1088 112893,
1089 112965,
1090 113021,
1091 113126,
1092 113221,
1093 113341,
1094 113349,
1095 113405,
1096 113414,
1097 113693,
1098 113864,
1099 114205,
1100 114246,
1101 114321,
1102 114365,
1103 114724,
1104 116261,
1105 116292,
1106 116357,
1107 116605,
1108 116723,
1109 116740,
1110 116931,
1111 116965,
1112 117233,
1113 117256,
1114 117585,
1115 117661,
1116 118820,
1117 118909,
1118 118916,
1119 118973,
1120 118980,
1121 119165,
1122 119172,
1123 119965,
1124 119972,
1125 120029,
1126 120036,
1127 120357,
1128 120388,
1129 120453,
1130 120740,
1131 120797,
1132 120836,
1133 121021,
1134 121027,
1135 121085,
1136 121093,
1137 121309,
1138 121352,
1139 121693,
1140 121732,
1141 121885,
1142 122884,
1143 122933,
1144 123025,
1145 123509,
1146 123537,
1147 123573,
1148 123653,
1149 123733,
1150 123912,
1151 124234,
1152 124565,
1153 124581,
1154 124629,
1155 124645,
1156 124693,
1157 124709,
1158 124749,
1159 124782,
1160 124813,
1161 124846,
1162 124870,
1163 124932,
1164 125213,
1165 125220,
1166 126397,
1167 126501,
1168 126950,
1169 126981,
1170 127153,
1171 127173,
1172 127236,
1173 127397,
1174 127773,
1175 127781,
1176 128957,
1177 128981,
1178 129221,
1179 129269,
1180 129469,
1181 129493,
1182 129553,
1183 129717,
1184 129841,
1185 129917,
1186 131076,
1187 132454,
1188 132517,
1189 132646,
1190 132677,
1191 132870,
1192 132901,
1193 132966,
1194 133029,
1195 133092,
1196 133128,
1197 133457,
1198 133636,
1199 133830,
1200 133893,
1201 133956,
1202 134085,
1203 134180,
1204 134214,
1205 134308,
1206 134374,
1207 134596,
1208 134693,
1209 134820,
1210 135237,
1211 135270,
1212 135333,
1213 135398,
1214 135589,
1215 135620,
1216 135654,
1217 135688,
1218 136006,
1219 136101,
1220 136149,
1221 136192,
1222 137437,
1223 137440,
1224 137501,
1225 137632,
1226 137693,
1227 137729,
1228 139121,
1229 139139,
1230 139169,
1231 139268,
1232 149821,
1233 149828,
1234 149981,
1235 150020,
1236 150269,
1237 150276,
1238 150333,
1239 150340,
1240 150493,
1241 150532,
1242 151869,
1243 151876,
1244 152029,
1245 152068,
1246 153149,
1247 153156,
1248 153309,
1249 153348,
1250 153597,
1251 153604,
1252 153661,
1253 153668,
1254 153821,
1255 153860,
1256 154365,
1257 154372,
1258 156221,
1259 156228,
1260 156381,
1261 156420,
1262 158589,
1263 158629,
1264 158737,
1265 159018,
1266 159677,
1267 159748,
1268 160277,
1269 160605,
1270 160768,
1271 163549,
1272 163585,
1273 163805,
1274 163852,
1275 163876,
1276 183733,
1277 183761,
1278 183780,
1279 184342,
1280 184356,
1281 185197,
1282 185230,
1283 185277,
1284 185348,
1285 187761,
1286 187849,
1287 187940,
1288 188221,
1289 188420,
1290 188861,
1291 188868,
1292 188997,
1293 189117,
1294 189444,
1295 190021,
1296 190129,
1297 190205,
1298 190468,
1299 191045,
1300 191133,
1301 191492,
1302 191933,
1303 191940,
1304 192061,
1305 192069,
1306 192157,
1307 192516,
1308 194181,
1309 194246,
1310 194277,
1311 194502,
1312 194757,
1313 194790,
1314 194853,
1315 195217,
1316 195299,
1317 195345,
1318 195443,
1319 195460,
1320 195493,
1321 195549,
1322 195592,
1323 195933,
1324 196106,
1325 196445,
1326 196625,
1327 196812,
1328 196849,
1329 196965,
1330 197082,
1331 197117,
1332 197128,
1333 197469,
1334 197636,
1335 198755,
1336 198788,
1337 200509,
1338 200708,
1339 200869,
1340 200932,
1341 202021,
1342 202052,
1343 202109,
1344 202244,
1345 204509,
1346 204804,
1347 205821,
1348 205829,
1349 205926,
1350 206053,
1351 206118,
1352 206237,
1353 206342,
1354 206405,
1355 206438,
1356 206629,
1357 206749,
1358 206869,
1359 206909,
1360 206993,
1361 207048,
1362 207364,
1363 208349,
1364 208388,
1365 208573,
1366 208900,
1367 210333,
1368 210436,
1369 211293,
1370 211464,
1371 211786,
1372 211837,
1373 211925,
1374 212996,
1375 213733,
1376 213798,
1377 213861,
1378 213917,
1379 213969,
1380 214020,
1381 215718,
1382 215749,
1383 215782,
1384 215813,
1385 216061,
1386 216069,
1387 216102,
1388 216133,
1389 216166,
1390 216229,
1391 216486,
1392 216677,
1393 217021,
1394 217061,
1395 217096,
1396 217437,
1397 217608,
1398 217949,
1399 218129,
1400 218339,
1401 218385,
1402 218589,
1403 218629,
1404 219079,
1405 219133,
1406 221189,
1407 221318,
1408 221348,
1409 222853,
1410 222886,
1411 222917,
1412 223078,
1413 223109,
1414 223142,
1415 223301,
1416 223334,
1417 223396,
1418 223645,
1419 223752,
1420 224081,
1421 224309,
1422 224613,
1423 224917,
1424 225213,
1425 225285,
1426 225350,
1427 225380,
1428 226342,
1429 226373,
1430 226502,
1431 226565,
1432 226630,
1433 226661,
1434 226756,
1435 226824,
1436 227140,
1437 228549,
1438 228582,
1439 228613,
1440 228678,
1441 228773,
1442 228806,
1443 228837,
1444 228934,
1445 229021,
1446 229265,
1447 229380,
1448 230534,
1449 230789,
1450 231046,
1451 231109,
1452 231197,
1453 231281,
1454 231432,
1455 231773,
1456 231844,
1457 231944,
1458 232260,
1459 233219,
1460 233425,
1461 233473,
1462 233789,
1463 233984,
1464 235389,
1465 235424,
1466 235537,
1467 235805,
1468 236037,
1469 236145,
1470 236165,
1471 236582,
1472 236613,
1473 236836,
1474 236965,
1475 236996,
1476 237189,
1477 237220,
1478 237286,
1479 237317,
1480 237380,
1481 237437,
1482 237569,
1483 238979,
1484 240993,
1485 241411,
1486 241441,
1487 242531,
1488 243717,
1489 245597,
1490 245605,
1491 245760,
1492 245793,
1493 245824,
1494 245857,
1495 245888,
1496 245921,
1497 245952,
1498 245985,
1499 246016,
1500 246049,
1501 246080,
1502 246113,
1503 246144,
1504 246177,
1505 246208,
1506 246241,
1507 246272,
1508 246305,
1509 246336,
1510 246369,
1511 246400,
1512 246433,
1513 246464,
1514 246497,
1515 246528,
1516 246561,
1517 246592,
1518 246625,
1519 246656,
1520 246689,
1521 246720,
1522 246753,
1523 246784,
1524 246817,
1525 246848,
1526 246881,
1527 246912,
1528 246945,
1529 246976,
1530 247009,
1531 247040,
1532 247073,
1533 247104,
1534 247137,
1535 247168,
1536 247201,
1537 247232,
1538 247265,
1539 247296,
1540 247329,
1541 247360,
1542 247393,
1543 247424,
1544 247457,
1545 247488,
1546 247521,
1547 247552,
1548 247585,
1549 247616,
1550 247649,
1551 247680,
1552 247713,
1553 247744,
1554 247777,
1555 247808,
1556 247841,
1557 247872,
1558 247905,
1559 247936,
1560 247969,
1561 248000,
1562 248033,
1563 248064,
1564 248097,
1565 248128,
1566 248161,
1567 248192,
1568 248225,
1569 248256,
1570 248289,
1571 248320,
1572 248353,
1573 248384,
1574 248417,
1575 248448,
1576 248481,
1577 248512,
1578 248545,
1579 248576,
1580 248609,
1581 248640,
1582 248673,
1583 248704,
1584 248737,
1585 248768,
1586 248801,
1587 248832,
1588 248865,
1589 248896,
1590 248929,
1591 248960,
1592 248993,
1593 249024,
1594 249057,
1595 249088,
1596 249121,
1597 249152,
1598 249185,
1599 249216,
1600 249249,
1601 249280,
1602 249313,
1603 249344,
1604 249377,
1605 249408,
1606 249441,
1607 249472,
1608 249505,
1609 249536,
1610 249569,
1611 249600,
1612 249633,
1613 249664,
1614 249697,
1615 249728,
1616 249761,
1617 249792,
1618 249825,
1619 249856,
1620 249889,
1621 249920,
1622 249953,
1623 249984,
1624 250017,
1625 250048,
1626 250081,
1627 250112,
1628 250145,
1629 250176,
1630 250209,
1631 250240,
1632 250273,
1633 250304,
1634 250337,
1635 250368,
1636 250401,
1637 250432,
1638 250465,
1639 250496,
1640 250529,
1641 250816,
1642 250849,
1643 250880,
1644 250913,
1645 250944,
1646 250977,
1647 251008,
1648 251041,
1649 251072,
1650 251105,
1651 251136,
1652 251169,
1653 251200,
1654 251233,
1655 251264,
1656 251297,
1657 251328,
1658 251361,
1659 251392,
1660 251425,
1661 251456,
1662 251489,
1663 251520,
1664 251553,
1665 251584,
1666 251617,
1667 251648,
1668 251681,
1669 251712,
1670 251745,
1671 251776,
1672 251809,
1673 251840,
1674 251873,
1675 251904,
1676 251937,
1677 251968,
1678 252001,
1679 252032,
1680 252065,
1681 252096,
1682 252129,
1683 252160,
1684 252193,
1685 252224,
1686 252257,
1687 252288,
1688 252321,
1689 252352,
1690 252385,
1691 252416,
1692 252449,
1693 252480,
1694 252513,
1695 252544,
1696 252577,
1697 252608,
1698 252641,
1699 252672,
1700 252705,
1701 252736,
1702 252769,
1703 252800,
1704 252833,
1705 252864,
1706 252897,
1707 252928,
1708 252961,
1709 252992,
1710 253025,
1711 253056,
1712 253089,
1713 253120,
1714 253153,
1715 253184,
1716 253217,
1717 253248,
1718 253281,
1719 253312,
1720 253345,
1721 253376,
1722 253409,
1723 253440,
1724 253473,
1725 253504,
1726 253537,
1727 253568,
1728 253601,
1729 253632,
1730 253665,
1731 253696,
1732 253729,
1733 253760,
1734 253793,
1735 253824,
1736 253857,
1737 253888,
1738 253921,
1739 254208,
1740 254465,
1741 254685,
1742 254720,
1743 254941,
1744 254977,
1745 255232,
1746 255489,
1747 255744,
1748 256001,
1749 256221,
1750 256256,
1751 256477,
1752 256513,
1753 256797,
1754 256800,
1755 256861,
1756 256864,
1757 256925,
1758 256928,
1759 256989,
1760 256992,
1761 257025,
1762 257280,
1763 257537,
1764 258013,
1765 258049,
1766 258306,
1767 258561,
1768 258818,
1769 259073,
1770 259330,
1771 259585,
1772 259773,
1773 259777,
1774 259840,
1775 259970,
1776 260020,
1777 260033,
1778 260084,
1779 260161,
1780 260285,
1781 260289,
1782 260352,
1783 260482,
1784 260532,
1785 260609,
1786 260765,
1787 260801,
1788 260864,
1789 261021,
1790 261044,
1791 261121,
1792 261376,
1793 261556,
1794 261661,
1795 261697,
1796 261821,
1797 261825,
1798 261888,
1799 262018,
1800 262068,
1801 262141,
1802 262166,
1803 262522,
1804 262668,
1805 262865,
1806 262927,
1807 262960,
1808 262989,
1809 263023,
1810 263088,
1811 263117,
1812 263151,
1813 263185,
1814 263447,
1815 263480,
1816 263514,
1817 263670,
1818 263697,
1819 263983,
1820 264016,
1821 264049,
1822 264171,
1823 264241,
1824 264338,
1825 264365,
1826 264398,
1827 264433,
1828 264786,
1829 264817,
1830 264843,
1831 264881,
1832 265206,
1833 265242,
1834 265405,
1835 265434,
1836 265738,
1837 265763,
1838 265821,
1839 265866,
1840 266066,
1841 266157,
1842 266190,
1843 266211,
1844 266250,
1845 266578,
1846 266669,
1847 266702,
1848 266749,
1849 266755,
1850 267197,
1851 267283,
1852 268317,
1853 268805,
1854 269223,
1855 269349,
1856 269383,
1857 269477,
1858 269885,
1859 270357,
1860 270400,
1861 270453,
1862 270560,
1863 270613,
1864 270657,
1865 270688,
1866 270785,
1867 270848,
1868 270945,
1869 270997,
1870 271008,
1871 271061,
1872 271122,
1873 271136,
1874 271317,
1875 271488,
1876 271541,
1877 271552,
1878 271605,
1879 271616,
1880 271669,
1881 271680,
1882 271829,
1883 271841,
1884 271872,
1885 272001,
1886 272036,
1887 272161,
1888 272213,
1889 272257,
1890 272320,
1891 272402,
1892 272544,
1893 272577,
1894 272725,
1895 272754,
1896 272789,
1897 272833,
1898 272885,
1899 272906,
1900 273417,
1901 274528,
1902 274561,
1903 274601,
1904 274730,
1905 274773,
1906 274845,
1907 274962,
1908 275125,
1909 275282,
1910 275349,
1911 275474,
1912 275509,
1913 275570,
1914 275605,
1915 275666,
1916 275701,
1917 275922,
1918 275957,
1919 276946,
1920 277013,
1921 277074,
1922 277109,
1923 277138,
1924 277173,
1925 278162,
1926 286741,
1927 286989,
1928 287022,
1929 287053,
1930 287086,
1931 287125,
1932 287762,
1933 287829,
1934 288045,
1935 288078,
1936 288117,
1937 290706,
1938 290741,
1939 291698,
1940 292501,
1941 293778,
1942 293973,
1943 296189,
1944 296981,
1945 297341,
1946 297994,
1947 299925,
1948 302410,
1949 303125,
1950 308978,
1951 309013,
1952 309298,
1953 309333,
1954 311058,
1955 311317,
1956 314866,
1957 314901,
1958 322829,
1959 322862,
1960 322893,
1961 322926,
1962 322957,
1963 322990,
1964 323021,
1965 323054,
1966 323085,
1967 323118,
1968 323149,
1969 323182,
1970 323213,
1971 323246,
1972 323274,
1973 324245,
1974 325650,
1975 325805,
1976 325838,
1977 325874,
1978 326861,
1979 326894,
1980 326925,
1981 326958,
1982 326989,
1983 327022,
1984 327053,
1985 327086,
1986 327117,
1987 327150,
1988 327186,
1989 327701,
1990 335890,
1991 340077,
1992 340110,
1993 340141,
1994 340174,
1995 340205,
1996 340238,
1997 340269,
1998 340302,
1999 340333,
2000 340366,
2001 340397,
2002 340430,
2003 340461,
2004 340494,
2005 340525,
2006 340558,
2007 340589,
2008 340622,
2009 340653,
2010 340686,
2011 340717,
2012 340750,
2013 340786,
2014 342797,
2015 342830,
2016 342861,
2017 342894,
2018 342930,
2019 343949,
2020 343982,
2021 344018,
2022 352277,
2023 353810,
2024 354485,
2025 354546,
2026 354741,
2027 355997,
2028 356053,
2029 357085,
2030 357141,
2031 360448,
2032 361981,
2033 361985,
2034 363517,
2035 363520,
2036 363553,
2037 363584,
2038 363681,
2039 363744,
2040 363777,
2041 363808,
2042 363841,
2043 363872,
2044 363905,
2045 363936,
2046 364065,
2047 364096,
2048 364129,
2049 364192,
2050 364225,
2051 364419,
2052 364480,
2053 364577,
2054 364608,
2055 364641,
2056 364672,
2057 364705,
2058 364736,
2059 364769,
2060 364800,
2061 364833,
2062 364864,
2063 364897,
2064 364928,
2065 364961,
2066 364992,
2067 365025,
2068 365056,
2069 365089,
2070 365120,
2071 365153,
2072 365184,
2073 365217,
2074 365248,
2075 365281,
2076 365312,
2077 365345,
2078 365376,
2079 365409,
2080 365440,
2081 365473,
2082 365504,
2083 365537,
2084 365568,
2085 365601,
2086 365632,
2087 365665,
2088 365696,
2089 365729,
2090 365760,
2091 365793,
2092 365824,
2093 365857,
2094 365888,
2095 365921,
2096 365952,
2097 365985,
2098 366016,
2099 366049,
2100 366080,
2101 366113,
2102 366144,
2103 366177,
2104 366208,
2105 366241,
2106 366272,
2107 366305,
2108 366336,
2109 366369,
2110 366400,
2111 366433,
2112 366464,
2113 366497,
2114 366528,
2115 366561,
2116 366592,
2117 366625,
2118 366656,
2119 366689,
2120 366720,
2121 366753,
2122 366784,
2123 366817,
2124 366848,
2125 366881,
2126 366912,
2127 366945,
2128 366976,
2129 367009,
2130 367040,
2131 367073,
2132 367104,
2133 367137,
2134 367168,
2135 367201,
2136 367232,
2137 367265,
2138 367296,
2139 367329,
2140 367360,
2141 367393,
2142 367424,
2143 367457,
2144 367488,
2145 367521,
2146 367552,
2147 367585,
2148 367616,
2149 367649,
2150 367680,
2151 367713,
2152 367797,
2153 367968,
2154 368001,
2155 368032,
2156 368065,
2157 368101,
2158 368192,
2159 368225,
2160 368285,
2161 368433,
2162 368554,
2163 368593,
2164 368641,
2165 369885,
2166 369889,
2167 369949,
2168 370081,
2169 370141,
2170 370180,
2171 371997,
2172 372195,
2173 372241,
2174 372285,
2175 372709,
2176 372740,
2177 373501,
2178 373764,
2179 374013,
2180 374020,
2181 374269,
2182 374276,
2183 374525,
2184 374532,
2185 374781,
2186 374788,
2187 375037,
2188 375044,
2189 375293,
2190 375300,
2191 375549,
2192 375556,
2193 375805,
2194 375813,
2195 376849,
2196 376911,
2197 376944,
2198 376975,
2199 377008,
2200 377041,
2201 377135,
2202 377168,
2203 377201,
2204 377231,
2205 377264,
2206 377297,
2207 377580,
2208 377617,
2209 377676,
2210 377713,
2211 377743,
2212 377776,
2213 377809,
2214 377871,
2215 377904,
2216 377933,
2217 377966,
2218 377997,
2219 378030,
2220 378061,
2221 378094,
2222 378125,
2223 378158,
2224 378193,
2225 378339,
2226 378385,
2227 378700,
2228 378769,
2229 378892,
2230 378929,
2231 378957,
2232 378993,
2233 379421,
2234 380949,
2235 381789,
2236 381813,
2237 384669,
2238 385045,
2239 391901,
2240 392725,
2241 393117,
2242 393238,
2243 393265,
2244 393365,
2245 393379,
2246 393412,
2247 393449,
2248 393485,
2249 393518,
2250 393549,
2251 393582,
2252 393613,
2253 393646,
2254 393677,
2255 393710,
2256 393741,
2257 393774,
2258 393813,
2259 393869,
2260 393902,
2261 393933,
2262 393966,
2263 393997,
2264 394030,
2265 394061,
2266 394094,
2267 394124,
2268 394157,
2269 394190,
2270 394261,
2271 394281,
2272 394565,
2273 394694,
2274 394764,
2275 394787,
2276 394965,
2277 395017,
2278 395107,
2279 395140,
2280 395185,
2281 395221,
2282 395293,
2283 395300,
2284 398077,
2285 398117,
2286 398196,
2287 398243,
2288 398308,
2289 398348,
2290 398372,
2291 401265,
2292 401283,
2293 401380,
2294 401437,
2295 401572,
2296 402973,
2297 402980,
2298 406013,
2299 406037,
2300 406090,
2301 406229,
2302 406532,
2303 407421,
2304 407573,
2305 408733,
2306 409092,
2307 409621,
2308 410621,
2309 410634,
2310 410965,
2311 411914,
2312 412181,
2313 412202,
2314 412693,
2315 413706,
2316 414037,
2317 415274,
2318 415765,
2319 425988,
2320 636637,
2321 636949,
2322 638980,
2323 1310237,
2324 1310724,
2325 1311395,
2326 1311428,
2327 1348029,
2328 1348117,
2329 1349885,
2330 1350148,
2331 1351427,
2332 1351633,
2333 1351684,
2334 1360259,
2335 1360305,
2336 1360388,
2337 1360904,
2338 1361220,
2339 1361309,
2340 1361920,
2341 1361953,
2342 1361984,
2343 1362017,
2344 1362048,
2345 1362081,
2346 1362112,
2347 1362145,
2348 1362176,
2349 1362209,
2350 1362240,
2351 1362273,
2352 1362304,
2353 1362337,
2354 1362368,
2355 1362401,
2356 1362432,
2357 1362465,
2358 1362496,
2359 1362529,
2360 1362560,
2361 1362593,
2362 1362624,
2363 1362657,
2364 1362688,
2365 1362721,
2366 1362752,
2367 1362785,
2368 1362816,
2369 1362849,
2370 1362880,
2371 1362913,
2372 1362944,
2373 1362977,
2374 1363008,
2375 1363041,
2376 1363072,
2377 1363105,
2378 1363136,
2379 1363169,
2380 1363200,
2381 1363233,
2382 1363264,
2383 1363297,
2384 1363328,
2385 1363361,
2386 1363396,
2387 1363429,
2388 1363463,
2389 1363569,
2390 1363589,
2391 1363921,
2392 1363939,
2393 1363968,
2394 1364001,
2395 1364032,
2396 1364065,
2397 1364096,
2398 1364129,
2399 1364160,
2400 1364193,
2401 1364224,
2402 1364257,
2403 1364288,
2404 1364321,
2405 1364352,
2406 1364385,
2407 1364416,
2408 1364449,
2409 1364480,
2410 1364513,
2411 1364544,
2412 1364577,
2413 1364608,
2414 1364641,
2415 1364672,
2416 1364705,
2417 1364736,
2418 1364769,
2419 1364800,
2420 1364833,
2421 1364867,
2422 1364933,
2423 1364996,
2424 1367241,
2425 1367557,
2426 1367633,
2427 1367837,
2428 1368084,
2429 1368803,
2430 1369108,
2431 1369152,
2432 1369185,
2433 1369216,
2434 1369249,
2435 1369280,
2436 1369313,
2437 1369344,
2438 1369377,
2439 1369408,
2440 1369441,
2441 1369472,
2442 1369505,
2443 1369536,
2444 1369569,
2445 1369664,
2446 1369697,
2447 1369728,
2448 1369761,
2449 1369792,
2450 1369825,
2451 1369856,
2452 1369889,
2453 1369920,
2454 1369953,
2455 1369984,
2456 1370017,
2457 1370048,
2458 1370081,
2459 1370112,
2460 1370145,
2461 1370176,
2462 1370209,
2463 1370240,
2464 1370273,
2465 1370304,
2466 1370337,
2467 1370368,
2468 1370401,
2469 1370432,
2470 1370465,
2471 1370496,
2472 1370529,
2473 1370560,
2474 1370593,
2475 1370624,
2476 1370657,
2477 1370688,
2478 1370721,
2479 1370752,
2480 1370785,
2481 1370816,
2482 1370849,
2483 1370880,
2484 1370913,
2485 1370944,
2486 1370977,
2487 1371008,
2488 1371041,
2489 1371072,
2490 1371105,
2491 1371136,
2492 1371169,
2493 1371200,
2494 1371233,
2495 1371264,
2496 1371297,
2497 1371328,
2498 1371361,
2499 1371392,
2500 1371425,
2501 1371456,
2502 1371489,
2503 1371520,
2504 1371553,
2505 1371584,
2506 1371617,
2507 1371651,
2508 1371681,
2509 1371936,
2510 1371969,
2511 1372000,
2512 1372033,
2513 1372064,
2514 1372129,
2515 1372160,
2516 1372193,
2517 1372224,
2518 1372257,
2519 1372288,
2520 1372321,
2521 1372352,
2522 1372385,
2523 1372419,
2524 1372468,
2525 1372512,
2526 1372545,
2527 1372576,
2528 1372609,
2529 1372644,
2530 1372672,
2531 1372705,
2532 1372736,
2533 1372769,
2534 1372864,
2535 1372897,
2536 1372928,
2537 1372961,
2538 1372992,
2539 1373025,
2540 1373056,
2541 1373089,
2542 1373120,
2543 1373153,
2544 1373184,
2545 1373217,
2546 1373248,
2547 1373281,
2548 1373312,
2549 1373345,
2550 1373376,
2551 1373409,
2552 1373440,
2553 1373473,
2554 1373504,
2555 1373665,
2556 1373696,
2557 1373857,
2558 1373888,
2559 1373921,
2560 1373952,
2561 1373985,
2562 1374016,
2563 1374049,
2564 1374080,
2565 1374113,
2566 1374144,
2567 1374177,
2568 1374237,
2569 1374272,
2570 1374305,
2571 1374336,
2572 1374461,
2573 1375972,
2574 1376003,
2575 1376065,
2576 1376100,
2577 1376325,
2578 1376356,
2579 1376453,
2580 1376484,
2581 1376613,
2582 1376644,
2583 1377382,
2584 1377445,
2585 1377510,
2586 1377557,
2587 1377693,
2588 1377802,
2589 1378005,
2590 1378067,
2591 1378101,
2592 1378141,
2593 1378308,
2594 1379985,
2595 1380125,
2596 1380358,
2597 1380420,
2598 1382022,
2599 1382533,
2600 1382621,
2601 1382865,
2602 1382920,
2603 1383261,
2604 1383429,
2605 1384004,
2606 1384209,
2607 1384292,
2608 1384337,
2609 1384356,
2610 1384421,
2611 1384456,
2612 1384772,
2613 1385669,
2614 1385937,
2615 1385988,
2616 1386725,
2617 1387078,
2618 1387165,
2619 1387505,
2620 1387524,
2621 1388477,
2622 1388549,
2623 1388646,
2624 1388676,
2625 1390181,
2626 1390214,
2627 1390277,
2628 1390406,
2629 1390469,
2630 1390534,
2631 1390641,
2632 1391069,
2633 1391075,
2634 1391112,
2635 1391453,
2636 1391569,
2637 1391620,
2638 1391781,
2639 1391811,
2640 1391844,
2641 1392136,
2642 1392452,
2643 1392637,
2644 1392644,
2645 1393957,
2646 1394150,
2647 1394213,
2648 1394278,
2649 1394341,
2650 1394429,
2651 1394692,
2652 1394789,
2653 1394820,
2654 1395077,
2655 1395110,
2656 1395165,
2657 1395208,
2658 1395549,
2659 1395601,
2660 1395716,
2661 1396227,
2662 1396260,
2663 1396469,
2664 1396548,
2665 1396582,
2666 1396613,
2667 1396646,
2668 1396676,
2669 1398277,
2670 1398308,
2671 1398341,
2672 1398436,
2673 1398501,
2674 1398564,
2675 1398725,
2676 1398788,
2677 1398821,
2678 1398852,
2679 1398909,
2680 1399652,
2681 1399715,
2682 1399761,
2683 1399812,
2684 1400166,
2685 1400197,
2686 1400262,
2687 1400337,
2688 1400388,
2689 1400419,
2690 1400486,
2691 1400517,
2692 1400573,
2693 1400868,
2694 1401085,
2695 1401124,
2696 1401341,
2697 1401380,
2698 1401597,
2699 1401860,
2700 1402109,
2701 1402116,
2702 1402365,
2703 1402369,
2704 1403764,
2705 1403779,
2706 1403905,
2707 1404189,
2708 1404417,
2709 1406980,
2710 1408102,
2711 1408165,
2712 1408198,
2713 1408261,
2714 1408294,
2715 1408369,
2716 1408390,
2717 1408421,
2718 1408477,
2719 1408520,
2720 1408861,
2721 1409028,
2722 1766557,
2723 1766916,
2724 1767677,
2725 1767780,
2726 1769373,
2727 1769499,
2728 1835036,
2729 2039812,
2730 2051549,
2731 2051588,
2732 2055005,
2733 2056193,
2734 2056445,
2735 2056801,
2736 2056989,
2737 2057124,
2738 2057157,
2739 2057188,
2740 2057522,
2741 2057540,
2742 2057981,
2743 2057988,
2744 2058173,
2745 2058180,
2746 2058237,
2747 2058244,
2748 2058333,
2749 2058340,
2750 2058429,
2751 2058436,
2752 2061908,
2753 2062429,
2754 2062948,
2755 2074574,
2756 2074605,
2757 2074653,
2758 2075140,
2759 2077213,
2760 2077252,
2761 2079005,
2762 2080260,
2763 2080659,
2764 2080693,
2765 2080733,
2766 2080773,
2767 2081297,
2768 2081517,
2769 2081550,
2770 2081585,
2771 2081629,
2772 2081797,
2773 2082321,
2774 2082348,
2775 2082411,
2776 2082477,
2777 2082510,
2778 2082541,
2779 2082574,
2780 2082605,
2781 2082638,
2782 2082669,
2783 2082702,
2784 2082733,
2785 2082766,
2786 2082797,
2787 2082830,
2788 2082861,
2789 2082894,
2790 2082925,
2791 2082958,
2792 2082993,
2793 2083053,
2794 2083086,
2795 2083121,
2796 2083243,
2797 2083345,
2798 2083453,
2799 2083473,
2800 2083596,
2801 2083629,
2802 2083662,
2803 2083693,
2804 2083726,
2805 2083757,
2806 2083790,
2807 2083825,
2808 2083922,
2809 2083948,
2810 2083986,
2811 2084093,
2812 2084113,
2813 2084147,
2814 2084177,
2815 2084253,
2816 2084356,
2817 2084541,
2818 2084548,
2819 2088893,
2820 2088954,
2821 2088989,
2822 2089009,
2823 2089107,
2824 2089137,
2825 2089229,
2826 2089262,
2827 2089297,
2828 2089330,
2829 2089361,
2830 2089388,
2831 2089425,
2832 2089480,
2833 2089809,
2834 2089874,
2835 2089969,
2836 2090016,
2837 2090861,
2838 2090897,
2839 2090926,
2840 2090964,
2841 2090987,
2842 2091028,
2843 2091041,
2844 2091885,
2845 2091922,
2846 2091950,
2847 2091986,
2848 2092013,
2849 2092046,
2850 2092081,
2851 2092109,
2852 2092142,
2853 2092177,
2854 2092228,
2855 2092547,
2856 2092580,
2857 2094019,
2858 2094084,
2859 2095101,
2860 2095172,
2861 2095389,
2862 2095428,
2863 2095645,
2864 2095684,
2865 2095901,
2866 2095940,
2867 2096061,
2868 2096147,
2869 2096210,
2870 2096244,
2871 2096277,
2872 2096307,
2873 2096381,
2874 2096405,
2875 2096434,
2876 2096565,
2877 2096637,
2878 2096954,
2879 2097045,
2880 2097117,
2881 2097156,
2882 2097565,
2883 2097572,
2884 2098429,
2885 2098436,
2886 2099069,
2887 2099076,
2888 2099165,
2889 2099172,
2890 2099677,
2891 2099716,
2892 2100189,
2893 2101252,
2894 2105213,
2895 2105361,
2896 2105469,
2897 2105578,
2898 2107037,
2899 2107125,
2900 2107401,
2901 2109098,
2902 2109237,
2903 2109770,
2904 2109845,
2905 2109949,
2906 2109973,
2907 2110365,
2908 2110485,
2909 2110525,
2910 2112021,
2911 2113445,
2912 2113501,
2913 2117636,
2914 2118589,
2915 2118660,
2916 2120253,
2917 2120709,
2918 2120746,
2919 2121629,
2920 2121732,
2921 2122762,
2922 2122909,
2923 2123172,
2924 2123817,
2925 2123844,
2926 2124105,
2927 2124157,
2928 2124292,
2929 2125509,
2930 2125693,
2931 2125828,
2932 2126813,
2933 2126833,
2934 2126852,
2935 2128029,
2936 2128132,
2937 2128401,
2938 2128425,
2939 2128605,
2940 2129920,
2941 2131201,
2942 2132484,
2943 2135005,
2944 2135048,
2945 2135389,
2946 2135552,
2947 2136733,
2948 2136833,
2949 2138013,
2950 2138116,
2951 2139421,
2952 2139652,
2953 2141341,
2954 2141681,
2955 2141725,
2956 2146308,
2957 2156285,
2958 2156548,
2959 2157277,
2960 2157572,
2961 2157853,
2962 2162692,
2963 2162909,
2964 2162948,
2965 2163005,
2966 2163012,
2967 2164445,
2968 2164452,
2969 2164541,
2970 2164612,
2971 2164669,
2972 2164708,
2973 2165469,
2974 2165489,
2975 2165514,
2976 2165764,
2977 2166517,
2978 2166570,
2979 2166788,
2980 2167805,
2981 2168042,
2982 2168349,
2983 2169860,
2984 2170493,
2985 2170500,
2986 2170589,
2987 2170730,
2988 2170884,
2989 2171594,
2990 2171805,
2991 2171889,
2992 2171908,
2993 2172765,
2994 2172913,
2995 2172957,
2996 2174980,
2997 2176797,
2998 2176906,
2999 2176964,
3000 2177034,
3001 2177565,
3002 2177610,
3003 2179076,
3004 2179109,
3005 2179229,
3006 2179237,
3007 2179325,
3008 2179461,
3009 2179588,
3010 2179741,
3011 2179748,
3012 2179869,
3013 2179876,
3014 2180829,
3015 2180869,
3016 2180989,
3017 2181093,
3018 2181130,
3019 2181437,
3020 2181649,
3021 2181949,
3022 2182148,
3023 2183082,
3024 2183153,
3025 2183172,
3026 2184106,
3027 2184221,
3028 2185220,
3029 2185493,
3030 2185508,
3031 2186405,
3032 2186493,
3033 2186602,
3034 2186769,
3035 2187005,
3036 2187268,
3037 2189021,
3038 2189105,
3039 2189316,
3040 2190045,
3041 2190090,
3042 2190340,
3043 2190973,
3044 2191114,
3045 2191364,
3046 2191965,
3047 2192177,
3048 2192317,
3049 2192682,
3050 2192925,
3051 2195460,
3052 2197821,
3053 2199552,
3054 2201213,
3055 2201601,
3056 2203261,
3057 2203466,
3058 2203652,
3059 2204805,
3060 2204957,
3061 2205192,
3062 2205533,
3063 2214922,
3064 2215933,
3065 2220036,
3066 2220970,
3067 2221284,
3068 2221341,
3069 2221572,
3070 2222277,
3071 2222634,
3072 2222769,
3073 2222941,
3074 2227204,
3075 2227965,
3076 2228230,
3077 2228261,
3078 2228294,
3079 2228324,
3080 2230021,
3081 2230513,
3082 2230749,
3083 2230858,
3084 2231496,
3085 2231837,
3086 2232293,
3087 2232390,
3088 2232420,
3089 2233862,
3090 2233957,
3091 2234086,
3092 2234149,
3093 2234225,
3094 2234298,
3095 2234321,
3096 2234461,
3097 2234810,
3098 2234845,
3099 2234884,
3100 2235709,
3101 2235912,
3102 2236253,
3103 2236421,
3104 2236516,
3105 2237669,
3106 2237830,
3107 2237861,
3108 2238141,
3109 2238152,
3110 2238481,
3111 2238596,
3112 2238630,
3113 2238717,
3114 2238980,
3115 2240101,
3116 2240145,
3117 2240196,
3118 2240253,
3119 2240517,
3120 2240582,
3121 2240612,
3122 2242150,
3123 2242245,
3124 2242534,
3125 2242596,
3126 2242737,
3127 2242853,
3128 2242993,
3129 2243037,
3130 2243080,
3131 2243396,
3132 2243441,
3133 2243460,
3134 2243505,
3135 2243613,
3136 2243626,
3137 2244285,
3138 2244612,
3139 2245213,
3140 2245220,
3141 2246022,
3142 2246117,
3143 2246214,
3144 2246277,
3145 2246310,
3146 2246341,
3147 2246417,
3148 2246597,
3149 2246653,
3150 2248708,
3151 2248957,
3152 2248964,
3153 2249021,
3154 2249028,
3155 2249181,
3156 2249188,
3157 2249693,
3158 2249700,
3159 2250033,
3160 2250077,
3161 2250244,
3162 2251749,
3163 2251782,
3164 2251877,
3165 2252157,
3166 2252296,
3167 2252637,
3168 2252805,
3169 2252870,
3170 2252957,
3171 2252964,
3172 2253245,
3173 2253284,
3174 2253373,
3175 2253412,
3176 2254141,
3177 2254148,
3178 2254397,
3179 2254404,
3180 2254493,
3181 2254500,
3182 2254685,
3183 2254693,
3184 2254756,
3185 2254790,
3186 2254853,
3187 2254886,
3188 2255037,
3189 2255078,
3190 2255165,
3191 2255206,
3192 2255325,
3193 2255364,
3194 2255421,
3195 2255590,
3196 2255645,
3197 2255780,
3198 2255942,
3199 2256029,
3200 2256069,
3201 2256317,
3202 2256389,
3203 2256573,
3204 2260996,
3205 2262694,
3206 2262789,
3207 2263046,
3208 2263109,
3209 2263206,
3210 2263237,
3211 2263268,
3212 2263409,
3213 2263560,
3214 2263901,
3215 2263921,
3216 2263965,
3217 2263985,
3218 2264005,
3219 2264036,
3220 2264093,
3221 2265092,
3222 2266630,
3223 2266725,
3224 2266918,
3225 2266949,
3226 2266982,
3227 2267109,
3228 2267174,
3229 2267205,
3230 2267268,
3231 2267345,
3232 2267364,
3233 2267421,
3234 2267656,
3235 2267997,
3236 2273284,
3237 2274790,
3238 2274885,
3239 2275037,
3240 2275078,
3241 2275205,
3242 2275270,
3243 2275301,
3244 2275377,
3245 2276100,
3246 2276229,
3247 2276317,
3248 2277380,
3249 2278918,
3250 2279013,
3251 2279270,
3252 2279333,
3253 2279366,
3254 2279397,
3255 2279473,
3256 2279556,
3257 2279613,
3258 2279944,
3259 2280285,
3260 2280465,
3261 2280893,
3262 2281476,
3263 2282853,
3264 2282886,
3265 2282917,
3266 2282950,
3267 2283013,
3268 2283206,
3269 2283237,
3270 2283268,
3271 2283325,
3272 2283528,
3273 2283869,
3274 2285572,
3275 2286461,
3276 2286501,
3277 2286598,
3278 2286661,
3279 2286790,
3280 2286821,
3281 2287005,
3282 2287112,
3283 2287434,
3284 2287505,
3285 2287605,
3286 2287645,
3287 2293764,
3288 2295174,
3289 2295269,
3290 2295558,
3291 2295589,
3292 2295665,
3293 2295709,
3294 2298880,
3295 2299905,
3296 2300936,
3297 2301258,
3298 2301565,
3299 2301924,
3300 2301981,
3301 2307076,
3302 2307357,
3303 2307396,
3304 2308646,
3305 2308741,
3306 2308893,
3307 2308933,
3308 2308998,
3309 2309125,
3310 2309156,
3311 2309201,
3312 2309220,
3313 2309254,
3314 2309309,
3315 2310148,
3316 2310181,
3317 2310500,
3318 2311781,
3319 2311974,
3320 2312004,
3321 2312037,
3322 2312177,
3323 2312421,
3324 2312477,
3325 2312708,
3326 2312741,
3327 2312934,
3328 2312997,
3329 2313092,
3330 2314565,
3331 2314982,
3332 2315013,
3333 2315089,
3334 2315172,
3335 2315217,
3336 2315389,
3337 2316292,
3338 2318141,
3339 2326532,
3340 2326845,
3341 2326852,
3342 2328038,
3343 2328069,
3344 2328317,
3345 2328325,
3346 2328518,
3347 2328549,
3348 2328580,
3349 2328625,
3350 2328797,
3351 2329096,
3352 2329418,
3353 2330045,
3354 2330129,
3355 2330180,
3356 2331165,
3357 2331205,
3358 2331933,
3359 2331942,
3360 2331973,
3361 2332198,
3362 2332229,
3363 2332294,
3364 2332325,
3365 2332413,
3366 2334724,
3367 2334973,
3368 2334980,
3369 2335069,
3370 2335076,
3371 2336293,
3372 2336509,
3373 2336581,
3374 2336637,
3375 2336645,
3376 2336733,
3377 2336741,
3378 2336964,
3379 2336997,
3380 2337053,
3381 2337288,
3382 2337629,
3383 2337796,
3384 2338013,
3385 2338020,
3386 2338109,
3387 2338116,
3388 2339142,
3389 2339325,
3390 2339333,
3391 2339421,
3392 2339430,
3393 2339493,
3394 2339526,
3395 2339557,
3396 2339588,
3397 2339645,
3398 2339848,
3399 2340189,
3400 2350084,
3401 2350693,
3402 2350758,
3403 2350833,
3404 2350909,
3405 2357258,
3406 2357941,
3407 2358195,
3408 2358325,
3409 2358877,
3410 2359281,
3411 2359300,
3412 2388829,
3413 2392073,
3414 2395645,
3415 2395665,
3416 2395837,
3417 2396164,
3418 2402461,
3419 2490372,
3420 2524669,
3421 2524698,
3422 2524989,
3423 2654212,
3424 2672893,
3425 2949124,
3426 2967357,
3427 2967556,
3428 2968573,
3429 2968584,
3430 2968925,
3431 2969041,
3432 2969117,
3433 2972164,
3434 2973149,
3435 2973189,
3436 2973361,
3437 2973405,
3438 2973700,
3439 2975237,
3440 2975473,
3441 2975637,
3442 2975747,
3443 2975889,
3444 2975925,
3445 2975965,
3446 2976264,
3447 2976605,
3448 2976618,
3449 2976861,
3450 2976868,
3451 2977565,
3452 2977700,
3453 2978333,
3454 3000320,
3455 3001345,
3456 3002378,
3457 3003121,
3458 3003261,
3459 3006468,
3460 3008893,
3461 3008997,
3462 3009028,
3463 3009062,
3464 3010845,
3465 3011045,
3466 3011171,
3467 3011613,
3468 3013635,
3469 3013713,
3470 3013731,
3471 3013789,
3472 3014660,
3473 3211037,
3474 3211268,
3475 3235453,
3476 3538948,
3477 3548157,
3478 3549700,
3479 3549821,
3480 3550340,
3481 3550493,
3482 3550724,
3483 3563421,
3484 3637252,
3485 3640701,
3486 3640836,
3487 3641277,
3488 3641348,
3489 3641661,
3490 3641860,
3491 3642205,
3492 3642261,
3493 3642277,
3494 3642353,
3495 3642394,
3496 3642525,
3497 3801109,
3498 3808989,
3499 3809301,
3500 3810557,
3501 3810613,
3502 3812518,
3503 3812581,
3504 3812693,
3505 3812774,
3506 3812986,
3507 3813221,
3508 3813493,
3509 3813541,
3510 3813781,
3511 3814725,
3512 3814869,
3513 3816765,
3514 3817493,
3515 3819589,
3516 3819701,
3517 3819741,
3518 3824650,
3519 3825309,
3520 3825685,
3521 3828477,
3522 3828746,
3523 3829565,
3524 3833856,
3525 3834689,
3526 3835520,
3527 3836353,
3528 3836605,
3529 3836609,
3530 3837184,
3531 3838017,
3532 3838848,
3533 3838909,
3534 3838912,
3535 3839005,
3536 3839040,
3537 3839101,
3538 3839136,
3539 3839229,
3540 3839264,
3541 3839421,
3542 3839424,
3543 3839681,
3544 3839837,
3545 3839841,
3546 3839901,
3547 3839905,
3548 3840157,
3549 3840161,
3550 3840512,
3551 3841345,
3552 3842176,
3553 3842269,
3554 3842272,
3555 3842429,
3556 3842464,
3557 3842749,
3558 3842752,
3559 3843005,
3560 3843009,
3561 3843840,
3562 3843933,
3563 3843936,
3564 3844093,
3565 3844096,
3566 3844285,
3567 3844288,
3568 3844349,
3569 3844416,
3570 3844669,
3571 3844673,
3572 3845504,
3573 3846337,
3574 3847168,
3575 3848001,
3576 3848832,
3577 3849665,
3578 3850496,
3579 3851329,
3580 3852160,
3581 3852993,
3582 3853824,
3583 3854657,
3584 3855581,
3585 3855616,
3586 3856434,
3587 3856449,
3588 3857266,
3589 3857281,
3590 3857472,
3591 3858290,
3592 3858305,
3593 3859122,
3594 3859137,
3595 3859328,
3596 3860146,
3597 3860161,
3598 3860978,
3599 3860993,
3600 3861184,
3601 3862002,
3602 3862017,
3603 3862834,
3604 3862849,
3605 3863040,
3606 3863858,
3607 3863873,
3608 3864690,
3609 3864705,
3610 3864896,
3611 3864929,
3612 3864989,
3613 3865032,
3614 3866645,
3615 3883013,
3616 3884789,
3617 3884901,
3618 3886517,
3619 3886757,
3620 3886805,
3621 3887237,
3622 3887285,
3623 3887345,
3624 3887517,
3625 3887973,
3626 3888157,
3627 3888165,
3628 3888669,
3629 3932165,
3630 3932413,
3631 3932421,
3632 3932989,
3633 3933029,
3634 3933277,
3635 3933285,
3636 3933373,
3637 3933381,
3638 3933565,
3639 3940356,
3640 3941821,
3641 3941893,
3642 3942115,
3643 3942365,
3644 3942408,
3645 3942749,
3646 3942852,
3647 3942901,
3648 3942941,
3649 3954692,
3650 3956101,
3651 3956232,
3652 3956573,
3653 3956723,
3654 3956765,
3655 3997700,
3656 4004029,
3657 4004074,
3658 4004357,
3659 4004605,
3660 4005888,
3661 4006977,
3662 4008069,
3663 4008291,
3664 4008349,
3665 4008456,
3666 4008797,
3667 4008913,
3668 4008989,
3669 4034090,
3670 4035989,
3671 4036010,
3672 4036115,
3673 4036138,
3674 4036285,
3675 4038698,
3676 4040149,
3677 4040170,
3678 4040669,
3679 4046852,
3680 4047005,
3681 4047012,
3682 4047901,
3683 4047908,
3684 4047997,
3685 4048004,
3686 4048061,
3687 4048100,
3688 4048157,
3689 4048164,
3690 4048509,
3691 4048516,
3692 4048669,
3693 4048676,
3694 4048733,
3695 4048740,
3696 4048797,
3697 4048964,
3698 4049021,
3699 4049124,
3700 4049181,
3701 4049188,
3702 4049245,
3703 4049252,
3704 4049309,
3705 4049316,
3706 4049437,
3707 4049444,
3708 4049533,
3709 4049540,
3710 4049597,
3711 4049636,
3712 4049693,
3713 4049700,
3714 4049757,
3715 4049764,
3716 4049821,
3717 4049828,
3718 4049885,
3719 4049892,
3720 4049949,
3721 4049956,
3722 4050045,
3723 4050052,
3724 4050109,
3725 4050148,
3726 4050301,
3727 4050308,
3728 4050557,
3729 4050564,
3730 4050717,
3731 4050724,
3732 4050877,
3733 4050884,
3734 4050941,
3735 4050948,
3736 4051293,
3737 4051300,
3738 4051869,
3739 4052004,
3740 4052125,
3741 4052132,
3742 4052317,
3743 4052324,
3744 4052893,
3745 4054546,
3746 4054621,
3747 4063253,
3748 4064669,
3749 4064789,
3750 4067997,
3751 4068373,
3752 4068861,
3753 4068917,
3754 4069405,
3755 4069429,
3756 4069917,
3757 4069941,
3758 4071133,
3759 4071434,
3760 4071869,
3761 4071957,
3762 4074941,
3763 4075029,
3764 4076989,
3765 4078805,
3766 4079741,
3767 4080149,
3768 4081565,
3769 4081685,
3770 4081981,
3771 4082197,
3772 4082269,
3773 4082709,
3774 4082909,
3775 4087829,
3776 4095860,
3777 4096021,
3778 4119261,
3779 4119573,
3780 4119997,
3781 4120085,
3782 4120445,
3783 4120597,
3784 4124317,
3785 4124693,
3786 4127549,
3787 4127765,
3788 4128157,
3789 4128789,
3790 4129181,
3791 4129301,
3792 4131101,
3793 4131349,
3794 4131677,
3795 4131861,
3796 4133149,
3797 4133397,
3798 4134365,
3799 4136981,
3800 4137373,
3801 4137397,
3802 4140637,
3803 4140661,
3804 4140797,
3805 4140885,
3806 4142205,
3807 4142261,
3808 4142461,
3809 4142549,
3810 4143485,
3811 4143541,
3812 4147869,
3813 4148245,
3814 4148701,
3815 4148757,
3816 4148893,
3817 4149013,
3818 4149117,
3819 4149269,
3820 4149373,
3821 4149781,
3822 4149981,
3823 4194308,
3824 5561085,
3825 5562372,
3826 5695165,
3827 5695492,
3828 5702621,
3829 5702660,
3830 5887069,
3831 5887492,
3832 6126653,
3833 6225924,
3834 6243293,
3835 29360186,
3836 29360221,
3837 29361178,
3838 29364253,
3839 29368325,
3840 29376029,
3841 31457308,
3842 33554397,
3843 33554460,
3844 35651549,
3845 35651613,
3846 //--Autogenerated -- end of section automatically generated
3847 };
3848 
3849 constexpr int maxUnicode = 0x10ffff;
3850 constexpr int maskCategory = 0x1F;
3851 
3852 }
3853 
3854 // Each element in catRanges is the start of a range of Unicode characters in
3855 // one general category.
3856 // The value is comprised of a 21-bit character value shifted 5 bits and a 5 bit
3857 // category matching the CharacterCategory enumeration.
3858 // Initial version has 3249 entries and adds about 13K to the executable.
3859 // The array is in ascending order so can be searched using binary search.
3860 // Therefore the average call takes log2(3249) = 12 comparisons.
3861 // For speed, it may be useful to make a linear table for the common values,
3862 // possibly for 0..0xff for most Western European text or 0..0xfff for most
3863 // alphabetic languages.
3864 
3865 CharacterCategory CategoriseCharacter(int character) {
3866 	if (character < 0 || character > maxUnicode)
3867 		return ccCn;
3868 	const int baseValue = character * (maskCategory+1) + maskCategory;
3869 	const int *placeAfter = std::lower_bound(catRanges, std::end(catRanges), baseValue);
3870 	return static_cast<CharacterCategory>(*(placeAfter-1) & maskCategory);
3871 }
3872 
3873 // Implementation of character sets recommended for identifiers in Unicode Standard Annex #31.
3874 // http://unicode.org/reports/tr31/
3875 
3876 namespace {
3877 
3878 enum class OtherID { oidNone, oidStart, oidContinue };
3879 
3880 // Some characters are treated as valid for identifiers even
3881 // though most characters from their category are not.
3882 // Values copied from http://www.unicode.org/Public/9.0.0/ucd/PropList.txt
3883 OtherID OtherIDOfCharacter(int character) noexcept {
3884 	if (
3885 		(character == 0x1885) ||	// MONGOLIAN LETTER ALI GALI BALUDA
3886 		(character == 0x1886) ||	// MONGOLIAN LETTER ALI GALI THREE BALUDA
3887 		(character == 0x2118) ||	// SCRIPT CAPITAL P
3888 		(character == 0x212E) ||	// ESTIMATED SYMBOL
3889 		(character == 0x309B) ||	// KATAKANA-HIRAGANA VOICED SOUND MARK
3890 		(character == 0x309C)) {	// KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
3891 		return OtherID::oidStart;
3892 	} else if (
3893 		(character == 0x00B7) ||	// MIDDLE DOT
3894 		(character == 0x0387) ||	// GREEK ANO TELEIA
3895 		((character >= 0x1369) && (character <= 0x1371)) ||	// ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
3896 		(character == 0x19DA)) {	// NEW TAI LUE THAM DIGIT ONE
3897 		return OtherID::oidContinue;
3898 	} else {
3899 		return OtherID::oidNone;
3900 	}
3901 }
3902 
3903 // Determine if a character is in  Ll|Lu|Lt|Lm|Lo|Nl|Mn|Mc|Nd|Pc and has
3904 // Pattern_Syntax|Pattern_White_Space.
3905 // As of Unicode 9, only VERTICAL TILDE which is in Lm and has Pattern_Syntax matches.
3906 // Should really generate from PropList.txt a list of Pattern_Syntax and Pattern_White_Space.
3907 constexpr bool IsIdPattern(int character) noexcept {
3908 	return character == 0x2E2F;
3909 }
3910 
3911 bool OmitXidStart(int character) noexcept {
3912 	switch (character) {
3913 	case 0x037A:	// GREEK YPOGEGRAMMENI
3914 	case 0x0E33:	// THAI CHARACTER SARA AM
3915 	case 0x0EB3:	// LAO VOWEL SIGN AM
3916 	case 0x309B:	// KATAKANA-HIRAGANA VOICED SOUND MARK
3917 	case 0x309C:	// KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
3918 	case 0xFC5E:	// ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
3919 	case 0xFC5F:	// ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
3920 	case 0xFC60:	// ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
3921 	case 0xFC61:	// ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
3922 	case 0xFC62:	// ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
3923 	case 0xFC63:	// ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
3924 	case 0xFDFA:	// ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
3925 	case 0xFDFB:	// ARABIC LIGATURE JALLAJALALOUHOU
3926 	case 0xFE70:	// ARABIC FATHATAN ISOLATED FORM
3927 	case 0xFE72:	// ARABIC DAMMATAN ISOLATED FORM
3928 	case 0xFE74:	// ARABIC KASRATAN ISOLATED FORM
3929 	case 0xFE76:	// ARABIC FATHA ISOLATED FORM
3930 	case 0xFE78:	// ARABIC DAMMA ISOLATED FORM
3931 	case 0xFE7A:	// ARABIC KASRA ISOLATED FORM
3932 	case 0xFE7C:	// ARABIC SHADDA ISOLATED FORM
3933 	case 0xFE7E:	// ARABIC SUKUN ISOLATED FORM
3934 	case 0xFF9E:	// HALFWIDTH KATAKANA VOICED SOUND MARK
3935 	case 0xFF9F:	// HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
3936 		return true;
3937 	default:
3938 		return false;
3939 	}
3940 }
3941 
3942 bool OmitXidContinue(int character) noexcept {
3943 	switch (character) {
3944 	case 0x037A:	// GREEK YPOGEGRAMMENI
3945 	case 0x309B:	// KATAKANA-HIRAGANA VOICED SOUND MARK
3946 	case 0x309C:	// KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
3947 	case 0xFC5E:	// ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
3948 	case 0xFC5F:	// ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
3949 	case 0xFC60:	// ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
3950 	case 0xFC61:	// ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
3951 	case 0xFC62:	// ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
3952 	case 0xFC63:	// ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
3953 	case 0xFDFA:	// ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
3954 	case 0xFDFB:	// ARABIC LIGATURE JALLAJALALOUHOU
3955 	case 0xFE70:	// ARABIC FATHATAN ISOLATED FORM
3956 	case 0xFE72:	// ARABIC DAMMATAN ISOLATED FORM
3957 	case 0xFE74:	// ARABIC KASRATAN ISOLATED FORM
3958 	case 0xFE76:	// ARABIC FATHA ISOLATED FORM
3959 	case 0xFE78:	// ARABIC DAMMA ISOLATED FORM
3960 	case 0xFE7A:	// ARABIC KASRA ISOLATED FORM
3961 	case 0xFE7C:	// ARABIC SHADDA ISOLATED FORM
3962 	case 0xFE7E:	// ARABIC SUKUN ISOLATED FORM
3963 		return true;
3964 	default:
3965 		return false;
3966 	}
3967 }
3968 
3969 }
3970 
3971 // UAX #31 defines ID_Start as
3972 // [[:L:][:Nl:][:Other_ID_Start:]--[:Pattern_Syntax:]--[:Pattern_White_Space:]]
3973 bool IsIdStart(int character) {
3974 	if (IsIdPattern(character)) {
3975 		return false;
3976 	}
3977 	const OtherID oid = OtherIDOfCharacter(character);
3978 	if (oid == OtherID::oidStart) {
3979 		return true;
3980 	}
3981 	const CharacterCategory c = CategoriseCharacter(character);
3982 	return (c == ccLl || c == ccLu || c == ccLt || c == ccLm || c == ccLo
3983 		|| c == ccNl);
3984 }
3985 
3986 // UAX #31 defines ID_Continue as
3987 // [[:ID_Start:][:Mn:][:Mc:][:Nd:][:Pc:][:Other_ID_Continue:]--[:Pattern_Syntax:]--[:Pattern_White_Space:]]
3988 bool IsIdContinue(int character) {
3989 	if (IsIdPattern(character)) {
3990 		return false;
3991 	}
3992 	const OtherID oid = OtherIDOfCharacter(character);
3993 	if (oid != OtherID::oidNone) {
3994 		return true;
3995 	}
3996 	const CharacterCategory c = CategoriseCharacter(character);
3997 	return (c == ccLl || c == ccLu || c == ccLt || c == ccLm || c == ccLo
3998 		|| c == ccNl || c == ccMn || c == ccMc || c == ccNd || c == ccPc);
3999 }
4000 
4001 // XID_Start is ID_Start modified for Normalization Form KC in UAX #31
4002 bool IsXidStart(int character) {
4003 	if (OmitXidStart(character)) {
4004 		return false;
4005 	} else {
4006 		return IsIdStart(character);
4007 	}
4008 }
4009 
4010 // XID_Continue is ID_Continue modified for Normalization Form KC in UAX #31
4011 bool IsXidContinue(int character) {
4012 	if (OmitXidContinue(character)) {
4013 		return false;
4014 	} else {
4015 		return IsIdContinue(character);
4016 	}
4017 }
4018 
4019 CharacterCategoryMap::CharacterCategoryMap() {
4020 	Optimize(256);
4021 }
4022 
4023 int CharacterCategoryMap::Size() const noexcept {
4024 	return static_cast<int>(dense.size());
4025 }
4026 
4027 void CharacterCategoryMap::Optimize(int countCharacters) {
4028 	const int characters = std::clamp(countCharacters, 256, maxUnicode + 1);
4029 	dense.resize(characters);
4030 
4031 	int end = 0;
4032 	int index = 0;
4033 	int current = catRanges[index];
4034 	++index;
4035 	do {
4036 		const int next = catRanges[index];
4037 		const unsigned char category = current & maskCategory;
4038 		current >>= 5;
4039 		end = std::min(characters, next >> 5);
4040 		while (current < end) {
4041 			dense[current++] = category;
4042 		}
4043 		current = next;
4044 		++index;
4045 	} while (characters > end);
4046 }
4047 
4048 }
4049