From 734062b298e129a8f8bdae299f8d2b7b19419867 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 5 Aug 2013 13:14:17 -0400 Subject: [PATCH] iconv support for legacy Korean encodings like for other character sets, stateful iso-2022 form is not supported yet but everything else should work. all charset aliases are treated the same, as Windows codepage 949, because reportedly the EUC-KR charset name is in widespread (mis?)usage in email and on the web for data which actually uses the extended characters outside the standard 93x94 grid. this could easily be changed if desired. the principle of this converter for handling the giant bulk of rare Hangul syllables outside of the standard KS X 1001 93x94 grid is the same as the GB18030 converter's treatment of non-explicitly-coded Unicode codepoints: sequences in the extension range are mapped to an integer index N, and the converter explicitly computes the Nth Hangul syllable not explicitly encoded in the character map. empirically, this requires at most 7 passes over the grid. this approach reduces the table size required for Korean legacy encodings from roughly 44k to 17k and should have minimal performance impact on real-world text conversions since the "slow" characters are rare. where it does have impact, the cost is merely a large constant time factor. --- src/locale/iconv.c | 38 +++ src/locale/ksc.h | 640 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 678 insertions(+) create mode 100644 src/locale/ksc.h diff --git a/src/locale/iconv.c b/src/locale/iconv.c index a2332ce0..d3caafa7 100644 --- a/src/locale/iconv.c +++ b/src/locale/iconv.c @@ -20,6 +20,7 @@ #define GB18030 0330 #define GBK 0331 #define GB2312 0332 +#define EUC_KR 0350 /* FIXME: these are not implemented yet * EUC: A1-FE A1-FE @@ -47,6 +48,7 @@ static const unsigned char charmaps[] = "gb18030\0\0\330" "gbk\0\0\331" "gb2312\0\0\332" +"euckr\0ksc5601\0ksx1001\0cp949\0\0\350" #include "codepages.h" ; @@ -62,6 +64,10 @@ static const unsigned short gb18030[126][190] = { #include "gb18030.h" }; +static const unsigned short ksc[93][94] = { +#include "ksc.h" +}; + static int fuzzycmp(const unsigned char *a, const unsigned char *b) { for (; *a && *b; a++, b++) { @@ -278,6 +284,38 @@ size_t iconv(iconv_t cd0, char **restrict in, size_t *restrict inb, char **restr if (d>63) d--; c = gb18030[c][d]; break; + case EUC_KR: + l = 2; + if (*inb < 2) goto starved; + d = *((unsigned char *)*in + 1); + c -= 0xa1; + d -= 0xa1; + if (c >= 93 || d >= 94) { + c += (0xa1-0x81); + d += 0xa1; + if (c >= 93 || c>=0xc6-0x81 && d>0x52) + goto ilseq; + if (d-'A'<26) d = d-'A'; + else if (d-'a'<26) d = d-'a'+26; + else if (d-0x81<0xff-0x81) d = d-0x81+52; + else goto ilseq; + if (c < 0x20) c = 178*c + d; + else c = 178*0x20 + 84*(c-0x20) + d; + c += 0xac00; + for (d=0xac00; d<=c; ) { + k = 0; + for (int i=0; i<93; i++) + for (int j=0; j<94; j++) + if (ksc[i][j]-d <= c-d) + k++; + d = c+1; + c += k; + } + break; + } + c = ksc[c][d]; + if (!c) goto ilseq; + break; default: if (c < 128+type) break; c -= 128+type; diff --git a/src/locale/ksc.h b/src/locale/ksc.h new file mode 100644 index 00000000..8f6eca4b --- /dev/null +++ b/src/locale/ksc.h @@ -0,0 +1,640 @@ +12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217, +8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304, +12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504, +65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733, +9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595, +8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834, +8835,8746,8745,8743,8744,65506,8658,8660,8704,8707,180,65374,711,728,733,730, +729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828, +9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639, +9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600, +9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65281,65282,65283,65284,65285,65286, +65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299, +65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312, +65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325, +65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338, +65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351, +65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364, +65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,12593,12594,12595, +12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608, +12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621, +12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634, +12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647, +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660, +12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673, +12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,0,0,0,0,0,8544,8545,8546, +8547,8548,8549,8550,8551,8552,8553,0,0,0,0,0,0,0,913,914,915,916,917,918,919, +920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,0,0,0,0,0, +0,0,0,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963, +964,965,966,967,968,969,0,0,0,0,0,0,9472,9474,9484,9488,9496,9492,9500,9516, +9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504, +9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493, +9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525, +9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13205,13206,13207,8467, +13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215, +13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224, +13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186, +13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204, +8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225, +13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,198,208,170,294,0,306,0,319,321,216,338,186,222,358,330,0,12896, +12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909, +12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922, +12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437, +9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314, +9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188, +190,8539,8540,8541,8542,230,273,240,295,305,307,312,320,322,248,339,223,254, +359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810, +12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823, +12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381, +9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396, +9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, +9346,185,178,179,8308,8319,8321,8322,8323,8324,12353,12354,12355,12356,12357, +12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370, +12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383, +12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396, +12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409, +12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422, +12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435, +0,0,0,0,0,0,0,0,0,0,0,12449,12450,12451,12452,12453,12454,12455,12456,12457, +12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470, +12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483, +12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496, +12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509, +12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522, +12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,0,0,0, +0,0,0,0,0,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051, +1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066, +1067,1068,1069,1070,1071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1072,1073,1074,1075, +1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089, +1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44032,44033,44036,44039,44040,44041,44042, +44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061, +44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109, +44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164, +44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193, +44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228, +44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272, +44273,44275,44277,44278,44284,44285,44288,44292,44294,44300,44301,44303,44305, +44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359, +44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406, +44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452, +44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537, +44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599, +44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628, +44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,44665, +44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749, +44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807, +44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866, +44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944, +44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006, +45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072, +45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141, +45143,45145,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209, +45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231, +45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265, +45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337, +45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369, +45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433, +45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480, +45516,45520,45524,45532,45533,45535,45544,45545,45548,45552,45561,45563,45565, +45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656, +45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716, +45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768, +45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800, +45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819, +45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909, +45910,45912,45915,45916,45918,45919,45924,45925,45927,45929,45931,45934,45936, +45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985, +45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041, +46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123, +46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237, +46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301, +46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363, +46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,46400,46401, +46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433, +46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524, +46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612, +46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764, +46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896, +46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961, +46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998, +46999,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032, +47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112, +47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157, +47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213, +47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301, +47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355, +47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449, +47452,47456,47464,47465,47467,47469,47476,47477,47480,47484,47492,47493,47495, +47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560, +47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585, +47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617, +47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699, +47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736, +47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801, +47803,47805,47812,47816,47832,47833,47868,47872,47876,47885,47887,47889,47896, +47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940, +47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012, +48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121, +48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149, +48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173, +48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208, +48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,48281,48282,48288, +48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324, +48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388, +48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472, +48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531, +48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624, +48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708, +48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740, +48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780, +48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864, +48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960, +48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108, +49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300, +49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334, +49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371, +49372,49373,49380,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416, +49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453, +49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485, +49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541, +49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577, +49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648, +49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692, +49695,49696,49704,49705,49707,49709,49711,49713,49714,49716,49736,49744,49745, +49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800, +49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847, +49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912, +49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948, +49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044, +50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153, +50157,50164,50165,50168,50184,50192,50212,50220,50224,50228,50236,50237,50248, +50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409, +50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472, +50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508, +50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532, +50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573, +50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619, +50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,50640, +50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678, +50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704, +50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740, +50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773, +50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827, +50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872, +50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912, +50913,50920,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964, +50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004, +51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030, +51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075, +51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096, +51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133, +51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180, +51200,51201,51204,51208,51210,51216,51217,51219,51221,51222,51228,51229,51232, +51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284, +51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340, +51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413, +51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468, +51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555, +51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648, +51649,51652,51655,51656,51658,51664,51665,51667,51669,51670,51673,51674,51676, +51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708, +51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796, +51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908, +51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988, +51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088, +52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253, +52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,52284,52285, +52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326, +52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404, +52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481, +52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572, +52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644, +52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731, +52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787, +52789,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853, +52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899, +52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983, +52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028, +53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095, +53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216, +53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293, +53300,53301,53304,53308,53316,53317,53319,53321,53328,53332,53336,53344,53356, +53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431, +53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469, +53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560, +53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599, +53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683, +53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808, +53812,53820,53821,53823,53825,53832,53852,53860,53888,53889,53892,53896,53904, +53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954, +53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016, +54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048, +54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085, +54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176, +54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232, +54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,54280,54301,54336, +54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408, +54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512, +54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596, +54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637, +54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729, +54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773, +54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816, +54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868, +54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928, +54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988, +54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044, +55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100, +55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139, +55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192, +55193,55195,55197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20285,20339,20551,20729, +21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634, +30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051, +21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718, +22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965, +31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883, +31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954, +26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,21283, +23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394, +24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611, +37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114, +28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353, +63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192, +28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314, +24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133, +21138,27298,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684, +27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211, +35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609, +37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218, +24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855, +29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686, +35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395, +23622,24760,25106,26690,26800,26856,28330,30028,30328,30926,31293,31995,32363, +32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396, +23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590, +31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747, +36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288, +22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592, +20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354, +34467,36002,38799,20018,23521,25096,26524,29916,31185,33747,35463,35506,36328, +36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874, +27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669, +25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568, +33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088, +39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898, +25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686, +37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,21312,21475, +21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601, +27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350, +32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476, +37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531, +31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406, +33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413, +29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512, +36020,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998, +33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224, +20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681, +27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810, +26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450, +24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864, +21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190, +24524,25216,26071,26083,26398,26399,26462,26827,26820,27231,27450,27683,27773, +27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047, +31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215, +37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708, +37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760, +63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771, +63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511, +26976,28275,63778,30007,63779,63780,63781,32013,63782,63783,34930,22218,23064, +63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899, +24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361, +24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801, +63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813, +33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821, +63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830, +63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,20025,20150,20294, +21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222, +34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812, +26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663, +27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070, +31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825, +29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294, +22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691, +26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241, +36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272, +29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788, +28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481, +26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460, +26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975, +37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078, +63835,30313,32645,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853, +63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068, +36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240, +34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802, +20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391, +35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670, +31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019, +36706,38722,24976,25088,25891,28451,29001,29833,32244,32879,34030,36646,36899, +37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557, +20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894, +37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736, +25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791, +40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407, +28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102, +20698,23534,24278,26009,29134,30274,30637,32842,34044,36988,39719,40845,22744, +23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129, +26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006, +20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841, +38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400, +21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178, +31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136, +29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,31435, +31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448, +33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415, +28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819, +33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725, +36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023, +36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431, +33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754, +40629,28357,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559, +33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720, +25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468, +33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794, +22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447, +33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595, +28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664, +20497,21006,21563,21839,25991,27766,32010,32011,32862,34442,38272,38639,21247, +27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228, +30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935, +26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338, +25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334, +34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075, +27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784, +36820,38930,39151,21187,25300,25765,28196,28497,30332,36299,37297,37474,39662, +39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121, +26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607, +37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953, +30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091, +26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115, +34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359, +31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,30887,34327, +38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712, +19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177, +31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541, +29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489, +26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086, +20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562, +36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827, +23142,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526, +31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212, +36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868, +22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033, +38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989, +20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503, +27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192, +31875,32203,32737,32933,33086,33218,33778,34586,35048,35513,35692,36027,37145, +38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277, +29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282, +20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531, +23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515, +27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114, +32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034, +39164,39391,40605,21066,63849,26388,63850,20632,21034,23665,25955,27733,29642, +29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851, +26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687, +20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705, +27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937, +36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989, +63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257, +26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,32997,33298,34223, +35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512, +27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307, +23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218, +32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245, +39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634, +40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854, +22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596, +32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855, +36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803, +27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787, +32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439, +23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956, +39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753, +30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723, +23744,24101,24833,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929, +28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143, +32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930, +36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706, +21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033, +24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636, +31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348, +25100,34899,36848,37477,23815,23847,23913,29791,33181,34664,28629,25342,32722, +35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365, +21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178, +26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925, +35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672, +36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180, +30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857, +36805,22833,23460,23526,24713,23529,23563,24515,27777,63858,28145,28683,29978, +33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784, +25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538, +23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823, +23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555, +38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232, +20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326, +28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,27387, +32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860, +37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864, +63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673, +29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525, +63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740, +25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474, +20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873, +22914,63874,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671, +36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884, +30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310, +63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890, +28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894, +32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902, +24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909, +28814,28976,29744,33398,33490,63910,38331,39653,40573,26308,63911,29121,33865, +63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704, +27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908, +30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923, +63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454, +34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116, +20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735, +63929,25034,25942,26111,26212,26791,27738,28595,28879,29100,29522,31613,34568, +35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277, +34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926, +31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609, +29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448, +26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031, +63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303, +25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,31368,31407, +32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958, +27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248, +24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362, +37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588, +24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419, +34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161, +26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464, +34131,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729, +22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304, +29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234, +37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234, +29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759, +20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736, +24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833, +27943,63946,28216,63947,28641,29494,29495,63948,29788,30001,63949,30290,63950, +63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986, +37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801, +22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961, +63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518, +37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957, +25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097, +30691,32681,33380,34191,34811,34915,35516,35696,37291,20108,20197,20234,63965, +63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246, +29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975, +63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714, +32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341, +24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986, +63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922, +23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,63991,63992,63993, +20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675, +24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071, +34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189, +33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668, +31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196, +24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456, +31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263, +38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289, +35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632, +22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053, +33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514, +23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735, +33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659, +20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643, +27583,27656,28593,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686, +32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999, +25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896, +38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979, +23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622, +26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010, +30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194, +37336,37478,37580,37664,38662,38742,38748,38914,40718,21046,21137,21884,22564, +24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420, +37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427, +25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031, +29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368, +32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165, +26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752, +24939,26837,28121,29742,31278,32066,32156,32305,33131,36394,36405,37758,37912, +20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610, +21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234, +28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208, +36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472, +23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981, +38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686, +24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,21675, +22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744, +27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584, +35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645, +25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043, +30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587, +36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894, +30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503, +32221,36655,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919, +24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364, +37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408, +35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649, +24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288, +24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081, +33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081, +37319,37365,20874,26613,31574,36012,20932,22971,24765,34389,20508,63999,21076, +23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191, +21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368, +36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639, +36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558, +22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893, +33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958, +39636,21021,21119,21736,24980,25220,25307,26786,26898,26970,27189,28818,28966, +30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218, +37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474, +22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368, +22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264, +36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069, +31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986, +26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,36101,21462, +21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434, +20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772, +27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473, +36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522, +26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668, +21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524, +21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752, +35351,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890, +33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153, +20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040, +39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005, +30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956, +25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487, +27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256, +29923,36009,36774,37393,38442,20843,21485,25420,20329,21764,24726,25943,27803, +28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559, +25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805, +35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253, +21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006, +30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825, +24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418, +29922,31080,34920,35961,39111,39108,39491,21697,31263,26963,35575,35914,39080, +39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644, +30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160, +27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372, +23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480, +38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532, +38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270, +24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,64008,64009,38917, +20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299, +35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139, +21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010, +27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358, +25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335, +34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846, +23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411, +24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872, +37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046, +20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009, +28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068, +31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912, +39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503, +21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301, +27194,28779,30069,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844, +25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213, +26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346, +20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361, +28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238, +24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362, +33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389, +25928,25989,26313,26783,28045,28102,29243,32948,37237,39501,20399,20505,21402, +21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628, +22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321, +21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875, +30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427, +28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725, +33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206, +26342,29081,29113,29114,29351,31143,31232,32690,35440, -- 2.25.1