Browse Source

JSM: Added module and TS file for MMDLoader.

Mugen87 6 năm trước cách đây
mục cha
commit
3ffb01c1ec

+ 1 - 0
docs/manual/en/introduction/Import-via-modules.html

@@ -182,6 +182,7 @@
 						<li>KTXLoader</li>
 						<li>LWOLoader</li>
 						<li>MD2Loader</li>
+						<li>MMDLoader</li>
 						<li>MTLLoader</li>
 						<li>NRRDLoader</li>
 						<li>OBJLoader</li>

+ 1 - 1
examples/js/loaders/MMDLoader.js

@@ -1026,7 +1026,7 @@ THREE.MMDLoader = ( function () {
 		 * @param {function} onError
 		 * @return {Array<THREE.MeshToonMaterial>}
 		 */
-		build: function ( data, geometry, onProgress, onError ) {
+		build: function ( data, geometry /*, onProgress, onError */ ) {
 
 			var materials = [];
 

+ 11535 - 0
examples/jsm/libs/mmdparser.module.js

@@ -0,0 +1,11535 @@
+/**
+ * @author Takahiro / https://github.com/takahirox
+ *
+ * Simple CharsetEncoder.
+ */
+
+function CharsetEncoder() {
+}
+
+/*
+ * Converts from Shift_JIS Uint8Array data to Unicode strings.
+ */
+CharsetEncoder.prototype.s2u = function ( uint8Array ) {
+
+	var t = this.s2uTable;
+	var str = '';
+	var p = 0;
+
+	while ( p < uint8Array.length ) {
+
+		var key = uint8Array[ p ++ ];
+
+		if ( ! ( ( key >= 0x00 && key <= 0x7e ) ||
+          ( key >= 0xa1 && key <= 0xdf ) ) &&
+       p < uint8Array.length ) {
+
+			key = ( key << 8 ) | uint8Array[ p ++ ];
+
+		}
+
+		if ( t[ key ] === undefined ) {
+
+			throw 'unknown char code ' + key + '.';
+
+		}
+
+		str += String.fromCharCode( t[ key ] );
+
+	}
+
+	return str;
+
+};
+
+CharsetEncoder.prototype.s2uTable = {
+	0: 0,
+	1: 1,
+	2: 2,
+	3: 3,
+	4: 4,
+	5: 5,
+	6: 6,
+	7: 7,
+	8: 8,
+	9: 9,
+	10: 10,
+	11: 11,
+	12: 12,
+	13: 13,
+	14: 14,
+	15: 15,
+	16: 16,
+	17: 17,
+	18: 18,
+	19: 19,
+	20: 20,
+	21: 21,
+	22: 22,
+	23: 23,
+	24: 24,
+	25: 25,
+	26: 26,
+	27: 27,
+	28: 28,
+	29: 29,
+	30: 30,
+	31: 31,
+	32: 32,
+	33: 33,
+	34: 34,
+	35: 35,
+	36: 36,
+	37: 37,
+	38: 38,
+	39: 39,
+	40: 40,
+	41: 41,
+	42: 42,
+	43: 43,
+	44: 44,
+	45: 45,
+	46: 46,
+	47: 47,
+	48: 48,
+	49: 49,
+	50: 50,
+	51: 51,
+	52: 52,
+	53: 53,
+	54: 54,
+	55: 55,
+	56: 56,
+	57: 57,
+	58: 58,
+	59: 59,
+	60: 60,
+	61: 61,
+	62: 62,
+	63: 63,
+	64: 64,
+	65: 65,
+	66: 66,
+	67: 67,
+	68: 68,
+	69: 69,
+	70: 70,
+	71: 71,
+	72: 72,
+	73: 73,
+	74: 74,
+	75: 75,
+	76: 76,
+	77: 77,
+	78: 78,
+	79: 79,
+	80: 80,
+	81: 81,
+	82: 82,
+	83: 83,
+	84: 84,
+	85: 85,
+	86: 86,
+	87: 87,
+	88: 88,
+	89: 89,
+	90: 90,
+	91: 91,
+	92: 92,
+	93: 93,
+	94: 94,
+	95: 95,
+	96: 96,
+	97: 97,
+	98: 98,
+	99: 99,
+	100: 100,
+	101: 101,
+	102: 102,
+	103: 103,
+	104: 104,
+	105: 105,
+	106: 106,
+	107: 107,
+	108: 108,
+	109: 109,
+	110: 110,
+	111: 111,
+	112: 112,
+	113: 113,
+	114: 114,
+	115: 115,
+	116: 116,
+	117: 117,
+	118: 118,
+	119: 119,
+	120: 120,
+	121: 121,
+	122: 122,
+	123: 123,
+	124: 124,
+	125: 125,
+	126: 126,
+	161: 65377,
+	162: 65378,
+	163: 65379,
+	164: 65380,
+	165: 65381,
+	166: 65382,
+	167: 65383,
+	168: 65384,
+	169: 65385,
+	170: 65386,
+	171: 65387,
+	172: 65388,
+	173: 65389,
+	174: 65390,
+	175: 65391,
+	176: 65392,
+	177: 65393,
+	178: 65394,
+	179: 65395,
+	180: 65396,
+	181: 65397,
+	182: 65398,
+	183: 65399,
+	184: 65400,
+	185: 65401,
+	186: 65402,
+	187: 65403,
+	188: 65404,
+	189: 65405,
+	190: 65406,
+	191: 65407,
+	192: 65408,
+	193: 65409,
+	194: 65410,
+	195: 65411,
+	196: 65412,
+	197: 65413,
+	198: 65414,
+	199: 65415,
+	200: 65416,
+	201: 65417,
+	202: 65418,
+	203: 65419,
+	204: 65420,
+	205: 65421,
+	206: 65422,
+	207: 65423,
+	208: 65424,
+	209: 65425,
+	210: 65426,
+	211: 65427,
+	212: 65428,
+	213: 65429,
+	214: 65430,
+	215: 65431,
+	216: 65432,
+	217: 65433,
+	218: 65434,
+	219: 65435,
+	220: 65436,
+	221: 65437,
+	222: 65438,
+	223: 65439,
+	33088: 12288,
+	33089: 12289,
+	33090: 12290,
+	33091: 65292,
+	33092: 65294,
+	33093: 12539,
+	33094: 65306,
+	33095: 65307,
+	33096: 65311,
+	33097: 65281,
+	33098: 12443,
+	33099: 12444,
+	33100: 180,
+	33101: 65344,
+	33102: 168,
+	33103: 65342,
+	33104: 65507,
+	33105: 65343,
+	33106: 12541,
+	33107: 12542,
+	33108: 12445,
+	33109: 12446,
+	33110: 12291,
+	33111: 20189,
+	33112: 12293,
+	33113: 12294,
+	33114: 12295,
+	33115: 12540,
+	33116: 8213,
+	33117: 8208,
+	33118: 65295,
+	33119: 65340,
+	33120: 65374,
+	33121: 8741,
+	33122: 65372,
+	33123: 8230,
+	33124: 8229,
+	33125: 8216,
+	33126: 8217,
+	33127: 8220,
+	33128: 8221,
+	33129: 65288,
+	33130: 65289,
+	33131: 12308,
+	33132: 12309,
+	33133: 65339,
+	33134: 65341,
+	33135: 65371,
+	33136: 65373,
+	33137: 12296,
+	33138: 12297,
+	33139: 12298,
+	33140: 12299,
+	33141: 12300,
+	33142: 12301,
+	33143: 12302,
+	33144: 12303,
+	33145: 12304,
+	33146: 12305,
+	33147: 65291,
+	33148: 65293,
+	33149: 177,
+	33150: 215,
+	33152: 247,
+	33153: 65309,
+	33154: 8800,
+	33155: 65308,
+	33156: 65310,
+	33157: 8806,
+	33158: 8807,
+	33159: 8734,
+	33160: 8756,
+	33161: 9794,
+	33162: 9792,
+	33163: 176,
+	33164: 8242,
+	33165: 8243,
+	33166: 8451,
+	33167: 65509,
+	33168: 65284,
+	33169: 65504,
+	33170: 65505,
+	33171: 65285,
+	33172: 65283,
+	33173: 65286,
+	33174: 65290,
+	33175: 65312,
+	33176: 167,
+	33177: 9734,
+	33178: 9733,
+	33179: 9675,
+	33180: 9679,
+	33181: 9678,
+	33182: 9671,
+	33183: 9670,
+	33184: 9633,
+	33185: 9632,
+	33186: 9651,
+	33187: 9650,
+	33188: 9661,
+	33189: 9660,
+	33190: 8251,
+	33191: 12306,
+	33192: 8594,
+	33193: 8592,
+	33194: 8593,
+	33195: 8595,
+	33196: 12307,
+	33208: 8712,
+	33209: 8715,
+	33210: 8838,
+	33211: 8839,
+	33212: 8834,
+	33213: 8835,
+	33214: 8746,
+	33215: 8745,
+	33224: 8743,
+	33225: 8744,
+	33226: 65506,
+	33227: 8658,
+	33228: 8660,
+	33229: 8704,
+	33230: 8707,
+	33242: 8736,
+	33243: 8869,
+	33244: 8978,
+	33245: 8706,
+	33246: 8711,
+	33247: 8801,
+	33248: 8786,
+	33249: 8810,
+	33250: 8811,
+	33251: 8730,
+	33252: 8765,
+	33253: 8733,
+	33254: 8757,
+	33255: 8747,
+	33256: 8748,
+	33264: 8491,
+	33265: 8240,
+	33266: 9839,
+	33267: 9837,
+	33268: 9834,
+	33269: 8224,
+	33270: 8225,
+	33271: 182,
+	33276: 9711,
+	33359: 65296,
+	33360: 65297,
+	33361: 65298,
+	33362: 65299,
+	33363: 65300,
+	33364: 65301,
+	33365: 65302,
+	33366: 65303,
+	33367: 65304,
+	33368: 65305,
+	33376: 65313,
+	33377: 65314,
+	33378: 65315,
+	33379: 65316,
+	33380: 65317,
+	33381: 65318,
+	33382: 65319,
+	33383: 65320,
+	33384: 65321,
+	33385: 65322,
+	33386: 65323,
+	33387: 65324,
+	33388: 65325,
+	33389: 65326,
+	33390: 65327,
+	33391: 65328,
+	33392: 65329,
+	33393: 65330,
+	33394: 65331,
+	33395: 65332,
+	33396: 65333,
+	33397: 65334,
+	33398: 65335,
+	33399: 65336,
+	33400: 65337,
+	33401: 65338,
+	33409: 65345,
+	33410: 65346,
+	33411: 65347,
+	33412: 65348,
+	33413: 65349,
+	33414: 65350,
+	33415: 65351,
+	33416: 65352,
+	33417: 65353,
+	33418: 65354,
+	33419: 65355,
+	33420: 65356,
+	33421: 65357,
+	33422: 65358,
+	33423: 65359,
+	33424: 65360,
+	33425: 65361,
+	33426: 65362,
+	33427: 65363,
+	33428: 65364,
+	33429: 65365,
+	33430: 65366,
+	33431: 65367,
+	33432: 65368,
+	33433: 65369,
+	33434: 65370,
+	33439: 12353,
+	33440: 12354,
+	33441: 12355,
+	33442: 12356,
+	33443: 12357,
+	33444: 12358,
+	33445: 12359,
+	33446: 12360,
+	33447: 12361,
+	33448: 12362,
+	33449: 12363,
+	33450: 12364,
+	33451: 12365,
+	33452: 12366,
+	33453: 12367,
+	33454: 12368,
+	33455: 12369,
+	33456: 12370,
+	33457: 12371,
+	33458: 12372,
+	33459: 12373,
+	33460: 12374,
+	33461: 12375,
+	33462: 12376,
+	33463: 12377,
+	33464: 12378,
+	33465: 12379,
+	33466: 12380,
+	33467: 12381,
+	33468: 12382,
+	33469: 12383,
+	33470: 12384,
+	33471: 12385,
+	33472: 12386,
+	33473: 12387,
+	33474: 12388,
+	33475: 12389,
+	33476: 12390,
+	33477: 12391,
+	33478: 12392,
+	33479: 12393,
+	33480: 12394,
+	33481: 12395,
+	33482: 12396,
+	33483: 12397,
+	33484: 12398,
+	33485: 12399,
+	33486: 12400,
+	33487: 12401,
+	33488: 12402,
+	33489: 12403,
+	33490: 12404,
+	33491: 12405,
+	33492: 12406,
+	33493: 12407,
+	33494: 12408,
+	33495: 12409,
+	33496: 12410,
+	33497: 12411,
+	33498: 12412,
+	33499: 12413,
+	33500: 12414,
+	33501: 12415,
+	33502: 12416,
+	33503: 12417,
+	33504: 12418,
+	33505: 12419,
+	33506: 12420,
+	33507: 12421,
+	33508: 12422,
+	33509: 12423,
+	33510: 12424,
+	33511: 12425,
+	33512: 12426,
+	33513: 12427,
+	33514: 12428,
+	33515: 12429,
+	33516: 12430,
+	33517: 12431,
+	33518: 12432,
+	33519: 12433,
+	33520: 12434,
+	33521: 12435,
+	33600: 12449,
+	33601: 12450,
+	33602: 12451,
+	33603: 12452,
+	33604: 12453,
+	33605: 12454,
+	33606: 12455,
+	33607: 12456,
+	33608: 12457,
+	33609: 12458,
+	33610: 12459,
+	33611: 12460,
+	33612: 12461,
+	33613: 12462,
+	33614: 12463,
+	33615: 12464,
+	33616: 12465,
+	33617: 12466,
+	33618: 12467,
+	33619: 12468,
+	33620: 12469,
+	33621: 12470,
+	33622: 12471,
+	33623: 12472,
+	33624: 12473,
+	33625: 12474,
+	33626: 12475,
+	33627: 12476,
+	33628: 12477,
+	33629: 12478,
+	33630: 12479,
+	33631: 12480,
+	33632: 12481,
+	33633: 12482,
+	33634: 12483,
+	33635: 12484,
+	33636: 12485,
+	33637: 12486,
+	33638: 12487,
+	33639: 12488,
+	33640: 12489,
+	33641: 12490,
+	33642: 12491,
+	33643: 12492,
+	33644: 12493,
+	33645: 12494,
+	33646: 12495,
+	33647: 12496,
+	33648: 12497,
+	33649: 12498,
+	33650: 12499,
+	33651: 12500,
+	33652: 12501,
+	33653: 12502,
+	33654: 12503,
+	33655: 12504,
+	33656: 12505,
+	33657: 12506,
+	33658: 12507,
+	33659: 12508,
+	33660: 12509,
+	33661: 12510,
+	33662: 12511,
+	33664: 12512,
+	33665: 12513,
+	33666: 12514,
+	33667: 12515,
+	33668: 12516,
+	33669: 12517,
+	33670: 12518,
+	33671: 12519,
+	33672: 12520,
+	33673: 12521,
+	33674: 12522,
+	33675: 12523,
+	33676: 12524,
+	33677: 12525,
+	33678: 12526,
+	33679: 12527,
+	33680: 12528,
+	33681: 12529,
+	33682: 12530,
+	33683: 12531,
+	33684: 12532,
+	33685: 12533,
+	33686: 12534,
+	33695: 913,
+	33696: 914,
+	33697: 915,
+	33698: 916,
+	33699: 917,
+	33700: 918,
+	33701: 919,
+	33702: 920,
+	33703: 921,
+	33704: 922,
+	33705: 923,
+	33706: 924,
+	33707: 925,
+	33708: 926,
+	33709: 927,
+	33710: 928,
+	33711: 929,
+	33712: 931,
+	33713: 932,
+	33714: 933,
+	33715: 934,
+	33716: 935,
+	33717: 936,
+	33718: 937,
+	33727: 945,
+	33728: 946,
+	33729: 947,
+	33730: 948,
+	33731: 949,
+	33732: 950,
+	33733: 951,
+	33734: 952,
+	33735: 953,
+	33736: 954,
+	33737: 955,
+	33738: 956,
+	33739: 957,
+	33740: 958,
+	33741: 959,
+	33742: 960,
+	33743: 961,
+	33744: 963,
+	33745: 964,
+	33746: 965,
+	33747: 966,
+	33748: 967,
+	33749: 968,
+	33750: 969,
+	33856: 1040,
+	33857: 1041,
+	33858: 1042,
+	33859: 1043,
+	33860: 1044,
+	33861: 1045,
+	33862: 1025,
+	33863: 1046,
+	33864: 1047,
+	33865: 1048,
+	33866: 1049,
+	33867: 1050,
+	33868: 1051,
+	33869: 1052,
+	33870: 1053,
+	33871: 1054,
+	33872: 1055,
+	33873: 1056,
+	33874: 1057,
+	33875: 1058,
+	33876: 1059,
+	33877: 1060,
+	33878: 1061,
+	33879: 1062,
+	33880: 1063,
+	33881: 1064,
+	33882: 1065,
+	33883: 1066,
+	33884: 1067,
+	33885: 1068,
+	33886: 1069,
+	33887: 1070,
+	33888: 1071,
+	33904: 1072,
+	33905: 1073,
+	33906: 1074,
+	33907: 1075,
+	33908: 1076,
+	33909: 1077,
+	33910: 1105,
+	33911: 1078,
+	33912: 1079,
+	33913: 1080,
+	33914: 1081,
+	33915: 1082,
+	33916: 1083,
+	33917: 1084,
+	33918: 1085,
+	33920: 1086,
+	33921: 1087,
+	33922: 1088,
+	33923: 1089,
+	33924: 1090,
+	33925: 1091,
+	33926: 1092,
+	33927: 1093,
+	33928: 1094,
+	33929: 1095,
+	33930: 1096,
+	33931: 1097,
+	33932: 1098,
+	33933: 1099,
+	33934: 1100,
+	33935: 1101,
+	33936: 1102,
+	33937: 1103,
+	33951: 9472,
+	33952: 9474,
+	33953: 9484,
+	33954: 9488,
+	33955: 9496,
+	33956: 9492,
+	33957: 9500,
+	33958: 9516,
+	33959: 9508,
+	33960: 9524,
+	33961: 9532,
+	33962: 9473,
+	33963: 9475,
+	33964: 9487,
+	33965: 9491,
+	33966: 9499,
+	33967: 9495,
+	33968: 9507,
+	33969: 9523,
+	33970: 9515,
+	33971: 9531,
+	33972: 9547,
+	33973: 9504,
+	33974: 9519,
+	33975: 9512,
+	33976: 9527,
+	33977: 9535,
+	33978: 9501,
+	33979: 9520,
+	33980: 9509,
+	33981: 9528,
+	33982: 9538,
+	34624: 9312,
+	34625: 9313,
+	34626: 9314,
+	34627: 9315,
+	34628: 9316,
+	34629: 9317,
+	34630: 9318,
+	34631: 9319,
+	34632: 9320,
+	34633: 9321,
+	34634: 9322,
+	34635: 9323,
+	34636: 9324,
+	34637: 9325,
+	34638: 9326,
+	34639: 9327,
+	34640: 9328,
+	34641: 9329,
+	34642: 9330,
+	34643: 9331,
+	34644: 8544,
+	34645: 8545,
+	34646: 8546,
+	34647: 8547,
+	34648: 8548,
+	34649: 8549,
+	34650: 8550,
+	34651: 8551,
+	34652: 8552,
+	34653: 8553,
+	34655: 13129,
+	34656: 13076,
+	34657: 13090,
+	34658: 13133,
+	34659: 13080,
+	34660: 13095,
+	34661: 13059,
+	34662: 13110,
+	34663: 13137,
+	34664: 13143,
+	34665: 13069,
+	34666: 13094,
+	34667: 13091,
+	34668: 13099,
+	34669: 13130,
+	34670: 13115,
+	34671: 13212,
+	34672: 13213,
+	34673: 13214,
+	34674: 13198,
+	34675: 13199,
+	34676: 13252,
+	34677: 13217,
+	34686: 13179,
+	34688: 12317,
+	34689: 12319,
+	34690: 8470,
+	34691: 13261,
+	34692: 8481,
+	34693: 12964,
+	34694: 12965,
+	34695: 12966,
+	34696: 12967,
+	34697: 12968,
+	34698: 12849,
+	34699: 12850,
+	34700: 12857,
+	34701: 13182,
+	34702: 13181,
+	34703: 13180,
+	34704: 8786,
+	34705: 8801,
+	34706: 8747,
+	34707: 8750,
+	34708: 8721,
+	34709: 8730,
+	34710: 8869,
+	34711: 8736,
+	34712: 8735,
+	34713: 8895,
+	34714: 8757,
+	34715: 8745,
+	34716: 8746,
+	34975: 20124,
+	34976: 21782,
+	34977: 23043,
+	34978: 38463,
+	34979: 21696,
+	34980: 24859,
+	34981: 25384,
+	34982: 23030,
+	34983: 36898,
+	34984: 33909,
+	34985: 33564,
+	34986: 31312,
+	34987: 24746,
+	34988: 25569,
+	34989: 28197,
+	34990: 26093,
+	34991: 33894,
+	34992: 33446,
+	34993: 39925,
+	34994: 26771,
+	34995: 22311,
+	34996: 26017,
+	34997: 25201,
+	34998: 23451,
+	34999: 22992,
+	35000: 34427,
+	35001: 39156,
+	35002: 32098,
+	35003: 32190,
+	35004: 39822,
+	35005: 25110,
+	35006: 31903,
+	35007: 34999,
+	35008: 23433,
+	35009: 24245,
+	35010: 25353,
+	35011: 26263,
+	35012: 26696,
+	35013: 38343,
+	35014: 38797,
+	35015: 26447,
+	35016: 20197,
+	35017: 20234,
+	35018: 20301,
+	35019: 20381,
+	35020: 20553,
+	35021: 22258,
+	35022: 22839,
+	35023: 22996,
+	35024: 23041,
+	35025: 23561,
+	35026: 24799,
+	35027: 24847,
+	35028: 24944,
+	35029: 26131,
+	35030: 26885,
+	35031: 28858,
+	35032: 30031,
+	35033: 30064,
+	35034: 31227,
+	35035: 32173,
+	35036: 32239,
+	35037: 32963,
+	35038: 33806,
+	35039: 34915,
+	35040: 35586,
+	35041: 36949,
+	35042: 36986,
+	35043: 21307,
+	35044: 20117,
+	35045: 20133,
+	35046: 22495,
+	35047: 32946,
+	35048: 37057,
+	35049: 30959,
+	35050: 19968,
+	35051: 22769,
+	35052: 28322,
+	35053: 36920,
+	35054: 31282,
+	35055: 33576,
+	35056: 33419,
+	35057: 39983,
+	35058: 20801,
+	35059: 21360,
+	35060: 21693,
+	35061: 21729,
+	35062: 22240,
+	35063: 23035,
+	35064: 24341,
+	35065: 39154,
+	35066: 28139,
+	35067: 32996,
+	35068: 34093,
+	35136: 38498,
+	35137: 38512,
+	35138: 38560,
+	35139: 38907,
+	35140: 21515,
+	35141: 21491,
+	35142: 23431,
+	35143: 28879,
+	35144: 32701,
+	35145: 36802,
+	35146: 38632,
+	35147: 21359,
+	35148: 40284,
+	35149: 31418,
+	35150: 19985,
+	35151: 30867,
+	35152: 33276,
+	35153: 28198,
+	35154: 22040,
+	35155: 21764,
+	35156: 27421,
+	35157: 34074,
+	35158: 39995,
+	35159: 23013,
+	35160: 21417,
+	35161: 28006,
+	35162: 29916,
+	35163: 38287,
+	35164: 22082,
+	35165: 20113,
+	35166: 36939,
+	35167: 38642,
+	35168: 33615,
+	35169: 39180,
+	35170: 21473,
+	35171: 21942,
+	35172: 23344,
+	35173: 24433,
+	35174: 26144,
+	35175: 26355,
+	35176: 26628,
+	35177: 27704,
+	35178: 27891,
+	35179: 27945,
+	35180: 29787,
+	35181: 30408,
+	35182: 31310,
+	35183: 38964,
+	35184: 33521,
+	35185: 34907,
+	35186: 35424,
+	35187: 37613,
+	35188: 28082,
+	35189: 30123,
+	35190: 30410,
+	35191: 39365,
+	35192: 24742,
+	35193: 35585,
+	35194: 36234,
+	35195: 38322,
+	35196: 27022,
+	35197: 21421,
+	35198: 20870,
+	35200: 22290,
+	35201: 22576,
+	35202: 22852,
+	35203: 23476,
+	35204: 24310,
+	35205: 24616,
+	35206: 25513,
+	35207: 25588,
+	35208: 27839,
+	35209: 28436,
+	35210: 28814,
+	35211: 28948,
+	35212: 29017,
+	35213: 29141,
+	35214: 29503,
+	35215: 32257,
+	35216: 33398,
+	35217: 33489,
+	35218: 34199,
+	35219: 36960,
+	35220: 37467,
+	35221: 40219,
+	35222: 22633,
+	35223: 26044,
+	35224: 27738,
+	35225: 29989,
+	35226: 20985,
+	35227: 22830,
+	35228: 22885,
+	35229: 24448,
+	35230: 24540,
+	35231: 25276,
+	35232: 26106,
+	35233: 27178,
+	35234: 27431,
+	35235: 27572,
+	35236: 29579,
+	35237: 32705,
+	35238: 35158,
+	35239: 40236,
+	35240: 40206,
+	35241: 40644,
+	35242: 23713,
+	35243: 27798,
+	35244: 33659,
+	35245: 20740,
+	35246: 23627,
+	35247: 25014,
+	35248: 33222,
+	35249: 26742,
+	35250: 29281,
+	35251: 20057,
+	35252: 20474,
+	35253: 21368,
+	35254: 24681,
+	35255: 28201,
+	35256: 31311,
+	35257: 38899,
+	35258: 19979,
+	35259: 21270,
+	35260: 20206,
+	35261: 20309,
+	35262: 20285,
+	35263: 20385,
+	35264: 20339,
+	35265: 21152,
+	35266: 21487,
+	35267: 22025,
+	35268: 22799,
+	35269: 23233,
+	35270: 23478,
+	35271: 23521,
+	35272: 31185,
+	35273: 26247,
+	35274: 26524,
+	35275: 26550,
+	35276: 27468,
+	35277: 27827,
+	35278: 28779,
+	35279: 29634,
+	35280: 31117,
+	35281: 31166,
+	35282: 31292,
+	35283: 31623,
+	35284: 33457,
+	35285: 33499,
+	35286: 33540,
+	35287: 33655,
+	35288: 33775,
+	35289: 33747,
+	35290: 34662,
+	35291: 35506,
+	35292: 22057,
+	35293: 36008,
+	35294: 36838,
+	35295: 36942,
+	35296: 38686,
+	35297: 34442,
+	35298: 20420,
+	35299: 23784,
+	35300: 25105,
+	35301: 29273,
+	35302: 30011,
+	35303: 33253,
+	35304: 33469,
+	35305: 34558,
+	35306: 36032,
+	35307: 38597,
+	35308: 39187,
+	35309: 39381,
+	35310: 20171,
+	35311: 20250,
+	35312: 35299,
+	35313: 22238,
+	35314: 22602,
+	35315: 22730,
+	35316: 24315,
+	35317: 24555,
+	35318: 24618,
+	35319: 24724,
+	35320: 24674,
+	35321: 25040,
+	35322: 25106,
+	35323: 25296,
+	35324: 25913,
+	35392: 39745,
+	35393: 26214,
+	35394: 26800,
+	35395: 28023,
+	35396: 28784,
+	35397: 30028,
+	35398: 30342,
+	35399: 32117,
+	35400: 33445,
+	35401: 34809,
+	35402: 38283,
+	35403: 38542,
+	35404: 35997,
+	35405: 20977,
+	35406: 21182,
+	35407: 22806,
+	35408: 21683,
+	35409: 23475,
+	35410: 23830,
+	35411: 24936,
+	35412: 27010,
+	35413: 28079,
+	35414: 30861,
+	35415: 33995,
+	35416: 34903,
+	35417: 35442,
+	35418: 37799,
+	35419: 39608,
+	35420: 28012,
+	35421: 39336,
+	35422: 34521,
+	35423: 22435,
+	35424: 26623,
+	35425: 34510,
+	35426: 37390,
+	35427: 21123,
+	35428: 22151,
+	35429: 21508,
+	35430: 24275,
+	35431: 25313,
+	35432: 25785,
+	35433: 26684,
+	35434: 26680,
+	35435: 27579,
+	35436: 29554,
+	35437: 30906,
+	35438: 31339,
+	35439: 35226,
+	35440: 35282,
+	35441: 36203,
+	35442: 36611,
+	35443: 37101,
+	35444: 38307,
+	35445: 38548,
+	35446: 38761,
+	35447: 23398,
+	35448: 23731,
+	35449: 27005,
+	35450: 38989,
+	35451: 38990,
+	35452: 25499,
+	35453: 31520,
+	35454: 27179,
+	35456: 27263,
+	35457: 26806,
+	35458: 39949,
+	35459: 28511,
+	35460: 21106,
+	35461: 21917,
+	35462: 24688,
+	35463: 25324,
+	35464: 27963,
+	35465: 28167,
+	35466: 28369,
+	35467: 33883,
+	35468: 35088,
+	35469: 36676,
+	35470: 19988,
+	35471: 39993,
+	35472: 21494,
+	35473: 26907,
+	35474: 27194,
+	35475: 38788,
+	35476: 26666,
+	35477: 20828,
+	35478: 31427,
+	35479: 33970,
+	35480: 37340,
+	35481: 37772,
+	35482: 22107,
+	35483: 40232,
+	35484: 26658,
+	35485: 33541,
+	35486: 33841,
+	35487: 31909,
+	35488: 21000,
+	35489: 33477,
+	35490: 29926,
+	35491: 20094,
+	35492: 20355,
+	35493: 20896,
+	35494: 23506,
+	35495: 21002,
+	35496: 21208,
+	35497: 21223,
+	35498: 24059,
+	35499: 21914,
+	35500: 22570,
+	35501: 23014,
+	35502: 23436,
+	35503: 23448,
+	35504: 23515,
+	35505: 24178,
+	35506: 24185,
+	35507: 24739,
+	35508: 24863,
+	35509: 24931,
+	35510: 25022,
+	35511: 25563,
+	35512: 25954,
+	35513: 26577,
+	35514: 26707,
+	35515: 26874,
+	35516: 27454,
+	35517: 27475,
+	35518: 27735,
+	35519: 28450,
+	35520: 28567,
+	35521: 28485,
+	35522: 29872,
+	35523: 29976,
+	35524: 30435,
+	35525: 30475,
+	35526: 31487,
+	35527: 31649,
+	35528: 31777,
+	35529: 32233,
+	35530: 32566,
+	35531: 32752,
+	35532: 32925,
+	35533: 33382,
+	35534: 33694,
+	35535: 35251,
+	35536: 35532,
+	35537: 36011,
+	35538: 36996,
+	35539: 37969,
+	35540: 38291,
+	35541: 38289,
+	35542: 38306,
+	35543: 38501,
+	35544: 38867,
+	35545: 39208,
+	35546: 33304,
+	35547: 20024,
+	35548: 21547,
+	35549: 23736,
+	35550: 24012,
+	35551: 29609,
+	35552: 30284,
+	35553: 30524,
+	35554: 23721,
+	35555: 32747,
+	35556: 36107,
+	35557: 38593,
+	35558: 38929,
+	35559: 38996,
+	35560: 39000,
+	35561: 20225,
+	35562: 20238,
+	35563: 21361,
+	35564: 21916,
+	35565: 22120,
+	35566: 22522,
+	35567: 22855,
+	35568: 23305,
+	35569: 23492,
+	35570: 23696,
+	35571: 24076,
+	35572: 24190,
+	35573: 24524,
+	35574: 25582,
+	35575: 26426,
+	35576: 26071,
+	35577: 26082,
+	35578: 26399,
+	35579: 26827,
+	35580: 26820,
+	35648: 27231,
+	35649: 24112,
+	35650: 27589,
+	35651: 27671,
+	35652: 27773,
+	35653: 30079,
+	35654: 31048,
+	35655: 23395,
+	35656: 31232,
+	35657: 32000,
+	35658: 24509,
+	35659: 35215,
+	35660: 35352,
+	35661: 36020,
+	35662: 36215,
+	35663: 36556,
+	35664: 36637,
+	35665: 39138,
+	35666: 39438,
+	35667: 39740,
+	35668: 20096,
+	35669: 20605,
+	35670: 20736,
+	35671: 22931,
+	35672: 23452,
+	35673: 25135,
+	35674: 25216,
+	35675: 25836,
+	35676: 27450,
+	35677: 29344,
+	35678: 30097,
+	35679: 31047,
+	35680: 32681,
+	35681: 34811,
+	35682: 35516,
+	35683: 35696,
+	35684: 25516,
+	35685: 33738,
+	35686: 38816,
+	35687: 21513,
+	35688: 21507,
+	35689: 21931,
+	35690: 26708,
+	35691: 27224,
+	35692: 35440,
+	35693: 30759,
+	35694: 26485,
+	35695: 40653,
+	35696: 21364,
+	35697: 23458,
+	35698: 33050,
+	35699: 34384,
+	35700: 36870,
+	35701: 19992,
+	35702: 20037,
+	35703: 20167,
+	35704: 20241,
+	35705: 21450,
+	35706: 21560,
+	35707: 23470,
+	35708: 24339,
+	35709: 24613,
+	35710: 25937,
+	35712: 26429,
+	35713: 27714,
+	35714: 27762,
+	35715: 27875,
+	35716: 28792,
+	35717: 29699,
+	35718: 31350,
+	35719: 31406,
+	35720: 31496,
+	35721: 32026,
+	35722: 31998,
+	35723: 32102,
+	35724: 26087,
+	35725: 29275,
+	35726: 21435,
+	35727: 23621,
+	35728: 24040,
+	35729: 25298,
+	35730: 25312,
+	35731: 25369,
+	35732: 28192,
+	35733: 34394,
+	35734: 35377,
+	35735: 36317,
+	35736: 37624,
+	35737: 28417,
+	35738: 31142,
+	35739: 39770,
+	35740: 20136,
+	35741: 20139,
+	35742: 20140,
+	35743: 20379,
+	35744: 20384,
+	35745: 20689,
+	35746: 20807,
+	35747: 31478,
+	35748: 20849,
+	35749: 20982,
+	35750: 21332,
+	35751: 21281,
+	35752: 21375,
+	35753: 21483,
+	35754: 21932,
+	35755: 22659,
+	35756: 23777,
+	35757: 24375,
+	35758: 24394,
+	35759: 24623,
+	35760: 24656,
+	35761: 24685,
+	35762: 25375,
+	35763: 25945,
+	35764: 27211,
+	35765: 27841,
+	35766: 29378,
+	35767: 29421,
+	35768: 30703,
+	35769: 33016,
+	35770: 33029,
+	35771: 33288,
+	35772: 34126,
+	35773: 37111,
+	35774: 37857,
+	35775: 38911,
+	35776: 39255,
+	35777: 39514,
+	35778: 20208,
+	35779: 20957,
+	35780: 23597,
+	35781: 26241,
+	35782: 26989,
+	35783: 23616,
+	35784: 26354,
+	35785: 26997,
+	35786: 29577,
+	35787: 26704,
+	35788: 31873,
+	35789: 20677,
+	35790: 21220,
+	35791: 22343,
+	35792: 24062,
+	35793: 37670,
+	35794: 26020,
+	35795: 27427,
+	35796: 27453,
+	35797: 29748,
+	35798: 31105,
+	35799: 31165,
+	35800: 31563,
+	35801: 32202,
+	35802: 33465,
+	35803: 33740,
+	35804: 34943,
+	35805: 35167,
+	35806: 35641,
+	35807: 36817,
+	35808: 37329,
+	35809: 21535,
+	35810: 37504,
+	35811: 20061,
+	35812: 20534,
+	35813: 21477,
+	35814: 21306,
+	35815: 29399,
+	35816: 29590,
+	35817: 30697,
+	35818: 33510,
+	35819: 36527,
+	35820: 39366,
+	35821: 39368,
+	35822: 39378,
+	35823: 20855,
+	35824: 24858,
+	35825: 34398,
+	35826: 21936,
+	35827: 31354,
+	35828: 20598,
+	35829: 23507,
+	35830: 36935,
+	35831: 38533,
+	35832: 20018,
+	35833: 27355,
+	35834: 37351,
+	35835: 23633,
+	35836: 23624,
+	35904: 25496,
+	35905: 31391,
+	35906: 27795,
+	35907: 38772,
+	35908: 36705,
+	35909: 31402,
+	35910: 29066,
+	35911: 38536,
+	35912: 31874,
+	35913: 26647,
+	35914: 32368,
+	35915: 26705,
+	35916: 37740,
+	35917: 21234,
+	35918: 21531,
+	35919: 34219,
+	35920: 35347,
+	35921: 32676,
+	35922: 36557,
+	35923: 37089,
+	35924: 21350,
+	35925: 34952,
+	35926: 31041,
+	35927: 20418,
+	35928: 20670,
+	35929: 21009,
+	35930: 20804,
+	35931: 21843,
+	35932: 22317,
+	35933: 29674,
+	35934: 22411,
+	35935: 22865,
+	35936: 24418,
+	35937: 24452,
+	35938: 24693,
+	35939: 24950,
+	35940: 24935,
+	35941: 25001,
+	35942: 25522,
+	35943: 25658,
+	35944: 25964,
+	35945: 26223,
+	35946: 26690,
+	35947: 28179,
+	35948: 30054,
+	35949: 31293,
+	35950: 31995,
+	35951: 32076,
+	35952: 32153,
+	35953: 32331,
+	35954: 32619,
+	35955: 33550,
+	35956: 33610,
+	35957: 34509,
+	35958: 35336,
+	35959: 35427,
+	35960: 35686,
+	35961: 36605,
+	35962: 38938,
+	35963: 40335,
+	35964: 33464,
+	35965: 36814,
+	35966: 39912,
+	35968: 21127,
+	35969: 25119,
+	35970: 25731,
+	35971: 28608,
+	35972: 38553,
+	35973: 26689,
+	35974: 20625,
+	35975: 27424,
+	35976: 27770,
+	35977: 28500,
+	35978: 31348,
+	35979: 32080,
+	35980: 34880,
+	35981: 35363,
+	35982: 26376,
+	35983: 20214,
+	35984: 20537,
+	35985: 20518,
+	35986: 20581,
+	35987: 20860,
+	35988: 21048,
+	35989: 21091,
+	35990: 21927,
+	35991: 22287,
+	35992: 22533,
+	35993: 23244,
+	35994: 24314,
+	35995: 25010,
+	35996: 25080,
+	35997: 25331,
+	35998: 25458,
+	35999: 26908,
+	36000: 27177,
+	36001: 29309,
+	36002: 29356,
+	36003: 29486,
+	36004: 30740,
+	36005: 30831,
+	36006: 32121,
+	36007: 30476,
+	36008: 32937,
+	36009: 35211,
+	36010: 35609,
+	36011: 36066,
+	36012: 36562,
+	36013: 36963,
+	36014: 37749,
+	36015: 38522,
+	36016: 38997,
+	36017: 39443,
+	36018: 40568,
+	36019: 20803,
+	36020: 21407,
+	36021: 21427,
+	36022: 24187,
+	36023: 24358,
+	36024: 28187,
+	36025: 28304,
+	36026: 29572,
+	36027: 29694,
+	36028: 32067,
+	36029: 33335,
+	36030: 35328,
+	36031: 35578,
+	36032: 38480,
+	36033: 20046,
+	36034: 20491,
+	36035: 21476,
+	36036: 21628,
+	36037: 22266,
+	36038: 22993,
+	36039: 23396,
+	36040: 24049,
+	36041: 24235,
+	36042: 24359,
+	36043: 25144,
+	36044: 25925,
+	36045: 26543,
+	36046: 28246,
+	36047: 29392,
+	36048: 31946,
+	36049: 34996,
+	36050: 32929,
+	36051: 32993,
+	36052: 33776,
+	36053: 34382,
+	36054: 35463,
+	36055: 36328,
+	36056: 37431,
+	36057: 38599,
+	36058: 39015,
+	36059: 40723,
+	36060: 20116,
+	36061: 20114,
+	36062: 20237,
+	36063: 21320,
+	36064: 21577,
+	36065: 21566,
+	36066: 23087,
+	36067: 24460,
+	36068: 24481,
+	36069: 24735,
+	36070: 26791,
+	36071: 27278,
+	36072: 29786,
+	36073: 30849,
+	36074: 35486,
+	36075: 35492,
+	36076: 35703,
+	36077: 37264,
+	36078: 20062,
+	36079: 39881,
+	36080: 20132,
+	36081: 20348,
+	36082: 20399,
+	36083: 20505,
+	36084: 20502,
+	36085: 20809,
+	36086: 20844,
+	36087: 21151,
+	36088: 21177,
+	36089: 21246,
+	36090: 21402,
+	36091: 21475,
+	36092: 21521,
+	36160: 21518,
+	36161: 21897,
+	36162: 22353,
+	36163: 22434,
+	36164: 22909,
+	36165: 23380,
+	36166: 23389,
+	36167: 23439,
+	36168: 24037,
+	36169: 24039,
+	36170: 24055,
+	36171: 24184,
+	36172: 24195,
+	36173: 24218,
+	36174: 24247,
+	36175: 24344,
+	36176: 24658,
+	36177: 24908,
+	36178: 25239,
+	36179: 25304,
+	36180: 25511,
+	36181: 25915,
+	36182: 26114,
+	36183: 26179,
+	36184: 26356,
+	36185: 26477,
+	36186: 26657,
+	36187: 26775,
+	36188: 27083,
+	36189: 27743,
+	36190: 27946,
+	36191: 28009,
+	36192: 28207,
+	36193: 28317,
+	36194: 30002,
+	36195: 30343,
+	36196: 30828,
+	36197: 31295,
+	36198: 31968,
+	36199: 32005,
+	36200: 32024,
+	36201: 32094,
+	36202: 32177,
+	36203: 32789,
+	36204: 32771,
+	36205: 32943,
+	36206: 32945,
+	36207: 33108,
+	36208: 33167,
+	36209: 33322,
+	36210: 33618,
+	36211: 34892,
+	36212: 34913,
+	36213: 35611,
+	36214: 36002,
+	36215: 36092,
+	36216: 37066,
+	36217: 37237,
+	36218: 37489,
+	36219: 30783,
+	36220: 37628,
+	36221: 38308,
+	36222: 38477,
+	36224: 38917,
+	36225: 39321,
+	36226: 39640,
+	36227: 40251,
+	36228: 21083,
+	36229: 21163,
+	36230: 21495,
+	36231: 21512,
+	36232: 22741,
+	36233: 25335,
+	36234: 28640,
+	36235: 35946,
+	36236: 36703,
+	36237: 40633,
+	36238: 20811,
+	36239: 21051,
+	36240: 21578,
+	36241: 22269,
+	36242: 31296,
+	36243: 37239,
+	36244: 40288,
+	36245: 40658,
+	36246: 29508,
+	36247: 28425,
+	36248: 33136,
+	36249: 29969,
+	36250: 24573,
+	36251: 24794,
+	36252: 39592,
+	36253: 29403,
+	36254: 36796,
+	36255: 27492,
+	36256: 38915,
+	36257: 20170,
+	36258: 22256,
+	36259: 22372,
+	36260: 22718,
+	36261: 23130,
+	36262: 24680,
+	36263: 25031,
+	36264: 26127,
+	36265: 26118,
+	36266: 26681,
+	36267: 26801,
+	36268: 28151,
+	36269: 30165,
+	36270: 32058,
+	36271: 33390,
+	36272: 39746,
+	36273: 20123,
+	36274: 20304,
+	36275: 21449,
+	36276: 21766,
+	36277: 23919,
+	36278: 24038,
+	36279: 24046,
+	36280: 26619,
+	36281: 27801,
+	36282: 29811,
+	36283: 30722,
+	36284: 35408,
+	36285: 37782,
+	36286: 35039,
+	36287: 22352,
+	36288: 24231,
+	36289: 25387,
+	36290: 20661,
+	36291: 20652,
+	36292: 20877,
+	36293: 26368,
+	36294: 21705,
+	36295: 22622,
+	36296: 22971,
+	36297: 23472,
+	36298: 24425,
+	36299: 25165,
+	36300: 25505,
+	36301: 26685,
+	36302: 27507,
+	36303: 28168,
+	36304: 28797,
+	36305: 37319,
+	36306: 29312,
+	36307: 30741,
+	36308: 30758,
+	36309: 31085,
+	36310: 25998,
+	36311: 32048,
+	36312: 33756,
+	36313: 35009,
+	36314: 36617,
+	36315: 38555,
+	36316: 21092,
+	36317: 22312,
+	36318: 26448,
+	36319: 32618,
+	36320: 36001,
+	36321: 20916,
+	36322: 22338,
+	36323: 38442,
+	36324: 22586,
+	36325: 27018,
+	36326: 32948,
+	36327: 21682,
+	36328: 23822,
+	36329: 22524,
+	36330: 30869,
+	36331: 40442,
+	36332: 20316,
+	36333: 21066,
+	36334: 21643,
+	36335: 25662,
+	36336: 26152,
+	36337: 26388,
+	36338: 26613,
+	36339: 31364,
+	36340: 31574,
+	36341: 32034,
+	36342: 37679,
+	36343: 26716,
+	36344: 39853,
+	36345: 31545,
+	36346: 21273,
+	36347: 20874,
+	36348: 21047,
+	36416: 23519,
+	36417: 25334,
+	36418: 25774,
+	36419: 25830,
+	36420: 26413,
+	36421: 27578,
+	36422: 34217,
+	36423: 38609,
+	36424: 30352,
+	36425: 39894,
+	36426: 25420,
+	36427: 37638,
+	36428: 39851,
+	36429: 30399,
+	36430: 26194,
+	36431: 19977,
+	36432: 20632,
+	36433: 21442,
+	36434: 23665,
+	36435: 24808,
+	36436: 25746,
+	36437: 25955,
+	36438: 26719,
+	36439: 29158,
+	36440: 29642,
+	36441: 29987,
+	36442: 31639,
+	36443: 32386,
+	36444: 34453,
+	36445: 35715,
+	36446: 36059,
+	36447: 37240,
+	36448: 39184,
+	36449: 26028,
+	36450: 26283,
+	36451: 27531,
+	36452: 20181,
+	36453: 20180,
+	36454: 20282,
+	36455: 20351,
+	36456: 21050,
+	36457: 21496,
+	36458: 21490,
+	36459: 21987,
+	36460: 22235,
+	36461: 22763,
+	36462: 22987,
+	36463: 22985,
+	36464: 23039,
+	36465: 23376,
+	36466: 23629,
+	36467: 24066,
+	36468: 24107,
+	36469: 24535,
+	36470: 24605,
+	36471: 25351,
+	36472: 25903,
+	36473: 23388,
+	36474: 26031,
+	36475: 26045,
+	36476: 26088,
+	36477: 26525,
+	36478: 27490,
+	36480: 27515,
+	36481: 27663,
+	36482: 29509,
+	36483: 31049,
+	36484: 31169,
+	36485: 31992,
+	36486: 32025,
+	36487: 32043,
+	36488: 32930,
+	36489: 33026,
+	36490: 33267,
+	36491: 35222,
+	36492: 35422,
+	36493: 35433,
+	36494: 35430,
+	36495: 35468,
+	36496: 35566,
+	36497: 36039,
+	36498: 36060,
+	36499: 38604,
+	36500: 39164,
+	36501: 27503,
+	36502: 20107,
+	36503: 20284,
+	36504: 20365,
+	36505: 20816,
+	36506: 23383,
+	36507: 23546,
+	36508: 24904,
+	36509: 25345,
+	36510: 26178,
+	36511: 27425,
+	36512: 28363,
+	36513: 27835,
+	36514: 29246,
+	36515: 29885,
+	36516: 30164,
+	36517: 30913,
+	36518: 31034,
+	36519: 32780,
+	36520: 32819,
+	36521: 33258,
+	36522: 33940,
+	36523: 36766,
+	36524: 27728,
+	36525: 40575,
+	36526: 24335,
+	36527: 35672,
+	36528: 40235,
+	36529: 31482,
+	36530: 36600,
+	36531: 23437,
+	36532: 38635,
+	36533: 19971,
+	36534: 21489,
+	36535: 22519,
+	36536: 22833,
+	36537: 23241,
+	36538: 23460,
+	36539: 24713,
+	36540: 28287,
+	36541: 28422,
+	36542: 30142,
+	36543: 36074,
+	36544: 23455,
+	36545: 34048,
+	36546: 31712,
+	36547: 20594,
+	36548: 26612,
+	36549: 33437,
+	36550: 23649,
+	36551: 34122,
+	36552: 32286,
+	36553: 33294,
+	36554: 20889,
+	36555: 23556,
+	36556: 25448,
+	36557: 36198,
+	36558: 26012,
+	36559: 29038,
+	36560: 31038,
+	36561: 32023,
+	36562: 32773,
+	36563: 35613,
+	36564: 36554,
+	36565: 36974,
+	36566: 34503,
+	36567: 37034,
+	36568: 20511,
+	36569: 21242,
+	36570: 23610,
+	36571: 26451,
+	36572: 28796,
+	36573: 29237,
+	36574: 37196,
+	36575: 37320,
+	36576: 37675,
+	36577: 33509,
+	36578: 23490,
+	36579: 24369,
+	36580: 24825,
+	36581: 20027,
+	36582: 21462,
+	36583: 23432,
+	36584: 25163,
+	36585: 26417,
+	36586: 27530,
+	36587: 29417,
+	36588: 29664,
+	36589: 31278,
+	36590: 33131,
+	36591: 36259,
+	36592: 37202,
+	36593: 39318,
+	36594: 20754,
+	36595: 21463,
+	36596: 21610,
+	36597: 23551,
+	36598: 25480,
+	36599: 27193,
+	36600: 32172,
+	36601: 38656,
+	36602: 22234,
+	36603: 21454,
+	36604: 21608,
+	36672: 23447,
+	36673: 23601,
+	36674: 24030,
+	36675: 20462,
+	36676: 24833,
+	36677: 25342,
+	36678: 27954,
+	36679: 31168,
+	36680: 31179,
+	36681: 32066,
+	36682: 32333,
+	36683: 32722,
+	36684: 33261,
+	36685: 33311,
+	36686: 33936,
+	36687: 34886,
+	36688: 35186,
+	36689: 35728,
+	36690: 36468,
+	36691: 36655,
+	36692: 36913,
+	36693: 37195,
+	36694: 37228,
+	36695: 38598,
+	36696: 37276,
+	36697: 20160,
+	36698: 20303,
+	36699: 20805,
+	36700: 21313,
+	36701: 24467,
+	36702: 25102,
+	36703: 26580,
+	36704: 27713,
+	36705: 28171,
+	36706: 29539,
+	36707: 32294,
+	36708: 37325,
+	36709: 37507,
+	36710: 21460,
+	36711: 22809,
+	36712: 23487,
+	36713: 28113,
+	36714: 31069,
+	36715: 32302,
+	36716: 31899,
+	36717: 22654,
+	36718: 29087,
+	36719: 20986,
+	36720: 34899,
+	36721: 36848,
+	36722: 20426,
+	36723: 23803,
+	36724: 26149,
+	36725: 30636,
+	36726: 31459,
+	36727: 33308,
+	36728: 39423,
+	36729: 20934,
+	36730: 24490,
+	36731: 26092,
+	36732: 26991,
+	36733: 27529,
+	36734: 28147,
+	36736: 28310,
+	36737: 28516,
+	36738: 30462,
+	36739: 32020,
+	36740: 24033,
+	36741: 36981,
+	36742: 37255,
+	36743: 38918,
+	36744: 20966,
+	36745: 21021,
+	36746: 25152,
+	36747: 26257,
+	36748: 26329,
+	36749: 28186,
+	36750: 24246,
+	36751: 32210,
+	36752: 32626,
+	36753: 26360,
+	36754: 34223,
+	36755: 34295,
+	36756: 35576,
+	36757: 21161,
+	36758: 21465,
+	36759: 22899,
+	36760: 24207,
+	36761: 24464,
+	36762: 24661,
+	36763: 37604,
+	36764: 38500,
+	36765: 20663,
+	36766: 20767,
+	36767: 21213,
+	36768: 21280,
+	36769: 21319,
+	36770: 21484,
+	36771: 21736,
+	36772: 21830,
+	36773: 21809,
+	36774: 22039,
+	36775: 22888,
+	36776: 22974,
+	36777: 23100,
+	36778: 23477,
+	36779: 23558,
+	36780: 23567,
+	36781: 23569,
+	36782: 23578,
+	36783: 24196,
+	36784: 24202,
+	36785: 24288,
+	36786: 24432,
+	36787: 25215,
+	36788: 25220,
+	36789: 25307,
+	36790: 25484,
+	36791: 25463,
+	36792: 26119,
+	36793: 26124,
+	36794: 26157,
+	36795: 26230,
+	36796: 26494,
+	36797: 26786,
+	36798: 27167,
+	36799: 27189,
+	36800: 27836,
+	36801: 28040,
+	36802: 28169,
+	36803: 28248,
+	36804: 28988,
+	36805: 28966,
+	36806: 29031,
+	36807: 30151,
+	36808: 30465,
+	36809: 30813,
+	36810: 30977,
+	36811: 31077,
+	36812: 31216,
+	36813: 31456,
+	36814: 31505,
+	36815: 31911,
+	36816: 32057,
+	36817: 32918,
+	36818: 33750,
+	36819: 33931,
+	36820: 34121,
+	36821: 34909,
+	36822: 35059,
+	36823: 35359,
+	36824: 35388,
+	36825: 35412,
+	36826: 35443,
+	36827: 35937,
+	36828: 36062,
+	36829: 37284,
+	36830: 37478,
+	36831: 37758,
+	36832: 37912,
+	36833: 38556,
+	36834: 38808,
+	36835: 19978,
+	36836: 19976,
+	36837: 19998,
+	36838: 20055,
+	36839: 20887,
+	36840: 21104,
+	36841: 22478,
+	36842: 22580,
+	36843: 22732,
+	36844: 23330,
+	36845: 24120,
+	36846: 24773,
+	36847: 25854,
+	36848: 26465,
+	36849: 26454,
+	36850: 27972,
+	36851: 29366,
+	36852: 30067,
+	36853: 31331,
+	36854: 33976,
+	36855: 35698,
+	36856: 37304,
+	36857: 37664,
+	36858: 22065,
+	36859: 22516,
+	36860: 39166,
+	36928: 25325,
+	36929: 26893,
+	36930: 27542,
+	36931: 29165,
+	36932: 32340,
+	36933: 32887,
+	36934: 33394,
+	36935: 35302,
+	36936: 39135,
+	36937: 34645,
+	36938: 36785,
+	36939: 23611,
+	36940: 20280,
+	36941: 20449,
+	36942: 20405,
+	36943: 21767,
+	36944: 23072,
+	36945: 23517,
+	36946: 23529,
+	36947: 24515,
+	36948: 24910,
+	36949: 25391,
+	36950: 26032,
+	36951: 26187,
+	36952: 26862,
+	36953: 27035,
+	36954: 28024,
+	36955: 28145,
+	36956: 30003,
+	36957: 30137,
+	36958: 30495,
+	36959: 31070,
+	36960: 31206,
+	36961: 32051,
+	36962: 33251,
+	36963: 33455,
+	36964: 34218,
+	36965: 35242,
+	36966: 35386,
+	36967: 36523,
+	36968: 36763,
+	36969: 36914,
+	36970: 37341,
+	36971: 38663,
+	36972: 20154,
+	36973: 20161,
+	36974: 20995,
+	36975: 22645,
+	36976: 22764,
+	36977: 23563,
+	36978: 29978,
+	36979: 23613,
+	36980: 33102,
+	36981: 35338,
+	36982: 36805,
+	36983: 38499,
+	36984: 38765,
+	36985: 31525,
+	36986: 35535,
+	36987: 38920,
+	36988: 37218,
+	36989: 22259,
+	36990: 21416,
+	36992: 36887,
+	36993: 21561,
+	36994: 22402,
+	36995: 24101,
+	36996: 25512,
+	36997: 27700,
+	36998: 28810,
+	36999: 30561,
+	37000: 31883,
+	37001: 32736,
+	37002: 34928,
+	37003: 36930,
+	37004: 37204,
+	37005: 37648,
+	37006: 37656,
+	37007: 38543,
+	37008: 29790,
+	37009: 39620,
+	37010: 23815,
+	37011: 23913,
+	37012: 25968,
+	37013: 26530,
+	37014: 36264,
+	37015: 38619,
+	37016: 25454,
+	37017: 26441,
+	37018: 26905,
+	37019: 33733,
+	37020: 38935,
+	37021: 38592,
+	37022: 35070,
+	37023: 28548,
+	37024: 25722,
+	37025: 23544,
+	37026: 19990,
+	37027: 28716,
+	37028: 30045,
+	37029: 26159,
+	37030: 20932,
+	37031: 21046,
+	37032: 21218,
+	37033: 22995,
+	37034: 24449,
+	37035: 24615,
+	37036: 25104,
+	37037: 25919,
+	37038: 25972,
+	37039: 26143,
+	37040: 26228,
+	37041: 26866,
+	37042: 26646,
+	37043: 27491,
+	37044: 28165,
+	37045: 29298,
+	37046: 29983,
+	37047: 30427,
+	37048: 31934,
+	37049: 32854,
+	37050: 22768,
+	37051: 35069,
+	37052: 35199,
+	37053: 35488,
+	37054: 35475,
+	37055: 35531,
+	37056: 36893,
+	37057: 37266,
+	37058: 38738,
+	37059: 38745,
+	37060: 25993,
+	37061: 31246,
+	37062: 33030,
+	37063: 38587,
+	37064: 24109,
+	37065: 24796,
+	37066: 25114,
+	37067: 26021,
+	37068: 26132,
+	37069: 26512,
+	37070: 30707,
+	37071: 31309,
+	37072: 31821,
+	37073: 32318,
+	37074: 33034,
+	37075: 36012,
+	37076: 36196,
+	37077: 36321,
+	37078: 36447,
+	37079: 30889,
+	37080: 20999,
+	37081: 25305,
+	37082: 25509,
+	37083: 25666,
+	37084: 25240,
+	37085: 35373,
+	37086: 31363,
+	37087: 31680,
+	37088: 35500,
+	37089: 38634,
+	37090: 32118,
+	37091: 33292,
+	37092: 34633,
+	37093: 20185,
+	37094: 20808,
+	37095: 21315,
+	37096: 21344,
+	37097: 23459,
+	37098: 23554,
+	37099: 23574,
+	37100: 24029,
+	37101: 25126,
+	37102: 25159,
+	37103: 25776,
+	37104: 26643,
+	37105: 26676,
+	37106: 27849,
+	37107: 27973,
+	37108: 27927,
+	37109: 26579,
+	37110: 28508,
+	37111: 29006,
+	37112: 29053,
+	37113: 26059,
+	37114: 31359,
+	37115: 31661,
+	37116: 32218,
+	37184: 32330,
+	37185: 32680,
+	37186: 33146,
+	37187: 33307,
+	37188: 33337,
+	37189: 34214,
+	37190: 35438,
+	37191: 36046,
+	37192: 36341,
+	37193: 36984,
+	37194: 36983,
+	37195: 37549,
+	37196: 37521,
+	37197: 38275,
+	37198: 39854,
+	37199: 21069,
+	37200: 21892,
+	37201: 28472,
+	37202: 28982,
+	37203: 20840,
+	37204: 31109,
+	37205: 32341,
+	37206: 33203,
+	37207: 31950,
+	37208: 22092,
+	37209: 22609,
+	37210: 23720,
+	37211: 25514,
+	37212: 26366,
+	37213: 26365,
+	37214: 26970,
+	37215: 29401,
+	37216: 30095,
+	37217: 30094,
+	37218: 30990,
+	37219: 31062,
+	37220: 31199,
+	37221: 31895,
+	37222: 32032,
+	37223: 32068,
+	37224: 34311,
+	37225: 35380,
+	37226: 38459,
+	37227: 36961,
+	37228: 40736,
+	37229: 20711,
+	37230: 21109,
+	37231: 21452,
+	37232: 21474,
+	37233: 20489,
+	37234: 21930,
+	37235: 22766,
+	37236: 22863,
+	37237: 29245,
+	37238: 23435,
+	37239: 23652,
+	37240: 21277,
+	37241: 24803,
+	37242: 24819,
+	37243: 25436,
+	37244: 25475,
+	37245: 25407,
+	37246: 25531,
+	37248: 25805,
+	37249: 26089,
+	37250: 26361,
+	37251: 24035,
+	37252: 27085,
+	37253: 27133,
+	37254: 28437,
+	37255: 29157,
+	37256: 20105,
+	37257: 30185,
+	37258: 30456,
+	37259: 31379,
+	37260: 31967,
+	37261: 32207,
+	37262: 32156,
+	37263: 32865,
+	37264: 33609,
+	37265: 33624,
+	37266: 33900,
+	37267: 33980,
+	37268: 34299,
+	37269: 35013,
+	37270: 36208,
+	37271: 36865,
+	37272: 36973,
+	37273: 37783,
+	37274: 38684,
+	37275: 39442,
+	37276: 20687,
+	37277: 22679,
+	37278: 24974,
+	37279: 33235,
+	37280: 34101,
+	37281: 36104,
+	37282: 36896,
+	37283: 20419,
+	37284: 20596,
+	37285: 21063,
+	37286: 21363,
+	37287: 24687,
+	37288: 25417,
+	37289: 26463,
+	37290: 28204,
+	37291: 36275,
+	37292: 36895,
+	37293: 20439,
+	37294: 23646,
+	37295: 36042,
+	37296: 26063,
+	37297: 32154,
+	37298: 21330,
+	37299: 34966,
+	37300: 20854,
+	37301: 25539,
+	37302: 23384,
+	37303: 23403,
+	37304: 23562,
+	37305: 25613,
+	37306: 26449,
+	37307: 36956,
+	37308: 20182,
+	37309: 22810,
+	37310: 22826,
+	37311: 27760,
+	37312: 35409,
+	37313: 21822,
+	37314: 22549,
+	37315: 22949,
+	37316: 24816,
+	37317: 25171,
+	37318: 26561,
+	37319: 33333,
+	37320: 26965,
+	37321: 38464,
+	37322: 39364,
+	37323: 39464,
+	37324: 20307,
+	37325: 22534,
+	37326: 23550,
+	37327: 32784,
+	37328: 23729,
+	37329: 24111,
+	37330: 24453,
+	37331: 24608,
+	37332: 24907,
+	37333: 25140,
+	37334: 26367,
+	37335: 27888,
+	37336: 28382,
+	37337: 32974,
+	37338: 33151,
+	37339: 33492,
+	37340: 34955,
+	37341: 36024,
+	37342: 36864,
+	37343: 36910,
+	37344: 38538,
+	37345: 40667,
+	37346: 39899,
+	37347: 20195,
+	37348: 21488,
+	37349: 22823,
+	37350: 31532,
+	37351: 37261,
+	37352: 38988,
+	37353: 40441,
+	37354: 28381,
+	37355: 28711,
+	37356: 21331,
+	37357: 21828,
+	37358: 23429,
+	37359: 25176,
+	37360: 25246,
+	37361: 25299,
+	37362: 27810,
+	37363: 28655,
+	37364: 29730,
+	37365: 35351,
+	37366: 37944,
+	37367: 28609,
+	37368: 35582,
+	37369: 33592,
+	37370: 20967,
+	37371: 34552,
+	37372: 21482,
+	37440: 21481,
+	37441: 20294,
+	37442: 36948,
+	37443: 36784,
+	37444: 22890,
+	37445: 33073,
+	37446: 24061,
+	37447: 31466,
+	37448: 36799,
+	37449: 26842,
+	37450: 35895,
+	37451: 29432,
+	37452: 40008,
+	37453: 27197,
+	37454: 35504,
+	37455: 20025,
+	37456: 21336,
+	37457: 22022,
+	37458: 22374,
+	37459: 25285,
+	37460: 25506,
+	37461: 26086,
+	37462: 27470,
+	37463: 28129,
+	37464: 28251,
+	37465: 28845,
+	37466: 30701,
+	37467: 31471,
+	37468: 31658,
+	37469: 32187,
+	37470: 32829,
+	37471: 32966,
+	37472: 34507,
+	37473: 35477,
+	37474: 37723,
+	37475: 22243,
+	37476: 22727,
+	37477: 24382,
+	37478: 26029,
+	37479: 26262,
+	37480: 27264,
+	37481: 27573,
+	37482: 30007,
+	37483: 35527,
+	37484: 20516,
+	37485: 30693,
+	37486: 22320,
+	37487: 24347,
+	37488: 24677,
+	37489: 26234,
+	37490: 27744,
+	37491: 30196,
+	37492: 31258,
+	37493: 32622,
+	37494: 33268,
+	37495: 34584,
+	37496: 36933,
+	37497: 39347,
+	37498: 31689,
+	37499: 30044,
+	37500: 31481,
+	37501: 31569,
+	37502: 33988,
+	37504: 36880,
+	37505: 31209,
+	37506: 31378,
+	37507: 33590,
+	37508: 23265,
+	37509: 30528,
+	37510: 20013,
+	37511: 20210,
+	37512: 23449,
+	37513: 24544,
+	37514: 25277,
+	37515: 26172,
+	37516: 26609,
+	37517: 27880,
+	37518: 34411,
+	37519: 34935,
+	37520: 35387,
+	37521: 37198,
+	37522: 37619,
+	37523: 39376,
+	37524: 27159,
+	37525: 28710,
+	37526: 29482,
+	37527: 33511,
+	37528: 33879,
+	37529: 36015,
+	37530: 19969,
+	37531: 20806,
+	37532: 20939,
+	37533: 21899,
+	37534: 23541,
+	37535: 24086,
+	37536: 24115,
+	37537: 24193,
+	37538: 24340,
+	37539: 24373,
+	37540: 24427,
+	37541: 24500,
+	37542: 25074,
+	37543: 25361,
+	37544: 26274,
+	37545: 26397,
+	37546: 28526,
+	37547: 29266,
+	37548: 30010,
+	37549: 30522,
+	37550: 32884,
+	37551: 33081,
+	37552: 33144,
+	37553: 34678,
+	37554: 35519,
+	37555: 35548,
+	37556: 36229,
+	37557: 36339,
+	37558: 37530,
+	37559: 38263,
+	37560: 38914,
+	37561: 40165,
+	37562: 21189,
+	37563: 25431,
+	37564: 30452,
+	37565: 26389,
+	37566: 27784,
+	37567: 29645,
+	37568: 36035,
+	37569: 37806,
+	37570: 38515,
+	37571: 27941,
+	37572: 22684,
+	37573: 26894,
+	37574: 27084,
+	37575: 36861,
+	37576: 37786,
+	37577: 30171,
+	37578: 36890,
+	37579: 22618,
+	37580: 26626,
+	37581: 25524,
+	37582: 27131,
+	37583: 20291,
+	37584: 28460,
+	37585: 26584,
+	37586: 36795,
+	37587: 34086,
+	37588: 32180,
+	37589: 37716,
+	37590: 26943,
+	37591: 28528,
+	37592: 22378,
+	37593: 22775,
+	37594: 23340,
+	37595: 32044,
+	37596: 29226,
+	37597: 21514,
+	37598: 37347,
+	37599: 40372,
+	37600: 20141,
+	37601: 20302,
+	37602: 20572,
+	37603: 20597,
+	37604: 21059,
+	37605: 35998,
+	37606: 21576,
+	37607: 22564,
+	37608: 23450,
+	37609: 24093,
+	37610: 24213,
+	37611: 24237,
+	37612: 24311,
+	37613: 24351,
+	37614: 24716,
+	37615: 25269,
+	37616: 25402,
+	37617: 25552,
+	37618: 26799,
+	37619: 27712,
+	37620: 30855,
+	37621: 31118,
+	37622: 31243,
+	37623: 32224,
+	37624: 33351,
+	37625: 35330,
+	37626: 35558,
+	37627: 36420,
+	37628: 36883,
+	37696: 37048,
+	37697: 37165,
+	37698: 37336,
+	37699: 40718,
+	37700: 27877,
+	37701: 25688,
+	37702: 25826,
+	37703: 25973,
+	37704: 28404,
+	37705: 30340,
+	37706: 31515,
+	37707: 36969,
+	37708: 37841,
+	37709: 28346,
+	37710: 21746,
+	37711: 24505,
+	37712: 25764,
+	37713: 36685,
+	37714: 36845,
+	37715: 37444,
+	37716: 20856,
+	37717: 22635,
+	37718: 22825,
+	37719: 23637,
+	37720: 24215,
+	37721: 28155,
+	37722: 32399,
+	37723: 29980,
+	37724: 36028,
+	37725: 36578,
+	37726: 39003,
+	37727: 28857,
+	37728: 20253,
+	37729: 27583,
+	37730: 28593,
+	37731: 30000,
+	37732: 38651,
+	37733: 20814,
+	37734: 21520,
+	37735: 22581,
+	37736: 22615,
+	37737: 22956,
+	37738: 23648,
+	37739: 24466,
+	37740: 26007,
+	37741: 26460,
+	37742: 28193,
+	37743: 30331,
+	37744: 33759,
+	37745: 36077,
+	37746: 36884,
+	37747: 37117,
+	37748: 37709,
+	37749: 30757,
+	37750: 30778,
+	37751: 21162,
+	37752: 24230,
+	37753: 22303,
+	37754: 22900,
+	37755: 24594,
+	37756: 20498,
+	37757: 20826,
+	37758: 20908,
+	37760: 20941,
+	37761: 20992,
+	37762: 21776,
+	37763: 22612,
+	37764: 22616,
+	37765: 22871,
+	37766: 23445,
+	37767: 23798,
+	37768: 23947,
+	37769: 24764,
+	37770: 25237,
+	37771: 25645,
+	37772: 26481,
+	37773: 26691,
+	37774: 26812,
+	37775: 26847,
+	37776: 30423,
+	37777: 28120,
+	37778: 28271,
+	37779: 28059,
+	37780: 28783,
+	37781: 29128,
+	37782: 24403,
+	37783: 30168,
+	37784: 31095,
+	37785: 31561,
+	37786: 31572,
+	37787: 31570,
+	37788: 31958,
+	37789: 32113,
+	37790: 21040,
+	37791: 33891,
+	37792: 34153,
+	37793: 34276,
+	37794: 35342,
+	37795: 35588,
+	37796: 35910,
+	37797: 36367,
+	37798: 36867,
+	37799: 36879,
+	37800: 37913,
+	37801: 38518,
+	37802: 38957,
+	37803: 39472,
+	37804: 38360,
+	37805: 20685,
+	37806: 21205,
+	37807: 21516,
+	37808: 22530,
+	37809: 23566,
+	37810: 24999,
+	37811: 25758,
+	37812: 27934,
+	37813: 30643,
+	37814: 31461,
+	37815: 33012,
+	37816: 33796,
+	37817: 36947,
+	37818: 37509,
+	37819: 23776,
+	37820: 40199,
+	37821: 21311,
+	37822: 24471,
+	37823: 24499,
+	37824: 28060,
+	37825: 29305,
+	37826: 30563,
+	37827: 31167,
+	37828: 31716,
+	37829: 27602,
+	37830: 29420,
+	37831: 35501,
+	37832: 26627,
+	37833: 27233,
+	37834: 20984,
+	37835: 31361,
+	37836: 26932,
+	37837: 23626,
+	37838: 40182,
+	37839: 33515,
+	37840: 23493,
+	37841: 37193,
+	37842: 28702,
+	37843: 22136,
+	37844: 23663,
+	37845: 24775,
+	37846: 25958,
+	37847: 27788,
+	37848: 35930,
+	37849: 36929,
+	37850: 38931,
+	37851: 21585,
+	37852: 26311,
+	37853: 37389,
+	37854: 22856,
+	37855: 37027,
+	37856: 20869,
+	37857: 20045,
+	37858: 20970,
+	37859: 34201,
+	37860: 35598,
+	37861: 28760,
+	37862: 25466,
+	37863: 37707,
+	37864: 26978,
+	37865: 39348,
+	37866: 32260,
+	37867: 30071,
+	37868: 21335,
+	37869: 26976,
+	37870: 36575,
+	37871: 38627,
+	37872: 27741,
+	37873: 20108,
+	37874: 23612,
+	37875: 24336,
+	37876: 36841,
+	37877: 21250,
+	37878: 36049,
+	37879: 32905,
+	37880: 34425,
+	37881: 24319,
+	37882: 26085,
+	37883: 20083,
+	37884: 20837,
+	37952: 22914,
+	37953: 23615,
+	37954: 38894,
+	37955: 20219,
+	37956: 22922,
+	37957: 24525,
+	37958: 35469,
+	37959: 28641,
+	37960: 31152,
+	37961: 31074,
+	37962: 23527,
+	37963: 33905,
+	37964: 29483,
+	37965: 29105,
+	37966: 24180,
+	37967: 24565,
+	37968: 25467,
+	37969: 25754,
+	37970: 29123,
+	37971: 31896,
+	37972: 20035,
+	37973: 24316,
+	37974: 20043,
+	37975: 22492,
+	37976: 22178,
+	37977: 24745,
+	37978: 28611,
+	37979: 32013,
+	37980: 33021,
+	37981: 33075,
+	37982: 33215,
+	37983: 36786,
+	37984: 35223,
+	37985: 34468,
+	37986: 24052,
+	37987: 25226,
+	37988: 25773,
+	37989: 35207,
+	37990: 26487,
+	37991: 27874,
+	37992: 27966,
+	37993: 29750,
+	37994: 30772,
+	37995: 23110,
+	37996: 32629,
+	37997: 33453,
+	37998: 39340,
+	37999: 20467,
+	38000: 24259,
+	38001: 25309,
+	38002: 25490,
+	38003: 25943,
+	38004: 26479,
+	38005: 30403,
+	38006: 29260,
+	38007: 32972,
+	38008: 32954,
+	38009: 36649,
+	38010: 37197,
+	38011: 20493,
+	38012: 22521,
+	38013: 23186,
+	38014: 26757,
+	38016: 26995,
+	38017: 29028,
+	38018: 29437,
+	38019: 36023,
+	38020: 22770,
+	38021: 36064,
+	38022: 38506,
+	38023: 36889,
+	38024: 34687,
+	38025: 31204,
+	38026: 30695,
+	38027: 33833,
+	38028: 20271,
+	38029: 21093,
+	38030: 21338,
+	38031: 25293,
+	38032: 26575,
+	38033: 27850,
+	38034: 30333,
+	38035: 31636,
+	38036: 31893,
+	38037: 33334,
+	38038: 34180,
+	38039: 36843,
+	38040: 26333,
+	38041: 28448,
+	38042: 29190,
+	38043: 32283,
+	38044: 33707,
+	38045: 39361,
+	38046: 40614,
+	38047: 20989,
+	38048: 31665,
+	38049: 30834,
+	38050: 31672,
+	38051: 32903,
+	38052: 31560,
+	38053: 27368,
+	38054: 24161,
+	38055: 32908,
+	38056: 30033,
+	38057: 30048,
+	38058: 20843,
+	38059: 37474,
+	38060: 28300,
+	38061: 30330,
+	38062: 37271,
+	38063: 39658,
+	38064: 20240,
+	38065: 32624,
+	38066: 25244,
+	38067: 31567,
+	38068: 38309,
+	38069: 40169,
+	38070: 22138,
+	38071: 22617,
+	38072: 34532,
+	38073: 38588,
+	38074: 20276,
+	38075: 21028,
+	38076: 21322,
+	38077: 21453,
+	38078: 21467,
+	38079: 24070,
+	38080: 25644,
+	38081: 26001,
+	38082: 26495,
+	38083: 27710,
+	38084: 27726,
+	38085: 29256,
+	38086: 29359,
+	38087: 29677,
+	38088: 30036,
+	38089: 32321,
+	38090: 33324,
+	38091: 34281,
+	38092: 36009,
+	38093: 31684,
+	38094: 37318,
+	38095: 29033,
+	38096: 38930,
+	38097: 39151,
+	38098: 25405,
+	38099: 26217,
+	38100: 30058,
+	38101: 30436,
+	38102: 30928,
+	38103: 34115,
+	38104: 34542,
+	38105: 21290,
+	38106: 21329,
+	38107: 21542,
+	38108: 22915,
+	38109: 24199,
+	38110: 24444,
+	38111: 24754,
+	38112: 25161,
+	38113: 25209,
+	38114: 25259,
+	38115: 26000,
+	38116: 27604,
+	38117: 27852,
+	38118: 30130,
+	38119: 30382,
+	38120: 30865,
+	38121: 31192,
+	38122: 32203,
+	38123: 32631,
+	38124: 32933,
+	38125: 34987,
+	38126: 35513,
+	38127: 36027,
+	38128: 36991,
+	38129: 38750,
+	38130: 39131,
+	38131: 27147,
+	38132: 31800,
+	38133: 20633,
+	38134: 23614,
+	38135: 24494,
+	38136: 26503,
+	38137: 27608,
+	38138: 29749,
+	38139: 30473,
+	38140: 32654,
+	38208: 40763,
+	38209: 26570,
+	38210: 31255,
+	38211: 21305,
+	38212: 30091,
+	38213: 39661,
+	38214: 24422,
+	38215: 33181,
+	38216: 33777,
+	38217: 32920,
+	38218: 24380,
+	38219: 24517,
+	38220: 30050,
+	38221: 31558,
+	38222: 36924,
+	38223: 26727,
+	38224: 23019,
+	38225: 23195,
+	38226: 32016,
+	38227: 30334,
+	38228: 35628,
+	38229: 20469,
+	38230: 24426,
+	38231: 27161,
+	38232: 27703,
+	38233: 28418,
+	38234: 29922,
+	38235: 31080,
+	38236: 34920,
+	38237: 35413,
+	38238: 35961,
+	38239: 24287,
+	38240: 25551,
+	38241: 30149,
+	38242: 31186,
+	38243: 33495,
+	38244: 37672,
+	38245: 37618,
+	38246: 33948,
+	38247: 34541,
+	38248: 39981,
+	38249: 21697,
+	38250: 24428,
+	38251: 25996,
+	38252: 27996,
+	38253: 28693,
+	38254: 36007,
+	38255: 36051,
+	38256: 38971,
+	38257: 25935,
+	38258: 29942,
+	38259: 19981,
+	38260: 20184,
+	38261: 22496,
+	38262: 22827,
+	38263: 23142,
+	38264: 23500,
+	38265: 20904,
+	38266: 24067,
+	38267: 24220,
+	38268: 24598,
+	38269: 25206,
+	38270: 25975,
+	38272: 26023,
+	38273: 26222,
+	38274: 28014,
+	38275: 29238,
+	38276: 31526,
+	38277: 33104,
+	38278: 33178,
+	38279: 33433,
+	38280: 35676,
+	38281: 36000,
+	38282: 36070,
+	38283: 36212,
+	38284: 38428,
+	38285: 38468,
+	38286: 20398,
+	38287: 25771,
+	38288: 27494,
+	38289: 33310,
+	38290: 33889,
+	38291: 34154,
+	38292: 37096,
+	38293: 23553,
+	38294: 26963,
+	38295: 39080,
+	38296: 33914,
+	38297: 34135,
+	38298: 20239,
+	38299: 21103,
+	38300: 24489,
+	38301: 24133,
+	38302: 26381,
+	38303: 31119,
+	38304: 33145,
+	38305: 35079,
+	38306: 35206,
+	38307: 28149,
+	38308: 24343,
+	38309: 25173,
+	38310: 27832,
+	38311: 20175,
+	38312: 29289,
+	38313: 39826,
+	38314: 20998,
+	38315: 21563,
+	38316: 22132,
+	38317: 22707,
+	38318: 24996,
+	38319: 25198,
+	38320: 28954,
+	38321: 22894,
+	38322: 31881,
+	38323: 31966,
+	38324: 32027,
+	38325: 38640,
+	38326: 25991,
+	38327: 32862,
+	38328: 19993,
+	38329: 20341,
+	38330: 20853,
+	38331: 22592,
+	38332: 24163,
+	38333: 24179,
+	38334: 24330,
+	38335: 26564,
+	38336: 20006,
+	38337: 34109,
+	38338: 38281,
+	38339: 38491,
+	38340: 31859,
+	38341: 38913,
+	38342: 20731,
+	38343: 22721,
+	38344: 30294,
+	38345: 30887,
+	38346: 21029,
+	38347: 30629,
+	38348: 34065,
+	38349: 31622,
+	38350: 20559,
+	38351: 22793,
+	38352: 29255,
+	38353: 31687,
+	38354: 32232,
+	38355: 36794,
+	38356: 36820,
+	38357: 36941,
+	38358: 20415,
+	38359: 21193,
+	38360: 23081,
+	38361: 24321,
+	38362: 38829,
+	38363: 20445,
+	38364: 33303,
+	38365: 37610,
+	38366: 22275,
+	38367: 25429,
+	38368: 27497,
+	38369: 29995,
+	38370: 35036,
+	38371: 36628,
+	38372: 31298,
+	38373: 21215,
+	38374: 22675,
+	38375: 24917,
+	38376: 25098,
+	38377: 26286,
+	38378: 27597,
+	38379: 31807,
+	38380: 33769,
+	38381: 20515,
+	38382: 20472,
+	38383: 21253,
+	38384: 21574,
+	38385: 22577,
+	38386: 22857,
+	38387: 23453,
+	38388: 23792,
+	38389: 23791,
+	38390: 23849,
+	38391: 24214,
+	38392: 25265,
+	38393: 25447,
+	38394: 25918,
+	38395: 26041,
+	38396: 26379,
+	38464: 27861,
+	38465: 27873,
+	38466: 28921,
+	38467: 30770,
+	38468: 32299,
+	38469: 32990,
+	38470: 33459,
+	38471: 33804,
+	38472: 34028,
+	38473: 34562,
+	38474: 35090,
+	38475: 35370,
+	38476: 35914,
+	38477: 37030,
+	38478: 37586,
+	38479: 39165,
+	38480: 40179,
+	38481: 40300,
+	38482: 20047,
+	38483: 20129,
+	38484: 20621,
+	38485: 21078,
+	38486: 22346,
+	38487: 22952,
+	38488: 24125,
+	38489: 24536,
+	38490: 24537,
+	38491: 25151,
+	38492: 26292,
+	38493: 26395,
+	38494: 26576,
+	38495: 26834,
+	38496: 20882,
+	38497: 32033,
+	38498: 32938,
+	38499: 33192,
+	38500: 35584,
+	38501: 35980,
+	38502: 36031,
+	38503: 37502,
+	38504: 38450,
+	38505: 21536,
+	38506: 38956,
+	38507: 21271,
+	38508: 20693,
+	38509: 21340,
+	38510: 22696,
+	38511: 25778,
+	38512: 26420,
+	38513: 29287,
+	38514: 30566,
+	38515: 31302,
+	38516: 37350,
+	38517: 21187,
+	38518: 27809,
+	38519: 27526,
+	38520: 22528,
+	38521: 24140,
+	38522: 22868,
+	38523: 26412,
+	38524: 32763,
+	38525: 20961,
+	38526: 30406,
+	38528: 25705,
+	38529: 30952,
+	38530: 39764,
+	38531: 40635,
+	38532: 22475,
+	38533: 22969,
+	38534: 26151,
+	38535: 26522,
+	38536: 27598,
+	38537: 21737,
+	38538: 27097,
+	38539: 24149,
+	38540: 33180,
+	38541: 26517,
+	38542: 39850,
+	38543: 26622,
+	38544: 40018,
+	38545: 26717,
+	38546: 20134,
+	38547: 20451,
+	38548: 21448,
+	38549: 25273,
+	38550: 26411,
+	38551: 27819,
+	38552: 36804,
+	38553: 20397,
+	38554: 32365,
+	38555: 40639,
+	38556: 19975,
+	38557: 24930,
+	38558: 28288,
+	38559: 28459,
+	38560: 34067,
+	38561: 21619,
+	38562: 26410,
+	38563: 39749,
+	38564: 24051,
+	38565: 31637,
+	38566: 23724,
+	38567: 23494,
+	38568: 34588,
+	38569: 28234,
+	38570: 34001,
+	38571: 31252,
+	38572: 33032,
+	38573: 22937,
+	38574: 31885,
+	38575: 27665,
+	38576: 30496,
+	38577: 21209,
+	38578: 22818,
+	38579: 28961,
+	38580: 29279,
+	38581: 30683,
+	38582: 38695,
+	38583: 40289,
+	38584: 26891,
+	38585: 23167,
+	38586: 23064,
+	38587: 20901,
+	38588: 21517,
+	38589: 21629,
+	38590: 26126,
+	38591: 30431,
+	38592: 36855,
+	38593: 37528,
+	38594: 40180,
+	38595: 23018,
+	38596: 29277,
+	38597: 28357,
+	38598: 20813,
+	38599: 26825,
+	38600: 32191,
+	38601: 32236,
+	38602: 38754,
+	38603: 40634,
+	38604: 25720,
+	38605: 27169,
+	38606: 33538,
+	38607: 22916,
+	38608: 23391,
+	38609: 27611,
+	38610: 29467,
+	38611: 30450,
+	38612: 32178,
+	38613: 32791,
+	38614: 33945,
+	38615: 20786,
+	38616: 26408,
+	38617: 40665,
+	38618: 30446,
+	38619: 26466,
+	38620: 21247,
+	38621: 39173,
+	38622: 23588,
+	38623: 25147,
+	38624: 31870,
+	38625: 36016,
+	38626: 21839,
+	38627: 24758,
+	38628: 32011,
+	38629: 38272,
+	38630: 21249,
+	38631: 20063,
+	38632: 20918,
+	38633: 22812,
+	38634: 29242,
+	38635: 32822,
+	38636: 37326,
+	38637: 24357,
+	38638: 30690,
+	38639: 21380,
+	38640: 24441,
+	38641: 32004,
+	38642: 34220,
+	38643: 35379,
+	38644: 36493,
+	38645: 38742,
+	38646: 26611,
+	38647: 34222,
+	38648: 37971,
+	38649: 24841,
+	38650: 24840,
+	38651: 27833,
+	38652: 30290,
+	38720: 35565,
+	38721: 36664,
+	38722: 21807,
+	38723: 20305,
+	38724: 20778,
+	38725: 21191,
+	38726: 21451,
+	38727: 23461,
+	38728: 24189,
+	38729: 24736,
+	38730: 24962,
+	38731: 25558,
+	38732: 26377,
+	38733: 26586,
+	38734: 28263,
+	38735: 28044,
+	38736: 29494,
+	38737: 29495,
+	38738: 30001,
+	38739: 31056,
+	38740: 35029,
+	38741: 35480,
+	38742: 36938,
+	38743: 37009,
+	38744: 37109,
+	38745: 38596,
+	38746: 34701,
+	38747: 22805,
+	38748: 20104,
+	38749: 20313,
+	38750: 19982,
+	38751: 35465,
+	38752: 36671,
+	38753: 38928,
+	38754: 20653,
+	38755: 24188,
+	38756: 22934,
+	38757: 23481,
+	38758: 24248,
+	38759: 25562,
+	38760: 25594,
+	38761: 25793,
+	38762: 26332,
+	38763: 26954,
+	38764: 27096,
+	38765: 27915,
+	38766: 28342,
+	38767: 29076,
+	38768: 29992,
+	38769: 31407,
+	38770: 32650,
+	38771: 32768,
+	38772: 33865,
+	38773: 33993,
+	38774: 35201,
+	38775: 35617,
+	38776: 36362,
+	38777: 36965,
+	38778: 38525,
+	38779: 39178,
+	38780: 24958,
+	38781: 25233,
+	38782: 27442,
+	38784: 27779,
+	38785: 28020,
+	38786: 32716,
+	38787: 32764,
+	38788: 28096,
+	38789: 32645,
+	38790: 34746,
+	38791: 35064,
+	38792: 26469,
+	38793: 33713,
+	38794: 38972,
+	38795: 38647,
+	38796: 27931,
+	38797: 32097,
+	38798: 33853,
+	38799: 37226,
+	38800: 20081,
+	38801: 21365,
+	38802: 23888,
+	38803: 27396,
+	38804: 28651,
+	38805: 34253,
+	38806: 34349,
+	38807: 35239,
+	38808: 21033,
+	38809: 21519,
+	38810: 23653,
+	38811: 26446,
+	38812: 26792,
+	38813: 29702,
+	38814: 29827,
+	38815: 30178,
+	38816: 35023,
+	38817: 35041,
+	38818: 37324,
+	38819: 38626,
+	38820: 38520,
+	38821: 24459,
+	38822: 29575,
+	38823: 31435,
+	38824: 33870,
+	38825: 25504,
+	38826: 30053,
+	38827: 21129,
+	38828: 27969,
+	38829: 28316,
+	38830: 29705,
+	38831: 30041,
+	38832: 30827,
+	38833: 31890,
+	38834: 38534,
+	38835: 31452,
+	38836: 40845,
+	38837: 20406,
+	38838: 24942,
+	38839: 26053,
+	38840: 34396,
+	38841: 20102,
+	38842: 20142,
+	38843: 20698,
+	38844: 20001,
+	38845: 20940,
+	38846: 23534,
+	38847: 26009,
+	38848: 26753,
+	38849: 28092,
+	38850: 29471,
+	38851: 30274,
+	38852: 30637,
+	38853: 31260,
+	38854: 31975,
+	38855: 33391,
+	38856: 35538,
+	38857: 36988,
+	38858: 37327,
+	38859: 38517,
+	38860: 38936,
+	38861: 21147,
+	38862: 32209,
+	38863: 20523,
+	38864: 21400,
+	38865: 26519,
+	38866: 28107,
+	38867: 29136,
+	38868: 29747,
+	38869: 33256,
+	38870: 36650,
+	38871: 38563,
+	38872: 40023,
+	38873: 40607,
+	38874: 29792,
+	38875: 22593,
+	38876: 28057,
+	38877: 32047,
+	38878: 39006,
+	38879: 20196,
+	38880: 20278,
+	38881: 20363,
+	38882: 20919,
+	38883: 21169,
+	38884: 23994,
+	38885: 24604,
+	38886: 29618,
+	38887: 31036,
+	38888: 33491,
+	38889: 37428,
+	38890: 38583,
+	38891: 38646,
+	38892: 38666,
+	38893: 40599,
+	38894: 40802,
+	38895: 26278,
+	38896: 27508,
+	38897: 21015,
+	38898: 21155,
+	38899: 28872,
+	38900: 35010,
+	38901: 24265,
+	38902: 24651,
+	38903: 24976,
+	38904: 28451,
+	38905: 29001,
+	38906: 31806,
+	38907: 32244,
+	38908: 32879,
+	38976: 34030,
+	38977: 36899,
+	38978: 37676,
+	38979: 21570,
+	38980: 39791,
+	38981: 27347,
+	38982: 28809,
+	38983: 36034,
+	38984: 36335,
+	38985: 38706,
+	38986: 21172,
+	38987: 23105,
+	38988: 24266,
+	38989: 24324,
+	38990: 26391,
+	38991: 27004,
+	38992: 27028,
+	38993: 28010,
+	38994: 28431,
+	38995: 29282,
+	38996: 29436,
+	38997: 31725,
+	38998: 32769,
+	38999: 32894,
+	39000: 34635,
+	39001: 37070,
+	39002: 20845,
+	39003: 40595,
+	39004: 31108,
+	39005: 32907,
+	39006: 37682,
+	39007: 35542,
+	39008: 20525,
+	39009: 21644,
+	39010: 35441,
+	39011: 27498,
+	39012: 36036,
+	39013: 33031,
+	39014: 24785,
+	39015: 26528,
+	39016: 40434,
+	39017: 20121,
+	39018: 20120,
+	39019: 39952,
+	39020: 35435,
+	39021: 34241,
+	39022: 34152,
+	39023: 26880,
+	39024: 28286,
+	39025: 30871,
+	39026: 33109,
+	39071: 24332,
+	39072: 19984,
+	39073: 19989,
+	39074: 20010,
+	39075: 20017,
+	39076: 20022,
+	39077: 20028,
+	39078: 20031,
+	39079: 20034,
+	39080: 20054,
+	39081: 20056,
+	39082: 20098,
+	39083: 20101,
+	39084: 35947,
+	39085: 20106,
+	39086: 33298,
+	39087: 24333,
+	39088: 20110,
+	39089: 20126,
+	39090: 20127,
+	39091: 20128,
+	39092: 20130,
+	39093: 20144,
+	39094: 20147,
+	39095: 20150,
+	39096: 20174,
+	39097: 20173,
+	39098: 20164,
+	39099: 20166,
+	39100: 20162,
+	39101: 20183,
+	39102: 20190,
+	39103: 20205,
+	39104: 20191,
+	39105: 20215,
+	39106: 20233,
+	39107: 20314,
+	39108: 20272,
+	39109: 20315,
+	39110: 20317,
+	39111: 20311,
+	39112: 20295,
+	39113: 20342,
+	39114: 20360,
+	39115: 20367,
+	39116: 20376,
+	39117: 20347,
+	39118: 20329,
+	39119: 20336,
+	39120: 20369,
+	39121: 20335,
+	39122: 20358,
+	39123: 20374,
+	39124: 20760,
+	39125: 20436,
+	39126: 20447,
+	39127: 20430,
+	39128: 20440,
+	39129: 20443,
+	39130: 20433,
+	39131: 20442,
+	39132: 20432,
+	39133: 20452,
+	39134: 20453,
+	39135: 20506,
+	39136: 20520,
+	39137: 20500,
+	39138: 20522,
+	39139: 20517,
+	39140: 20485,
+	39141: 20252,
+	39142: 20470,
+	39143: 20513,
+	39144: 20521,
+	39145: 20524,
+	39146: 20478,
+	39147: 20463,
+	39148: 20497,
+	39149: 20486,
+	39150: 20547,
+	39151: 20551,
+	39152: 26371,
+	39153: 20565,
+	39154: 20560,
+	39155: 20552,
+	39156: 20570,
+	39157: 20566,
+	39158: 20588,
+	39159: 20600,
+	39160: 20608,
+	39161: 20634,
+	39162: 20613,
+	39163: 20660,
+	39164: 20658,
+	39232: 20681,
+	39233: 20682,
+	39234: 20659,
+	39235: 20674,
+	39236: 20694,
+	39237: 20702,
+	39238: 20709,
+	39239: 20717,
+	39240: 20707,
+	39241: 20718,
+	39242: 20729,
+	39243: 20725,
+	39244: 20745,
+	39245: 20737,
+	39246: 20738,
+	39247: 20758,
+	39248: 20757,
+	39249: 20756,
+	39250: 20762,
+	39251: 20769,
+	39252: 20794,
+	39253: 20791,
+	39254: 20796,
+	39255: 20795,
+	39256: 20799,
+	39257: 20800,
+	39258: 20818,
+	39259: 20812,
+	39260: 20820,
+	39261: 20834,
+	39262: 31480,
+	39263: 20841,
+	39264: 20842,
+	39265: 20846,
+	39266: 20864,
+	39267: 20866,
+	39268: 22232,
+	39269: 20876,
+	39270: 20873,
+	39271: 20879,
+	39272: 20881,
+	39273: 20883,
+	39274: 20885,
+	39275: 20886,
+	39276: 20900,
+	39277: 20902,
+	39278: 20898,
+	39279: 20905,
+	39280: 20906,
+	39281: 20907,
+	39282: 20915,
+	39283: 20913,
+	39284: 20914,
+	39285: 20912,
+	39286: 20917,
+	39287: 20925,
+	39288: 20933,
+	39289: 20937,
+	39290: 20955,
+	39291: 20960,
+	39292: 34389,
+	39293: 20969,
+	39294: 20973,
+	39296: 20976,
+	39297: 20981,
+	39298: 20990,
+	39299: 20996,
+	39300: 21003,
+	39301: 21012,
+	39302: 21006,
+	39303: 21031,
+	39304: 21034,
+	39305: 21038,
+	39306: 21043,
+	39307: 21049,
+	39308: 21071,
+	39309: 21060,
+	39310: 21067,
+	39311: 21068,
+	39312: 21086,
+	39313: 21076,
+	39314: 21098,
+	39315: 21108,
+	39316: 21097,
+	39317: 21107,
+	39318: 21119,
+	39319: 21117,
+	39320: 21133,
+	39321: 21140,
+	39322: 21138,
+	39323: 21105,
+	39324: 21128,
+	39325: 21137,
+	39326: 36776,
+	39327: 36775,
+	39328: 21164,
+	39329: 21165,
+	39330: 21180,
+	39331: 21173,
+	39332: 21185,
+	39333: 21197,
+	39334: 21207,
+	39335: 21214,
+	39336: 21219,
+	39337: 21222,
+	39338: 39149,
+	39339: 21216,
+	39340: 21235,
+	39341: 21237,
+	39342: 21240,
+	39343: 21241,
+	39344: 21254,
+	39345: 21256,
+	39346: 30008,
+	39347: 21261,
+	39348: 21264,
+	39349: 21263,
+	39350: 21269,
+	39351: 21274,
+	39352: 21283,
+	39353: 21295,
+	39354: 21297,
+	39355: 21299,
+	39356: 21304,
+	39357: 21312,
+	39358: 21318,
+	39359: 21317,
+	39360: 19991,
+	39361: 21321,
+	39362: 21325,
+	39363: 20950,
+	39364: 21342,
+	39365: 21353,
+	39366: 21358,
+	39367: 22808,
+	39368: 21371,
+	39369: 21367,
+	39370: 21378,
+	39371: 21398,
+	39372: 21408,
+	39373: 21414,
+	39374: 21413,
+	39375: 21422,
+	39376: 21424,
+	39377: 21430,
+	39378: 21443,
+	39379: 31762,
+	39380: 38617,
+	39381: 21471,
+	39382: 26364,
+	39383: 29166,
+	39384: 21486,
+	39385: 21480,
+	39386: 21485,
+	39387: 21498,
+	39388: 21505,
+	39389: 21565,
+	39390: 21568,
+	39391: 21548,
+	39392: 21549,
+	39393: 21564,
+	39394: 21550,
+	39395: 21558,
+	39396: 21545,
+	39397: 21533,
+	39398: 21582,
+	39399: 21647,
+	39400: 21621,
+	39401: 21646,
+	39402: 21599,
+	39403: 21617,
+	39404: 21623,
+	39405: 21616,
+	39406: 21650,
+	39407: 21627,
+	39408: 21632,
+	39409: 21622,
+	39410: 21636,
+	39411: 21648,
+	39412: 21638,
+	39413: 21703,
+	39414: 21666,
+	39415: 21688,
+	39416: 21669,
+	39417: 21676,
+	39418: 21700,
+	39419: 21704,
+	39420: 21672,
+	39488: 21675,
+	39489: 21698,
+	39490: 21668,
+	39491: 21694,
+	39492: 21692,
+	39493: 21720,
+	39494: 21733,
+	39495: 21734,
+	39496: 21775,
+	39497: 21780,
+	39498: 21757,
+	39499: 21742,
+	39500: 21741,
+	39501: 21754,
+	39502: 21730,
+	39503: 21817,
+	39504: 21824,
+	39505: 21859,
+	39506: 21836,
+	39507: 21806,
+	39508: 21852,
+	39509: 21829,
+	39510: 21846,
+	39511: 21847,
+	39512: 21816,
+	39513: 21811,
+	39514: 21853,
+	39515: 21913,
+	39516: 21888,
+	39517: 21679,
+	39518: 21898,
+	39519: 21919,
+	39520: 21883,
+	39521: 21886,
+	39522: 21912,
+	39523: 21918,
+	39524: 21934,
+	39525: 21884,
+	39526: 21891,
+	39527: 21929,
+	39528: 21895,
+	39529: 21928,
+	39530: 21978,
+	39531: 21957,
+	39532: 21983,
+	39533: 21956,
+	39534: 21980,
+	39535: 21988,
+	39536: 21972,
+	39537: 22036,
+	39538: 22007,
+	39539: 22038,
+	39540: 22014,
+	39541: 22013,
+	39542: 22043,
+	39543: 22009,
+	39544: 22094,
+	39545: 22096,
+	39546: 29151,
+	39547: 22068,
+	39548: 22070,
+	39549: 22066,
+	39550: 22072,
+	39552: 22123,
+	39553: 22116,
+	39554: 22063,
+	39555: 22124,
+	39556: 22122,
+	39557: 22150,
+	39558: 22144,
+	39559: 22154,
+	39560: 22176,
+	39561: 22164,
+	39562: 22159,
+	39563: 22181,
+	39564: 22190,
+	39565: 22198,
+	39566: 22196,
+	39567: 22210,
+	39568: 22204,
+	39569: 22209,
+	39570: 22211,
+	39571: 22208,
+	39572: 22216,
+	39573: 22222,
+	39574: 22225,
+	39575: 22227,
+	39576: 22231,
+	39577: 22254,
+	39578: 22265,
+	39579: 22272,
+	39580: 22271,
+	39581: 22276,
+	39582: 22281,
+	39583: 22280,
+	39584: 22283,
+	39585: 22285,
+	39586: 22291,
+	39587: 22296,
+	39588: 22294,
+	39589: 21959,
+	39590: 22300,
+	39591: 22310,
+	39592: 22327,
+	39593: 22328,
+	39594: 22350,
+	39595: 22331,
+	39596: 22336,
+	39597: 22351,
+	39598: 22377,
+	39599: 22464,
+	39600: 22408,
+	39601: 22369,
+	39602: 22399,
+	39603: 22409,
+	39604: 22419,
+	39605: 22432,
+	39606: 22451,
+	39607: 22436,
+	39608: 22442,
+	39609: 22448,
+	39610: 22467,
+	39611: 22470,
+	39612: 22484,
+	39613: 22482,
+	39614: 22483,
+	39615: 22538,
+	39616: 22486,
+	39617: 22499,
+	39618: 22539,
+	39619: 22553,
+	39620: 22557,
+	39621: 22642,
+	39622: 22561,
+	39623: 22626,
+	39624: 22603,
+	39625: 22640,
+	39626: 27584,
+	39627: 22610,
+	39628: 22589,
+	39629: 22649,
+	39630: 22661,
+	39631: 22713,
+	39632: 22687,
+	39633: 22699,
+	39634: 22714,
+	39635: 22750,
+	39636: 22715,
+	39637: 22712,
+	39638: 22702,
+	39639: 22725,
+	39640: 22739,
+	39641: 22737,
+	39642: 22743,
+	39643: 22745,
+	39644: 22744,
+	39645: 22757,
+	39646: 22748,
+	39647: 22756,
+	39648: 22751,
+	39649: 22767,
+	39650: 22778,
+	39651: 22777,
+	39652: 22779,
+	39653: 22780,
+	39654: 22781,
+	39655: 22786,
+	39656: 22794,
+	39657: 22800,
+	39658: 22811,
+	39659: 26790,
+	39660: 22821,
+	39661: 22828,
+	39662: 22829,
+	39663: 22834,
+	39664: 22840,
+	39665: 22846,
+	39666: 31442,
+	39667: 22869,
+	39668: 22864,
+	39669: 22862,
+	39670: 22874,
+	39671: 22872,
+	39672: 22882,
+	39673: 22880,
+	39674: 22887,
+	39675: 22892,
+	39676: 22889,
+	39744: 22904,
+	39745: 22913,
+	39746: 22941,
+	39747: 20318,
+	39748: 20395,
+	39749: 22947,
+	39750: 22962,
+	39751: 22982,
+	39752: 23016,
+	39753: 23004,
+	39754: 22925,
+	39755: 23001,
+	39756: 23002,
+	39757: 23077,
+	39758: 23071,
+	39759: 23057,
+	39760: 23068,
+	39761: 23049,
+	39762: 23066,
+	39763: 23104,
+	39764: 23148,
+	39765: 23113,
+	39766: 23093,
+	39767: 23094,
+	39768: 23138,
+	39769: 23146,
+	39770: 23194,
+	39771: 23228,
+	39772: 23230,
+	39773: 23243,
+	39774: 23234,
+	39775: 23229,
+	39776: 23267,
+	39777: 23255,
+	39778: 23270,
+	39779: 23273,
+	39780: 23254,
+	39781: 23290,
+	39782: 23291,
+	39783: 23308,
+	39784: 23307,
+	39785: 23318,
+	39786: 23346,
+	39787: 23248,
+	39788: 23338,
+	39789: 23350,
+	39790: 23358,
+	39791: 23363,
+	39792: 23365,
+	39793: 23360,
+	39794: 23377,
+	39795: 23381,
+	39796: 23386,
+	39797: 23387,
+	39798: 23397,
+	39799: 23401,
+	39800: 23408,
+	39801: 23411,
+	39802: 23413,
+	39803: 23416,
+	39804: 25992,
+	39805: 23418,
+	39806: 23424,
+	39808: 23427,
+	39809: 23462,
+	39810: 23480,
+	39811: 23491,
+	39812: 23495,
+	39813: 23497,
+	39814: 23508,
+	39815: 23504,
+	39816: 23524,
+	39817: 23526,
+	39818: 23522,
+	39819: 23518,
+	39820: 23525,
+	39821: 23531,
+	39822: 23536,
+	39823: 23542,
+	39824: 23539,
+	39825: 23557,
+	39826: 23559,
+	39827: 23560,
+	39828: 23565,
+	39829: 23571,
+	39830: 23584,
+	39831: 23586,
+	39832: 23592,
+	39833: 23608,
+	39834: 23609,
+	39835: 23617,
+	39836: 23622,
+	39837: 23630,
+	39838: 23635,
+	39839: 23632,
+	39840: 23631,
+	39841: 23409,
+	39842: 23660,
+	39843: 23662,
+	39844: 20066,
+	39845: 23670,
+	39846: 23673,
+	39847: 23692,
+	39848: 23697,
+	39849: 23700,
+	39850: 22939,
+	39851: 23723,
+	39852: 23739,
+	39853: 23734,
+	39854: 23740,
+	39855: 23735,
+	39856: 23749,
+	39857: 23742,
+	39858: 23751,
+	39859: 23769,
+	39860: 23785,
+	39861: 23805,
+	39862: 23802,
+	39863: 23789,
+	39864: 23948,
+	39865: 23786,
+	39866: 23819,
+	39867: 23829,
+	39868: 23831,
+	39869: 23900,
+	39870: 23839,
+	39871: 23835,
+	39872: 23825,
+	39873: 23828,
+	39874: 23842,
+	39875: 23834,
+	39876: 23833,
+	39877: 23832,
+	39878: 23884,
+	39879: 23890,
+	39880: 23886,
+	39881: 23883,
+	39882: 23916,
+	39883: 23923,
+	39884: 23926,
+	39885: 23943,
+	39886: 23940,
+	39887: 23938,
+	39888: 23970,
+	39889: 23965,
+	39890: 23980,
+	39891: 23982,
+	39892: 23997,
+	39893: 23952,
+	39894: 23991,
+	39895: 23996,
+	39896: 24009,
+	39897: 24013,
+	39898: 24019,
+	39899: 24018,
+	39900: 24022,
+	39901: 24027,
+	39902: 24043,
+	39903: 24050,
+	39904: 24053,
+	39905: 24075,
+	39906: 24090,
+	39907: 24089,
+	39908: 24081,
+	39909: 24091,
+	39910: 24118,
+	39911: 24119,
+	39912: 24132,
+	39913: 24131,
+	39914: 24128,
+	39915: 24142,
+	39916: 24151,
+	39917: 24148,
+	39918: 24159,
+	39919: 24162,
+	39920: 24164,
+	39921: 24135,
+	39922: 24181,
+	39923: 24182,
+	39924: 24186,
+	39925: 40636,
+	39926: 24191,
+	39927: 24224,
+	39928: 24257,
+	39929: 24258,
+	39930: 24264,
+	39931: 24272,
+	39932: 24271,
+	40000: 24278,
+	40001: 24291,
+	40002: 24285,
+	40003: 24282,
+	40004: 24283,
+	40005: 24290,
+	40006: 24289,
+	40007: 24296,
+	40008: 24297,
+	40009: 24300,
+	40010: 24305,
+	40011: 24307,
+	40012: 24304,
+	40013: 24308,
+	40014: 24312,
+	40015: 24318,
+	40016: 24323,
+	40017: 24329,
+	40018: 24413,
+	40019: 24412,
+	40020: 24331,
+	40021: 24337,
+	40022: 24342,
+	40023: 24361,
+	40024: 24365,
+	40025: 24376,
+	40026: 24385,
+	40027: 24392,
+	40028: 24396,
+	40029: 24398,
+	40030: 24367,
+	40031: 24401,
+	40032: 24406,
+	40033: 24407,
+	40034: 24409,
+	40035: 24417,
+	40036: 24429,
+	40037: 24435,
+	40038: 24439,
+	40039: 24451,
+	40040: 24450,
+	40041: 24447,
+	40042: 24458,
+	40043: 24456,
+	40044: 24465,
+	40045: 24455,
+	40046: 24478,
+	40047: 24473,
+	40048: 24472,
+	40049: 24480,
+	40050: 24488,
+	40051: 24493,
+	40052: 24508,
+	40053: 24534,
+	40054: 24571,
+	40055: 24548,
+	40056: 24568,
+	40057: 24561,
+	40058: 24541,
+	40059: 24755,
+	40060: 24575,
+	40061: 24609,
+	40062: 24672,
+	40064: 24601,
+	40065: 24592,
+	40066: 24617,
+	40067: 24590,
+	40068: 24625,
+	40069: 24603,
+	40070: 24597,
+	40071: 24619,
+	40072: 24614,
+	40073: 24591,
+	40074: 24634,
+	40075: 24666,
+	40076: 24641,
+	40077: 24682,
+	40078: 24695,
+	40079: 24671,
+	40080: 24650,
+	40081: 24646,
+	40082: 24653,
+	40083: 24675,
+	40084: 24643,
+	40085: 24676,
+	40086: 24642,
+	40087: 24684,
+	40088: 24683,
+	40089: 24665,
+	40090: 24705,
+	40091: 24717,
+	40092: 24807,
+	40093: 24707,
+	40094: 24730,
+	40095: 24708,
+	40096: 24731,
+	40097: 24726,
+	40098: 24727,
+	40099: 24722,
+	40100: 24743,
+	40101: 24715,
+	40102: 24801,
+	40103: 24760,
+	40104: 24800,
+	40105: 24787,
+	40106: 24756,
+	40107: 24560,
+	40108: 24765,
+	40109: 24774,
+	40110: 24757,
+	40111: 24792,
+	40112: 24909,
+	40113: 24853,
+	40114: 24838,
+	40115: 24822,
+	40116: 24823,
+	40117: 24832,
+	40118: 24820,
+	40119: 24826,
+	40120: 24835,
+	40121: 24865,
+	40122: 24827,
+	40123: 24817,
+	40124: 24845,
+	40125: 24846,
+	40126: 24903,
+	40127: 24894,
+	40128: 24872,
+	40129: 24871,
+	40130: 24906,
+	40131: 24895,
+	40132: 24892,
+	40133: 24876,
+	40134: 24884,
+	40135: 24893,
+	40136: 24898,
+	40137: 24900,
+	40138: 24947,
+	40139: 24951,
+	40140: 24920,
+	40141: 24921,
+	40142: 24922,
+	40143: 24939,
+	40144: 24948,
+	40145: 24943,
+	40146: 24933,
+	40147: 24945,
+	40148: 24927,
+	40149: 24925,
+	40150: 24915,
+	40151: 24949,
+	40152: 24985,
+	40153: 24982,
+	40154: 24967,
+	40155: 25004,
+	40156: 24980,
+	40157: 24986,
+	40158: 24970,
+	40159: 24977,
+	40160: 25003,
+	40161: 25006,
+	40162: 25036,
+	40163: 25034,
+	40164: 25033,
+	40165: 25079,
+	40166: 25032,
+	40167: 25027,
+	40168: 25030,
+	40169: 25018,
+	40170: 25035,
+	40171: 32633,
+	40172: 25037,
+	40173: 25062,
+	40174: 25059,
+	40175: 25078,
+	40176: 25082,
+	40177: 25076,
+	40178: 25087,
+	40179: 25085,
+	40180: 25084,
+	40181: 25086,
+	40182: 25088,
+	40183: 25096,
+	40184: 25097,
+	40185: 25101,
+	40186: 25100,
+	40187: 25108,
+	40188: 25115,
+	40256: 25118,
+	40257: 25121,
+	40258: 25130,
+	40259: 25134,
+	40260: 25136,
+	40261: 25138,
+	40262: 25139,
+	40263: 25153,
+	40264: 25166,
+	40265: 25182,
+	40266: 25187,
+	40267: 25179,
+	40268: 25184,
+	40269: 25192,
+	40270: 25212,
+	40271: 25218,
+	40272: 25225,
+	40273: 25214,
+	40274: 25234,
+	40275: 25235,
+	40276: 25238,
+	40277: 25300,
+	40278: 25219,
+	40279: 25236,
+	40280: 25303,
+	40281: 25297,
+	40282: 25275,
+	40283: 25295,
+	40284: 25343,
+	40285: 25286,
+	40286: 25812,
+	40287: 25288,
+	40288: 25308,
+	40289: 25292,
+	40290: 25290,
+	40291: 25282,
+	40292: 25287,
+	40293: 25243,
+	40294: 25289,
+	40295: 25356,
+	40296: 25326,
+	40297: 25329,
+	40298: 25383,
+	40299: 25346,
+	40300: 25352,
+	40301: 25327,
+	40302: 25333,
+	40303: 25424,
+	40304: 25406,
+	40305: 25421,
+	40306: 25628,
+	40307: 25423,
+	40308: 25494,
+	40309: 25486,
+	40310: 25472,
+	40311: 25515,
+	40312: 25462,
+	40313: 25507,
+	40314: 25487,
+	40315: 25481,
+	40316: 25503,
+	40317: 25525,
+	40318: 25451,
+	40320: 25449,
+	40321: 25534,
+	40322: 25577,
+	40323: 25536,
+	40324: 25542,
+	40325: 25571,
+	40326: 25545,
+	40327: 25554,
+	40328: 25590,
+	40329: 25540,
+	40330: 25622,
+	40331: 25652,
+	40332: 25606,
+	40333: 25619,
+	40334: 25638,
+	40335: 25654,
+	40336: 25885,
+	40337: 25623,
+	40338: 25640,
+	40339: 25615,
+	40340: 25703,
+	40341: 25711,
+	40342: 25718,
+	40343: 25678,
+	40344: 25898,
+	40345: 25749,
+	40346: 25747,
+	40347: 25765,
+	40348: 25769,
+	40349: 25736,
+	40350: 25788,
+	40351: 25818,
+	40352: 25810,
+	40353: 25797,
+	40354: 25799,
+	40355: 25787,
+	40356: 25816,
+	40357: 25794,
+	40358: 25841,
+	40359: 25831,
+	40360: 33289,
+	40361: 25824,
+	40362: 25825,
+	40363: 25260,
+	40364: 25827,
+	40365: 25839,
+	40366: 25900,
+	40367: 25846,
+	40368: 25844,
+	40369: 25842,
+	40370: 25850,
+	40371: 25856,
+	40372: 25853,
+	40373: 25880,
+	40374: 25884,
+	40375: 25861,
+	40376: 25892,
+	40377: 25891,
+	40378: 25899,
+	40379: 25908,
+	40380: 25909,
+	40381: 25911,
+	40382: 25910,
+	40383: 25912,
+	40384: 30027,
+	40385: 25928,
+	40386: 25942,
+	40387: 25941,
+	40388: 25933,
+	40389: 25944,
+	40390: 25950,
+	40391: 25949,
+	40392: 25970,
+	40393: 25976,
+	40394: 25986,
+	40395: 25987,
+	40396: 35722,
+	40397: 26011,
+	40398: 26015,
+	40399: 26027,
+	40400: 26039,
+	40401: 26051,
+	40402: 26054,
+	40403: 26049,
+	40404: 26052,
+	40405: 26060,
+	40406: 26066,
+	40407: 26075,
+	40408: 26073,
+	40409: 26080,
+	40410: 26081,
+	40411: 26097,
+	40412: 26482,
+	40413: 26122,
+	40414: 26115,
+	40415: 26107,
+	40416: 26483,
+	40417: 26165,
+	40418: 26166,
+	40419: 26164,
+	40420: 26140,
+	40421: 26191,
+	40422: 26180,
+	40423: 26185,
+	40424: 26177,
+	40425: 26206,
+	40426: 26205,
+	40427: 26212,
+	40428: 26215,
+	40429: 26216,
+	40430: 26207,
+	40431: 26210,
+	40432: 26224,
+	40433: 26243,
+	40434: 26248,
+	40435: 26254,
+	40436: 26249,
+	40437: 26244,
+	40438: 26264,
+	40439: 26269,
+	40440: 26305,
+	40441: 26297,
+	40442: 26313,
+	40443: 26302,
+	40444: 26300,
+	40512: 26308,
+	40513: 26296,
+	40514: 26326,
+	40515: 26330,
+	40516: 26336,
+	40517: 26175,
+	40518: 26342,
+	40519: 26345,
+	40520: 26352,
+	40521: 26357,
+	40522: 26359,
+	40523: 26383,
+	40524: 26390,
+	40525: 26398,
+	40526: 26406,
+	40527: 26407,
+	40528: 38712,
+	40529: 26414,
+	40530: 26431,
+	40531: 26422,
+	40532: 26433,
+	40533: 26424,
+	40534: 26423,
+	40535: 26438,
+	40536: 26462,
+	40537: 26464,
+	40538: 26457,
+	40539: 26467,
+	40540: 26468,
+	40541: 26505,
+	40542: 26480,
+	40543: 26537,
+	40544: 26492,
+	40545: 26474,
+	40546: 26508,
+	40547: 26507,
+	40548: 26534,
+	40549: 26529,
+	40550: 26501,
+	40551: 26551,
+	40552: 26607,
+	40553: 26548,
+	40554: 26604,
+	40555: 26547,
+	40556: 26601,
+	40557: 26552,
+	40558: 26596,
+	40559: 26590,
+	40560: 26589,
+	40561: 26594,
+	40562: 26606,
+	40563: 26553,
+	40564: 26574,
+	40565: 26566,
+	40566: 26599,
+	40567: 27292,
+	40568: 26654,
+	40569: 26694,
+	40570: 26665,
+	40571: 26688,
+	40572: 26701,
+	40573: 26674,
+	40574: 26702,
+	40576: 26803,
+	40577: 26667,
+	40578: 26713,
+	40579: 26723,
+	40580: 26743,
+	40581: 26751,
+	40582: 26783,
+	40583: 26767,
+	40584: 26797,
+	40585: 26772,
+	40586: 26781,
+	40587: 26779,
+	40588: 26755,
+	40589: 27310,
+	40590: 26809,
+	40591: 26740,
+	40592: 26805,
+	40593: 26784,
+	40594: 26810,
+	40595: 26895,
+	40596: 26765,
+	40597: 26750,
+	40598: 26881,
+	40599: 26826,
+	40600: 26888,
+	40601: 26840,
+	40602: 26914,
+	40603: 26918,
+	40604: 26849,
+	40605: 26892,
+	40606: 26829,
+	40607: 26836,
+	40608: 26855,
+	40609: 26837,
+	40610: 26934,
+	40611: 26898,
+	40612: 26884,
+	40613: 26839,
+	40614: 26851,
+	40615: 26917,
+	40616: 26873,
+	40617: 26848,
+	40618: 26863,
+	40619: 26920,
+	40620: 26922,
+	40621: 26906,
+	40622: 26915,
+	40623: 26913,
+	40624: 26822,
+	40625: 27001,
+	40626: 26999,
+	40627: 26972,
+	40628: 27000,
+	40629: 26987,
+	40630: 26964,
+	40631: 27006,
+	40632: 26990,
+	40633: 26937,
+	40634: 26996,
+	40635: 26941,
+	40636: 26969,
+	40637: 26928,
+	40638: 26977,
+	40639: 26974,
+	40640: 26973,
+	40641: 27009,
+	40642: 26986,
+	40643: 27058,
+	40644: 27054,
+	40645: 27088,
+	40646: 27071,
+	40647: 27073,
+	40648: 27091,
+	40649: 27070,
+	40650: 27086,
+	40651: 23528,
+	40652: 27082,
+	40653: 27101,
+	40654: 27067,
+	40655: 27075,
+	40656: 27047,
+	40657: 27182,
+	40658: 27025,
+	40659: 27040,
+	40660: 27036,
+	40661: 27029,
+	40662: 27060,
+	40663: 27102,
+	40664: 27112,
+	40665: 27138,
+	40666: 27163,
+	40667: 27135,
+	40668: 27402,
+	40669: 27129,
+	40670: 27122,
+	40671: 27111,
+	40672: 27141,
+	40673: 27057,
+	40674: 27166,
+	40675: 27117,
+	40676: 27156,
+	40677: 27115,
+	40678: 27146,
+	40679: 27154,
+	40680: 27329,
+	40681: 27171,
+	40682: 27155,
+	40683: 27204,
+	40684: 27148,
+	40685: 27250,
+	40686: 27190,
+	40687: 27256,
+	40688: 27207,
+	40689: 27234,
+	40690: 27225,
+	40691: 27238,
+	40692: 27208,
+	40693: 27192,
+	40694: 27170,
+	40695: 27280,
+	40696: 27277,
+	40697: 27296,
+	40698: 27268,
+	40699: 27298,
+	40700: 27299,
+	40768: 27287,
+	40769: 34327,
+	40770: 27323,
+	40771: 27331,
+	40772: 27330,
+	40773: 27320,
+	40774: 27315,
+	40775: 27308,
+	40776: 27358,
+	40777: 27345,
+	40778: 27359,
+	40779: 27306,
+	40780: 27354,
+	40781: 27370,
+	40782: 27387,
+	40783: 27397,
+	40784: 34326,
+	40785: 27386,
+	40786: 27410,
+	40787: 27414,
+	40788: 39729,
+	40789: 27423,
+	40790: 27448,
+	40791: 27447,
+	40792: 30428,
+	40793: 27449,
+	40794: 39150,
+	40795: 27463,
+	40796: 27459,
+	40797: 27465,
+	40798: 27472,
+	40799: 27481,
+	40800: 27476,
+	40801: 27483,
+	40802: 27487,
+	40803: 27489,
+	40804: 27512,
+	40805: 27513,
+	40806: 27519,
+	40807: 27520,
+	40808: 27524,
+	40809: 27523,
+	40810: 27533,
+	40811: 27544,
+	40812: 27541,
+	40813: 27550,
+	40814: 27556,
+	40815: 27562,
+	40816: 27563,
+	40817: 27567,
+	40818: 27570,
+	40819: 27569,
+	40820: 27571,
+	40821: 27575,
+	40822: 27580,
+	40823: 27590,
+	40824: 27595,
+	40825: 27603,
+	40826: 27615,
+	40827: 27628,
+	40828: 27627,
+	40829: 27635,
+	40830: 27631,
+	40832: 40638,
+	40833: 27656,
+	40834: 27667,
+	40835: 27668,
+	40836: 27675,
+	40837: 27684,
+	40838: 27683,
+	40839: 27742,
+	40840: 27733,
+	40841: 27746,
+	40842: 27754,
+	40843: 27778,
+	40844: 27789,
+	40845: 27802,
+	40846: 27777,
+	40847: 27803,
+	40848: 27774,
+	40849: 27752,
+	40850: 27763,
+	40851: 27794,
+	40852: 27792,
+	40853: 27844,
+	40854: 27889,
+	40855: 27859,
+	40856: 27837,
+	40857: 27863,
+	40858: 27845,
+	40859: 27869,
+	40860: 27822,
+	40861: 27825,
+	40862: 27838,
+	40863: 27834,
+	40864: 27867,
+	40865: 27887,
+	40866: 27865,
+	40867: 27882,
+	40868: 27935,
+	40869: 34893,
+	40870: 27958,
+	40871: 27947,
+	40872: 27965,
+	40873: 27960,
+	40874: 27929,
+	40875: 27957,
+	40876: 27955,
+	40877: 27922,
+	40878: 27916,
+	40879: 28003,
+	40880: 28051,
+	40881: 28004,
+	40882: 27994,
+	40883: 28025,
+	40884: 27993,
+	40885: 28046,
+	40886: 28053,
+	40887: 28644,
+	40888: 28037,
+	40889: 28153,
+	40890: 28181,
+	40891: 28170,
+	40892: 28085,
+	40893: 28103,
+	40894: 28134,
+	40895: 28088,
+	40896: 28102,
+	40897: 28140,
+	40898: 28126,
+	40899: 28108,
+	40900: 28136,
+	40901: 28114,
+	40902: 28101,
+	40903: 28154,
+	40904: 28121,
+	40905: 28132,
+	40906: 28117,
+	40907: 28138,
+	40908: 28142,
+	40909: 28205,
+	40910: 28270,
+	40911: 28206,
+	40912: 28185,
+	40913: 28274,
+	40914: 28255,
+	40915: 28222,
+	40916: 28195,
+	40917: 28267,
+	40918: 28203,
+	40919: 28278,
+	40920: 28237,
+	40921: 28191,
+	40922: 28227,
+	40923: 28218,
+	40924: 28238,
+	40925: 28196,
+	40926: 28415,
+	40927: 28189,
+	40928: 28216,
+	40929: 28290,
+	40930: 28330,
+	40931: 28312,
+	40932: 28361,
+	40933: 28343,
+	40934: 28371,
+	40935: 28349,
+	40936: 28335,
+	40937: 28356,
+	40938: 28338,
+	40939: 28372,
+	40940: 28373,
+	40941: 28303,
+	40942: 28325,
+	40943: 28354,
+	40944: 28319,
+	40945: 28481,
+	40946: 28433,
+	40947: 28748,
+	40948: 28396,
+	40949: 28408,
+	40950: 28414,
+	40951: 28479,
+	40952: 28402,
+	40953: 28465,
+	40954: 28399,
+	40955: 28466,
+	40956: 28364,
+	57408: 28478,
+	57409: 28435,
+	57410: 28407,
+	57411: 28550,
+	57412: 28538,
+	57413: 28536,
+	57414: 28545,
+	57415: 28544,
+	57416: 28527,
+	57417: 28507,
+	57418: 28659,
+	57419: 28525,
+	57420: 28546,
+	57421: 28540,
+	57422: 28504,
+	57423: 28558,
+	57424: 28561,
+	57425: 28610,
+	57426: 28518,
+	57427: 28595,
+	57428: 28579,
+	57429: 28577,
+	57430: 28580,
+	57431: 28601,
+	57432: 28614,
+	57433: 28586,
+	57434: 28639,
+	57435: 28629,
+	57436: 28652,
+	57437: 28628,
+	57438: 28632,
+	57439: 28657,
+	57440: 28654,
+	57441: 28635,
+	57442: 28681,
+	57443: 28683,
+	57444: 28666,
+	57445: 28689,
+	57446: 28673,
+	57447: 28687,
+	57448: 28670,
+	57449: 28699,
+	57450: 28698,
+	57451: 28532,
+	57452: 28701,
+	57453: 28696,
+	57454: 28703,
+	57455: 28720,
+	57456: 28734,
+	57457: 28722,
+	57458: 28753,
+	57459: 28771,
+	57460: 28825,
+	57461: 28818,
+	57462: 28847,
+	57463: 28913,
+	57464: 28844,
+	57465: 28856,
+	57466: 28851,
+	57467: 28846,
+	57468: 28895,
+	57469: 28875,
+	57470: 28893,
+	57472: 28889,
+	57473: 28937,
+	57474: 28925,
+	57475: 28956,
+	57476: 28953,
+	57477: 29029,
+	57478: 29013,
+	57479: 29064,
+	57480: 29030,
+	57481: 29026,
+	57482: 29004,
+	57483: 29014,
+	57484: 29036,
+	57485: 29071,
+	57486: 29179,
+	57487: 29060,
+	57488: 29077,
+	57489: 29096,
+	57490: 29100,
+	57491: 29143,
+	57492: 29113,
+	57493: 29118,
+	57494: 29138,
+	57495: 29129,
+	57496: 29140,
+	57497: 29134,
+	57498: 29152,
+	57499: 29164,
+	57500: 29159,
+	57501: 29173,
+	57502: 29180,
+	57503: 29177,
+	57504: 29183,
+	57505: 29197,
+	57506: 29200,
+	57507: 29211,
+	57508: 29224,
+	57509: 29229,
+	57510: 29228,
+	57511: 29232,
+	57512: 29234,
+	57513: 29243,
+	57514: 29244,
+	57515: 29247,
+	57516: 29248,
+	57517: 29254,
+	57518: 29259,
+	57519: 29272,
+	57520: 29300,
+	57521: 29310,
+	57522: 29314,
+	57523: 29313,
+	57524: 29319,
+	57525: 29330,
+	57526: 29334,
+	57527: 29346,
+	57528: 29351,
+	57529: 29369,
+	57530: 29362,
+	57531: 29379,
+	57532: 29382,
+	57533: 29380,
+	57534: 29390,
+	57535: 29394,
+	57536: 29410,
+	57537: 29408,
+	57538: 29409,
+	57539: 29433,
+	57540: 29431,
+	57541: 20495,
+	57542: 29463,
+	57543: 29450,
+	57544: 29468,
+	57545: 29462,
+	57546: 29469,
+	57547: 29492,
+	57548: 29487,
+	57549: 29481,
+	57550: 29477,
+	57551: 29502,
+	57552: 29518,
+	57553: 29519,
+	57554: 40664,
+	57555: 29527,
+	57556: 29546,
+	57557: 29544,
+	57558: 29552,
+	57559: 29560,
+	57560: 29557,
+	57561: 29563,
+	57562: 29562,
+	57563: 29640,
+	57564: 29619,
+	57565: 29646,
+	57566: 29627,
+	57567: 29632,
+	57568: 29669,
+	57569: 29678,
+	57570: 29662,
+	57571: 29858,
+	57572: 29701,
+	57573: 29807,
+	57574: 29733,
+	57575: 29688,
+	57576: 29746,
+	57577: 29754,
+	57578: 29781,
+	57579: 29759,
+	57580: 29791,
+	57581: 29785,
+	57582: 29761,
+	57583: 29788,
+	57584: 29801,
+	57585: 29808,
+	57586: 29795,
+	57587: 29802,
+	57588: 29814,
+	57589: 29822,
+	57590: 29835,
+	57591: 29854,
+	57592: 29863,
+	57593: 29898,
+	57594: 29903,
+	57595: 29908,
+	57596: 29681,
+	57664: 29920,
+	57665: 29923,
+	57666: 29927,
+	57667: 29929,
+	57668: 29934,
+	57669: 29938,
+	57670: 29936,
+	57671: 29937,
+	57672: 29944,
+	57673: 29943,
+	57674: 29956,
+	57675: 29955,
+	57676: 29957,
+	57677: 29964,
+	57678: 29966,
+	57679: 29965,
+	57680: 29973,
+	57681: 29971,
+	57682: 29982,
+	57683: 29990,
+	57684: 29996,
+	57685: 30012,
+	57686: 30020,
+	57687: 30029,
+	57688: 30026,
+	57689: 30025,
+	57690: 30043,
+	57691: 30022,
+	57692: 30042,
+	57693: 30057,
+	57694: 30052,
+	57695: 30055,
+	57696: 30059,
+	57697: 30061,
+	57698: 30072,
+	57699: 30070,
+	57700: 30086,
+	57701: 30087,
+	57702: 30068,
+	57703: 30090,
+	57704: 30089,
+	57705: 30082,
+	57706: 30100,
+	57707: 30106,
+	57708: 30109,
+	57709: 30117,
+	57710: 30115,
+	57711: 30146,
+	57712: 30131,
+	57713: 30147,
+	57714: 30133,
+	57715: 30141,
+	57716: 30136,
+	57717: 30140,
+	57718: 30129,
+	57719: 30157,
+	57720: 30154,
+	57721: 30162,
+	57722: 30169,
+	57723: 30179,
+	57724: 30174,
+	57725: 30206,
+	57726: 30207,
+	57728: 30204,
+	57729: 30209,
+	57730: 30192,
+	57731: 30202,
+	57732: 30194,
+	57733: 30195,
+	57734: 30219,
+	57735: 30221,
+	57736: 30217,
+	57737: 30239,
+	57738: 30247,
+	57739: 30240,
+	57740: 30241,
+	57741: 30242,
+	57742: 30244,
+	57743: 30260,
+	57744: 30256,
+	57745: 30267,
+	57746: 30279,
+	57747: 30280,
+	57748: 30278,
+	57749: 30300,
+	57750: 30296,
+	57751: 30305,
+	57752: 30306,
+	57753: 30312,
+	57754: 30313,
+	57755: 30314,
+	57756: 30311,
+	57757: 30316,
+	57758: 30320,
+	57759: 30322,
+	57760: 30326,
+	57761: 30328,
+	57762: 30332,
+	57763: 30336,
+	57764: 30339,
+	57765: 30344,
+	57766: 30347,
+	57767: 30350,
+	57768: 30358,
+	57769: 30355,
+	57770: 30361,
+	57771: 30362,
+	57772: 30384,
+	57773: 30388,
+	57774: 30392,
+	57775: 30393,
+	57776: 30394,
+	57777: 30402,
+	57778: 30413,
+	57779: 30422,
+	57780: 30418,
+	57781: 30430,
+	57782: 30433,
+	57783: 30437,
+	57784: 30439,
+	57785: 30442,
+	57786: 34351,
+	57787: 30459,
+	57788: 30472,
+	57789: 30471,
+	57790: 30468,
+	57791: 30505,
+	57792: 30500,
+	57793: 30494,
+	57794: 30501,
+	57795: 30502,
+	57796: 30491,
+	57797: 30519,
+	57798: 30520,
+	57799: 30535,
+	57800: 30554,
+	57801: 30568,
+	57802: 30571,
+	57803: 30555,
+	57804: 30565,
+	57805: 30591,
+	57806: 30590,
+	57807: 30585,
+	57808: 30606,
+	57809: 30603,
+	57810: 30609,
+	57811: 30624,
+	57812: 30622,
+	57813: 30640,
+	57814: 30646,
+	57815: 30649,
+	57816: 30655,
+	57817: 30652,
+	57818: 30653,
+	57819: 30651,
+	57820: 30663,
+	57821: 30669,
+	57822: 30679,
+	57823: 30682,
+	57824: 30684,
+	57825: 30691,
+	57826: 30702,
+	57827: 30716,
+	57828: 30732,
+	57829: 30738,
+	57830: 31014,
+	57831: 30752,
+	57832: 31018,
+	57833: 30789,
+	57834: 30862,
+	57835: 30836,
+	57836: 30854,
+	57837: 30844,
+	57838: 30874,
+	57839: 30860,
+	57840: 30883,
+	57841: 30901,
+	57842: 30890,
+	57843: 30895,
+	57844: 30929,
+	57845: 30918,
+	57846: 30923,
+	57847: 30932,
+	57848: 30910,
+	57849: 30908,
+	57850: 30917,
+	57851: 30922,
+	57852: 30956,
+	57920: 30951,
+	57921: 30938,
+	57922: 30973,
+	57923: 30964,
+	57924: 30983,
+	57925: 30994,
+	57926: 30993,
+	57927: 31001,
+	57928: 31020,
+	57929: 31019,
+	57930: 31040,
+	57931: 31072,
+	57932: 31063,
+	57933: 31071,
+	57934: 31066,
+	57935: 31061,
+	57936: 31059,
+	57937: 31098,
+	57938: 31103,
+	57939: 31114,
+	57940: 31133,
+	57941: 31143,
+	57942: 40779,
+	57943: 31146,
+	57944: 31150,
+	57945: 31155,
+	57946: 31161,
+	57947: 31162,
+	57948: 31177,
+	57949: 31189,
+	57950: 31207,
+	57951: 31212,
+	57952: 31201,
+	57953: 31203,
+	57954: 31240,
+	57955: 31245,
+	57956: 31256,
+	57957: 31257,
+	57958: 31264,
+	57959: 31263,
+	57960: 31104,
+	57961: 31281,
+	57962: 31291,
+	57963: 31294,
+	57964: 31287,
+	57965: 31299,
+	57966: 31319,
+	57967: 31305,
+	57968: 31329,
+	57969: 31330,
+	57970: 31337,
+	57971: 40861,
+	57972: 31344,
+	57973: 31353,
+	57974: 31357,
+	57975: 31368,
+	57976: 31383,
+	57977: 31381,
+	57978: 31384,
+	57979: 31382,
+	57980: 31401,
+	57981: 31432,
+	57982: 31408,
+	57984: 31414,
+	57985: 31429,
+	57986: 31428,
+	57987: 31423,
+	57988: 36995,
+	57989: 31431,
+	57990: 31434,
+	57991: 31437,
+	57992: 31439,
+	57993: 31445,
+	57994: 31443,
+	57995: 31449,
+	57996: 31450,
+	57997: 31453,
+	57998: 31457,
+	57999: 31458,
+	58000: 31462,
+	58001: 31469,
+	58002: 31472,
+	58003: 31490,
+	58004: 31503,
+	58005: 31498,
+	58006: 31494,
+	58007: 31539,
+	58008: 31512,
+	58009: 31513,
+	58010: 31518,
+	58011: 31541,
+	58012: 31528,
+	58013: 31542,
+	58014: 31568,
+	58015: 31610,
+	58016: 31492,
+	58017: 31565,
+	58018: 31499,
+	58019: 31564,
+	58020: 31557,
+	58021: 31605,
+	58022: 31589,
+	58023: 31604,
+	58024: 31591,
+	58025: 31600,
+	58026: 31601,
+	58027: 31596,
+	58028: 31598,
+	58029: 31645,
+	58030: 31640,
+	58031: 31647,
+	58032: 31629,
+	58033: 31644,
+	58034: 31642,
+	58035: 31627,
+	58036: 31634,
+	58037: 31631,
+	58038: 31581,
+	58039: 31641,
+	58040: 31691,
+	58041: 31681,
+	58042: 31692,
+	58043: 31695,
+	58044: 31668,
+	58045: 31686,
+	58046: 31709,
+	58047: 31721,
+	58048: 31761,
+	58049: 31764,
+	58050: 31718,
+	58051: 31717,
+	58052: 31840,
+	58053: 31744,
+	58054: 31751,
+	58055: 31763,
+	58056: 31731,
+	58057: 31735,
+	58058: 31767,
+	58059: 31757,
+	58060: 31734,
+	58061: 31779,
+	58062: 31783,
+	58063: 31786,
+	58064: 31775,
+	58065: 31799,
+	58066: 31787,
+	58067: 31805,
+	58068: 31820,
+	58069: 31811,
+	58070: 31828,
+	58071: 31823,
+	58072: 31808,
+	58073: 31824,
+	58074: 31832,
+	58075: 31839,
+	58076: 31844,
+	58077: 31830,
+	58078: 31845,
+	58079: 31852,
+	58080: 31861,
+	58081: 31875,
+	58082: 31888,
+	58083: 31908,
+	58084: 31917,
+	58085: 31906,
+	58086: 31915,
+	58087: 31905,
+	58088: 31912,
+	58089: 31923,
+	58090: 31922,
+	58091: 31921,
+	58092: 31918,
+	58093: 31929,
+	58094: 31933,
+	58095: 31936,
+	58096: 31941,
+	58097: 31938,
+	58098: 31960,
+	58099: 31954,
+	58100: 31964,
+	58101: 31970,
+	58102: 39739,
+	58103: 31983,
+	58104: 31986,
+	58105: 31988,
+	58106: 31990,
+	58107: 31994,
+	58108: 32006,
+	58176: 32002,
+	58177: 32028,
+	58178: 32021,
+	58179: 32010,
+	58180: 32069,
+	58181: 32075,
+	58182: 32046,
+	58183: 32050,
+	58184: 32063,
+	58185: 32053,
+	58186: 32070,
+	58187: 32115,
+	58188: 32086,
+	58189: 32078,
+	58190: 32114,
+	58191: 32104,
+	58192: 32110,
+	58193: 32079,
+	58194: 32099,
+	58195: 32147,
+	58196: 32137,
+	58197: 32091,
+	58198: 32143,
+	58199: 32125,
+	58200: 32155,
+	58201: 32186,
+	58202: 32174,
+	58203: 32163,
+	58204: 32181,
+	58205: 32199,
+	58206: 32189,
+	58207: 32171,
+	58208: 32317,
+	58209: 32162,
+	58210: 32175,
+	58211: 32220,
+	58212: 32184,
+	58213: 32159,
+	58214: 32176,
+	58215: 32216,
+	58216: 32221,
+	58217: 32228,
+	58218: 32222,
+	58219: 32251,
+	58220: 32242,
+	58221: 32225,
+	58222: 32261,
+	58223: 32266,
+	58224: 32291,
+	58225: 32289,
+	58226: 32274,
+	58227: 32305,
+	58228: 32287,
+	58229: 32265,
+	58230: 32267,
+	58231: 32290,
+	58232: 32326,
+	58233: 32358,
+	58234: 32315,
+	58235: 32309,
+	58236: 32313,
+	58237: 32323,
+	58238: 32311,
+	58240: 32306,
+	58241: 32314,
+	58242: 32359,
+	58243: 32349,
+	58244: 32342,
+	58245: 32350,
+	58246: 32345,
+	58247: 32346,
+	58248: 32377,
+	58249: 32362,
+	58250: 32361,
+	58251: 32380,
+	58252: 32379,
+	58253: 32387,
+	58254: 32213,
+	58255: 32381,
+	58256: 36782,
+	58257: 32383,
+	58258: 32392,
+	58259: 32393,
+	58260: 32396,
+	58261: 32402,
+	58262: 32400,
+	58263: 32403,
+	58264: 32404,
+	58265: 32406,
+	58266: 32398,
+	58267: 32411,
+	58268: 32412,
+	58269: 32568,
+	58270: 32570,
+	58271: 32581,
+	58272: 32588,
+	58273: 32589,
+	58274: 32590,
+	58275: 32592,
+	58276: 32593,
+	58277: 32597,
+	58278: 32596,
+	58279: 32600,
+	58280: 32607,
+	58281: 32608,
+	58282: 32616,
+	58283: 32617,
+	58284: 32615,
+	58285: 32632,
+	58286: 32642,
+	58287: 32646,
+	58288: 32643,
+	58289: 32648,
+	58290: 32647,
+	58291: 32652,
+	58292: 32660,
+	58293: 32670,
+	58294: 32669,
+	58295: 32666,
+	58296: 32675,
+	58297: 32687,
+	58298: 32690,
+	58299: 32697,
+	58300: 32686,
+	58301: 32694,
+	58302: 32696,
+	58303: 35697,
+	58304: 32709,
+	58305: 32710,
+	58306: 32714,
+	58307: 32725,
+	58308: 32724,
+	58309: 32737,
+	58310: 32742,
+	58311: 32745,
+	58312: 32755,
+	58313: 32761,
+	58314: 39132,
+	58315: 32774,
+	58316: 32772,
+	58317: 32779,
+	58318: 32786,
+	58319: 32792,
+	58320: 32793,
+	58321: 32796,
+	58322: 32801,
+	58323: 32808,
+	58324: 32831,
+	58325: 32827,
+	58326: 32842,
+	58327: 32838,
+	58328: 32850,
+	58329: 32856,
+	58330: 32858,
+	58331: 32863,
+	58332: 32866,
+	58333: 32872,
+	58334: 32883,
+	58335: 32882,
+	58336: 32880,
+	58337: 32886,
+	58338: 32889,
+	58339: 32893,
+	58340: 32895,
+	58341: 32900,
+	58342: 32902,
+	58343: 32901,
+	58344: 32923,
+	58345: 32915,
+	58346: 32922,
+	58347: 32941,
+	58348: 20880,
+	58349: 32940,
+	58350: 32987,
+	58351: 32997,
+	58352: 32985,
+	58353: 32989,
+	58354: 32964,
+	58355: 32986,
+	58356: 32982,
+	58357: 33033,
+	58358: 33007,
+	58359: 33009,
+	58360: 33051,
+	58361: 33065,
+	58362: 33059,
+	58363: 33071,
+	58364: 33099,
+	58432: 38539,
+	58433: 33094,
+	58434: 33086,
+	58435: 33107,
+	58436: 33105,
+	58437: 33020,
+	58438: 33137,
+	58439: 33134,
+	58440: 33125,
+	58441: 33126,
+	58442: 33140,
+	58443: 33155,
+	58444: 33160,
+	58445: 33162,
+	58446: 33152,
+	58447: 33154,
+	58448: 33184,
+	58449: 33173,
+	58450: 33188,
+	58451: 33187,
+	58452: 33119,
+	58453: 33171,
+	58454: 33193,
+	58455: 33200,
+	58456: 33205,
+	58457: 33214,
+	58458: 33208,
+	58459: 33213,
+	58460: 33216,
+	58461: 33218,
+	58462: 33210,
+	58463: 33225,
+	58464: 33229,
+	58465: 33233,
+	58466: 33241,
+	58467: 33240,
+	58468: 33224,
+	58469: 33242,
+	58470: 33247,
+	58471: 33248,
+	58472: 33255,
+	58473: 33274,
+	58474: 33275,
+	58475: 33278,
+	58476: 33281,
+	58477: 33282,
+	58478: 33285,
+	58479: 33287,
+	58480: 33290,
+	58481: 33293,
+	58482: 33296,
+	58483: 33302,
+	58484: 33321,
+	58485: 33323,
+	58486: 33336,
+	58487: 33331,
+	58488: 33344,
+	58489: 33369,
+	58490: 33368,
+	58491: 33373,
+	58492: 33370,
+	58493: 33375,
+	58494: 33380,
+	58496: 33378,
+	58497: 33384,
+	58498: 33386,
+	58499: 33387,
+	58500: 33326,
+	58501: 33393,
+	58502: 33399,
+	58503: 33400,
+	58504: 33406,
+	58505: 33421,
+	58506: 33426,
+	58507: 33451,
+	58508: 33439,
+	58509: 33467,
+	58510: 33452,
+	58511: 33505,
+	58512: 33507,
+	58513: 33503,
+	58514: 33490,
+	58515: 33524,
+	58516: 33523,
+	58517: 33530,
+	58518: 33683,
+	58519: 33539,
+	58520: 33531,
+	58521: 33529,
+	58522: 33502,
+	58523: 33542,
+	58524: 33500,
+	58525: 33545,
+	58526: 33497,
+	58527: 33589,
+	58528: 33588,
+	58529: 33558,
+	58530: 33586,
+	58531: 33585,
+	58532: 33600,
+	58533: 33593,
+	58534: 33616,
+	58535: 33605,
+	58536: 33583,
+	58537: 33579,
+	58538: 33559,
+	58539: 33560,
+	58540: 33669,
+	58541: 33690,
+	58542: 33706,
+	58543: 33695,
+	58544: 33698,
+	58545: 33686,
+	58546: 33571,
+	58547: 33678,
+	58548: 33671,
+	58549: 33674,
+	58550: 33660,
+	58551: 33717,
+	58552: 33651,
+	58553: 33653,
+	58554: 33696,
+	58555: 33673,
+	58556: 33704,
+	58557: 33780,
+	58558: 33811,
+	58559: 33771,
+	58560: 33742,
+	58561: 33789,
+	58562: 33795,
+	58563: 33752,
+	58564: 33803,
+	58565: 33729,
+	58566: 33783,
+	58567: 33799,
+	58568: 33760,
+	58569: 33778,
+	58570: 33805,
+	58571: 33826,
+	58572: 33824,
+	58573: 33725,
+	58574: 33848,
+	58575: 34054,
+	58576: 33787,
+	58577: 33901,
+	58578: 33834,
+	58579: 33852,
+	58580: 34138,
+	58581: 33924,
+	58582: 33911,
+	58583: 33899,
+	58584: 33965,
+	58585: 33902,
+	58586: 33922,
+	58587: 33897,
+	58588: 33862,
+	58589: 33836,
+	58590: 33903,
+	58591: 33913,
+	58592: 33845,
+	58593: 33994,
+	58594: 33890,
+	58595: 33977,
+	58596: 33983,
+	58597: 33951,
+	58598: 34009,
+	58599: 33997,
+	58600: 33979,
+	58601: 34010,
+	58602: 34000,
+	58603: 33985,
+	58604: 33990,
+	58605: 34006,
+	58606: 33953,
+	58607: 34081,
+	58608: 34047,
+	58609: 34036,
+	58610: 34071,
+	58611: 34072,
+	58612: 34092,
+	58613: 34079,
+	58614: 34069,
+	58615: 34068,
+	58616: 34044,
+	58617: 34112,
+	58618: 34147,
+	58619: 34136,
+	58620: 34120,
+	58688: 34113,
+	58689: 34306,
+	58690: 34123,
+	58691: 34133,
+	58692: 34176,
+	58693: 34212,
+	58694: 34184,
+	58695: 34193,
+	58696: 34186,
+	58697: 34216,
+	58698: 34157,
+	58699: 34196,
+	58700: 34203,
+	58701: 34282,
+	58702: 34183,
+	58703: 34204,
+	58704: 34167,
+	58705: 34174,
+	58706: 34192,
+	58707: 34249,
+	58708: 34234,
+	58709: 34255,
+	58710: 34233,
+	58711: 34256,
+	58712: 34261,
+	58713: 34269,
+	58714: 34277,
+	58715: 34268,
+	58716: 34297,
+	58717: 34314,
+	58718: 34323,
+	58719: 34315,
+	58720: 34302,
+	58721: 34298,
+	58722: 34310,
+	58723: 34338,
+	58724: 34330,
+	58725: 34352,
+	58726: 34367,
+	58727: 34381,
+	58728: 20053,
+	58729: 34388,
+	58730: 34399,
+	58731: 34407,
+	58732: 34417,
+	58733: 34451,
+	58734: 34467,
+	58735: 34473,
+	58736: 34474,
+	58737: 34443,
+	58738: 34444,
+	58739: 34486,
+	58740: 34479,
+	58741: 34500,
+	58742: 34502,
+	58743: 34480,
+	58744: 34505,
+	58745: 34851,
+	58746: 34475,
+	58747: 34516,
+	58748: 34526,
+	58749: 34537,
+	58750: 34540,
+	58752: 34527,
+	58753: 34523,
+	58754: 34543,
+	58755: 34578,
+	58756: 34566,
+	58757: 34568,
+	58758: 34560,
+	58759: 34563,
+	58760: 34555,
+	58761: 34577,
+	58762: 34569,
+	58763: 34573,
+	58764: 34553,
+	58765: 34570,
+	58766: 34612,
+	58767: 34623,
+	58768: 34615,
+	58769: 34619,
+	58770: 34597,
+	58771: 34601,
+	58772: 34586,
+	58773: 34656,
+	58774: 34655,
+	58775: 34680,
+	58776: 34636,
+	58777: 34638,
+	58778: 34676,
+	58779: 34647,
+	58780: 34664,
+	58781: 34670,
+	58782: 34649,
+	58783: 34643,
+	58784: 34659,
+	58785: 34666,
+	58786: 34821,
+	58787: 34722,
+	58788: 34719,
+	58789: 34690,
+	58790: 34735,
+	58791: 34763,
+	58792: 34749,
+	58793: 34752,
+	58794: 34768,
+	58795: 38614,
+	58796: 34731,
+	58797: 34756,
+	58798: 34739,
+	58799: 34759,
+	58800: 34758,
+	58801: 34747,
+	58802: 34799,
+	58803: 34802,
+	58804: 34784,
+	58805: 34831,
+	58806: 34829,
+	58807: 34814,
+	58808: 34806,
+	58809: 34807,
+	58810: 34830,
+	58811: 34770,
+	58812: 34833,
+	58813: 34838,
+	58814: 34837,
+	58815: 34850,
+	58816: 34849,
+	58817: 34865,
+	58818: 34870,
+	58819: 34873,
+	58820: 34855,
+	58821: 34875,
+	58822: 34884,
+	58823: 34882,
+	58824: 34898,
+	58825: 34905,
+	58826: 34910,
+	58827: 34914,
+	58828: 34923,
+	58829: 34945,
+	58830: 34942,
+	58831: 34974,
+	58832: 34933,
+	58833: 34941,
+	58834: 34997,
+	58835: 34930,
+	58836: 34946,
+	58837: 34967,
+	58838: 34962,
+	58839: 34990,
+	58840: 34969,
+	58841: 34978,
+	58842: 34957,
+	58843: 34980,
+	58844: 34992,
+	58845: 35007,
+	58846: 34993,
+	58847: 35011,
+	58848: 35012,
+	58849: 35028,
+	58850: 35032,
+	58851: 35033,
+	58852: 35037,
+	58853: 35065,
+	58854: 35074,
+	58855: 35068,
+	58856: 35060,
+	58857: 35048,
+	58858: 35058,
+	58859: 35076,
+	58860: 35084,
+	58861: 35082,
+	58862: 35091,
+	58863: 35139,
+	58864: 35102,
+	58865: 35109,
+	58866: 35114,
+	58867: 35115,
+	58868: 35137,
+	58869: 35140,
+	58870: 35131,
+	58871: 35126,
+	58872: 35128,
+	58873: 35148,
+	58874: 35101,
+	58875: 35168,
+	58876: 35166,
+	58944: 35174,
+	58945: 35172,
+	58946: 35181,
+	58947: 35178,
+	58948: 35183,
+	58949: 35188,
+	58950: 35191,
+	58951: 35198,
+	58952: 35203,
+	58953: 35208,
+	58954: 35210,
+	58955: 35219,
+	58956: 35224,
+	58957: 35233,
+	58958: 35241,
+	58959: 35238,
+	58960: 35244,
+	58961: 35247,
+	58962: 35250,
+	58963: 35258,
+	58964: 35261,
+	58965: 35263,
+	58966: 35264,
+	58967: 35290,
+	58968: 35292,
+	58969: 35293,
+	58970: 35303,
+	58971: 35316,
+	58972: 35320,
+	58973: 35331,
+	58974: 35350,
+	58975: 35344,
+	58976: 35340,
+	58977: 35355,
+	58978: 35357,
+	58979: 35365,
+	58980: 35382,
+	58981: 35393,
+	58982: 35419,
+	58983: 35410,
+	58984: 35398,
+	58985: 35400,
+	58986: 35452,
+	58987: 35437,
+	58988: 35436,
+	58989: 35426,
+	58990: 35461,
+	58991: 35458,
+	58992: 35460,
+	58993: 35496,
+	58994: 35489,
+	58995: 35473,
+	58996: 35493,
+	58997: 35494,
+	58998: 35482,
+	58999: 35491,
+	59000: 35524,
+	59001: 35533,
+	59002: 35522,
+	59003: 35546,
+	59004: 35563,
+	59005: 35571,
+	59006: 35559,
+	59008: 35556,
+	59009: 35569,
+	59010: 35604,
+	59011: 35552,
+	59012: 35554,
+	59013: 35575,
+	59014: 35550,
+	59015: 35547,
+	59016: 35596,
+	59017: 35591,
+	59018: 35610,
+	59019: 35553,
+	59020: 35606,
+	59021: 35600,
+	59022: 35607,
+	59023: 35616,
+	59024: 35635,
+	59025: 38827,
+	59026: 35622,
+	59027: 35627,
+	59028: 35646,
+	59029: 35624,
+	59030: 35649,
+	59031: 35660,
+	59032: 35663,
+	59033: 35662,
+	59034: 35657,
+	59035: 35670,
+	59036: 35675,
+	59037: 35674,
+	59038: 35691,
+	59039: 35679,
+	59040: 35692,
+	59041: 35695,
+	59042: 35700,
+	59043: 35709,
+	59044: 35712,
+	59045: 35724,
+	59046: 35726,
+	59047: 35730,
+	59048: 35731,
+	59049: 35734,
+	59050: 35737,
+	59051: 35738,
+	59052: 35898,
+	59053: 35905,
+	59054: 35903,
+	59055: 35912,
+	59056: 35916,
+	59057: 35918,
+	59058: 35920,
+	59059: 35925,
+	59060: 35938,
+	59061: 35948,
+	59062: 35960,
+	59063: 35962,
+	59064: 35970,
+	59065: 35977,
+	59066: 35973,
+	59067: 35978,
+	59068: 35981,
+	59069: 35982,
+	59070: 35988,
+	59071: 35964,
+	59072: 35992,
+	59073: 25117,
+	59074: 36013,
+	59075: 36010,
+	59076: 36029,
+	59077: 36018,
+	59078: 36019,
+	59079: 36014,
+	59080: 36022,
+	59081: 36040,
+	59082: 36033,
+	59083: 36068,
+	59084: 36067,
+	59085: 36058,
+	59086: 36093,
+	59087: 36090,
+	59088: 36091,
+	59089: 36100,
+	59090: 36101,
+	59091: 36106,
+	59092: 36103,
+	59093: 36111,
+	59094: 36109,
+	59095: 36112,
+	59096: 40782,
+	59097: 36115,
+	59098: 36045,
+	59099: 36116,
+	59100: 36118,
+	59101: 36199,
+	59102: 36205,
+	59103: 36209,
+	59104: 36211,
+	59105: 36225,
+	59106: 36249,
+	59107: 36290,
+	59108: 36286,
+	59109: 36282,
+	59110: 36303,
+	59111: 36314,
+	59112: 36310,
+	59113: 36300,
+	59114: 36315,
+	59115: 36299,
+	59116: 36330,
+	59117: 36331,
+	59118: 36319,
+	59119: 36323,
+	59120: 36348,
+	59121: 36360,
+	59122: 36361,
+	59123: 36351,
+	59124: 36381,
+	59125: 36382,
+	59126: 36368,
+	59127: 36383,
+	59128: 36418,
+	59129: 36405,
+	59130: 36400,
+	59131: 36404,
+	59132: 36426,
+	59200: 36423,
+	59201: 36425,
+	59202: 36428,
+	59203: 36432,
+	59204: 36424,
+	59205: 36441,
+	59206: 36452,
+	59207: 36448,
+	59208: 36394,
+	59209: 36451,
+	59210: 36437,
+	59211: 36470,
+	59212: 36466,
+	59213: 36476,
+	59214: 36481,
+	59215: 36487,
+	59216: 36485,
+	59217: 36484,
+	59218: 36491,
+	59219: 36490,
+	59220: 36499,
+	59221: 36497,
+	59222: 36500,
+	59223: 36505,
+	59224: 36522,
+	59225: 36513,
+	59226: 36524,
+	59227: 36528,
+	59228: 36550,
+	59229: 36529,
+	59230: 36542,
+	59231: 36549,
+	59232: 36552,
+	59233: 36555,
+	59234: 36571,
+	59235: 36579,
+	59236: 36604,
+	59237: 36603,
+	59238: 36587,
+	59239: 36606,
+	59240: 36618,
+	59241: 36613,
+	59242: 36629,
+	59243: 36626,
+	59244: 36633,
+	59245: 36627,
+	59246: 36636,
+	59247: 36639,
+	59248: 36635,
+	59249: 36620,
+	59250: 36646,
+	59251: 36659,
+	59252: 36667,
+	59253: 36665,
+	59254: 36677,
+	59255: 36674,
+	59256: 36670,
+	59257: 36684,
+	59258: 36681,
+	59259: 36678,
+	59260: 36686,
+	59261: 36695,
+	59262: 36700,
+	59264: 36706,
+	59265: 36707,
+	59266: 36708,
+	59267: 36764,
+	59268: 36767,
+	59269: 36771,
+	59270: 36781,
+	59271: 36783,
+	59272: 36791,
+	59273: 36826,
+	59274: 36837,
+	59275: 36834,
+	59276: 36842,
+	59277: 36847,
+	59278: 36999,
+	59279: 36852,
+	59280: 36869,
+	59281: 36857,
+	59282: 36858,
+	59283: 36881,
+	59284: 36885,
+	59285: 36897,
+	59286: 36877,
+	59287: 36894,
+	59288: 36886,
+	59289: 36875,
+	59290: 36903,
+	59291: 36918,
+	59292: 36917,
+	59293: 36921,
+	59294: 36856,
+	59295: 36943,
+	59296: 36944,
+	59297: 36945,
+	59298: 36946,
+	59299: 36878,
+	59300: 36937,
+	59301: 36926,
+	59302: 36950,
+	59303: 36952,
+	59304: 36958,
+	59305: 36968,
+	59306: 36975,
+	59307: 36982,
+	59308: 38568,
+	59309: 36978,
+	59310: 36994,
+	59311: 36989,
+	59312: 36993,
+	59313: 36992,
+	59314: 37002,
+	59315: 37001,
+	59316: 37007,
+	59317: 37032,
+	59318: 37039,
+	59319: 37041,
+	59320: 37045,
+	59321: 37090,
+	59322: 37092,
+	59323: 25160,
+	59324: 37083,
+	59325: 37122,
+	59326: 37138,
+	59327: 37145,
+	59328: 37170,
+	59329: 37168,
+	59330: 37194,
+	59331: 37206,
+	59332: 37208,
+	59333: 37219,
+	59334: 37221,
+	59335: 37225,
+	59336: 37235,
+	59337: 37234,
+	59338: 37259,
+	59339: 37257,
+	59340: 37250,
+	59341: 37282,
+	59342: 37291,
+	59343: 37295,
+	59344: 37290,
+	59345: 37301,
+	59346: 37300,
+	59347: 37306,
+	59348: 37312,
+	59349: 37313,
+	59350: 37321,
+	59351: 37323,
+	59352: 37328,
+	59353: 37334,
+	59354: 37343,
+	59355: 37345,
+	59356: 37339,
+	59357: 37372,
+	59358: 37365,
+	59359: 37366,
+	59360: 37406,
+	59361: 37375,
+	59362: 37396,
+	59363: 37420,
+	59364: 37397,
+	59365: 37393,
+	59366: 37470,
+	59367: 37463,
+	59368: 37445,
+	59369: 37449,
+	59370: 37476,
+	59371: 37448,
+	59372: 37525,
+	59373: 37439,
+	59374: 37451,
+	59375: 37456,
+	59376: 37532,
+	59377: 37526,
+	59378: 37523,
+	59379: 37531,
+	59380: 37466,
+	59381: 37583,
+	59382: 37561,
+	59383: 37559,
+	59384: 37609,
+	59385: 37647,
+	59386: 37626,
+	59387: 37700,
+	59388: 37678,
+	59456: 37657,
+	59457: 37666,
+	59458: 37658,
+	59459: 37667,
+	59460: 37690,
+	59461: 37685,
+	59462: 37691,
+	59463: 37724,
+	59464: 37728,
+	59465: 37756,
+	59466: 37742,
+	59467: 37718,
+	59468: 37808,
+	59469: 37804,
+	59470: 37805,
+	59471: 37780,
+	59472: 37817,
+	59473: 37846,
+	59474: 37847,
+	59475: 37864,
+	59476: 37861,
+	59477: 37848,
+	59478: 37827,
+	59479: 37853,
+	59480: 37840,
+	59481: 37832,
+	59482: 37860,
+	59483: 37914,
+	59484: 37908,
+	59485: 37907,
+	59486: 37891,
+	59487: 37895,
+	59488: 37904,
+	59489: 37942,
+	59490: 37931,
+	59491: 37941,
+	59492: 37921,
+	59493: 37946,
+	59494: 37953,
+	59495: 37970,
+	59496: 37956,
+	59497: 37979,
+	59498: 37984,
+	59499: 37986,
+	59500: 37982,
+	59501: 37994,
+	59502: 37417,
+	59503: 38000,
+	59504: 38005,
+	59505: 38007,
+	59506: 38013,
+	59507: 37978,
+	59508: 38012,
+	59509: 38014,
+	59510: 38017,
+	59511: 38015,
+	59512: 38274,
+	59513: 38279,
+	59514: 38282,
+	59515: 38292,
+	59516: 38294,
+	59517: 38296,
+	59518: 38297,
+	59520: 38304,
+	59521: 38312,
+	59522: 38311,
+	59523: 38317,
+	59524: 38332,
+	59525: 38331,
+	59526: 38329,
+	59527: 38334,
+	59528: 38346,
+	59529: 28662,
+	59530: 38339,
+	59531: 38349,
+	59532: 38348,
+	59533: 38357,
+	59534: 38356,
+	59535: 38358,
+	59536: 38364,
+	59537: 38369,
+	59538: 38373,
+	59539: 38370,
+	59540: 38433,
+	59541: 38440,
+	59542: 38446,
+	59543: 38447,
+	59544: 38466,
+	59545: 38476,
+	59546: 38479,
+	59547: 38475,
+	59548: 38519,
+	59549: 38492,
+	59550: 38494,
+	59551: 38493,
+	59552: 38495,
+	59553: 38502,
+	59554: 38514,
+	59555: 38508,
+	59556: 38541,
+	59557: 38552,
+	59558: 38549,
+	59559: 38551,
+	59560: 38570,
+	59561: 38567,
+	59562: 38577,
+	59563: 38578,
+	59564: 38576,
+	59565: 38580,
+	59566: 38582,
+	59567: 38584,
+	59568: 38585,
+	59569: 38606,
+	59570: 38603,
+	59571: 38601,
+	59572: 38605,
+	59573: 35149,
+	59574: 38620,
+	59575: 38669,
+	59576: 38613,
+	59577: 38649,
+	59578: 38660,
+	59579: 38662,
+	59580: 38664,
+	59581: 38675,
+	59582: 38670,
+	59583: 38673,
+	59584: 38671,
+	59585: 38678,
+	59586: 38681,
+	59587: 38692,
+	59588: 38698,
+	59589: 38704,
+	59590: 38713,
+	59591: 38717,
+	59592: 38718,
+	59593: 38724,
+	59594: 38726,
+	59595: 38728,
+	59596: 38722,
+	59597: 38729,
+	59598: 38748,
+	59599: 38752,
+	59600: 38756,
+	59601: 38758,
+	59602: 38760,
+	59603: 21202,
+	59604: 38763,
+	59605: 38769,
+	59606: 38777,
+	59607: 38789,
+	59608: 38780,
+	59609: 38785,
+	59610: 38778,
+	59611: 38790,
+	59612: 38795,
+	59613: 38799,
+	59614: 38800,
+	59615: 38812,
+	59616: 38824,
+	59617: 38822,
+	59618: 38819,
+	59619: 38835,
+	59620: 38836,
+	59621: 38851,
+	59622: 38854,
+	59623: 38856,
+	59624: 38859,
+	59625: 38876,
+	59626: 38893,
+	59627: 40783,
+	59628: 38898,
+	59629: 31455,
+	59630: 38902,
+	59631: 38901,
+	59632: 38927,
+	59633: 38924,
+	59634: 38968,
+	59635: 38948,
+	59636: 38945,
+	59637: 38967,
+	59638: 38973,
+	59639: 38982,
+	59640: 38991,
+	59641: 38987,
+	59642: 39019,
+	59643: 39023,
+	59644: 39024,
+	59712: 39025,
+	59713: 39028,
+	59714: 39027,
+	59715: 39082,
+	59716: 39087,
+	59717: 39089,
+	59718: 39094,
+	59719: 39108,
+	59720: 39107,
+	59721: 39110,
+	59722: 39145,
+	59723: 39147,
+	59724: 39171,
+	59725: 39177,
+	59726: 39186,
+	59727: 39188,
+	59728: 39192,
+	59729: 39201,
+	59730: 39197,
+	59731: 39198,
+	59732: 39204,
+	59733: 39200,
+	59734: 39212,
+	59735: 39214,
+	59736: 39229,
+	59737: 39230,
+	59738: 39234,
+	59739: 39241,
+	59740: 39237,
+	59741: 39248,
+	59742: 39243,
+	59743: 39249,
+	59744: 39250,
+	59745: 39244,
+	59746: 39253,
+	59747: 39319,
+	59748: 39320,
+	59749: 39333,
+	59750: 39341,
+	59751: 39342,
+	59752: 39356,
+	59753: 39391,
+	59754: 39387,
+	59755: 39389,
+	59756: 39384,
+	59757: 39377,
+	59758: 39405,
+	59759: 39406,
+	59760: 39409,
+	59761: 39410,
+	59762: 39419,
+	59763: 39416,
+	59764: 39425,
+	59765: 39439,
+	59766: 39429,
+	59767: 39394,
+	59768: 39449,
+	59769: 39467,
+	59770: 39479,
+	59771: 39493,
+	59772: 39490,
+	59773: 39488,
+	59774: 39491,
+	59776: 39486,
+	59777: 39509,
+	59778: 39501,
+	59779: 39515,
+	59780: 39511,
+	59781: 39519,
+	59782: 39522,
+	59783: 39525,
+	59784: 39524,
+	59785: 39529,
+	59786: 39531,
+	59787: 39530,
+	59788: 39597,
+	59789: 39600,
+	59790: 39612,
+	59791: 39616,
+	59792: 39631,
+	59793: 39633,
+	59794: 39635,
+	59795: 39636,
+	59796: 39646,
+	59797: 39647,
+	59798: 39650,
+	59799: 39651,
+	59800: 39654,
+	59801: 39663,
+	59802: 39659,
+	59803: 39662,
+	59804: 39668,
+	59805: 39665,
+	59806: 39671,
+	59807: 39675,
+	59808: 39686,
+	59809: 39704,
+	59810: 39706,
+	59811: 39711,
+	59812: 39714,
+	59813: 39715,
+	59814: 39717,
+	59815: 39719,
+	59816: 39720,
+	59817: 39721,
+	59818: 39722,
+	59819: 39726,
+	59820: 39727,
+	59821: 39730,
+	59822: 39748,
+	59823: 39747,
+	59824: 39759,
+	59825: 39757,
+	59826: 39758,
+	59827: 39761,
+	59828: 39768,
+	59829: 39796,
+	59830: 39827,
+	59831: 39811,
+	59832: 39825,
+	59833: 39830,
+	59834: 39831,
+	59835: 39839,
+	59836: 39840,
+	59837: 39848,
+	59838: 39860,
+	59839: 39872,
+	59840: 39882,
+	59841: 39865,
+	59842: 39878,
+	59843: 39887,
+	59844: 39889,
+	59845: 39890,
+	59846: 39907,
+	59847: 39906,
+	59848: 39908,
+	59849: 39892,
+	59850: 39905,
+	59851: 39994,
+	59852: 39922,
+	59853: 39921,
+	59854: 39920,
+	59855: 39957,
+	59856: 39956,
+	59857: 39945,
+	59858: 39955,
+	59859: 39948,
+	59860: 39942,
+	59861: 39944,
+	59862: 39954,
+	59863: 39946,
+	59864: 39940,
+	59865: 39982,
+	59866: 39963,
+	59867: 39973,
+	59868: 39972,
+	59869: 39969,
+	59870: 39984,
+	59871: 40007,
+	59872: 39986,
+	59873: 40006,
+	59874: 39998,
+	59875: 40026,
+	59876: 40032,
+	59877: 40039,
+	59878: 40054,
+	59879: 40056,
+	59880: 40167,
+	59881: 40172,
+	59882: 40176,
+	59883: 40201,
+	59884: 40200,
+	59885: 40171,
+	59886: 40195,
+	59887: 40198,
+	59888: 40234,
+	59889: 40230,
+	59890: 40367,
+	59891: 40227,
+	59892: 40223,
+	59893: 40260,
+	59894: 40213,
+	59895: 40210,
+	59896: 40257,
+	59897: 40255,
+	59898: 40254,
+	59899: 40262,
+	59900: 40264,
+	59968: 40285,
+	59969: 40286,
+	59970: 40292,
+	59971: 40273,
+	59972: 40272,
+	59973: 40281,
+	59974: 40306,
+	59975: 40329,
+	59976: 40327,
+	59977: 40363,
+	59978: 40303,
+	59979: 40314,
+	59980: 40346,
+	59981: 40356,
+	59982: 40361,
+	59983: 40370,
+	59984: 40388,
+	59985: 40385,
+	59986: 40379,
+	59987: 40376,
+	59988: 40378,
+	59989: 40390,
+	59990: 40399,
+	59991: 40386,
+	59992: 40409,
+	59993: 40403,
+	59994: 40440,
+	59995: 40422,
+	59996: 40429,
+	59997: 40431,
+	59998: 40445,
+	59999: 40474,
+	60000: 40475,
+	60001: 40478,
+	60002: 40565,
+	60003: 40569,
+	60004: 40573,
+	60005: 40577,
+	60006: 40584,
+	60007: 40587,
+	60008: 40588,
+	60009: 40594,
+	60010: 40597,
+	60011: 40593,
+	60012: 40605,
+	60013: 40613,
+	60014: 40617,
+	60015: 40632,
+	60016: 40618,
+	60017: 40621,
+	60018: 38753,
+	60019: 40652,
+	60020: 40654,
+	60021: 40655,
+	60022: 40656,
+	60023: 40660,
+	60024: 40668,
+	60025: 40670,
+	60026: 40669,
+	60027: 40672,
+	60028: 40677,
+	60029: 40680,
+	60030: 40687,
+	60032: 40692,
+	60033: 40694,
+	60034: 40695,
+	60035: 40697,
+	60036: 40699,
+	60037: 40700,
+	60038: 40701,
+	60039: 40711,
+	60040: 40712,
+	60041: 30391,
+	60042: 40725,
+	60043: 40737,
+	60044: 40748,
+	60045: 40766,
+	60046: 40778,
+	60047: 40786,
+	60048: 40788,
+	60049: 40803,
+	60050: 40799,
+	60051: 40800,
+	60052: 40801,
+	60053: 40806,
+	60054: 40807,
+	60055: 40812,
+	60056: 40810,
+	60057: 40823,
+	60058: 40818,
+	60059: 40822,
+	60060: 40853,
+	60061: 40860,
+	60062: 40864,
+	60063: 22575,
+	60064: 27079,
+	60065: 36953,
+	60066: 29796,
+	60067: 20956,
+	60068: 29081,
+	60736: 32394,
+	60737: 35100,
+	60738: 37704,
+	60739: 37512,
+	60740: 34012,
+	60741: 20425,
+	60742: 28859,
+	60743: 26161,
+	60744: 26824,
+	60745: 37625,
+	60746: 26363,
+	60747: 24389,
+	60748: 20008,
+	60749: 20193,
+	60750: 20220,
+	60751: 20224,
+	60752: 20227,
+	60753: 20281,
+	60754: 20310,
+	60755: 20370,
+	60756: 20362,
+	60757: 20378,
+	60758: 20372,
+	60759: 20429,
+	60760: 20544,
+	60761: 20514,
+	60762: 20479,
+	60763: 20510,
+	60764: 20550,
+	60765: 20592,
+	60766: 20546,
+	60767: 20628,
+	60768: 20724,
+	60769: 20696,
+	60770: 20810,
+	60771: 20836,
+	60772: 20893,
+	60773: 20926,
+	60774: 20972,
+	60775: 21013,
+	60776: 21148,
+	60777: 21158,
+	60778: 21184,
+	60779: 21211,
+	60780: 21248,
+	60781: 21255,
+	60782: 21284,
+	60783: 21362,
+	60784: 21395,
+	60785: 21426,
+	60786: 21469,
+	60787: 64014,
+	60788: 21660,
+	60789: 21642,
+	60790: 21673,
+	60791: 21759,
+	60792: 21894,
+	60793: 22361,
+	60794: 22373,
+	60795: 22444,
+	60796: 22472,
+	60797: 22471,
+	60798: 64015,
+	60800: 64016,
+	60801: 22686,
+	60802: 22706,
+	60803: 22795,
+	60804: 22867,
+	60805: 22875,
+	60806: 22877,
+	60807: 22883,
+	60808: 22948,
+	60809: 22970,
+	60810: 23382,
+	60811: 23488,
+	60812: 29999,
+	60813: 23512,
+	60814: 23532,
+	60815: 23582,
+	60816: 23718,
+	60817: 23738,
+	60818: 23797,
+	60819: 23847,
+	60820: 23891,
+	60821: 64017,
+	60822: 23874,
+	60823: 23917,
+	60824: 23992,
+	60825: 23993,
+	60826: 24016,
+	60827: 24353,
+	60828: 24372,
+	60829: 24423,
+	60830: 24503,
+	60831: 24542,
+	60832: 24669,
+	60833: 24709,
+	60834: 24714,
+	60835: 24798,
+	60836: 24789,
+	60837: 24864,
+	60838: 24818,
+	60839: 24849,
+	60840: 24887,
+	60841: 24880,
+	60842: 24984,
+	60843: 25107,
+	60844: 25254,
+	60845: 25589,
+	60846: 25696,
+	60847: 25757,
+	60848: 25806,
+	60849: 25934,
+	60850: 26112,
+	60851: 26133,
+	60852: 26171,
+	60853: 26121,
+	60854: 26158,
+	60855: 26142,
+	60856: 26148,
+	60857: 26213,
+	60858: 26199,
+	60859: 26201,
+	60860: 64018,
+	60861: 26227,
+	60862: 26265,
+	60863: 26272,
+	60864: 26290,
+	60865: 26303,
+	60866: 26362,
+	60867: 26382,
+	60868: 63785,
+	60869: 26470,
+	60870: 26555,
+	60871: 26706,
+	60872: 26560,
+	60873: 26625,
+	60874: 26692,
+	60875: 26831,
+	60876: 64019,
+	60877: 26984,
+	60878: 64020,
+	60879: 27032,
+	60880: 27106,
+	60881: 27184,
+	60882: 27243,
+	60883: 27206,
+	60884: 27251,
+	60885: 27262,
+	60886: 27362,
+	60887: 27364,
+	60888: 27606,
+	60889: 27711,
+	60890: 27740,
+	60891: 27782,
+	60892: 27759,
+	60893: 27866,
+	60894: 27908,
+	60895: 28039,
+	60896: 28015,
+	60897: 28054,
+	60898: 28076,
+	60899: 28111,
+	60900: 28152,
+	60901: 28146,
+	60902: 28156,
+	60903: 28217,
+	60904: 28252,
+	60905: 28199,
+	60906: 28220,
+	60907: 28351,
+	60908: 28552,
+	60909: 28597,
+	60910: 28661,
+	60911: 28677,
+	60912: 28679,
+	60913: 28712,
+	60914: 28805,
+	60915: 28843,
+	60916: 28943,
+	60917: 28932,
+	60918: 29020,
+	60919: 28998,
+	60920: 28999,
+	60921: 64021,
+	60922: 29121,
+	60923: 29182,
+	60924: 29361,
+	60992: 29374,
+	60993: 29476,
+	60994: 64022,
+	60995: 29559,
+	60996: 29629,
+	60997: 29641,
+	60998: 29654,
+	60999: 29667,
+	61000: 29650,
+	61001: 29703,
+	61002: 29685,
+	61003: 29734,
+	61004: 29738,
+	61005: 29737,
+	61006: 29742,
+	61007: 29794,
+	61008: 29833,
+	61009: 29855,
+	61010: 29953,
+	61011: 30063,
+	61012: 30338,
+	61013: 30364,
+	61014: 30366,
+	61015: 30363,
+	61016: 30374,
+	61017: 64023,
+	61018: 30534,
+	61019: 21167,
+	61020: 30753,
+	61021: 30798,
+	61022: 30820,
+	61023: 30842,
+	61024: 31024,
+	61025: 64024,
+	61026: 64025,
+	61027: 64026,
+	61028: 31124,
+	61029: 64027,
+	61030: 31131,
+	61031: 31441,
+	61032: 31463,
+	61033: 64028,
+	61034: 31467,
+	61035: 31646,
+	61036: 64029,
+	61037: 32072,
+	61038: 32092,
+	61039: 32183,
+	61040: 32160,
+	61041: 32214,
+	61042: 32338,
+	61043: 32583,
+	61044: 32673,
+	61045: 64030,
+	61046: 33537,
+	61047: 33634,
+	61048: 33663,
+	61049: 33735,
+	61050: 33782,
+	61051: 33864,
+	61052: 33972,
+	61053: 34131,
+	61054: 34137,
+	61056: 34155,
+	61057: 64031,
+	61058: 34224,
+	61059: 64032,
+	61060: 64033,
+	61061: 34823,
+	61062: 35061,
+	61063: 35346,
+	61064: 35383,
+	61065: 35449,
+	61066: 35495,
+	61067: 35518,
+	61068: 35551,
+	61069: 64034,
+	61070: 35574,
+	61071: 35667,
+	61072: 35711,
+	61073: 36080,
+	61074: 36084,
+	61075: 36114,
+	61076: 36214,
+	61077: 64035,
+	61078: 36559,
+	61079: 64036,
+	61080: 64037,
+	61081: 36967,
+	61082: 37086,
+	61083: 64038,
+	61084: 37141,
+	61085: 37159,
+	61086: 37338,
+	61087: 37335,
+	61088: 37342,
+	61089: 37357,
+	61090: 37358,
+	61091: 37348,
+	61092: 37349,
+	61093: 37382,
+	61094: 37392,
+	61095: 37386,
+	61096: 37434,
+	61097: 37440,
+	61098: 37436,
+	61099: 37454,
+	61100: 37465,
+	61101: 37457,
+	61102: 37433,
+	61103: 37479,
+	61104: 37543,
+	61105: 37495,
+	61106: 37496,
+	61107: 37607,
+	61108: 37591,
+	61109: 37593,
+	61110: 37584,
+	61111: 64039,
+	61112: 37589,
+	61113: 37600,
+	61114: 37587,
+	61115: 37669,
+	61116: 37665,
+	61117: 37627,
+	61118: 64040,
+	61119: 37662,
+	61120: 37631,
+	61121: 37661,
+	61122: 37634,
+	61123: 37744,
+	61124: 37719,
+	61125: 37796,
+	61126: 37830,
+	61127: 37854,
+	61128: 37880,
+	61129: 37937,
+	61130: 37957,
+	61131: 37960,
+	61132: 38290,
+	61133: 63964,
+	61134: 64041,
+	61135: 38557,
+	61136: 38575,
+	61137: 38707,
+	61138: 38715,
+	61139: 38723,
+	61140: 38733,
+	61141: 38735,
+	61142: 38737,
+	61143: 38741,
+	61144: 38999,
+	61145: 39013,
+	61146: 64042,
+	61147: 64043,
+	61148: 39207,
+	61149: 64044,
+	61150: 39326,
+	61151: 39502,
+	61152: 39641,
+	61153: 39644,
+	61154: 39797,
+	61155: 39794,
+	61156: 39823,
+	61157: 39857,
+	61158: 39867,
+	61159: 39936,
+	61160: 40304,
+	61161: 40299,
+	61162: 64045,
+	61163: 40473,
+	61164: 40657,
+	61167: 8560,
+	61168: 8561,
+	61169: 8562,
+	61170: 8563,
+	61171: 8564,
+	61172: 8565,
+	61173: 8566,
+	61174: 8567,
+	61175: 8568,
+	61176: 8569,
+	61177: 65506,
+	61178: 65508,
+	61179: 65287,
+	61180: 65282,
+	61504: 57344,
+	61505: 57345,
+	61506: 57346,
+	61507: 57347,
+	61508: 57348,
+	61509: 57349,
+	61510: 57350,
+	61511: 57351,
+	61512: 57352,
+	61513: 57353,
+	61514: 57354,
+	61515: 57355,
+	61516: 57356,
+	61517: 57357,
+	61518: 57358,
+	61519: 57359,
+	61520: 57360,
+	61521: 57361,
+	61522: 57362,
+	61523: 57363,
+	61524: 57364,
+	61525: 57365,
+	61526: 57366,
+	61527: 57367,
+	61528: 57368,
+	61529: 57369,
+	61530: 57370,
+	61531: 57371,
+	61532: 57372,
+	61533: 57373,
+	61534: 57374,
+	61535: 57375,
+	61536: 57376,
+	61537: 57377,
+	61538: 57378,
+	61539: 57379,
+	61540: 57380,
+	61541: 57381,
+	61542: 57382,
+	61543: 57383,
+	61544: 57384,
+	61545: 57385,
+	61546: 57386,
+	61547: 57387,
+	61548: 57388,
+	61549: 57389,
+	61550: 57390,
+	61551: 57391,
+	61552: 57392,
+	61553: 57393,
+	61554: 57394,
+	61555: 57395,
+	61556: 57396,
+	61557: 57397,
+	61558: 57398,
+	61559: 57399,
+	61560: 57400,
+	61561: 57401,
+	61562: 57402,
+	61563: 57403,
+	61564: 57404,
+	61565: 57405,
+	61566: 57406,
+	61568: 57407,
+	61569: 57408,
+	61570: 57409,
+	61571: 57410,
+	61572: 57411,
+	61573: 57412,
+	61574: 57413,
+	61575: 57414,
+	61576: 57415,
+	61577: 57416,
+	61578: 57417,
+	61579: 57418,
+	61580: 57419,
+	61581: 57420,
+	61582: 57421,
+	61583: 57422,
+	61584: 57423,
+	61585: 57424,
+	61586: 57425,
+	61587: 57426,
+	61588: 57427,
+	61589: 57428,
+	61590: 57429,
+	61591: 57430,
+	61592: 57431,
+	61593: 57432,
+	61594: 57433,
+	61595: 57434,
+	61596: 57435,
+	61597: 57436,
+	61598: 57437,
+	61599: 57438,
+	61600: 57439,
+	61601: 57440,
+	61602: 57441,
+	61603: 57442,
+	61604: 57443,
+	61605: 57444,
+	61606: 57445,
+	61607: 57446,
+	61608: 57447,
+	61609: 57448,
+	61610: 57449,
+	61611: 57450,
+	61612: 57451,
+	61613: 57452,
+	61614: 57453,
+	61615: 57454,
+	61616: 57455,
+	61617: 57456,
+	61618: 57457,
+	61619: 57458,
+	61620: 57459,
+	61621: 57460,
+	61622: 57461,
+	61623: 57462,
+	61624: 57463,
+	61625: 57464,
+	61626: 57465,
+	61627: 57466,
+	61628: 57467,
+	61629: 57468,
+	61630: 57469,
+	61631: 57470,
+	61632: 57471,
+	61633: 57472,
+	61634: 57473,
+	61635: 57474,
+	61636: 57475,
+	61637: 57476,
+	61638: 57477,
+	61639: 57478,
+	61640: 57479,
+	61641: 57480,
+	61642: 57481,
+	61643: 57482,
+	61644: 57483,
+	61645: 57484,
+	61646: 57485,
+	61647: 57486,
+	61648: 57487,
+	61649: 57488,
+	61650: 57489,
+	61651: 57490,
+	61652: 57491,
+	61653: 57492,
+	61654: 57493,
+	61655: 57494,
+	61656: 57495,
+	61657: 57496,
+	61658: 57497,
+	61659: 57498,
+	61660: 57499,
+	61661: 57500,
+	61662: 57501,
+	61663: 57502,
+	61664: 57503,
+	61665: 57504,
+	61666: 57505,
+	61667: 57506,
+	61668: 57507,
+	61669: 57508,
+	61670: 57509,
+	61671: 57510,
+	61672: 57511,
+	61673: 57512,
+	61674: 57513,
+	61675: 57514,
+	61676: 57515,
+	61677: 57516,
+	61678: 57517,
+	61679: 57518,
+	61680: 57519,
+	61681: 57520,
+	61682: 57521,
+	61683: 57522,
+	61684: 57523,
+	61685: 57524,
+	61686: 57525,
+	61687: 57526,
+	61688: 57527,
+	61689: 57528,
+	61690: 57529,
+	61691: 57530,
+	61692: 57531,
+	61760: 57532,
+	61761: 57533,
+	61762: 57534,
+	61763: 57535,
+	61764: 57536,
+	61765: 57537,
+	61766: 57538,
+	61767: 57539,
+	61768: 57540,
+	61769: 57541,
+	61770: 57542,
+	61771: 57543,
+	61772: 57544,
+	61773: 57545,
+	61774: 57546,
+	61775: 57547,
+	61776: 57548,
+	61777: 57549,
+	61778: 57550,
+	61779: 57551,
+	61780: 57552,
+	61781: 57553,
+	61782: 57554,
+	61783: 57555,
+	61784: 57556,
+	61785: 57557,
+	61786: 57558,
+	61787: 57559,
+	61788: 57560,
+	61789: 57561,
+	61790: 57562,
+	61791: 57563,
+	61792: 57564,
+	61793: 57565,
+	61794: 57566,
+	61795: 57567,
+	61796: 57568,
+	61797: 57569,
+	61798: 57570,
+	61799: 57571,
+	61800: 57572,
+	61801: 57573,
+	61802: 57574,
+	61803: 57575,
+	61804: 57576,
+	61805: 57577,
+	61806: 57578,
+	61807: 57579,
+	61808: 57580,
+	61809: 57581,
+	61810: 57582,
+	61811: 57583,
+	61812: 57584,
+	61813: 57585,
+	61814: 57586,
+	61815: 57587,
+	61816: 57588,
+	61817: 57589,
+	61818: 57590,
+	61819: 57591,
+	61820: 57592,
+	61821: 57593,
+	61822: 57594,
+	61824: 57595,
+	61825: 57596,
+	61826: 57597,
+	61827: 57598,
+	61828: 57599,
+	61829: 57600,
+	61830: 57601,
+	61831: 57602,
+	61832: 57603,
+	61833: 57604,
+	61834: 57605,
+	61835: 57606,
+	61836: 57607,
+	61837: 57608,
+	61838: 57609,
+	61839: 57610,
+	61840: 57611,
+	61841: 57612,
+	61842: 57613,
+	61843: 57614,
+	61844: 57615,
+	61845: 57616,
+	61846: 57617,
+	61847: 57618,
+	61848: 57619,
+	61849: 57620,
+	61850: 57621,
+	61851: 57622,
+	61852: 57623,
+	61853: 57624,
+	61854: 57625,
+	61855: 57626,
+	61856: 57627,
+	61857: 57628,
+	61858: 57629,
+	61859: 57630,
+	61860: 57631,
+	61861: 57632,
+	61862: 57633,
+	61863: 57634,
+	61864: 57635,
+	61865: 57636,
+	61866: 57637,
+	61867: 57638,
+	61868: 57639,
+	61869: 57640,
+	61870: 57641,
+	61871: 57642,
+	61872: 57643,
+	61873: 57644,
+	61874: 57645,
+	61875: 57646,
+	61876: 57647,
+	61877: 57648,
+	61878: 57649,
+	61879: 57650,
+	61880: 57651,
+	61881: 57652,
+	61882: 57653,
+	61883: 57654,
+	61884: 57655,
+	61885: 57656,
+	61886: 57657,
+	61887: 57658,
+	61888: 57659,
+	61889: 57660,
+	61890: 57661,
+	61891: 57662,
+	61892: 57663,
+	61893: 57664,
+	61894: 57665,
+	61895: 57666,
+	61896: 57667,
+	61897: 57668,
+	61898: 57669,
+	61899: 57670,
+	61900: 57671,
+	61901: 57672,
+	61902: 57673,
+	61903: 57674,
+	61904: 57675,
+	61905: 57676,
+	61906: 57677,
+	61907: 57678,
+	61908: 57679,
+	61909: 57680,
+	61910: 57681,
+	61911: 57682,
+	61912: 57683,
+	61913: 57684,
+	61914: 57685,
+	61915: 57686,
+	61916: 57687,
+	61917: 57688,
+	61918: 57689,
+	61919: 57690,
+	61920: 57691,
+	61921: 57692,
+	61922: 57693,
+	61923: 57694,
+	61924: 57695,
+	61925: 57696,
+	61926: 57697,
+	61927: 57698,
+	61928: 57699,
+	61929: 57700,
+	61930: 57701,
+	61931: 57702,
+	61932: 57703,
+	61933: 57704,
+	61934: 57705,
+	61935: 57706,
+	61936: 57707,
+	61937: 57708,
+	61938: 57709,
+	61939: 57710,
+	61940: 57711,
+	61941: 57712,
+	61942: 57713,
+	61943: 57714,
+	61944: 57715,
+	61945: 57716,
+	61946: 57717,
+	61947: 57718,
+	61948: 57719,
+	62016: 57720,
+	62017: 57721,
+	62018: 57722,
+	62019: 57723,
+	62020: 57724,
+	62021: 57725,
+	62022: 57726,
+	62023: 57727,
+	62024: 57728,
+	62025: 57729,
+	62026: 57730,
+	62027: 57731,
+	62028: 57732,
+	62029: 57733,
+	62030: 57734,
+	62031: 57735,
+	62032: 57736,
+	62033: 57737,
+	62034: 57738,
+	62035: 57739,
+	62036: 57740,
+	62037: 57741,
+	62038: 57742,
+	62039: 57743,
+	62040: 57744,
+	62041: 57745,
+	62042: 57746,
+	62043: 57747,
+	62044: 57748,
+	62045: 57749,
+	62046: 57750,
+	62047: 57751,
+	62048: 57752,
+	62049: 57753,
+	62050: 57754,
+	62051: 57755,
+	62052: 57756,
+	62053: 57757,
+	62054: 57758,
+	62055: 57759,
+	62056: 57760,
+	62057: 57761,
+	62058: 57762,
+	62059: 57763,
+	62060: 57764,
+	62061: 57765,
+	62062: 57766,
+	62063: 57767,
+	62064: 57768,
+	62065: 57769,
+	62066: 57770,
+	62067: 57771,
+	62068: 57772,
+	62069: 57773,
+	62070: 57774,
+	62071: 57775,
+	62072: 57776,
+	62073: 57777,
+	62074: 57778,
+	62075: 57779,
+	62076: 57780,
+	62077: 57781,
+	62078: 57782,
+	62080: 57783,
+	62081: 57784,
+	62082: 57785,
+	62083: 57786,
+	62084: 57787,
+	62085: 57788,
+	62086: 57789,
+	62087: 57790,
+	62088: 57791,
+	62089: 57792,
+	62090: 57793,
+	62091: 57794,
+	62092: 57795,
+	62093: 57796,
+	62094: 57797,
+	62095: 57798,
+	62096: 57799,
+	62097: 57800,
+	62098: 57801,
+	62099: 57802,
+	62100: 57803,
+	62101: 57804,
+	62102: 57805,
+	62103: 57806,
+	62104: 57807,
+	62105: 57808,
+	62106: 57809,
+	62107: 57810,
+	62108: 57811,
+	62109: 57812,
+	62110: 57813,
+	62111: 57814,
+	62112: 57815,
+	62113: 57816,
+	62114: 57817,
+	62115: 57818,
+	62116: 57819,
+	62117: 57820,
+	62118: 57821,
+	62119: 57822,
+	62120: 57823,
+	62121: 57824,
+	62122: 57825,
+	62123: 57826,
+	62124: 57827,
+	62125: 57828,
+	62126: 57829,
+	62127: 57830,
+	62128: 57831,
+	62129: 57832,
+	62130: 57833,
+	62131: 57834,
+	62132: 57835,
+	62133: 57836,
+	62134: 57837,
+	62135: 57838,
+	62136: 57839,
+	62137: 57840,
+	62138: 57841,
+	62139: 57842,
+	62140: 57843,
+	62141: 57844,
+	62142: 57845,
+	62143: 57846,
+	62144: 57847,
+	62145: 57848,
+	62146: 57849,
+	62147: 57850,
+	62148: 57851,
+	62149: 57852,
+	62150: 57853,
+	62151: 57854,
+	62152: 57855,
+	62153: 57856,
+	62154: 57857,
+	62155: 57858,
+	62156: 57859,
+	62157: 57860,
+	62158: 57861,
+	62159: 57862,
+	62160: 57863,
+	62161: 57864,
+	62162: 57865,
+	62163: 57866,
+	62164: 57867,
+	62165: 57868,
+	62166: 57869,
+	62167: 57870,
+	62168: 57871,
+	62169: 57872,
+	62170: 57873,
+	62171: 57874,
+	62172: 57875,
+	62173: 57876,
+	62174: 57877,
+	62175: 57878,
+	62176: 57879,
+	62177: 57880,
+	62178: 57881,
+	62179: 57882,
+	62180: 57883,
+	62181: 57884,
+	62182: 57885,
+	62183: 57886,
+	62184: 57887,
+	62185: 57888,
+	62186: 57889,
+	62187: 57890,
+	62188: 57891,
+	62189: 57892,
+	62190: 57893,
+	62191: 57894,
+	62192: 57895,
+	62193: 57896,
+	62194: 57897,
+	62195: 57898,
+	62196: 57899,
+	62197: 57900,
+	62198: 57901,
+	62199: 57902,
+	62200: 57903,
+	62201: 57904,
+	62202: 57905,
+	62203: 57906,
+	62204: 57907,
+	62272: 57908,
+	62273: 57909,
+	62274: 57910,
+	62275: 57911,
+	62276: 57912,
+	62277: 57913,
+	62278: 57914,
+	62279: 57915,
+	62280: 57916,
+	62281: 57917,
+	62282: 57918,
+	62283: 57919,
+	62284: 57920,
+	62285: 57921,
+	62286: 57922,
+	62287: 57923,
+	62288: 57924,
+	62289: 57925,
+	62290: 57926,
+	62291: 57927,
+	62292: 57928,
+	62293: 57929,
+	62294: 57930,
+	62295: 57931,
+	62296: 57932,
+	62297: 57933,
+	62298: 57934,
+	62299: 57935,
+	62300: 57936,
+	62301: 57937,
+	62302: 57938,
+	62303: 57939,
+	62304: 57940,
+	62305: 57941,
+	62306: 57942,
+	62307: 57943,
+	62308: 57944,
+	62309: 57945,
+	62310: 57946,
+	62311: 57947,
+	62312: 57948,
+	62313: 57949,
+	62314: 57950,
+	62315: 57951,
+	62316: 57952,
+	62317: 57953,
+	62318: 57954,
+	62319: 57955,
+	62320: 57956,
+	62321: 57957,
+	62322: 57958,
+	62323: 57959,
+	62324: 57960,
+	62325: 57961,
+	62326: 57962,
+	62327: 57963,
+	62328: 57964,
+	62329: 57965,
+	62330: 57966,
+	62331: 57967,
+	62332: 57968,
+	62333: 57969,
+	62334: 57970,
+	62336: 57971,
+	62337: 57972,
+	62338: 57973,
+	62339: 57974,
+	62340: 57975,
+	62341: 57976,
+	62342: 57977,
+	62343: 57978,
+	62344: 57979,
+	62345: 57980,
+	62346: 57981,
+	62347: 57982,
+	62348: 57983,
+	62349: 57984,
+	62350: 57985,
+	62351: 57986,
+	62352: 57987,
+	62353: 57988,
+	62354: 57989,
+	62355: 57990,
+	62356: 57991,
+	62357: 57992,
+	62358: 57993,
+	62359: 57994,
+	62360: 57995,
+	62361: 57996,
+	62362: 57997,
+	62363: 57998,
+	62364: 57999,
+	62365: 58000,
+	62366: 58001,
+	62367: 58002,
+	62368: 58003,
+	62369: 58004,
+	62370: 58005,
+	62371: 58006,
+	62372: 58007,
+	62373: 58008,
+	62374: 58009,
+	62375: 58010,
+	62376: 58011,
+	62377: 58012,
+	62378: 58013,
+	62379: 58014,
+	62380: 58015,
+	62381: 58016,
+	62382: 58017,
+	62383: 58018,
+	62384: 58019,
+	62385: 58020,
+	62386: 58021,
+	62387: 58022,
+	62388: 58023,
+	62389: 58024,
+	62390: 58025,
+	62391: 58026,
+	62392: 58027,
+	62393: 58028,
+	62394: 58029,
+	62395: 58030,
+	62396: 58031,
+	62397: 58032,
+	62398: 58033,
+	62399: 58034,
+	62400: 58035,
+	62401: 58036,
+	62402: 58037,
+	62403: 58038,
+	62404: 58039,
+	62405: 58040,
+	62406: 58041,
+	62407: 58042,
+	62408: 58043,
+	62409: 58044,
+	62410: 58045,
+	62411: 58046,
+	62412: 58047,
+	62413: 58048,
+	62414: 58049,
+	62415: 58050,
+	62416: 58051,
+	62417: 58052,
+	62418: 58053,
+	62419: 58054,
+	62420: 58055,
+	62421: 58056,
+	62422: 58057,
+	62423: 58058,
+	62424: 58059,
+	62425: 58060,
+	62426: 58061,
+	62427: 58062,
+	62428: 58063,
+	62429: 58064,
+	62430: 58065,
+	62431: 58066,
+	62432: 58067,
+	62433: 58068,
+	62434: 58069,
+	62435: 58070,
+	62436: 58071,
+	62437: 58072,
+	62438: 58073,
+	62439: 58074,
+	62440: 58075,
+	62441: 58076,
+	62442: 58077,
+	62443: 58078,
+	62444: 58079,
+	62445: 58080,
+	62446: 58081,
+	62447: 58082,
+	62448: 58083,
+	62449: 58084,
+	62450: 58085,
+	62451: 58086,
+	62452: 58087,
+	62453: 58088,
+	62454: 58089,
+	62455: 58090,
+	62456: 58091,
+	62457: 58092,
+	62458: 58093,
+	62459: 58094,
+	62460: 58095,
+	62528: 58096,
+	62529: 58097,
+	62530: 58098,
+	62531: 58099,
+	62532: 58100,
+	62533: 58101,
+	62534: 58102,
+	62535: 58103,
+	62536: 58104,
+	62537: 58105,
+	62538: 58106,
+	62539: 58107,
+	62540: 58108,
+	62541: 58109,
+	62542: 58110,
+	62543: 58111,
+	62544: 58112,
+	62545: 58113,
+	62546: 58114,
+	62547: 58115,
+	62548: 58116,
+	62549: 58117,
+	62550: 58118,
+	62551: 58119,
+	62552: 58120,
+	62553: 58121,
+	62554: 58122,
+	62555: 58123,
+	62556: 58124,
+	62557: 58125,
+	62558: 58126,
+	62559: 58127,
+	62560: 58128,
+	62561: 58129,
+	62562: 58130,
+	62563: 58131,
+	62564: 58132,
+	62565: 58133,
+	62566: 58134,
+	62567: 58135,
+	62568: 58136,
+	62569: 58137,
+	62570: 58138,
+	62571: 58139,
+	62572: 58140,
+	62573: 58141,
+	62574: 58142,
+	62575: 58143,
+	62576: 58144,
+	62577: 58145,
+	62578: 58146,
+	62579: 58147,
+	62580: 58148,
+	62581: 58149,
+	62582: 58150,
+	62583: 58151,
+	62584: 58152,
+	62585: 58153,
+	62586: 58154,
+	62587: 58155,
+	62588: 58156,
+	62589: 58157,
+	62590: 58158,
+	62592: 58159,
+	62593: 58160,
+	62594: 58161,
+	62595: 58162,
+	62596: 58163,
+	62597: 58164,
+	62598: 58165,
+	62599: 58166,
+	62600: 58167,
+	62601: 58168,
+	62602: 58169,
+	62603: 58170,
+	62604: 58171,
+	62605: 58172,
+	62606: 58173,
+	62607: 58174,
+	62608: 58175,
+	62609: 58176,
+	62610: 58177,
+	62611: 58178,
+	62612: 58179,
+	62613: 58180,
+	62614: 58181,
+	62615: 58182,
+	62616: 58183,
+	62617: 58184,
+	62618: 58185,
+	62619: 58186,
+	62620: 58187,
+	62621: 58188,
+	62622: 58189,
+	62623: 58190,
+	62624: 58191,
+	62625: 58192,
+	62626: 58193,
+	62627: 58194,
+	62628: 58195,
+	62629: 58196,
+	62630: 58197,
+	62631: 58198,
+	62632: 58199,
+	62633: 58200,
+	62634: 58201,
+	62635: 58202,
+	62636: 58203,
+	62637: 58204,
+	62638: 58205,
+	62639: 58206,
+	62640: 58207,
+	62641: 58208,
+	62642: 58209,
+	62643: 58210,
+	62644: 58211,
+	62645: 58212,
+	62646: 58213,
+	62647: 58214,
+	62648: 58215,
+	62649: 58216,
+	62650: 58217,
+	62651: 58218,
+	62652: 58219,
+	62653: 58220,
+	62654: 58221,
+	62655: 58222,
+	62656: 58223,
+	62657: 58224,
+	62658: 58225,
+	62659: 58226,
+	62660: 58227,
+	62661: 58228,
+	62662: 58229,
+	62663: 58230,
+	62664: 58231,
+	62665: 58232,
+	62666: 58233,
+	62667: 58234,
+	62668: 58235,
+	62669: 58236,
+	62670: 58237,
+	62671: 58238,
+	62672: 58239,
+	62673: 58240,
+	62674: 58241,
+	62675: 58242,
+	62676: 58243,
+	62677: 58244,
+	62678: 58245,
+	62679: 58246,
+	62680: 58247,
+	62681: 58248,
+	62682: 58249,
+	62683: 58250,
+	62684: 58251,
+	62685: 58252,
+	62686: 58253,
+	62687: 58254,
+	62688: 58255,
+	62689: 58256,
+	62690: 58257,
+	62691: 58258,
+	62692: 58259,
+	62693: 58260,
+	62694: 58261,
+	62695: 58262,
+	62696: 58263,
+	62697: 58264,
+	62698: 58265,
+	62699: 58266,
+	62700: 58267,
+	62701: 58268,
+	62702: 58269,
+	62703: 58270,
+	62704: 58271,
+	62705: 58272,
+	62706: 58273,
+	62707: 58274,
+	62708: 58275,
+	62709: 58276,
+	62710: 58277,
+	62711: 58278,
+	62712: 58279,
+	62713: 58280,
+	62714: 58281,
+	62715: 58282,
+	62716: 58283,
+	62784: 58284,
+	62785: 58285,
+	62786: 58286,
+	62787: 58287,
+	62788: 58288,
+	62789: 58289,
+	62790: 58290,
+	62791: 58291,
+	62792: 58292,
+	62793: 58293,
+	62794: 58294,
+	62795: 58295,
+	62796: 58296,
+	62797: 58297,
+	62798: 58298,
+	62799: 58299,
+	62800: 58300,
+	62801: 58301,
+	62802: 58302,
+	62803: 58303,
+	62804: 58304,
+	62805: 58305,
+	62806: 58306,
+	62807: 58307,
+	62808: 58308,
+	62809: 58309,
+	62810: 58310,
+	62811: 58311,
+	62812: 58312,
+	62813: 58313,
+	62814: 58314,
+	62815: 58315,
+	62816: 58316,
+	62817: 58317,
+	62818: 58318,
+	62819: 58319,
+	62820: 58320,
+	62821: 58321,
+	62822: 58322,
+	62823: 58323,
+	62824: 58324,
+	62825: 58325,
+	62826: 58326,
+	62827: 58327,
+	62828: 58328,
+	62829: 58329,
+	62830: 58330,
+	62831: 58331,
+	62832: 58332,
+	62833: 58333,
+	62834: 58334,
+	62835: 58335,
+	62836: 58336,
+	62837: 58337,
+	62838: 58338,
+	62839: 58339,
+	62840: 58340,
+	62841: 58341,
+	62842: 58342,
+	62843: 58343,
+	62844: 58344,
+	62845: 58345,
+	62846: 58346,
+	62848: 58347,
+	62849: 58348,
+	62850: 58349,
+	62851: 58350,
+	62852: 58351,
+	62853: 58352,
+	62854: 58353,
+	62855: 58354,
+	62856: 58355,
+	62857: 58356,
+	62858: 58357,
+	62859: 58358,
+	62860: 58359,
+	62861: 58360,
+	62862: 58361,
+	62863: 58362,
+	62864: 58363,
+	62865: 58364,
+	62866: 58365,
+	62867: 58366,
+	62868: 58367,
+	62869: 58368,
+	62870: 58369,
+	62871: 58370,
+	62872: 58371,
+	62873: 58372,
+	62874: 58373,
+	62875: 58374,
+	62876: 58375,
+	62877: 58376,
+	62878: 58377,
+	62879: 58378,
+	62880: 58379,
+	62881: 58380,
+	62882: 58381,
+	62883: 58382,
+	62884: 58383,
+	62885: 58384,
+	62886: 58385,
+	62887: 58386,
+	62888: 58387,
+	62889: 58388,
+	62890: 58389,
+	62891: 58390,
+	62892: 58391,
+	62893: 58392,
+	62894: 58393,
+	62895: 58394,
+	62896: 58395,
+	62897: 58396,
+	62898: 58397,
+	62899: 58398,
+	62900: 58399,
+	62901: 58400,
+	62902: 58401,
+	62903: 58402,
+	62904: 58403,
+	62905: 58404,
+	62906: 58405,
+	62907: 58406,
+	62908: 58407,
+	62909: 58408,
+	62910: 58409,
+	62911: 58410,
+	62912: 58411,
+	62913: 58412,
+	62914: 58413,
+	62915: 58414,
+	62916: 58415,
+	62917: 58416,
+	62918: 58417,
+	62919: 58418,
+	62920: 58419,
+	62921: 58420,
+	62922: 58421,
+	62923: 58422,
+	62924: 58423,
+	62925: 58424,
+	62926: 58425,
+	62927: 58426,
+	62928: 58427,
+	62929: 58428,
+	62930: 58429,
+	62931: 58430,
+	62932: 58431,
+	62933: 58432,
+	62934: 58433,
+	62935: 58434,
+	62936: 58435,
+	62937: 58436,
+	62938: 58437,
+	62939: 58438,
+	62940: 58439,
+	62941: 58440,
+	62942: 58441,
+	62943: 58442,
+	62944: 58443,
+	62945: 58444,
+	62946: 58445,
+	62947: 58446,
+	62948: 58447,
+	62949: 58448,
+	62950: 58449,
+	62951: 58450,
+	62952: 58451,
+	62953: 58452,
+	62954: 58453,
+	62955: 58454,
+	62956: 58455,
+	62957: 58456,
+	62958: 58457,
+	62959: 58458,
+	62960: 58459,
+	62961: 58460,
+	62962: 58461,
+	62963: 58462,
+	62964: 58463,
+	62965: 58464,
+	62966: 58465,
+	62967: 58466,
+	62968: 58467,
+	62969: 58468,
+	62970: 58469,
+	62971: 58470,
+	62972: 58471,
+	63040: 58472,
+	63041: 58473,
+	63042: 58474,
+	63043: 58475,
+	63044: 58476,
+	63045: 58477,
+	63046: 58478,
+	63047: 58479,
+	63048: 58480,
+	63049: 58481,
+	63050: 58482,
+	63051: 58483,
+	63052: 58484,
+	63053: 58485,
+	63054: 58486,
+	63055: 58487,
+	63056: 58488,
+	63057: 58489,
+	63058: 58490,
+	63059: 58491,
+	63060: 58492,
+	63061: 58493,
+	63062: 58494,
+	63063: 58495,
+	63064: 58496,
+	63065: 58497,
+	63066: 58498,
+	63067: 58499,
+	63068: 58500,
+	63069: 58501,
+	63070: 58502,
+	63071: 58503,
+	63072: 58504,
+	63073: 58505,
+	63074: 58506,
+	63075: 58507,
+	63076: 58508,
+	63077: 58509,
+	63078: 58510,
+	63079: 58511,
+	63080: 58512,
+	63081: 58513,
+	63082: 58514,
+	63083: 58515,
+	63084: 58516,
+	63085: 58517,
+	63086: 58518,
+	63087: 58519,
+	63088: 58520,
+	63089: 58521,
+	63090: 58522,
+	63091: 58523,
+	63092: 58524,
+	63093: 58525,
+	63094: 58526,
+	63095: 58527,
+	63096: 58528,
+	63097: 58529,
+	63098: 58530,
+	63099: 58531,
+	63100: 58532,
+	63101: 58533,
+	63102: 58534,
+	63104: 58535,
+	63105: 58536,
+	63106: 58537,
+	63107: 58538,
+	63108: 58539,
+	63109: 58540,
+	63110: 58541,
+	63111: 58542,
+	63112: 58543,
+	63113: 58544,
+	63114: 58545,
+	63115: 58546,
+	63116: 58547,
+	63117: 58548,
+	63118: 58549,
+	63119: 58550,
+	63120: 58551,
+	63121: 58552,
+	63122: 58553,
+	63123: 58554,
+	63124: 58555,
+	63125: 58556,
+	63126: 58557,
+	63127: 58558,
+	63128: 58559,
+	63129: 58560,
+	63130: 58561,
+	63131: 58562,
+	63132: 58563,
+	63133: 58564,
+	63134: 58565,
+	63135: 58566,
+	63136: 58567,
+	63137: 58568,
+	63138: 58569,
+	63139: 58570,
+	63140: 58571,
+	63141: 58572,
+	63142: 58573,
+	63143: 58574,
+	63144: 58575,
+	63145: 58576,
+	63146: 58577,
+	63147: 58578,
+	63148: 58579,
+	63149: 58580,
+	63150: 58581,
+	63151: 58582,
+	63152: 58583,
+	63153: 58584,
+	63154: 58585,
+	63155: 58586,
+	63156: 58587,
+	63157: 58588,
+	63158: 58589,
+	63159: 58590,
+	63160: 58591,
+	63161: 58592,
+	63162: 58593,
+	63163: 58594,
+	63164: 58595,
+	63165: 58596,
+	63166: 58597,
+	63167: 58598,
+	63168: 58599,
+	63169: 58600,
+	63170: 58601,
+	63171: 58602,
+	63172: 58603,
+	63173: 58604,
+	63174: 58605,
+	63175: 58606,
+	63176: 58607,
+	63177: 58608,
+	63178: 58609,
+	63179: 58610,
+	63180: 58611,
+	63181: 58612,
+	63182: 58613,
+	63183: 58614,
+	63184: 58615,
+	63185: 58616,
+	63186: 58617,
+	63187: 58618,
+	63188: 58619,
+	63189: 58620,
+	63190: 58621,
+	63191: 58622,
+	63192: 58623,
+	63193: 58624,
+	63194: 58625,
+	63195: 58626,
+	63196: 58627,
+	63197: 58628,
+	63198: 58629,
+	63199: 58630,
+	63200: 58631,
+	63201: 58632,
+	63202: 58633,
+	63203: 58634,
+	63204: 58635,
+	63205: 58636,
+	63206: 58637,
+	63207: 58638,
+	63208: 58639,
+	63209: 58640,
+	63210: 58641,
+	63211: 58642,
+	63212: 58643,
+	63213: 58644,
+	63214: 58645,
+	63215: 58646,
+	63216: 58647,
+	63217: 58648,
+	63218: 58649,
+	63219: 58650,
+	63220: 58651,
+	63221: 58652,
+	63222: 58653,
+	63223: 58654,
+	63224: 58655,
+	63225: 58656,
+	63226: 58657,
+	63227: 58658,
+	63228: 58659,
+	63296: 58660,
+	63297: 58661,
+	63298: 58662,
+	63299: 58663,
+	63300: 58664,
+	63301: 58665,
+	63302: 58666,
+	63303: 58667,
+	63304: 58668,
+	63305: 58669,
+	63306: 58670,
+	63307: 58671,
+	63308: 58672,
+	63309: 58673,
+	63310: 58674,
+	63311: 58675,
+	63312: 58676,
+	63313: 58677,
+	63314: 58678,
+	63315: 58679,
+	63316: 58680,
+	63317: 58681,
+	63318: 58682,
+	63319: 58683,
+	63320: 58684,
+	63321: 58685,
+	63322: 58686,
+	63323: 58687,
+	63324: 58688,
+	63325: 58689,
+	63326: 58690,
+	63327: 58691,
+	63328: 58692,
+	63329: 58693,
+	63330: 58694,
+	63331: 58695,
+	63332: 58696,
+	63333: 58697,
+	63334: 58698,
+	63335: 58699,
+	63336: 58700,
+	63337: 58701,
+	63338: 58702,
+	63339: 58703,
+	63340: 58704,
+	63341: 58705,
+	63342: 58706,
+	63343: 58707,
+	63344: 58708,
+	63345: 58709,
+	63346: 58710,
+	63347: 58711,
+	63348: 58712,
+	63349: 58713,
+	63350: 58714,
+	63351: 58715,
+	63352: 58716,
+	63353: 58717,
+	63354: 58718,
+	63355: 58719,
+	63356: 58720,
+	63357: 58721,
+	63358: 58722,
+	63360: 58723,
+	63361: 58724,
+	63362: 58725,
+	63363: 58726,
+	63364: 58727,
+	63365: 58728,
+	63366: 58729,
+	63367: 58730,
+	63368: 58731,
+	63369: 58732,
+	63370: 58733,
+	63371: 58734,
+	63372: 58735,
+	63373: 58736,
+	63374: 58737,
+	63375: 58738,
+	63376: 58739,
+	63377: 58740,
+	63378: 58741,
+	63379: 58742,
+	63380: 58743,
+	63381: 58744,
+	63382: 58745,
+	63383: 58746,
+	63384: 58747,
+	63385: 58748,
+	63386: 58749,
+	63387: 58750,
+	63388: 58751,
+	63389: 58752,
+	63390: 58753,
+	63391: 58754,
+	63392: 58755,
+	63393: 58756,
+	63394: 58757,
+	63395: 58758,
+	63396: 58759,
+	63397: 58760,
+	63398: 58761,
+	63399: 58762,
+	63400: 58763,
+	63401: 58764,
+	63402: 58765,
+	63403: 58766,
+	63404: 58767,
+	63405: 58768,
+	63406: 58769,
+	63407: 58770,
+	63408: 58771,
+	63409: 58772,
+	63410: 58773,
+	63411: 58774,
+	63412: 58775,
+	63413: 58776,
+	63414: 58777,
+	63415: 58778,
+	63416: 58779,
+	63417: 58780,
+	63418: 58781,
+	63419: 58782,
+	63420: 58783,
+	63421: 58784,
+	63422: 58785,
+	63423: 58786,
+	63424: 58787,
+	63425: 58788,
+	63426: 58789,
+	63427: 58790,
+	63428: 58791,
+	63429: 58792,
+	63430: 58793,
+	63431: 58794,
+	63432: 58795,
+	63433: 58796,
+	63434: 58797,
+	63435: 58798,
+	63436: 58799,
+	63437: 58800,
+	63438: 58801,
+	63439: 58802,
+	63440: 58803,
+	63441: 58804,
+	63442: 58805,
+	63443: 58806,
+	63444: 58807,
+	63445: 58808,
+	63446: 58809,
+	63447: 58810,
+	63448: 58811,
+	63449: 58812,
+	63450: 58813,
+	63451: 58814,
+	63452: 58815,
+	63453: 58816,
+	63454: 58817,
+	63455: 58818,
+	63456: 58819,
+	63457: 58820,
+	63458: 58821,
+	63459: 58822,
+	63460: 58823,
+	63461: 58824,
+	63462: 58825,
+	63463: 58826,
+	63464: 58827,
+	63465: 58828,
+	63466: 58829,
+	63467: 58830,
+	63468: 58831,
+	63469: 58832,
+	63470: 58833,
+	63471: 58834,
+	63472: 58835,
+	63473: 58836,
+	63474: 58837,
+	63475: 58838,
+	63476: 58839,
+	63477: 58840,
+	63478: 58841,
+	63479: 58842,
+	63480: 58843,
+	63481: 58844,
+	63482: 58845,
+	63483: 58846,
+	63484: 58847,
+	63552: 58848,
+	63553: 58849,
+	63554: 58850,
+	63555: 58851,
+	63556: 58852,
+	63557: 58853,
+	63558: 58854,
+	63559: 58855,
+	63560: 58856,
+	63561: 58857,
+	63562: 58858,
+	63563: 58859,
+	63564: 58860,
+	63565: 58861,
+	63566: 58862,
+	63567: 58863,
+	63568: 58864,
+	63569: 58865,
+	63570: 58866,
+	63571: 58867,
+	63572: 58868,
+	63573: 58869,
+	63574: 58870,
+	63575: 58871,
+	63576: 58872,
+	63577: 58873,
+	63578: 58874,
+	63579: 58875,
+	63580: 58876,
+	63581: 58877,
+	63582: 58878,
+	63583: 58879,
+	63584: 58880,
+	63585: 58881,
+	63586: 58882,
+	63587: 58883,
+	63588: 58884,
+	63589: 58885,
+	63590: 58886,
+	63591: 58887,
+	63592: 58888,
+	63593: 58889,
+	63594: 58890,
+	63595: 58891,
+	63596: 58892,
+	63597: 58893,
+	63598: 58894,
+	63599: 58895,
+	63600: 58896,
+	63601: 58897,
+	63602: 58898,
+	63603: 58899,
+	63604: 58900,
+	63605: 58901,
+	63606: 58902,
+	63607: 58903,
+	63608: 58904,
+	63609: 58905,
+	63610: 58906,
+	63611: 58907,
+	63612: 58908,
+	63613: 58909,
+	63614: 58910,
+	63616: 58911,
+	63617: 58912,
+	63618: 58913,
+	63619: 58914,
+	63620: 58915,
+	63621: 58916,
+	63622: 58917,
+	63623: 58918,
+	63624: 58919,
+	63625: 58920,
+	63626: 58921,
+	63627: 58922,
+	63628: 58923,
+	63629: 58924,
+	63630: 58925,
+	63631: 58926,
+	63632: 58927,
+	63633: 58928,
+	63634: 58929,
+	63635: 58930,
+	63636: 58931,
+	63637: 58932,
+	63638: 58933,
+	63639: 58934,
+	63640: 58935,
+	63641: 58936,
+	63642: 58937,
+	63643: 58938,
+	63644: 58939,
+	63645: 58940,
+	63646: 58941,
+	63647: 58942,
+	63648: 58943,
+	63649: 58944,
+	63650: 58945,
+	63651: 58946,
+	63652: 58947,
+	63653: 58948,
+	63654: 58949,
+	63655: 58950,
+	63656: 58951,
+	63657: 58952,
+	63658: 58953,
+	63659: 58954,
+	63660: 58955,
+	63661: 58956,
+	63662: 58957,
+	63663: 58958,
+	63664: 58959,
+	63665: 58960,
+	63666: 58961,
+	63667: 58962,
+	63668: 58963,
+	63669: 58964,
+	63670: 58965,
+	63671: 58966,
+	63672: 58967,
+	63673: 58968,
+	63674: 58969,
+	63675: 58970,
+	63676: 58971,
+	63677: 58972,
+	63678: 58973,
+	63679: 58974,
+	63680: 58975,
+	63681: 58976,
+	63682: 58977,
+	63683: 58978,
+	63684: 58979,
+	63685: 58980,
+	63686: 58981,
+	63687: 58982,
+	63688: 58983,
+	63689: 58984,
+	63690: 58985,
+	63691: 58986,
+	63692: 58987,
+	63693: 58988,
+	63694: 58989,
+	63695: 58990,
+	63696: 58991,
+	63697: 58992,
+	63698: 58993,
+	63699: 58994,
+	63700: 58995,
+	63701: 58996,
+	63702: 58997,
+	63703: 58998,
+	63704: 58999,
+	63705: 59000,
+	63706: 59001,
+	63707: 59002,
+	63708: 59003,
+	63709: 59004,
+	63710: 59005,
+	63711: 59006,
+	63712: 59007,
+	63713: 59008,
+	63714: 59009,
+	63715: 59010,
+	63716: 59011,
+	63717: 59012,
+	63718: 59013,
+	63719: 59014,
+	63720: 59015,
+	63721: 59016,
+	63722: 59017,
+	63723: 59018,
+	63724: 59019,
+	63725: 59020,
+	63726: 59021,
+	63727: 59022,
+	63728: 59023,
+	63729: 59024,
+	63730: 59025,
+	63731: 59026,
+	63732: 59027,
+	63733: 59028,
+	63734: 59029,
+	63735: 59030,
+	63736: 59031,
+	63737: 59032,
+	63738: 59033,
+	63739: 59034,
+	63740: 59035,
+	64064: 8560,
+	64065: 8561,
+	64066: 8562,
+	64067: 8563,
+	64068: 8564,
+	64069: 8565,
+	64070: 8566,
+	64071: 8567,
+	64072: 8568,
+	64073: 8569,
+	64074: 8544,
+	64075: 8545,
+	64076: 8546,
+	64077: 8547,
+	64078: 8548,
+	64079: 8549,
+	64080: 8550,
+	64081: 8551,
+	64082: 8552,
+	64083: 8553,
+	64084: 65506,
+	64085: 65508,
+	64086: 65287,
+	64087: 65282,
+	64088: 12849,
+	64089: 8470,
+	64090: 8481,
+	64091: 8757,
+	64092: 32394,
+	64093: 35100,
+	64094: 37704,
+	64095: 37512,
+	64096: 34012,
+	64097: 20425,
+	64098: 28859,
+	64099: 26161,
+	64100: 26824,
+	64101: 37625,
+	64102: 26363,
+	64103: 24389,
+	64104: 20008,
+	64105: 20193,
+	64106: 20220,
+	64107: 20224,
+	64108: 20227,
+	64109: 20281,
+	64110: 20310,
+	64111: 20370,
+	64112: 20362,
+	64113: 20378,
+	64114: 20372,
+	64115: 20429,
+	64116: 20544,
+	64117: 20514,
+	64118: 20479,
+	64119: 20510,
+	64120: 20550,
+	64121: 20592,
+	64122: 20546,
+	64123: 20628,
+	64124: 20724,
+	64125: 20696,
+	64126: 20810,
+	64128: 20836,
+	64129: 20893,
+	64130: 20926,
+	64131: 20972,
+	64132: 21013,
+	64133: 21148,
+	64134: 21158,
+	64135: 21184,
+	64136: 21211,
+	64137: 21248,
+	64138: 21255,
+	64139: 21284,
+	64140: 21362,
+	64141: 21395,
+	64142: 21426,
+	64143: 21469,
+	64144: 64014,
+	64145: 21660,
+	64146: 21642,
+	64147: 21673,
+	64148: 21759,
+	64149: 21894,
+	64150: 22361,
+	64151: 22373,
+	64152: 22444,
+	64153: 22472,
+	64154: 22471,
+	64155: 64015,
+	64156: 64016,
+	64157: 22686,
+	64158: 22706,
+	64159: 22795,
+	64160: 22867,
+	64161: 22875,
+	64162: 22877,
+	64163: 22883,
+	64164: 22948,
+	64165: 22970,
+	64166: 23382,
+	64167: 23488,
+	64168: 29999,
+	64169: 23512,
+	64170: 23532,
+	64171: 23582,
+	64172: 23718,
+	64173: 23738,
+	64174: 23797,
+	64175: 23847,
+	64176: 23891,
+	64177: 64017,
+	64178: 23874,
+	64179: 23917,
+	64180: 23992,
+	64181: 23993,
+	64182: 24016,
+	64183: 24353,
+	64184: 24372,
+	64185: 24423,
+	64186: 24503,
+	64187: 24542,
+	64188: 24669,
+	64189: 24709,
+	64190: 24714,
+	64191: 24798,
+	64192: 24789,
+	64193: 24864,
+	64194: 24818,
+	64195: 24849,
+	64196: 24887,
+	64197: 24880,
+	64198: 24984,
+	64199: 25107,
+	64200: 25254,
+	64201: 25589,
+	64202: 25696,
+	64203: 25757,
+	64204: 25806,
+	64205: 25934,
+	64206: 26112,
+	64207: 26133,
+	64208: 26171,
+	64209: 26121,
+	64210: 26158,
+	64211: 26142,
+	64212: 26148,
+	64213: 26213,
+	64214: 26199,
+	64215: 26201,
+	64216: 64018,
+	64217: 26227,
+	64218: 26265,
+	64219: 26272,
+	64220: 26290,
+	64221: 26303,
+	64222: 26362,
+	64223: 26382,
+	64224: 63785,
+	64225: 26470,
+	64226: 26555,
+	64227: 26706,
+	64228: 26560,
+	64229: 26625,
+	64230: 26692,
+	64231: 26831,
+	64232: 64019,
+	64233: 26984,
+	64234: 64020,
+	64235: 27032,
+	64236: 27106,
+	64237: 27184,
+	64238: 27243,
+	64239: 27206,
+	64240: 27251,
+	64241: 27262,
+	64242: 27362,
+	64243: 27364,
+	64244: 27606,
+	64245: 27711,
+	64246: 27740,
+	64247: 27782,
+	64248: 27759,
+	64249: 27866,
+	64250: 27908,
+	64251: 28039,
+	64252: 28015,
+	64320: 28054,
+	64321: 28076,
+	64322: 28111,
+	64323: 28152,
+	64324: 28146,
+	64325: 28156,
+	64326: 28217,
+	64327: 28252,
+	64328: 28199,
+	64329: 28220,
+	64330: 28351,
+	64331: 28552,
+	64332: 28597,
+	64333: 28661,
+	64334: 28677,
+	64335: 28679,
+	64336: 28712,
+	64337: 28805,
+	64338: 28843,
+	64339: 28943,
+	64340: 28932,
+	64341: 29020,
+	64342: 28998,
+	64343: 28999,
+	64344: 64021,
+	64345: 29121,
+	64346: 29182,
+	64347: 29361,
+	64348: 29374,
+	64349: 29476,
+	64350: 64022,
+	64351: 29559,
+	64352: 29629,
+	64353: 29641,
+	64354: 29654,
+	64355: 29667,
+	64356: 29650,
+	64357: 29703,
+	64358: 29685,
+	64359: 29734,
+	64360: 29738,
+	64361: 29737,
+	64362: 29742,
+	64363: 29794,
+	64364: 29833,
+	64365: 29855,
+	64366: 29953,
+	64367: 30063,
+	64368: 30338,
+	64369: 30364,
+	64370: 30366,
+	64371: 30363,
+	64372: 30374,
+	64373: 64023,
+	64374: 30534,
+	64375: 21167,
+	64376: 30753,
+	64377: 30798,
+	64378: 30820,
+	64379: 30842,
+	64380: 31024,
+	64381: 64024,
+	64382: 64025,
+	64384: 64026,
+	64385: 31124,
+	64386: 64027,
+	64387: 31131,
+	64388: 31441,
+	64389: 31463,
+	64390: 64028,
+	64391: 31467,
+	64392: 31646,
+	64393: 64029,
+	64394: 32072,
+	64395: 32092,
+	64396: 32183,
+	64397: 32160,
+	64398: 32214,
+	64399: 32338,
+	64400: 32583,
+	64401: 32673,
+	64402: 64030,
+	64403: 33537,
+	64404: 33634,
+	64405: 33663,
+	64406: 33735,
+	64407: 33782,
+	64408: 33864,
+	64409: 33972,
+	64410: 34131,
+	64411: 34137,
+	64412: 34155,
+	64413: 64031,
+	64414: 34224,
+	64415: 64032,
+	64416: 64033,
+	64417: 34823,
+	64418: 35061,
+	64419: 35346,
+	64420: 35383,
+	64421: 35449,
+	64422: 35495,
+	64423: 35518,
+	64424: 35551,
+	64425: 64034,
+	64426: 35574,
+	64427: 35667,
+	64428: 35711,
+	64429: 36080,
+	64430: 36084,
+	64431: 36114,
+	64432: 36214,
+	64433: 64035,
+	64434: 36559,
+	64435: 64036,
+	64436: 64037,
+	64437: 36967,
+	64438: 37086,
+	64439: 64038,
+	64440: 37141,
+	64441: 37159,
+	64442: 37338,
+	64443: 37335,
+	64444: 37342,
+	64445: 37357,
+	64446: 37358,
+	64447: 37348,
+	64448: 37349,
+	64449: 37382,
+	64450: 37392,
+	64451: 37386,
+	64452: 37434,
+	64453: 37440,
+	64454: 37436,
+	64455: 37454,
+	64456: 37465,
+	64457: 37457,
+	64458: 37433,
+	64459: 37479,
+	64460: 37543,
+	64461: 37495,
+	64462: 37496,
+	64463: 37607,
+	64464: 37591,
+	64465: 37593,
+	64466: 37584,
+	64467: 64039,
+	64468: 37589,
+	64469: 37600,
+	64470: 37587,
+	64471: 37669,
+	64472: 37665,
+	64473: 37627,
+	64474: 64040,
+	64475: 37662,
+	64476: 37631,
+	64477: 37661,
+	64478: 37634,
+	64479: 37744,
+	64480: 37719,
+	64481: 37796,
+	64482: 37830,
+	64483: 37854,
+	64484: 37880,
+	64485: 37937,
+	64486: 37957,
+	64487: 37960,
+	64488: 38290,
+	64489: 63964,
+	64490: 64041,
+	64491: 38557,
+	64492: 38575,
+	64493: 38707,
+	64494: 38715,
+	64495: 38723,
+	64496: 38733,
+	64497: 38735,
+	64498: 38737,
+	64499: 38741,
+	64500: 38999,
+	64501: 39013,
+	64502: 64042,
+	64503: 64043,
+	64504: 39207,
+	64505: 64044,
+	64506: 39326,
+	64507: 39502,
+	64508: 39641,
+	64576: 39644,
+	64577: 39797,
+	64578: 39794,
+	64579: 39823,
+	64580: 39857,
+	64581: 39867,
+	64582: 39936,
+	64583: 40304,
+	64584: 40299,
+	64585: 64045,
+	64586: 40473,
+	64587: 40657
+};
+
+/**
+ * @author takahiro / https://github.com/takahirox
+ */
+
+function DataViewEx( buffer, littleEndian ) {
+
+	this.dv = new DataView( buffer );
+	this.offset = 0;
+	this.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;
+	this.encoder = new CharsetEncoder();
+
+}
+
+DataViewEx.prototype = {
+
+	constructor: DataViewEx,
+
+	getInt8: function () {
+
+		var value = this.dv.getInt8( this.offset );
+		this.offset += 1;
+		return value;
+
+	},
+
+	getInt8Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getInt8() );
+
+		}
+
+		return a;
+
+	},
+
+	getUint8: function () {
+
+		var value = this.dv.getUint8( this.offset );
+		this.offset += 1;
+		return value;
+
+	},
+
+	getUint8Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getUint8() );
+
+		}
+
+		return a;
+
+	},
+
+
+	getInt16: function () {
+
+		var value = this.dv.getInt16( this.offset, this.littleEndian );
+		this.offset += 2;
+		return value;
+
+	},
+
+	getInt16Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getInt16() );
+
+		}
+
+		return a;
+
+	},
+
+	getUint16: function () {
+
+		var value = this.dv.getUint16( this.offset, this.littleEndian );
+		this.offset += 2;
+		return value;
+
+	},
+
+	getUint16Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getUint16() );
+
+		}
+
+		return a;
+
+	},
+
+	getInt32: function () {
+
+		var value = this.dv.getInt32( this.offset, this.littleEndian );
+		this.offset += 4;
+		return value;
+
+	},
+
+	getInt32Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getInt32() );
+
+		}
+
+		return a;
+
+	},
+
+	getUint32: function () {
+
+		var value = this.dv.getUint32( this.offset, this.littleEndian );
+		this.offset += 4;
+		return value;
+
+	},
+
+	getUint32Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getUint32() );
+
+		}
+
+		return a;
+
+	},
+
+	getFloat32: function () {
+
+		var value = this.dv.getFloat32( this.offset, this.littleEndian );
+		this.offset += 4;
+		return value;
+
+	},
+
+	getFloat32Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getFloat32() );
+
+		}
+
+		return a;
+
+	},
+
+	getFloat64: function () {
+
+		var value = this.dv.getFloat64( this.offset, this.littleEndian );
+		this.offset += 8;
+		return value;
+
+	},
+
+	getFloat64Array: function ( size ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getFloat64() );
+
+		}
+
+		return a;
+
+	},
+
+	getIndex: function ( type, isUnsigned ) {
+
+		switch ( type ) {
+
+			case 1:
+				return ( isUnsigned === true ) ? this.getUint8() : this.getInt8();
+
+			case 2:
+				return ( isUnsigned === true ) ? this.getUint16() : this.getInt16();
+
+			case 4:
+				return this.getInt32(); // No Uint32
+
+			default:
+				throw 'unknown number type ' + type + ' exception.';
+
+		}
+
+	},
+
+	getIndexArray: function ( type, size, isUnsigned ) {
+
+		var a = [];
+
+		for ( var i = 0; i < size; i ++ ) {
+
+			a.push( this.getIndex( type, isUnsigned ) );
+
+		}
+
+		return a;
+
+	},
+
+	getChars: function ( size ) {
+
+		var str = '';
+
+		while ( size > 0 ) {
+
+			var value = this.getUint8();
+			size --;
+
+			if ( value === 0 ) {
+
+				break;
+
+			}
+
+			str += String.fromCharCode( value );
+
+		}
+
+		while ( size > 0 ) {
+
+			this.getUint8();
+			size --;
+
+		}
+
+		return str;
+
+	},
+
+	getSjisStringsAsUnicode: function ( size ) {
+
+		var a = [];
+
+		while ( size > 0 ) {
+
+			var value = this.getUint8();
+			size --;
+
+			if ( value === 0 ) {
+
+				break;
+
+			}
+
+			a.push( value );
+
+		}
+
+		while ( size > 0 ) {
+
+			this.getUint8();
+			size --;
+
+		}
+
+		return this.encoder.s2u( new Uint8Array( a ) );
+
+	},
+
+	getUnicodeStrings: function ( size ) {
+
+		var str = '';
+
+		while ( size > 0 ) {
+
+			var value = this.getUint16();
+			size -= 2;
+
+			if ( value === 0 ) {
+
+				break;
+
+			}
+
+			str += String.fromCharCode( value );
+
+		}
+
+		while ( size > 0 ) {
+
+			this.getUint8();
+			size --;
+
+		}
+
+		return str;
+
+	},
+
+	getTextBuffer: function () {
+
+		var size = this.getUint32();
+		return this.getUnicodeStrings( size );
+
+	}
+
+};
+
+/**
+ * @author takahiro / https://github.com/takahirox
+ */
+
+function DataCreationHelper() {
+}
+
+DataCreationHelper.prototype = {
+
+	constructor: DataCreationHelper,
+
+	leftToRightVector3: function ( v ) {
+
+		v[ 2 ] = - v[ 2 ];
+
+	},
+
+	leftToRightQuaternion: function ( q ) {
+
+		q[ 0 ] = - q[ 0 ];
+		q[ 1 ] = - q[ 1 ];
+
+	},
+
+	leftToRightEuler: function ( r ) {
+
+		r[ 0 ] = - r[ 0 ];
+		r[ 1 ] = - r[ 1 ];
+
+	},
+
+	leftToRightIndexOrder: function ( p ) {
+
+		var tmp = p[ 2 ];
+		p[ 2 ] = p[ 0 ];
+		p[ 0 ] = tmp;
+
+	},
+
+	leftToRightVector3Range: function ( v1, v2 ) {
+
+		var tmp = - v2[ 2 ];
+		v2[ 2 ] = - v1[ 2 ];
+		v1[ 2 ] = tmp;
+
+	},
+
+	leftToRightEulerRange: function ( r1, r2 ) {
+
+		var tmp1 = - r2[ 0 ];
+		var tmp2 = - r2[ 1 ];
+		r2[ 0 ] = - r1[ 0 ];
+		r2[ 1 ] = - r1[ 1 ];
+		r1[ 0 ] = tmp1;
+		r1[ 1 ] = tmp2;
+
+	}
+
+};
+
+/**
+ * @author takahiro / https://github.com/takahirox
+ */
+
+function Parser() {
+}
+
+Parser.prototype.parsePmd = function ( buffer, leftToRight ) {
+
+	var pmd = {};
+	var dv = new DataViewEx( buffer );
+
+	pmd.metadata = {};
+	pmd.metadata.format = 'pmd';
+	pmd.metadata.coordinateSystem = 'left';
+
+	var parseHeader = function () {
+
+		var metadata = pmd.metadata;
+		metadata.magic = dv.getChars( 3 );
+
+		if ( metadata.magic !== 'Pmd' ) {
+
+			throw 'PMD file magic is not Pmd, but ' + metadata.magic;
+
+		}
+
+		metadata.version = dv.getFloat32();
+		metadata.modelName = dv.getSjisStringsAsUnicode( 20 );
+		metadata.comment = dv.getSjisStringsAsUnicode( 256 );
+
+	};
+
+	var parseVertices = function () {
+
+		var parseVertex = function () {
+
+			var p = {};
+			p.position = dv.getFloat32Array( 3 );
+			p.normal = dv.getFloat32Array( 3 );
+			p.uv = dv.getFloat32Array( 2 );
+			p.skinIndices = dv.getUint16Array( 2 );
+			p.skinWeights = [ dv.getUint8() / 100 ];
+			p.skinWeights.push( 1.0 - p.skinWeights[ 0 ] );
+			p.edgeFlag = dv.getUint8();
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.vertexCount = dv.getUint32();
+
+		pmd.vertices = [];
+
+		for ( var i = 0; i < metadata.vertexCount; i ++ ) {
+
+			pmd.vertices.push( parseVertex() );
+
+		}
+
+	};
+
+	var parseFaces = function () {
+
+		var parseFace = function () {
+
+			var p = {};
+			p.indices = dv.getUint16Array( 3 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.faceCount = dv.getUint32() / 3;
+
+		pmd.faces = [];
+
+		for ( var i = 0; i < metadata.faceCount; i ++ ) {
+
+			pmd.faces.push( parseFace() );
+
+		}
+
+	};
+
+	var parseMaterials = function () {
+
+		var parseMaterial = function () {
+
+			var p = {};
+			p.diffuse = dv.getFloat32Array( 4 );
+			p.shininess = dv.getFloat32();
+			p.specular = dv.getFloat32Array( 3 );
+			p.ambient = dv.getFloat32Array( 3 );
+			p.toonIndex = dv.getInt8();
+			p.edgeFlag = dv.getUint8();
+			p.faceCount = dv.getUint32() / 3;
+			p.fileName = dv.getSjisStringsAsUnicode( 20 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.materialCount = dv.getUint32();
+
+		pmd.materials = [];
+
+		for ( var i = 0; i < metadata.materialCount; i ++ ) {
+
+			pmd.materials.push( parseMaterial() );
+
+		}
+
+	};
+
+	var parseBones = function () {
+
+		var parseBone = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 20 );
+			p.parentIndex = dv.getInt16();
+			p.tailIndex = dv.getInt16();
+			p.type = dv.getUint8();
+			p.ikIndex = dv.getInt16();
+			p.position = dv.getFloat32Array( 3 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.boneCount = dv.getUint16();
+
+		pmd.bones = [];
+
+		for ( var i = 0; i < metadata.boneCount; i ++ ) {
+
+			pmd.bones.push( parseBone() );
+
+		}
+
+	};
+
+	var parseIks = function () {
+
+		var parseIk = function () {
+
+			var p = {};
+			p.target = dv.getUint16();
+			p.effector = dv.getUint16();
+			p.linkCount = dv.getUint8();
+			p.iteration = dv.getUint16();
+			p.maxAngle = dv.getFloat32();
+
+			p.links = [];
+			for ( var i = 0; i < p.linkCount; i ++ ) {
+
+				var link = {};
+				link.index = dv.getUint16();
+				p.links.push( link );
+
+			}
+
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.ikCount = dv.getUint16();
+
+		pmd.iks = [];
+
+		for ( var i = 0; i < metadata.ikCount; i ++ ) {
+
+			pmd.iks.push( parseIk() );
+
+		}
+
+	};
+
+	var parseMorphs = function () {
+
+		var parseMorph = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 20 );
+			p.elementCount = dv.getUint32();
+			p.type = dv.getUint8();
+
+			p.elements = [];
+			for ( var i = 0; i < p.elementCount; i ++ ) {
+
+				p.elements.push( {
+					index: dv.getUint32(),
+					position: dv.getFloat32Array( 3 )
+				} );
+
+			}
+
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.morphCount = dv.getUint16();
+
+		pmd.morphs = [];
+
+		for ( var i = 0; i < metadata.morphCount; i ++ ) {
+
+			pmd.morphs.push( parseMorph() );
+
+		}
+
+
+	};
+
+	var parseMorphFrames = function () {
+
+		var parseMorphFrame = function () {
+
+			var p = {};
+			p.index = dv.getUint16();
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.morphFrameCount = dv.getUint8();
+
+		pmd.morphFrames = [];
+
+		for ( var i = 0; i < metadata.morphFrameCount; i ++ ) {
+
+			pmd.morphFrames.push( parseMorphFrame() );
+
+		}
+
+	};
+
+	var parseBoneFrameNames = function () {
+
+		var parseBoneFrameName = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 50 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.boneFrameNameCount = dv.getUint8();
+
+		pmd.boneFrameNames = [];
+
+		for ( var i = 0; i < metadata.boneFrameNameCount; i ++ ) {
+
+			pmd.boneFrameNames.push( parseBoneFrameName() );
+
+		}
+
+	};
+
+	var parseBoneFrames = function () {
+
+		var parseBoneFrame = function () {
+
+			var p = {};
+			p.boneIndex = dv.getInt16();
+			p.frameIndex = dv.getUint8();
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.boneFrameCount = dv.getUint32();
+
+		pmd.boneFrames = [];
+
+		for ( var i = 0; i < metadata.boneFrameCount; i ++ ) {
+
+			pmd.boneFrames.push( parseBoneFrame() );
+
+		}
+
+	};
+
+	var parseEnglishHeader = function () {
+
+		var metadata = pmd.metadata;
+		metadata.englishCompatibility = dv.getUint8();
+
+		if ( metadata.englishCompatibility > 0 ) {
+
+			metadata.englishModelName = dv.getSjisStringsAsUnicode( 20 );
+			metadata.englishComment = dv.getSjisStringsAsUnicode( 256 );
+
+		}
+
+	};
+
+	var parseEnglishBoneNames = function () {
+
+		var parseEnglishBoneName = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 20 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+
+		if ( metadata.englishCompatibility === 0 ) {
+
+			return;
+
+		}
+
+		pmd.englishBoneNames = [];
+
+		for ( var i = 0; i < metadata.boneCount; i ++ ) {
+
+			pmd.englishBoneNames.push( parseEnglishBoneName() );
+
+		}
+
+	};
+
+	var parseEnglishMorphNames = function () {
+
+		var parseEnglishMorphName = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 20 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+
+		if ( metadata.englishCompatibility === 0 ) {
+
+			return;
+
+		}
+
+		pmd.englishMorphNames = [];
+
+		for ( var i = 0; i < metadata.morphCount - 1; i ++ ) {
+
+			pmd.englishMorphNames.push( parseEnglishMorphName() );
+
+		}
+
+	};
+
+	var parseEnglishBoneFrameNames = function () {
+
+		var parseEnglishBoneFrameName = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 50 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+
+		if ( metadata.englishCompatibility === 0 ) {
+
+			return;
+
+		}
+
+		pmd.englishBoneFrameNames = [];
+
+		for ( var i = 0; i < metadata.boneFrameNameCount; i ++ ) {
+
+			pmd.englishBoneFrameNames.push( parseEnglishBoneFrameName() );
+
+		}
+
+	};
+
+	var parseToonTextures = function () {
+
+		var parseToonTexture = function () {
+
+			var p = {};
+			p.fileName = dv.getSjisStringsAsUnicode( 100 );
+			return p;
+
+		};
+
+		pmd.toonTextures = [];
+
+		for ( var i = 0; i < 10; i ++ ) {
+
+			pmd.toonTextures.push( parseToonTexture() );
+
+		}
+
+	};
+
+	var parseRigidBodies = function () {
+
+		var parseRigidBody = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 20 );
+			p.boneIndex = dv.getInt16();
+			p.groupIndex = dv.getUint8();
+			p.groupTarget = dv.getUint16();
+			p.shapeType = dv.getUint8();
+			p.width = dv.getFloat32();
+			p.height = dv.getFloat32();
+			p.depth = dv.getFloat32();
+			p.position = dv.getFloat32Array( 3 );
+			p.rotation = dv.getFloat32Array( 3 );
+			p.weight = dv.getFloat32();
+			p.positionDamping = dv.getFloat32();
+			p.rotationDamping = dv.getFloat32();
+			p.restitution = dv.getFloat32();
+			p.friction = dv.getFloat32();
+			p.type = dv.getUint8();
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.rigidBodyCount = dv.getUint32();
+
+		pmd.rigidBodies = [];
+
+		for ( var i = 0; i < metadata.rigidBodyCount; i ++ ) {
+
+			pmd.rigidBodies.push( parseRigidBody() );
+
+		}
+
+	};
+
+	var parseConstraints = function () {
+
+		var parseConstraint = function () {
+
+			var p = {};
+			p.name = dv.getSjisStringsAsUnicode( 20 );
+			p.rigidBodyIndex1 = dv.getUint32();
+			p.rigidBodyIndex2 = dv.getUint32();
+			p.position = dv.getFloat32Array( 3 );
+			p.rotation = dv.getFloat32Array( 3 );
+			p.translationLimitation1 = dv.getFloat32Array( 3 );
+			p.translationLimitation2 = dv.getFloat32Array( 3 );
+			p.rotationLimitation1 = dv.getFloat32Array( 3 );
+			p.rotationLimitation2 = dv.getFloat32Array( 3 );
+			p.springPosition = dv.getFloat32Array( 3 );
+			p.springRotation = dv.getFloat32Array( 3 );
+			return p;
+
+		};
+
+		var metadata = pmd.metadata;
+		metadata.constraintCount = dv.getUint32();
+
+		pmd.constraints = [];
+
+		for ( var i = 0; i < metadata.constraintCount; i ++ ) {
+
+			pmd.constraints.push( parseConstraint() );
+
+		}
+
+	};
+
+	parseHeader();
+	parseVertices();
+	parseFaces();
+	parseMaterials();
+	parseBones();
+	parseIks();
+	parseMorphs();
+	parseMorphFrames();
+	parseBoneFrameNames();
+	parseBoneFrames();
+	parseEnglishHeader();
+	parseEnglishBoneNames();
+	parseEnglishMorphNames();
+	parseEnglishBoneFrameNames();
+	parseToonTextures();
+	parseRigidBodies();
+	parseConstraints();
+
+	if ( leftToRight === true ) this.leftToRightModel( pmd );
+
+	// console.log( pmd ); // for console debug
+
+	return pmd;
+
+};
+
+Parser.prototype.parsePmx = function ( buffer, leftToRight ) {
+
+	var pmx = {};
+	var dv = new DataViewEx( buffer );
+
+	pmx.metadata = {};
+	pmx.metadata.format = 'pmx';
+	pmx.metadata.coordinateSystem = 'left';
+
+	var parseHeader = function () {
+
+		var metadata = pmx.metadata;
+		metadata.magic = dv.getChars( 4 );
+
+		// Note: don't remove the last blank space.
+		if ( metadata.magic !== 'PMX ' ) {
+
+			throw 'PMX file magic is not PMX , but ' + metadata.magic;
+
+		}
+
+		metadata.version = dv.getFloat32();
+
+		if ( metadata.version !== 2.0 && metadata.version !== 2.1 ) {
+
+			throw 'PMX version ' + metadata.version + ' is not supported.';
+
+		}
+
+		metadata.headerSize = dv.getUint8();
+		metadata.encoding = dv.getUint8();
+		metadata.additionalUvNum = dv.getUint8();
+		metadata.vertexIndexSize = dv.getUint8();
+		metadata.textureIndexSize = dv.getUint8();
+		metadata.materialIndexSize = dv.getUint8();
+		metadata.boneIndexSize = dv.getUint8();
+		metadata.morphIndexSize = dv.getUint8();
+		metadata.rigidBodyIndexSize = dv.getUint8();
+		metadata.modelName = dv.getTextBuffer();
+		metadata.englishModelName = dv.getTextBuffer();
+		metadata.comment = dv.getTextBuffer();
+		metadata.englishComment = dv.getTextBuffer();
+
+	};
+
+	var parseVertices = function () {
+
+		var parseVertex = function () {
+
+			var p = {};
+			p.position = dv.getFloat32Array( 3 );
+			p.normal = dv.getFloat32Array( 3 );
+			p.uv = dv.getFloat32Array( 2 );
+
+			p.auvs = [];
+
+			for ( var i = 0; i < pmx.metadata.additionalUvNum; i ++ ) {
+
+				p.auvs.push( dv.getFloat32Array( 4 ) );
+
+			}
+
+			p.type = dv.getUint8();
+
+			var indexSize = metadata.boneIndexSize;
+
+			if ( p.type === 0 ) { // BDEF1
+
+				p.skinIndices = dv.getIndexArray( indexSize, 1 );
+				p.skinWeights = [ 1.0 ];
+
+			} else if ( p.type === 1 ) { // BDEF2
+
+				p.skinIndices = dv.getIndexArray( indexSize, 2 );
+				p.skinWeights = dv.getFloat32Array( 1 );
+				p.skinWeights.push( 1.0 - p.skinWeights[ 0 ] );
+
+			} else if ( p.type === 2 ) { // BDEF4
+
+				p.skinIndices = dv.getIndexArray( indexSize, 4 );
+				p.skinWeights = dv.getFloat32Array( 4 );
+
+			} else if ( p.type === 3 ) { // SDEF
+
+				p.skinIndices = dv.getIndexArray( indexSize, 2 );
+				p.skinWeights = dv.getFloat32Array( 1 );
+				p.skinWeights.push( 1.0 - p.skinWeights[ 0 ] );
+
+				p.skinC = dv.getFloat32Array( 3 );
+				p.skinR0 = dv.getFloat32Array( 3 );
+				p.skinR1 = dv.getFloat32Array( 3 );
+
+				// SDEF is not supported yet and is handled as BDEF2 so far.
+				// TODO: SDEF support
+				p.type = 1;
+
+			} else {
+
+				throw 'unsupport bone type ' + p.type + ' exception.';
+
+			}
+
+			p.edgeRatio = dv.getFloat32();
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.vertexCount = dv.getUint32();
+
+		pmx.vertices = [];
+
+		for ( var i = 0; i < metadata.vertexCount; i ++ ) {
+
+			pmx.vertices.push( parseVertex() );
+
+		}
+
+	};
+
+	var parseFaces = function () {
+
+		var parseFace = function () {
+
+			var p = {};
+			p.indices = dv.getIndexArray( metadata.vertexIndexSize, 3, true );
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.faceCount = dv.getUint32() / 3;
+
+		pmx.faces = [];
+
+		for ( var i = 0; i < metadata.faceCount; i ++ ) {
+
+			pmx.faces.push( parseFace() );
+
+		}
+
+	};
+
+	var parseTextures = function () {
+
+		var parseTexture = function () {
+
+			return dv.getTextBuffer();
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.textureCount = dv.getUint32();
+
+		pmx.textures = [];
+
+		for ( var i = 0; i < metadata.textureCount; i ++ ) {
+
+			pmx.textures.push( parseTexture() );
+
+		}
+
+	};
+
+	var parseMaterials = function () {
+
+		var parseMaterial = function () {
+
+			var p = {};
+			p.name = dv.getTextBuffer();
+			p.englishName = dv.getTextBuffer();
+			p.diffuse = dv.getFloat32Array( 4 );
+			p.specular = dv.getFloat32Array( 3 );
+			p.shininess = dv.getFloat32();
+			p.ambient = dv.getFloat32Array( 3 );
+			p.flag = dv.getUint8();
+			p.edgeColor = dv.getFloat32Array( 4 );
+			p.edgeSize = dv.getFloat32();
+			p.textureIndex = dv.getIndex( pmx.metadata.textureIndexSize );
+			p.envTextureIndex = dv.getIndex( pmx.metadata.textureIndexSize );
+			p.envFlag = dv.getUint8();
+			p.toonFlag = dv.getUint8();
+
+			if ( p.toonFlag === 0 ) {
+
+				p.toonIndex = dv.getIndex( pmx.metadata.textureIndexSize );
+
+			} else if ( p.toonFlag === 1 ) {
+
+				p.toonIndex = dv.getInt8();
+
+			} else {
+
+				throw 'unknown toon flag ' + p.toonFlag + ' exception.';
+
+			}
+
+			p.comment = dv.getTextBuffer();
+			p.faceCount = dv.getUint32() / 3;
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.materialCount = dv.getUint32();
+
+		pmx.materials = [];
+
+		for ( var i = 0; i < metadata.materialCount; i ++ ) {
+
+			pmx.materials.push( parseMaterial() );
+
+		}
+
+	};
+
+	var parseBones = function () {
+
+		var parseBone = function () {
+
+			var p = {};
+			p.name = dv.getTextBuffer();
+			p.englishName = dv.getTextBuffer();
+			p.position = dv.getFloat32Array( 3 );
+			p.parentIndex = dv.getIndex( pmx.metadata.boneIndexSize );
+			p.transformationClass = dv.getUint32();
+			p.flag = dv.getUint16();
+
+			if ( p.flag & 0x1 ) {
+
+				p.connectIndex = dv.getIndex( pmx.metadata.boneIndexSize );
+
+			} else {
+
+				p.offsetPosition = dv.getFloat32Array( 3 );
+
+			}
+
+			if ( p.flag & 0x100 || p.flag & 0x200 ) {
+
+				// Note: I don't think Grant is an appropriate name
+				//       but I found that some English translated MMD tools use this term
+				//       so I've named it Grant so far.
+				//       I'd rename to more appropriate name from Grant later.
+				var grant = {};
+
+				grant.isLocal = ( p.flag & 0x80 ) !== 0 ? true : false;
+				grant.affectRotation = ( p.flag & 0x100 ) !== 0 ? true : false;
+				grant.affectPosition = ( p.flag & 0x200 ) !== 0 ? true : false;
+				grant.parentIndex = dv.getIndex( pmx.metadata.boneIndexSize );
+				grant.ratio = dv.getFloat32();
+
+				p.grant = grant;
+
+			}
+
+			if ( p.flag & 0x400 ) {
+
+				p.fixAxis = dv.getFloat32Array( 3 );
+
+			}
+
+			if ( p.flag & 0x800 ) {
+
+				p.localXVector = dv.getFloat32Array( 3 );
+				p.localZVector = dv.getFloat32Array( 3 );
+
+			}
+
+			if ( p.flag & 0x2000 ) {
+
+				p.key = dv.getUint32();
+
+			}
+
+			if ( p.flag & 0x20 ) {
+
+				var ik = {};
+
+				ik.effector = dv.getIndex( pmx.metadata.boneIndexSize );
+				ik.target = null;
+				ik.iteration = dv.getUint32();
+				ik.maxAngle = dv.getFloat32();
+				ik.linkCount = dv.getUint32();
+				ik.links = [];
+
+				for ( var i = 0; i < ik.linkCount; i ++ ) {
+
+					var link = {};
+					link.index = dv.getIndex( pmx.metadata.boneIndexSize );
+					link.angleLimitation = dv.getUint8();
+
+					if ( link.angleLimitation === 1 ) {
+
+						link.lowerLimitationAngle = dv.getFloat32Array( 3 );
+						link.upperLimitationAngle = dv.getFloat32Array( 3 );
+
+					}
+
+					ik.links.push( link );
+
+				}
+
+				p.ik = ik;
+
+			}
+
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.boneCount = dv.getUint32();
+
+		pmx.bones = [];
+
+		for ( var i = 0; i < metadata.boneCount; i ++ ) {
+
+			pmx.bones.push( parseBone() );
+
+		}
+
+	};
+
+	var parseMorphs = function () {
+
+		var parseMorph = function () {
+
+			var p = {};
+			p.name = dv.getTextBuffer();
+			p.englishName = dv.getTextBuffer();
+			p.panel = dv.getUint8();
+			p.type = dv.getUint8();
+			p.elementCount = dv.getUint32();
+			p.elements = [];
+
+			for ( var i = 0; i < p.elementCount; i ++ ) {
+
+				if ( p.type === 0 ) { // group morph
+
+					var m = {};
+					m.index = dv.getIndex( pmx.metadata.morphIndexSize );
+					m.ratio = dv.getFloat32();
+					p.elements.push( m );
+
+				} else if ( p.type === 1 ) { // vertex morph
+
+					var m = {};
+					m.index = dv.getIndex( pmx.metadata.vertexIndexSize, true );
+					m.position = dv.getFloat32Array( 3 );
+					p.elements.push( m );
+
+				} else if ( p.type === 2 ) { // bone morph
+
+					var m = {};
+					m.index = dv.getIndex( pmx.metadata.boneIndexSize );
+					m.position = dv.getFloat32Array( 3 );
+					m.rotation = dv.getFloat32Array( 4 );
+					p.elements.push( m );
+
+				} else if ( p.type === 3 ) { // uv morph
+
+					var m = {};
+					m.index = dv.getIndex( pmx.metadata.vertexIndexSize, true );
+					m.uv = dv.getFloat32Array( 4 );
+					p.elements.push( m );
+
+				} else if ( p.type === 4 ) { // additional uv1
+
+					// TODO: implement
+
+				} else if ( p.type === 5 ) { // additional uv2
+
+					// TODO: implement
+
+				} else if ( p.type === 6 ) { // additional uv3
+
+					// TODO: implement
+
+				} else if ( p.type === 7 ) { // additional uv4
+
+					// TODO: implement
+
+				} else if ( p.type === 8 ) { // material morph
+
+					var m = {};
+					m.index = dv.getIndex( pmx.metadata.materialIndexSize );
+					m.type = dv.getUint8();
+					m.diffuse = dv.getFloat32Array( 4 );
+					m.specular = dv.getFloat32Array( 3 );
+					m.shininess = dv.getFloat32();
+					m.ambient = dv.getFloat32Array( 3 );
+					m.edgeColor = dv.getFloat32Array( 4 );
+					m.edgeSize = dv.getFloat32();
+					m.textureColor = dv.getFloat32Array( 4 );
+					m.sphereTextureColor = dv.getFloat32Array( 4 );
+					m.toonColor = dv.getFloat32Array( 4 );
+					p.elements.push( m );
+
+				}
+
+			}
+
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.morphCount = dv.getUint32();
+
+		pmx.morphs = [];
+
+		for ( var i = 0; i < metadata.morphCount; i ++ ) {
+
+			pmx.morphs.push( parseMorph() );
+
+		}
+
+	};
+
+	var parseFrames = function () {
+
+		var parseFrame = function () {
+
+			var p = {};
+			p.name = dv.getTextBuffer();
+			p.englishName = dv.getTextBuffer();
+			p.type = dv.getUint8();
+			p.elementCount = dv.getUint32();
+			p.elements = [];
+
+			for ( var i = 0; i < p.elementCount; i ++ ) {
+
+				var e = {};
+				e.target = dv.getUint8();
+				e.index = ( e.target === 0 ) ? dv.getIndex( pmx.metadata.boneIndexSize ) : dv.getIndex( pmx.metadata.morphIndexSize );
+				p.elements.push( e );
+
+			}
+
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.frameCount = dv.getUint32();
+
+		pmx.frames = [];
+
+		for ( var i = 0; i < metadata.frameCount; i ++ ) {
+
+			pmx.frames.push( parseFrame() );
+
+		}
+
+	};
+
+	var parseRigidBodies = function () {
+
+		var parseRigidBody = function () {
+
+			var p = {};
+			p.name = dv.getTextBuffer();
+			p.englishName = dv.getTextBuffer();
+			p.boneIndex = dv.getIndex( pmx.metadata.boneIndexSize );
+			p.groupIndex = dv.getUint8();
+			p.groupTarget = dv.getUint16();
+			p.shapeType = dv.getUint8();
+			p.width = dv.getFloat32();
+			p.height = dv.getFloat32();
+			p.depth = dv.getFloat32();
+			p.position = dv.getFloat32Array( 3 );
+			p.rotation = dv.getFloat32Array( 3 );
+			p.weight = dv.getFloat32();
+			p.positionDamping = dv.getFloat32();
+			p.rotationDamping = dv.getFloat32();
+			p.restitution = dv.getFloat32();
+			p.friction = dv.getFloat32();
+			p.type = dv.getUint8();
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.rigidBodyCount = dv.getUint32();
+
+		pmx.rigidBodies = [];
+
+		for ( var i = 0; i < metadata.rigidBodyCount; i ++ ) {
+
+			pmx.rigidBodies.push( parseRigidBody() );
+
+		}
+
+	};
+
+	var parseConstraints = function () {
+
+		var parseConstraint = function () {
+
+			var p = {};
+			p.name = dv.getTextBuffer();
+			p.englishName = dv.getTextBuffer();
+			p.type = dv.getUint8();
+			p.rigidBodyIndex1 = dv.getIndex( pmx.metadata.rigidBodyIndexSize );
+			p.rigidBodyIndex2 = dv.getIndex( pmx.metadata.rigidBodyIndexSize );
+			p.position = dv.getFloat32Array( 3 );
+			p.rotation = dv.getFloat32Array( 3 );
+			p.translationLimitation1 = dv.getFloat32Array( 3 );
+			p.translationLimitation2 = dv.getFloat32Array( 3 );
+			p.rotationLimitation1 = dv.getFloat32Array( 3 );
+			p.rotationLimitation2 = dv.getFloat32Array( 3 );
+			p.springPosition = dv.getFloat32Array( 3 );
+			p.springRotation = dv.getFloat32Array( 3 );
+			return p;
+
+		};
+
+		var metadata = pmx.metadata;
+		metadata.constraintCount = dv.getUint32();
+
+		pmx.constraints = [];
+
+		for ( var i = 0; i < metadata.constraintCount; i ++ ) {
+
+			pmx.constraints.push( parseConstraint() );
+
+		}
+
+	};
+
+	parseHeader();
+	parseVertices();
+	parseFaces();
+	parseTextures();
+	parseMaterials();
+	parseBones();
+	parseMorphs();
+	parseFrames();
+	parseRigidBodies();
+	parseConstraints();
+
+	if ( leftToRight === true ) this.leftToRightModel( pmx );
+
+	// console.log( pmx ); // for console debug
+
+	return pmx;
+
+};
+
+Parser.prototype.parseVmd = function ( buffer, leftToRight ) {
+
+	var vmd = {};
+	var dv = new DataViewEx( buffer );
+
+	vmd.metadata = {};
+	vmd.metadata.coordinateSystem = 'left';
+
+	var parseHeader = function () {
+
+		var metadata = vmd.metadata;
+		metadata.magic = dv.getChars( 30 );
+
+		if ( metadata.magic !== 'Vocaloid Motion Data 0002' ) {
+
+			throw 'VMD file magic is not Vocaloid Motion Data 0002, but ' + metadata.magic;
+
+		}
+
+		metadata.name = dv.getSjisStringsAsUnicode( 20 );
+
+	};
+
+	var parseMotions = function () {
+
+		var parseMotion = function () {
+
+			var p = {};
+			p.boneName = dv.getSjisStringsAsUnicode( 15 );
+			p.frameNum = dv.getUint32();
+			p.position = dv.getFloat32Array( 3 );
+			p.rotation = dv.getFloat32Array( 4 );
+			p.interpolation = dv.getUint8Array( 64 );
+			return p;
+
+		};
+
+		var metadata = vmd.metadata;
+		metadata.motionCount = dv.getUint32();
+
+		vmd.motions = [];
+		for ( var i = 0; i < metadata.motionCount; i ++ ) {
+
+			vmd.motions.push( parseMotion() );
+
+		}
+
+	};
+
+	var parseMorphs = function () {
+
+		var parseMorph = function () {
+
+			var p = {};
+			p.morphName = dv.getSjisStringsAsUnicode( 15 );
+			p.frameNum = dv.getUint32();
+			p.weight = dv.getFloat32();
+			return p;
+
+		};
+
+		var metadata = vmd.metadata;
+		metadata.morphCount = dv.getUint32();
+
+		vmd.morphs = [];
+		for ( var i = 0; i < metadata.morphCount; i ++ ) {
+
+			vmd.morphs.push( parseMorph() );
+
+		}
+
+	};
+
+	var parseCameras = function () {
+
+		var parseCamera = function () {
+
+			var p = {};
+			p.frameNum = dv.getUint32();
+			p.distance = dv.getFloat32();
+			p.position = dv.getFloat32Array( 3 );
+			p.rotation = dv.getFloat32Array( 3 );
+			p.interpolation = dv.getUint8Array( 24 );
+			p.fov = dv.getUint32();
+			p.perspective = dv.getUint8();
+			return p;
+
+		};
+
+		var metadata = vmd.metadata;
+		metadata.cameraCount = dv.getUint32();
+
+		vmd.cameras = [];
+		for ( var i = 0; i < metadata.cameraCount; i ++ ) {
+
+			vmd.cameras.push( parseCamera() );
+
+		}
+
+	};
+
+	parseHeader();
+	parseMotions();
+	parseMorphs();
+	parseCameras();
+
+	if ( leftToRight === true ) this.leftToRightVmd( vmd );
+
+	// console.log( vmd ); // for console debug
+
+	return vmd;
+
+};
+
+Parser.prototype.parseVpd = function ( text, leftToRight ) {
+
+	var vpd = {};
+
+	vpd.metadata = {};
+	vpd.metadata.coordinateSystem = 'left';
+
+	vpd.bones = [];
+
+	var commentPatternG = /\/\/\w*(\r|\n|\r\n)/g;
+	var newlinePattern = /\r|\n|\r\n/;
+
+	var lines = text.replace( commentPatternG, '' ).split( newlinePattern );
+
+	function throwError() {
+
+		throw 'the file seems not vpd file.';
+
+	}
+
+	function checkMagic() {
+
+		if ( lines[ 0 ] !== 'Vocaloid Pose Data file' ) {
+
+			throwError();
+
+		}
+
+	}
+
+	function parseHeader() {
+
+		if ( lines.length < 4 ) {
+
+			throwError();
+
+		}
+
+		vpd.metadata.parentFile = lines[ 2 ];
+		vpd.metadata.boneCount = parseInt( lines[ 3 ] );
+
+	}
+
+	function parseBones() {
+
+		var boneHeaderPattern = /^\s*(Bone[0-9]+)\s*\{\s*(.*)$/;
+		var boneVectorPattern = /^\s*(-?[0-9]+\.[0-9]+)\s*,\s*(-?[0-9]+\.[0-9]+)\s*,\s*(-?[0-9]+\.[0-9]+)\s*;/;
+		var boneQuaternionPattern = /^\s*(-?[0-9]+\.[0-9]+)\s*,\s*(-?[0-9]+\.[0-9]+)\s*,\s*(-?[0-9]+\.[0-9]+)\s*,\s*(-?[0-9]+\.[0-9]+)\s*;/;
+		var boneFooterPattern = /^\s*}/;
+
+		var bones = vpd.bones;
+		var n = null;
+		var v = null;
+		var q = null;
+
+		for ( var i = 4; i < lines.length; i ++ ) {
+
+			var line = lines[ i ];
+
+			var result;
+
+			result = line.match( boneHeaderPattern );
+
+			if ( result !== null ) {
+
+				if ( n !== null ) {
+
+					throwError();
+
+				}
+
+				n = result[ 2 ];
+
+			}
+
+			result = line.match( boneVectorPattern );
+
+			if ( result !== null ) {
+
+				if ( v !== null ) {
+
+					throwError();
+
+				}
+
+				v = [
+
+					parseFloat( result[ 1 ] ),
+					parseFloat( result[ 2 ] ),
+					parseFloat( result[ 3 ] )
+
+				];
+
+			}
+
+			result = line.match( boneQuaternionPattern );
+
+			if ( result !== null ) {
+
+				if ( q !== null ) {
+
+					throwError();
+
+				}
+
+				q = [
+
+					parseFloat( result[ 1 ] ),
+					parseFloat( result[ 2 ] ),
+					parseFloat( result[ 3 ] ),
+					parseFloat( result[ 4 ] )
+
+				];
+
+
+			}
+
+			result = line.match( boneFooterPattern );
+
+			if ( result !== null ) {
+
+				if ( n === null || v === null || q === null ) {
+
+					throwError();
+
+				}
+
+				bones.push( {
+
+					name: n,
+					translation: v,
+					quaternion: q
+
+				} );
+
+				n = null;
+				v = null;
+				q = null;
+
+			}
+
+		}
+
+		if ( n !== null || v !== null || q !== null ) {
+
+			throwError();
+
+		}
+
+	}
+
+	checkMagic();
+	parseHeader();
+	parseBones();
+
+	if ( leftToRight === true ) this.leftToRightVpd( vpd );
+
+	// console.log( vpd );  // for console debug
+
+	return vpd;
+
+};
+
+Parser.prototype.mergeVmds = function ( vmds ) {
+
+	var v = {};
+	v.metadata = {};
+	v.metadata.name = vmds[ 0 ].metadata.name;
+	v.metadata.coordinateSystem = vmds[ 0 ].metadata.coordinateSystem;
+	v.metadata.motionCount = 0;
+	v.metadata.morphCount = 0;
+	v.metadata.cameraCount = 0;
+	v.motions = [];
+	v.morphs = [];
+	v.cameras = [];
+
+	for ( var i = 0; i < vmds.length; i ++ ) {
+
+		var v2 = vmds[ i ];
+
+		v.metadata.motionCount += v2.metadata.motionCount;
+		v.metadata.morphCount += v2.metadata.morphCount;
+		v.metadata.cameraCount += v2.metadata.cameraCount;
+
+		for ( var j = 0; j < v2.metadata.motionCount; j ++ ) {
+
+			v.motions.push( v2.motions[ j ] );
+
+		}
+
+		for ( var j = 0; j < v2.metadata.morphCount; j ++ ) {
+
+			v.morphs.push( v2.morphs[ j ] );
+
+		}
+
+		for ( var j = 0; j < v2.metadata.cameraCount; j ++ ) {
+
+			v.cameras.push( v2.cameras[ j ] );
+
+		}
+
+	}
+
+	return v;
+
+};
+
+Parser.prototype.leftToRightModel = function ( model ) {
+
+	if ( model.metadata.coordinateSystem === 'right' ) {
+
+		return;
+
+	}
+
+	model.metadata.coordinateSystem = 'right';
+
+	var helper = new DataCreationHelper();
+
+	for ( var i = 0; i < model.metadata.vertexCount; i ++ ) {
+
+		helper.leftToRightVector3( model.vertices[ i ].position );
+		helper.leftToRightVector3( model.vertices[ i ].normal );
+
+	}
+
+	for ( var i = 0; i < model.metadata.faceCount; i ++ ) {
+
+		helper.leftToRightIndexOrder( model.faces[ i ].indices );
+
+	}
+
+	for ( var i = 0; i < model.metadata.boneCount; i ++ ) {
+
+		helper.leftToRightVector3( model.bones[ i ].position );
+
+	}
+
+	// TODO: support other morph for PMX
+	for ( var i = 0; i < model.metadata.morphCount; i ++ ) {
+
+		var m = model.morphs[ i ];
+
+		if ( model.metadata.format === 'pmx' && m.type !== 1 ) {
+
+			// TODO: implement
+			continue;
+
+		}
+
+		for ( var j = 0; j < m.elements.length; j ++ ) {
+
+			helper.leftToRightVector3( m.elements[ j ].position );
+
+		}
+
+	}
+
+	for ( var i = 0; i < model.metadata.rigidBodyCount; i ++ ) {
+
+		helper.leftToRightVector3( model.rigidBodies[ i ].position );
+		helper.leftToRightEuler( model.rigidBodies[ i ].rotation );
+
+	}
+
+	for ( var i = 0; i < model.metadata.constraintCount; i ++ ) {
+
+		helper.leftToRightVector3( model.constraints[ i ].position );
+		helper.leftToRightEuler( model.constraints[ i ].rotation );
+		helper.leftToRightVector3Range( model.constraints[ i ].translationLimitation1, model.constraints[ i ].translationLimitation2 );
+		helper.leftToRightEulerRange( model.constraints[ i ].rotationLimitation1, model.constraints[ i ].rotationLimitation2 );
+
+	}
+
+};
+
+Parser.prototype.leftToRightVmd = function ( vmd ) {
+
+	if ( vmd.metadata.coordinateSystem === 'right' ) {
+
+		return;
+
+	}
+
+	vmd.metadata.coordinateSystem = 'right';
+
+	var helper = new DataCreationHelper();
+
+	for ( var i = 0; i < vmd.metadata.motionCount; i ++ ) {
+
+		helper.leftToRightVector3( vmd.motions[ i ].position );
+		helper.leftToRightQuaternion( vmd.motions[ i ].rotation );
+
+	}
+
+	for ( var i = 0; i < vmd.metadata.cameraCount; i ++ ) {
+
+		helper.leftToRightVector3( vmd.cameras[ i ].position );
+		helper.leftToRightEuler( vmd.cameras[ i ].rotation );
+
+	}
+
+};
+
+Parser.prototype.leftToRightVpd = function ( vpd ) {
+
+	if ( vpd.metadata.coordinateSystem === 'right' ) {
+
+		return;
+
+	}
+
+	vpd.metadata.coordinateSystem = 'right';
+
+	var helper = new DataCreationHelper();
+
+	for ( var i = 0; i < vpd.bones.length; i ++ ) {
+
+		helper.leftToRightVector3( vpd.bones[ i ].translation );
+		helper.leftToRightQuaternion( vpd.bones[ i ].quaternion );
+
+	}
+
+};
+
+var MMDParser = { CharsetEncoder, Parser };
+
+export { MMDParser };

+ 36 - 0
examples/jsm/loaders/MMDLoader.d.ts

@@ -0,0 +1,36 @@
+import {
+  AnimationClip,
+  FileLoader,
+  LoadingManager,
+  SkinnedMesh
+} from '../../../src/Three';
+
+export interface MMDLoaderAnimationObject {
+  animation: AnimationClip;
+  mesh: SkinnedMesh;
+}
+
+export class MMDLoader {
+  constructor(manager?: LoadingManager);
+  animationBuilder: object;
+  animationPath: string;
+  crossOrigin: string;
+  loader: FileLoader;
+  manager: LoadingManager;
+  meshBuilder: object;
+  path: string;
+  parser: object | null;
+  resourcePath: string;
+
+  load(url: string, onLoad: (mesh: SkinnedMesh) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  loadAnimation(url: string, onLoad: (object: SkinnedMesh | AnimationClip) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  loadPMD(url: string, onLoad: (object: object) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  loadPMX(url: string, onLoad: (object: object) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  loadVMD(url: string, onLoad: (object: object) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  loadVPD(url: string, onLoad: (object: object) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  loadWithAnimation(url: string, onLoad: (object: MMDLoaderAnimationObject) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  setAnimationPath(animationPath: string): this;
+  setCrossOrigin(crossOrigin: string): this;
+  setPath(path: string): this;
+  setResoucePath(resourcePath: string): this;
+}

+ 2062 - 0
examples/jsm/loaders/MMDLoader.js

@@ -0,0 +1,2062 @@
+/**
+ * @author takahiro / https://github.com/takahirox
+ *
+ * Dependencies
+ *  - mmd-parser https://github.com/takahirox/mmd-parser
+ *  - TGALoader
+ *  - OutlineEffect
+ *
+ * MMDLoader creates Three.js Objects from MMD resources as
+ * PMD, PMX, VMD, and VPD files.
+ *
+ * PMD/PMX is a model data format, VMD is a motion data format
+ * VPD is a posing data format used in MMD(Miku Miku Dance).
+ *
+ * MMD official site
+ *  - http://www.geocities.jp/higuchuu4/index_e.htm
+ *
+ * PMD, VMD format (in Japanese)
+ *  - http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4
+ *
+ * PMX format
+ *  - https://gist.github.com/felixjones/f8a06bd48f9da9a4539f
+ *
+ * TODO
+ *  - light motion in vmd support.
+ *  - SDEF support.
+ *  - uv/material/bone morphing support.
+ *  - more precise grant skinning support.
+ *  - shadow support.
+ */
+
+import {
+	AddOperation,
+	AnimationClip,
+	Bone,
+	BufferGeometry,
+	Color,
+	CustomBlending,
+	DefaultLoadingManager,
+	DoubleSide,
+	DstAlphaFactor,
+	Euler,
+	FileLoader,
+	Float32BufferAttribute,
+	FrontSide,
+	Interpolant,
+	Loader,
+	LoaderUtils,
+	MeshToonMaterial,
+	MultiplyOperation,
+	NearestFilter,
+	NumberKeyframeTrack,
+	OneMinusSrcAlphaFactor,
+	Quaternion,
+	QuaternionKeyframeTrack,
+	RepeatWrapping,
+	Skeleton,
+	SkinnedMesh,
+	SphericalReflectionMapping,
+	SrcAlphaFactor,
+	TextureLoader,
+	Uint16BufferAttribute,
+	Vector3,
+	VectorKeyframeTrack
+} from "../../../build/three.module.js";
+import { TGALoader } from "../loaders/TGALoader.js";
+import { MMDParser } from "../libs/mmdparser.module.js";
+
+var MMDLoader = ( function () {
+
+	/**
+	 * @param {THREE.LoadingManager} manager
+	 */
+	function MMDLoader( manager ) {
+
+		this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
+
+		this.loader = new FileLoader( this.manager );
+
+		this.parser = null; // lazy generation
+		this.meshBuilder = new MeshBuilder( this.manager );
+		this.animationBuilder = new AnimationBuilder();
+
+	}
+
+	MMDLoader.prototype = {
+
+		constructor: MMDLoader,
+
+		crossOrigin: 'anonymous',
+
+		/**
+		 * @param {string} crossOrigin
+		 * @return {MMDLoader}
+		 */
+		setCrossOrigin: function ( crossOrigin ) {
+
+			this.crossOrigin = crossOrigin;
+			return this;
+
+		},
+
+		/**
+		 * @param {string} animationPath
+		 * @return {MMDLoader}
+		 */
+		setAnimationPath: function ( animationPath ) {
+
+			this.animationPath = animationPath;
+			return this;
+
+		},
+
+		/**
+		 * @param {string} path
+		 * @return {MMDLoader}
+		 */
+		setPath: function ( path ) {
+
+			this.path = path;
+			return this;
+
+		},
+
+		/**
+		 * @param {string} resourcePath
+		 * @return {MMDLoader}
+		 */
+		setResoucePath: function ( resourcePath ) {
+
+			this.resourcePath = resourcePath;
+			return this;
+
+		},
+
+		// Load MMD assets as Three.js Object
+
+		/**
+		 * Loads Model file (.pmd or .pmx) as a SkinnedMesh.
+		 *
+		 * @param {string} url - url to Model(.pmd or .pmx) file
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		load: function ( url, onLoad, onProgress, onError ) {
+
+			var builder = this.meshBuilder.setCrossOrigin( this.crossOrigin );
+
+			// resource path
+
+			var resourcePath;
+
+			if ( this.resourcePath !== undefined ) {
+
+				resourcePath = this.resourcePath;
+
+			} else if ( this.path !== undefined ) {
+
+				resourcePath = this.path;
+
+			} else {
+
+				resourcePath = LoaderUtils.extractUrlBase( url );
+
+			}
+
+			var modelExtension = this._extractExtension( url ).toLowerCase();
+
+			// Should I detect by seeing header?
+			if ( modelExtension !== 'pmd' && modelExtension !== 'pmx' ) {
+
+				if ( onError ) onError( new Error( 'THREE.MMDLoader: Unknown model file extension .' + modelExtension + '.' ) );
+
+				return;
+
+			}
+
+			this[ modelExtension === 'pmd' ? 'loadPMD' : 'loadPMX' ]( url, function ( data ) {
+
+				onLoad(	builder.build( data, resourcePath, onProgress, onError )	);
+
+			}, onProgress, onError );
+
+		},
+
+		/**
+		 * Loads Motion file(s) (.vmd) as a AnimationClip.
+		 * If two or more files are specified, they'll be merged.
+		 *
+		 * @param {string|Array<string>} url - url(s) to animation(.vmd) file(s)
+		 * @param {SkinnedMesh|THREE.Camera} object - tracks will be fitting to this object
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		loadAnimation: function ( url, object, onLoad, onProgress, onError ) {
+
+			var builder = this.animationBuilder;
+
+			this.loadVMD( url, function ( vmd ) {
+
+				onLoad( object.isCamera
+					? builder.buildCameraAnimation( vmd )
+					: builder.build( vmd, object ) );
+
+			}, onProgress, onError );
+
+		},
+
+		/**
+		 * Loads mode file and motion file(s) as an object containing
+		 * a SkinnedMesh and a AnimationClip.
+		 * Tracks of AnimationClip are fitting to the model.
+		 *
+		 * @param {string} modelUrl - url to Model(.pmd or .pmx) file
+		 * @param {string|Array{string}} vmdUrl - url(s) to animation(.vmd) file
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		loadWithAnimation: function ( modelUrl, vmdUrl, onLoad, onProgress, onError ) {
+
+			var scope = this;
+
+			this.load( modelUrl, function ( mesh ) {
+
+				scope.loadAnimation( vmdUrl, mesh, function ( animation ) {
+
+					onLoad( {
+						mesh: mesh,
+						animation: animation
+					} );
+
+				}, onProgress, onError );
+
+			}, onProgress, onError );
+
+		},
+
+		// Load MMD assets as Object data parsed by MMDParser
+
+		/**
+		 * Loads .pmd file as an Object.
+		 *
+		 * @param {string} url - url to .pmd file
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		loadPMD: function ( url, onLoad, onProgress, onError ) {
+
+			var parser = this._getParser();
+
+			this.loader
+				.setMimeType( undefined )
+				.setPath( this.path )
+				.setResponseType( 'arraybuffer' )
+				.load( url, function ( buffer ) {
+
+					onLoad( parser.parsePmd( buffer, true ) );
+
+				}, onProgress, onError );
+
+		},
+
+		/**
+		 * Loads .pmx file as an Object.
+		 *
+		 * @param {string} url - url to .pmx file
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		loadPMX: function ( url, onLoad, onProgress, onError ) {
+
+			var parser = this._getParser();
+
+			this.loader
+				.setMimeType( undefined )
+				.setPath( this.path )
+				.setResponseType( 'arraybuffer' )
+				.load( url, function ( buffer ) {
+
+					onLoad( parser.parsePmx( buffer, true ) );
+
+				}, onProgress, onError );
+
+		},
+
+		/**
+		 * Loads .vmd file as an Object. If two or more files are specified
+		 * they'll be merged.
+		 *
+		 * @param {string|Array<string>} url - url(s) to .vmd file(s)
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		loadVMD: function ( url, onLoad, onProgress, onError ) {
+
+			var urls = Array.isArray( url ) ? url : [ url ];
+
+			var vmds = [];
+			var vmdNum = urls.length;
+
+			var parser = this._getParser();
+
+			this.loader
+				.setMimeType( undefined )
+				.setPath( this.animationPath )
+				.setResponseType( 'arraybuffer' );
+
+			for ( var i = 0, il = urls.length; i < il; i ++ ) {
+
+				this.loader.load( urls[ i ], function ( buffer ) {
+
+					vmds.push( parser.parseVmd( buffer, true ) );
+
+					if ( vmds.length === vmdNum ) onLoad( parser.mergeVmds( vmds ) );
+
+				}, onProgress, onError );
+
+			}
+
+		},
+
+		/**
+		 * Loads .vpd file as an Object.
+		 *
+		 * @param {string} url - url to .vpd file
+		 * @param {boolean} isUnicode
+		 * @param {function} onLoad
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 */
+		loadVPD: function ( url, isUnicode, onLoad, onProgress, onError ) {
+
+			var parser = this._getParser();
+
+			this.loader
+				.setMimeType( isUnicode ? undefined : 'text/plain; charset=shift_jis' )
+				.setPath( this.animationPath )
+				.setResponseType( 'text' )
+				.load( url, function ( text ) {
+
+					onLoad( parser.parseVpd( text, true ) );
+
+				}, onProgress, onError );
+
+		},
+
+		// private methods
+
+		_extractExtension: function ( url ) {
+
+			var index = url.lastIndexOf( '.' );
+			return index < 0 ? '' : url.slice( index + 1 );
+
+		},
+
+		_getParser: function () {
+
+			if ( this.parser === null ) {
+
+				if ( typeof MMDParser === 'undefined' ) {
+
+					throw new Error( 'THREE.MMDLoader: Import MMDParser https://github.com/takahirox/mmd-parser' );
+
+				}
+
+				this.parser = new MMDParser.Parser();
+
+			}
+
+			return this.parser;
+
+		}
+
+	};
+
+	// Utilities
+
+	/*
+	 * base64 encoded defalut toon textures toon00.bmp - toon10.bmp.
+	 * We don't need to request external toon image files.
+	 * This idea is from http://www20.atpages.jp/katwat/three.js_r58/examples/mytest37/mmd.three.js
+	 */
+	var DEFAULT_TOON_TEXTURES = [
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAN0lEQVRYR+3WQREAMBACsZ5/bWiiMvgEBTt5cW37hjsBBAgQIECAwFwgyfYPCCBAgAABAgTWAh8aBHZBl14e8wAAAABJRU5ErkJggg==',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOUlEQVRYR+3WMREAMAwDsYY/yoDI7MLwIiP40+RJklfcCCBAgAABAgTqArfb/QMCCBAgQIAAgbbAB3z/e0F3js2cAAAAAElFTkSuQmCC',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAN0lEQVRYR+3WQREAMBACsZ5/B5ilMvgEBTt5cW37hjsBBAgQIECAwFwgyfYPCCBAgAABAgTWAh81dWyx0gFwKAAAAABJRU5ErkJggg==',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOklEQVRYR+3WoREAMAwDsWb/UQtCy9wxTOQJ/oQ8SXKKGwEECBAgQIBAXeDt7f4BAQQIECBAgEBb4AOz8Hzx7WLY4wAAAABJRU5ErkJggg==',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABPUlEQVRYR+1XwW7CMAy1+f9fZOMysSEOEweEOPRNdm3HbdOyIhAcklPrOs/PLy9RygBALxzcCDQFmgJNgaZAU6Ap0BR4PwX8gsRMVLssMRH5HcpzJEaWL7EVg9F1IHRlyqQohgVr4FGUlUcMJSjcUlDw0zvjeun70cLWmneoyf7NgBTQSniBTQQSuJAZsOnnaczjIMb5hCiuHKxokCrJfVnrctyZL0PkJAJe1HMil4nxeyi3Ypfn1kX51jpPvo/JeCNC4PhVdHdJw2XjBR8brF8PEIhNVn12AgP7uHsTBguBn53MUZCqv7Lp07Pn5k1Ro+uWmUNn7D+M57rtk7aG0Vo73xyF/fbFf0bPJjDXngnGocDTdFhygZjwUQrMNrDcmZlQT50VJ/g/UwNyHpu778+yW+/ksOz/BFo54P4AsUXMfRq7XWsAAAAASUVORK5CYII=',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACMElEQVRYR+2Xv4pTQRTGf2dubhLdICiii2KnYKHVolhauKWPoGAnNr6BD6CvIVaihYuI2i1ia0BY0MZGRHQXjZj/mSPnnskfNWiWZUlzJ5k7M2cm833nO5Mziej2DWWJRUoCpQKlAntSQCqgw39/iUWAGmh37jrRnVsKlgpiqmkoGVABA7E57fvY+pJDdgKqF6HzFCSADkDq+F6AHABtQ+UMVE5D7zXod7fFNhTEckTbj5XQgHzNN+5tQvc5NG7C6BNkp6D3EmpXHDR+dQAjFLchW3VS9rlw3JBh+B7ys5Cf9z0GW1C/7P32AyBAOAz1q4jGliIH3YPuBnSfQX4OGreTIgEYQb/pBDtPnEQ4CivXYPAWBk13oHrB54yA9QuSn2H4AcKRpEILDt0BUzj+RLR1V5EqjD66NPRBVpLcQwjHoHYJOhsQv6U4mnzmrIXJCFr4LDwm/xBUoboG9XX4cc9VKdYoSA2yk5NQLJaKDUjTBoveG3Z2TElTxwjNK4M3LEZgUdDdruvcXzKBpStgp2NPiWi3ks9ZXxIoFVi+AvHLdc9TqtjL3/aYjpPlrzOcEnK62Szhimdd7xX232zFDTgtxezOu3WNMRLjiKgjtOhHVMd1loynVHvOgjuIIJMaELEqhJAV/RCSLbWTcfPFakFgFlALTRRvx+ok6Hlp/Q+v3fmx90bMyUzaEAhmM3KvHlXTL5DxnbGf/1M8RNNACLL5MNtPxP/mypJAqcDSFfgFhpYqWUzhTEAAAAAASUVORK5CYII=',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',
+		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII='
+	];
+
+	// Builders. They build Three.js object from Object data parsed by MMDParser.
+
+	/**
+	 * @param {THREE.LoadingManager} manager
+	 */
+	function MeshBuilder( manager ) {
+
+		this.geometryBuilder = new GeometryBuilder();
+		this.materialBuilder = new MaterialBuilder( manager );
+
+	}
+
+	MeshBuilder.prototype = {
+
+		constructor: MeshBuilder,
+
+		crossOrigin: 'anonymous',
+
+		/**
+		 * @param {string} crossOrigin
+		 * @return {MeshBuilder}
+		 */
+		setCrossOrigin: function ( crossOrigin ) {
+
+			this.crossOrigin = crossOrigin;
+			return this;
+
+		},
+
+		/**
+		 * @param {Object} data - parsed PMD/PMX data
+		 * @param {string} resourcePath
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 * @return {SkinnedMesh}
+		 */
+		build: function ( data, resourcePath, onProgress, onError ) {
+
+			var geometry = this.geometryBuilder.build( data );
+			var material = this.materialBuilder
+				.setCrossOrigin( this.crossOrigin )
+				.setResourcePath( resourcePath )
+				.build( data, geometry, onProgress, onError );
+
+			var mesh = new SkinnedMesh( geometry, material );
+
+			var skeleton = new Skeleton( initBones( mesh ) );
+			mesh.bind( skeleton );
+
+			// console.log( mesh ); // for console debug
+
+			return mesh;
+
+		}
+
+	};
+
+	// TODO: Try to remove this function
+
+	function initBones( mesh ) {
+
+		var geometry = mesh.geometry;
+
+		var bones = [], bone, gbone;
+		var i, il;
+
+		if ( geometry && geometry.bones !== undefined ) {
+
+			// first, create array of 'Bone' objects from geometry data
+
+			for ( i = 0, il = geometry.bones.length; i < il; i ++ ) {
+
+				gbone = geometry.bones[ i ];
+
+				// create new 'Bone' object
+
+				bone = new Bone();
+				bones.push( bone );
+
+				// apply values
+
+				bone.name = gbone.name;
+				bone.position.fromArray( gbone.pos );
+				bone.quaternion.fromArray( gbone.rotq );
+				if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );
+
+			}
+
+			// second, create bone hierarchy
+
+			for ( i = 0, il = geometry.bones.length; i < il; i ++ ) {
+
+				gbone = geometry.bones[ i ];
+
+				if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {
+
+					// subsequent bones in the hierarchy
+
+					bones[ gbone.parent ].add( bones[ i ] );
+
+				} else {
+
+					// topmost bone, immediate child of the skinned mesh
+
+					mesh.add( bones[ i ] );
+
+				}
+
+			}
+
+		}
+
+		// now the bones are part of the scene graph and children of the skinned mesh.
+		// let's update the corresponding matrices
+
+		mesh.updateMatrixWorld( true );
+
+		return bones;
+
+	}
+
+	//
+
+	function GeometryBuilder() {
+
+	}
+
+	GeometryBuilder.prototype = {
+
+		constructor: GeometryBuilder,
+
+		/**
+		 * @param {Object} data - parsed PMD/PMX data
+		 * @return {BufferGeometry}
+		 */
+		build: function ( data ) {
+
+			// for geometry
+			var positions = [];
+			var uvs = [];
+			var normals = [];
+
+			var indices = [];
+
+			var groups = [];
+
+			var bones = [];
+			var skinIndices = [];
+			var skinWeights = [];
+
+			var morphTargets = [];
+			var morphPositions = [];
+
+			var iks = [];
+			var grants = [];
+
+			var rigidBodies = [];
+			var constraints = [];
+
+			// for work
+			var offset = 0;
+			var boneTypeTable = {};
+
+			// positions, normals, uvs, skinIndices, skinWeights
+
+			for ( var i = 0; i < data.metadata.vertexCount; i ++ ) {
+
+				var v = data.vertices[ i ];
+
+				for ( var j = 0, jl = v.position.length; j < jl; j ++ ) {
+
+					positions.push( v.position[ j ] );
+
+				}
+
+				for ( var j = 0, jl = v.normal.length; j < jl; j ++ ) {
+
+					normals.push( v.normal[ j ] );
+
+				}
+
+				for ( var j = 0, jl = v.uv.length; j < jl; j ++ ) {
+
+					uvs.push( v.uv[ j ] );
+
+				}
+
+				for ( var j = 0; j < 4; j ++ ) {
+
+					skinIndices.push( v.skinIndices.length - 1 >= j ? v.skinIndices[ j ] : 0.0 );
+
+				}
+
+				for ( var j = 0; j < 4; j ++ ) {
+
+					skinWeights.push( v.skinWeights.length - 1 >= j ? v.skinWeights[ j ] : 0.0 );
+
+				}
+
+			}
+
+			// indices
+
+			for ( var i = 0; i < data.metadata.faceCount; i ++ ) {
+
+				var face = data.faces[ i ];
+
+				for ( var j = 0, jl = face.indices.length; j < jl; j ++ ) {
+
+					indices.push( face.indices[ j ] );
+
+				}
+
+			}
+
+			// groups
+
+			for ( var i = 0; i < data.metadata.materialCount; i ++ ) {
+
+				var material = data.materials[ i ];
+
+				groups.push( {
+					offset: offset * 3,
+					count: material.faceCount * 3
+				} );
+
+				offset += material.faceCount;
+
+			}
+
+			// bones
+
+			for ( var i = 0; i < data.metadata.rigidBodyCount; i ++ ) {
+
+				var body = data.rigidBodies[ i ];
+				var value = boneTypeTable[ body.boneIndex ];
+
+				// keeps greater number if already value is set without any special reasons
+				value = value === undefined ? body.type : Math.max( body.type, value );
+
+				boneTypeTable[ body.boneIndex ] = value;
+
+			}
+
+			for ( var i = 0; i < data.metadata.boneCount; i ++ ) {
+
+				var boneData = data.bones[ i ];
+
+				var bone = {
+					parent: boneData.parentIndex,
+					name: boneData.name,
+					pos: boneData.position.slice( 0, 3 ),
+					rotq: [ 0, 0, 0, 1 ],
+					scl: [ 1, 1, 1 ],
+					rigidBodyType: boneTypeTable[ i ] !== undefined ? boneTypeTable[ i ] : - 1
+				};
+
+				if ( bone.parent !== - 1 ) {
+
+					bone.pos[ 0 ] -= data.bones[ bone.parent ].position[ 0 ];
+					bone.pos[ 1 ] -= data.bones[ bone.parent ].position[ 1 ];
+					bone.pos[ 2 ] -= data.bones[ bone.parent ].position[ 2 ];
+
+				}
+
+				bones.push( bone );
+
+			}
+
+			// iks
+
+			// TODO: remove duplicated codes between PMD and PMX
+			if ( data.metadata.format === 'pmd' ) {
+
+				for ( var i = 0; i < data.metadata.ikCount; i ++ ) {
+
+					var ik = data.iks[ i ];
+
+					var param = {
+						target: ik.target,
+						effector: ik.effector,
+						iteration: ik.iteration,
+						maxAngle: ik.maxAngle * 4,
+						links: []
+					};
+
+					for ( var j = 0, jl = ik.links.length; j < jl; j ++ ) {
+
+						var link = {};
+						link.index = ik.links[ j ].index;
+						link.enabled = true;
+
+						if ( data.bones[ link.index ].name.indexOf( 'ひざ' ) >= 0 ) {
+
+							link.limitation = new Vector3( 1.0, 0.0, 0.0 );
+
+						}
+
+						param.links.push( link );
+
+					}
+
+					iks.push( param );
+
+				}
+
+			} else {
+
+				for ( var i = 0; i < data.metadata.boneCount; i ++ ) {
+
+					var ik = data.bones[ i ].ik;
+
+					if ( ik === undefined ) continue;
+
+					var param = {
+						target: i,
+						effector: ik.effector,
+						iteration: ik.iteration,
+						maxAngle: ik.maxAngle,
+						links: []
+					};
+
+					for ( var j = 0, jl = ik.links.length; j < jl; j ++ ) {
+
+						var link = {};
+						link.index = ik.links[ j ].index;
+						link.enabled = true;
+
+						if ( ik.links[ j ].angleLimitation === 1 ) {
+
+							// Revert if rotationMin/Max doesn't work well
+							// link.limitation = new Vector3( 1.0, 0.0, 0.0 );
+
+							var rotationMin = ik.links[ j ].lowerLimitationAngle;
+							var rotationMax = ik.links[ j ].upperLimitationAngle;
+
+							// Convert Left to Right coordinate by myself because
+							// MMDParser doesn't convert. It's a MMDParser's bug
+
+							var tmp1 = - rotationMax[ 0 ];
+							var tmp2 = - rotationMax[ 1 ];
+							rotationMax[ 0 ] = - rotationMin[ 0 ];
+							rotationMax[ 1 ] = - rotationMin[ 1 ];
+							rotationMin[ 0 ] = tmp1;
+							rotationMin[ 1 ] = tmp2;
+
+							link.rotationMin = new Vector3().fromArray( rotationMin );
+							link.rotationMax = new Vector3().fromArray( rotationMax );
+
+						}
+
+						param.links.push( link );
+
+					}
+
+					iks.push( param );
+
+				}
+
+			}
+
+			// grants
+
+			if ( data.metadata.format === 'pmx' ) {
+
+				for ( var i = 0; i < data.metadata.boneCount; i ++ ) {
+
+					var boneData = data.bones[ i ];
+					var grant = boneData.grant;
+
+					if ( grant === undefined ) continue;
+
+					var param = {
+						index: i,
+						parentIndex: grant.parentIndex,
+						ratio: grant.ratio,
+						isLocal: grant.isLocal,
+						affectRotation: grant.affectRotation,
+						affectPosition: grant.affectPosition,
+						transformationClass: boneData.transformationClass
+					};
+
+					grants.push( param );
+
+				}
+
+				grants.sort( function ( a, b ) {
+
+					return a.transformationClass - b.transformationClass;
+
+				} );
+
+			}
+
+			// morph
+
+			function updateAttributes( attribute, morph, ratio ) {
+
+				for ( var i = 0; i < morph.elementCount; i ++ ) {
+
+					var element = morph.elements[ i ];
+
+					var index;
+
+					if ( data.metadata.format === 'pmd' ) {
+
+						index = data.morphs[ 0 ].elements[ element.index ].index;
+
+					} else {
+
+						index = element.index;
+
+					}
+
+					attribute.array[ index * 3 + 0 ] += element.position[ 0 ] * ratio;
+					attribute.array[ index * 3 + 1 ] += element.position[ 1 ] * ratio;
+					attribute.array[ index * 3 + 2 ] += element.position[ 2 ] * ratio;
+
+				}
+
+			}
+
+			for ( var i = 0; i < data.metadata.morphCount; i ++ ) {
+
+				var morph = data.morphs[ i ];
+				var params = { name: morph.name };
+
+				var attribute = new Float32BufferAttribute( data.metadata.vertexCount * 3, 3 );
+				attribute.name = morph.name;
+
+				for ( var j = 0; j < data.metadata.vertexCount * 3; j ++ ) {
+
+					attribute.array[ j ] = positions[ j ];
+
+				}
+
+				if ( data.metadata.format === 'pmd' ) {
+
+					if ( i !== 0 ) {
+
+						updateAttributes( attribute, morph, 1.0 );
+
+					}
+
+				} else {
+
+					if ( morph.type === 0 ) { // group
+
+						for ( var j = 0; j < morph.elementCount; j ++ ) {
+
+							var morph2 = data.morphs[ morph.elements[ j ].index ];
+							var ratio = morph.elements[ j ].ratio;
+
+							if ( morph2.type === 1 ) {
+
+								updateAttributes( attribute, morph2, ratio );
+
+							} else {
+
+								// TODO: implement
+
+							}
+
+						}
+
+					} else if ( morph.type === 1 ) { // vertex
+
+						updateAttributes( attribute, morph, 1.0 );
+
+					} else if ( morph.type === 2 ) { // bone
+
+						// TODO: implement
+
+					} else if ( morph.type === 3 ) { // uv
+
+						// TODO: implement
+
+					} else if ( morph.type === 4 ) { // additional uv1
+
+						// TODO: implement
+
+					} else if ( morph.type === 5 ) { // additional uv2
+
+						// TODO: implement
+
+					} else if ( morph.type === 6 ) { // additional uv3
+
+						// TODO: implement
+
+					} else if ( morph.type === 7 ) { // additional uv4
+
+						// TODO: implement
+
+					} else if ( morph.type === 8 ) { // material
+
+						// TODO: implement
+
+					}
+
+				}
+
+				morphTargets.push( params );
+				morphPositions.push( attribute );
+
+			}
+
+			// rigid bodies from rigidBodies field.
+
+			for ( var i = 0; i < data.metadata.rigidBodyCount; i ++ ) {
+
+				var rigidBody = data.rigidBodies[ i ];
+				var params = {};
+
+				for ( var key in rigidBody ) {
+
+					params[ key ] = rigidBody[ key ];
+
+				}
+
+				/*
+				 * RigidBody position parameter in PMX seems global position
+				 * while the one in PMD seems offset from corresponding bone.
+				 * So unify being offset.
+				 */
+				if ( data.metadata.format === 'pmx' ) {
+
+					if ( params.boneIndex !== - 1 ) {
+
+						var bone = data.bones[ params.boneIndex ];
+						params.position[ 0 ] -= bone.position[ 0 ];
+						params.position[ 1 ] -= bone.position[ 1 ];
+						params.position[ 2 ] -= bone.position[ 2 ];
+
+					}
+
+				}
+
+				rigidBodies.push( params );
+
+			}
+
+			// constraints from constraints field.
+
+			for ( var i = 0; i < data.metadata.constraintCount; i ++ ) {
+
+				var constraint = data.constraints[ i ];
+				var params = {};
+
+				for ( var key in constraint ) {
+
+					params[ key ] = constraint[ key ];
+
+				}
+
+				var bodyA = rigidBodies[ params.rigidBodyIndex1 ];
+				var bodyB = rigidBodies[ params.rigidBodyIndex2 ];
+
+				// Refer to http://www20.atpages.jp/katwat/wp/?p=4135
+				if ( bodyA.type !== 0 && bodyB.type === 2 ) {
+
+					if ( bodyA.boneIndex !== - 1 && bodyB.boneIndex !== - 1 &&
+					     data.bones[ bodyB.boneIndex ].parentIndex === bodyA.boneIndex ) {
+
+						bodyB.type = 1;
+
+					}
+
+				}
+
+				constraints.push( params );
+
+			}
+
+			// build BufferGeometry.
+
+			var geometry = new BufferGeometry();
+
+			geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+			geometry.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
+			geometry.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
+			geometry.addAttribute( 'skinIndex', new Uint16BufferAttribute( skinIndices, 4 ) );
+			geometry.addAttribute( 'skinWeight', new Float32BufferAttribute( skinWeights, 4 ) );
+			geometry.setIndex( indices );
+
+			for ( var i = 0, il = groups.length; i < il; i ++ ) {
+
+				geometry.addGroup( groups[ i ].offset, groups[ i ].count, i );
+
+			}
+
+			geometry.bones = bones;
+
+			geometry.morphTargets = morphTargets;
+			geometry.morphAttributes.position = morphPositions;
+
+			geometry.userData.MMD = {
+				bones: bones,
+				iks: iks,
+				grants: grants,
+				rigidBodies: rigidBodies,
+				constraints: constraints,
+				format: data.metadata.format
+			};
+
+			geometry.computeBoundingSphere();
+
+			return geometry;
+
+		}
+
+	};
+
+	//
+
+	/**
+	 * @param {THREE.LoadingManager} manager
+	 */
+	function MaterialBuilder( manager ) {
+
+		this.manager = manager;
+
+		this.textureLoader = new TextureLoader( this.manager );
+		this.tgaLoader = null; // lazy generation
+
+	}
+
+	MaterialBuilder.prototype = {
+
+		constructor: MaterialBuilder,
+
+		crossOrigin: 'anonymous',
+
+		resourcePath: undefined,
+
+		/**
+		 * @param {string} crossOrigin
+		 * @return {MaterialBuilder}
+		 */
+		setCrossOrigin: function ( crossOrigin ) {
+
+			this.crossOrigin = crossOrigin;
+			return this;
+
+		},
+
+		/**
+		 * @param {string} resourcePath
+		 * @return {MaterialBuilder}
+		 */
+		setResourcePath: function ( resourcePath ) {
+
+			this.resourcePath = resourcePath;
+			return this;
+
+		},
+
+		/**
+		 * @param {Object} data - parsed PMD/PMX data
+		 * @param {BufferGeometry} geometry - some properties are dependend on geometry
+		 * @param {function} onProgress
+		 * @param {function} onError
+		 * @return {Array<MeshToonMaterial>}
+		 */
+		build: function ( data, geometry /*, onProgress, onError */ ) {
+
+			var materials = [];
+
+			var textures = {};
+
+			this.textureLoader.setCrossOrigin( this.crossOrigin );
+
+			// materials
+
+			for ( var i = 0; i < data.metadata.materialCount; i ++ ) {
+
+				var material = data.materials[ i ];
+
+				var params = { userData: {} };
+
+				if ( material.name !== undefined ) params.name = material.name;
+
+				/*
+				 * Color
+				 *
+				 * MMD         MeshToonMaterial
+				 * diffuse  -  color
+				 * specular -  specular
+				 * ambient  -  emissive * a
+				 *               (a = 1.0 without map texture or 0.2 with map texture)
+				 *
+				 * MeshToonMaterial doesn't have ambient. Set it to emissive instead.
+				 * It'll be too bright if material has map texture so using coef 0.2.
+				 */
+				params.color = new Color().fromArray( material.diffuse );
+				params.opacity = material.diffuse[ 3 ];
+				params.specular = new Color().fromArray( material.specular );
+				params.emissive = new Color().fromArray( material.ambient );
+				params.shininess = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
+				params.transparent = params.opacity !== 1.0;
+
+				//
+
+				params.skinning = geometry.bones.length > 0 ? true : false;
+				params.morphTargets = geometry.morphTargets.length > 0 ? true : false;
+				params.lights = true;
+				params.fog = true;
+
+				// blend
+
+				params.blending = CustomBlending;
+				params.blendSrc = SrcAlphaFactor;
+				params.blendDst = OneMinusSrcAlphaFactor;
+				params.blendSrcAlpha = SrcAlphaFactor;
+				params.blendDstAlpha = DstAlphaFactor;
+
+				// side
+
+				if ( data.metadata.format === 'pmx' && ( material.flag & 0x1 ) === 1 ) {
+
+					params.side = DoubleSide;
+
+				} else {
+
+					params.side = params.opacity === 1.0 ? FrontSide : DoubleSide;
+
+				}
+
+				if ( data.metadata.format === 'pmd' ) {
+
+					// map, envMap
+
+					if ( material.fileName ) {
+
+						var fileName = material.fileName;
+						var fileNames = fileName.split( '*' );
+
+						// fileNames[ 0 ]: mapFileName
+						// fileNames[ 1 ]: envMapFileName( optional )
+
+						params.map = this._loadTexture( fileNames[ 0 ], textures );
+
+						if ( fileNames.length > 1 ) {
+
+							var extension = fileNames[ 1 ].slice( - 4 ).toLowerCase();
+
+							params.envMap = this._loadTexture(
+								fileNames[ 1 ],
+								textures,
+								{ sphericalReflectionMapping: true }
+							);
+
+							params.combine = extension === '.sph'
+								? MultiplyOperation
+								: AddOperation;
+
+						}
+
+					}
+
+					// gradientMap
+
+					var toonFileName = ( material.toonIndex === - 1 )
+						? 'toon00.bmp'
+						: data.toonTextures[ material.toonIndex ].fileName;
+
+					params.gradientMap = this._loadTexture(
+						toonFileName,
+						textures,
+						{
+							isToonTexture: true,
+							isDefaultToonTexture: this._isDefaultToonTexture( toonFileName )
+						}
+					);
+
+					// parameters for OutlineEffect
+
+					params.userData.outlineParameters = {
+						thickness: material.edgeFlag === 1 ? 0.003 : 0.0,
+						color: [ 0, 0, 0 ],
+						alpha: 1.0,
+						visible: material.edgeFlag === 1
+					};
+
+				} else {
+
+					// map
+
+					if ( material.textureIndex !== - 1 ) {
+
+						params.map = this._loadTexture( data.textures[ material.textureIndex ], textures );
+
+					}
+
+					// envMap TODO: support m.envFlag === 3
+
+					if ( material.envTextureIndex !== - 1 && ( material.envFlag === 1 || material.envFlag == 2 ) ) {
+
+						params.envMap = this._loadTexture(
+							data.textures[ material.envTextureIndex ],
+							textures, { sphericalReflectionMapping: true }
+						);
+
+						params.combine = material.envFlag === 1
+							? MultiplyOperation
+							: AddOperation;
+
+					}
+
+					// gradientMap
+
+					var toonFileName, isDefaultToon;
+
+					if ( material.toonIndex === - 1 || material.toonFlag !== 0 ) {
+
+						toonFileName = 'toon' + ( '0' + ( material.toonIndex + 1 ) ).slice( - 2 ) + '.bmp';
+						isDefaultToon = true;
+
+					} else {
+
+						toonFileName = data.textures[ material.toonIndex ];
+						isDefaultToon = false;
+
+					}
+
+					params.gradientMap = this._loadTexture(
+						toonFileName,
+						textures,
+						{
+							isToonTexture: true,
+							isDefaultToonTexture: isDefaultToon
+						}
+					);
+
+					// parameters for OutlineEffect
+					params.userData.outlineParameters = {
+						thickness: material.edgeSize / 300, // TODO: better calculation?
+						color: material.edgeColor.slice( 0, 3 ),
+						alpha: material.edgeColor[ 3 ],
+						visible: ( material.flag & 0x10 ) !== 0 && material.edgeSize > 0.0
+					};
+
+				}
+
+				if ( params.map !== undefined ) {
+
+					if ( ! params.transparent ) {
+
+						this._checkImageTransparency( params.map, geometry, i );
+
+					}
+
+					params.emissive.multiplyScalar( 0.2 );
+
+				}
+
+				materials.push( new MeshToonMaterial( params ) );
+
+			}
+
+			if ( data.metadata.format === 'pmx' ) {
+
+				// set transparent true if alpha morph is defined.
+
+				function checkAlphaMorph( elements, materials ) {
+
+					for ( var i = 0, il = elements.length; i < il; i ++ ) {
+
+						var element = elements[ i ];
+
+						if ( element.index === - 1 ) continue;
+
+						var material = materials[ element.index ];
+
+						if ( material.opacity !== element.diffuse[ 3 ] ) {
+
+							material.transparent = true;
+
+						}
+
+					}
+
+				}
+
+				for ( var i = 0, il = data.morphs.length; i < il; i ++ ) {
+
+					var morph = data.morphs[ i ];
+					var elements = morph.elements;
+
+					if ( morph.type === 0 ) {
+
+						for ( var j = 0, jl = elements.length; j < jl; j ++ ) {
+
+							var morph2 = data.morphs[ elements[ j ].index ];
+
+							if ( morph2.type !== 8 ) continue;
+
+							checkAlphaMorph( morph2.elements, materials );
+
+						}
+
+					} else if ( morph.type === 8 ) {
+
+						checkAlphaMorph( elements, materials );
+
+					}
+
+				}
+
+			}
+
+			return materials;
+
+		},
+
+		// private methods
+
+		_getTGALoader: function () {
+
+			if ( this.tgaLoader === null ) {
+
+				if ( TGALoader === undefined ) {
+
+					throw new Error( 'THREE.MMDLoader: Import TGALoader' );
+
+				}
+
+				this.tgaLoader = new TGALoader( this.manager );
+
+			}
+
+			return this.tgaLoader;
+
+		},
+
+		_isDefaultToonTexture: function ( name ) {
+
+			if ( name.length !== 10 ) return false;
+
+			return /toon(10|0[0-9])\.bmp/.test( name );
+
+		},
+
+		_loadTexture: function ( filePath, textures, params, onProgress, onError ) {
+
+			params = params || {};
+
+			var scope = this;
+
+			var fullPath;
+
+			if ( params.isDefaultToonTexture === true ) {
+
+				var index;
+
+				try {
+
+					index = parseInt( filePath.match( 'toon([0-9]{2})\.bmp$' )[ 1 ] );
+
+				} catch ( e ) {
+
+					console.warn( 'THREE.MMDLoader: ' + filePath + ' seems like a '
+						+ 'not right default texture path. Using toon00.bmp instead.' );
+
+					index = 0;
+
+				}
+
+				fullPath = DEFAULT_TOON_TEXTURES[ index ];
+
+			} else {
+
+				fullPath = this.resourcePath + filePath;
+
+			}
+
+			if ( textures[ fullPath ] !== undefined ) return textures[ fullPath ];
+
+			var loader = Loader.Handlers.get( fullPath );
+
+			if ( loader === null ) {
+
+				loader = ( filePath.slice( - 4 ).toLowerCase() === '.tga' )
+					? this._getTGALoader()
+					: this.textureLoader;
+
+			}
+
+			var texture = loader.load( fullPath, function ( t ) {
+
+				// MMD toon texture is Axis-Y oriented
+				// but Three.js gradient map is Axis-X oriented.
+				// So here replaces the toon texture image with the rotated one.
+				if ( params.isToonTexture === true ) {
+
+					t.image = scope._getRotatedImage( t.image );
+
+					t.magFilter = NearestFilter;
+					t.minFilter = NearestFilter;
+
+				}
+
+				t.flipY = false;
+				t.wrapS = RepeatWrapping;
+				t.wrapT = RepeatWrapping;
+
+				for ( var i = 0; i < texture.readyCallbacks.length; i ++ ) {
+
+					texture.readyCallbacks[ i ]( texture );
+
+				}
+
+				delete texture.readyCallbacks;
+
+			}, onProgress, onError );
+
+			if ( params.sphericalReflectionMapping === true ) {
+
+				texture.mapping = SphericalReflectionMapping;
+
+			}
+
+			texture.readyCallbacks = [];
+
+			textures[ fullPath ] = texture;
+
+			return texture;
+
+		},
+
+		_getRotatedImage: function ( image ) {
+
+			var canvas = document.createElement( 'canvas' );
+			var context = canvas.getContext( '2d' );
+
+			var width = image.width;
+			var height = image.height;
+
+			canvas.width = width;
+			canvas.height = height;
+
+			context.clearRect( 0, 0, width, height );
+			context.translate( width / 2.0, height / 2.0 );
+			context.rotate( 0.5 * Math.PI ); // 90.0 * Math.PI / 180.0
+			context.translate( - width / 2.0, - height / 2.0 );
+			context.drawImage( image, 0, 0 );
+
+			return context.getImageData( 0, 0, width, height );
+
+		},
+
+		// Check if the partial image area used by the texture is transparent.
+		_checkImageTransparency: function ( map, geometry, groupIndex ) {
+
+			map.readyCallbacks.push( function ( texture ) {
+
+				// Is there any efficient ways?
+				function createImageData( image ) {
+
+					var canvas = document.createElement( 'canvas' );
+					canvas.width = image.width;
+					canvas.height = image.height;
+
+					var context = canvas.getContext( '2d' );
+					context.drawImage( image, 0, 0 );
+
+					return context.getImageData( 0, 0, canvas.width, canvas.height );
+
+				}
+
+				function detectImageTransparency( image, uvs, indices ) {
+
+					var width = image.width;
+					var height = image.height;
+					var data = image.data;
+					var threshold = 253;
+
+					if ( data.length / ( width * height ) !== 4 ) return false;
+
+					for ( var i = 0; i < indices.length; i += 3 ) {
+
+						var centerUV = { x: 0.0, y: 0.0 };
+
+						for ( var j = 0; j < 3; j ++ ) {
+
+							var index = indices[ i * 3 + j ];
+							var uv = { x: uvs[ index * 2 + 0 ], y: uvs[ index * 2 + 1 ] };
+
+							if ( getAlphaByUv( image, uv ) < threshold ) return true;
+
+							centerUV.x += uv.x;
+							centerUV.y += uv.y;
+
+						}
+
+						centerUV.x /= 3;
+						centerUV.y /= 3;
+
+						if ( getAlphaByUv( image, centerUV ) < threshold ) return true;
+
+					}
+
+					return false;
+
+				}
+
+				/*
+				 * This method expects
+				 *   texture.flipY = false
+				 *   texture.wrapS = RepeatWrapping
+				 *   texture.wrapT = RepeatWrapping
+				 * TODO: more precise
+				 */
+				function getAlphaByUv( image, uv ) {
+
+					var width = image.width;
+					var height = image.height;
+
+					var x = Math.round( uv.x * width ) % width;
+					var y = Math.round( uv.y * height ) % height;
+
+					if ( x < 0 ) x += width;
+					if ( y < 0 ) y += height;
+
+					var index = y * width + x;
+
+					return image.data[ index * 4 + 3 ];
+
+				}
+
+				var imageData = texture.image.data !== undefined
+					? texture.image
+					: createImageData( texture.image );
+
+				var group = geometry.groups[ groupIndex ];
+
+				if ( detectImageTransparency(
+					imageData,
+					geometry.attributes.uv.array,
+					geometry.index.array.slice( group.start, group.start + group.count ) ) ) {
+
+					map.transparent = true;
+
+				}
+
+			} );
+
+		}
+
+	};
+
+	//
+
+	function AnimationBuilder() {
+
+	}
+
+	AnimationBuilder.prototype = {
+
+		constructor: AnimationBuilder,
+
+		/**
+		 * @param {Object} vmd - parsed VMD data
+		 * @param {SkinnedMesh} mesh - tracks will be fitting to mesh
+		 * @return {AnimationClip}
+		 */
+		build: function ( vmd, mesh ) {
+
+			// combine skeletal and morph animations
+
+			var tracks = this.buildSkeletalAnimation( vmd, mesh ).tracks;
+			var tracks2 = this.buildMorphAnimation( vmd, mesh ).tracks;
+
+			for ( var i = 0, il = tracks2.length; i < il; i ++ ) {
+
+				tracks.push( tracks2[ i ] );
+
+			}
+
+			return new AnimationClip( '', - 1, tracks );
+
+		},
+
+		/**
+		 * @param {Object} vmd - parsed VMD data
+		 * @param {SkinnedMesh} mesh - tracks will be fitting to mesh
+		 * @return {AnimationClip}
+		 */
+		buildSkeletalAnimation: function ( vmd, mesh ) {
+
+			function pushInterpolation( array, interpolation, index ) {
+
+				array.push( interpolation[ index + 0 ] / 127 ); // x1
+				array.push( interpolation[ index + 8 ] / 127 ); // x2
+				array.push( interpolation[ index + 4 ] / 127 ); // y1
+				array.push( interpolation[ index + 12 ] / 127 ); // y2
+
+			}
+
+			var tracks = [];
+
+			var motions = {};
+			var bones = mesh.skeleton.bones;
+			var boneNameDictionary = {};
+
+			for ( var i = 0, il = bones.length; i < il; i ++ ) {
+
+				boneNameDictionary[ bones[ i ].name ] = true;
+
+			}
+
+			for ( var i = 0; i < vmd.metadata.motionCount; i ++ ) {
+
+				var motion = vmd.motions[ i ];
+				var boneName = motion.boneName;
+
+				if ( boneNameDictionary[ boneName ] === undefined ) continue;
+
+				motions[ boneName ] = motions[ boneName ] || [];
+				motions[ boneName ].push( motion );
+
+			}
+
+			for ( var key in motions ) {
+
+				var array = motions[ key ];
+
+				array.sort( function ( a, b ) {
+
+					return a.frameNum - b.frameNum;
+
+				} );
+
+				var times = [];
+				var positions = [];
+				var rotations = [];
+				var pInterpolations = [];
+				var rInterpolations = [];
+
+				var basePosition = mesh.skeleton.getBoneByName( key ).position.toArray();
+
+				for ( var i = 0, il = array.length; i < il; i ++ ) {
+
+					var time = array[ i ].frameNum / 30;
+					var position = array[ i ].position;
+					var rotation = array[ i ].rotation;
+					var interpolation = array[ i ].interpolation;
+
+					times.push( time );
+
+					for ( var j = 0; j < 3; j ++ ) positions.push( basePosition[ j ] + position[ j ] );
+					for ( var j = 0; j < 4; j ++ ) rotations.push( rotation[ j ] );
+					for ( var j = 0; j < 3; j ++ ) pushInterpolation( pInterpolations, interpolation, j );
+
+					pushInterpolation( rInterpolations, interpolation, 3 );
+
+				}
+
+				var targetName = '.bones[' + key + ']';
+
+				tracks.push( this._createTrack( targetName + '.position', VectorKeyframeTrack, times, positions, pInterpolations ) );
+				tracks.push( this._createTrack( targetName + '.quaternion', QuaternionKeyframeTrack, times, rotations, rInterpolations ) );
+
+			}
+
+			return new AnimationClip( '', - 1, tracks );
+
+		},
+
+		/**
+		 * @param {Object} vmd - parsed VMD data
+		 * @param {SkinnedMesh} mesh - tracks will be fitting to mesh
+		 * @return {AnimationClip}
+		 */
+		buildMorphAnimation: function ( vmd, mesh ) {
+
+			var tracks = [];
+
+			var morphs = {};
+			var morphTargetDictionary = mesh.morphTargetDictionary;
+
+			for ( var i = 0; i < vmd.metadata.morphCount; i ++ ) {
+
+				var morph = vmd.morphs[ i ];
+				var morphName = morph.morphName;
+
+				if ( morphTargetDictionary[ morphName ] === undefined ) continue;
+
+				morphs[ morphName ] = morphs[ morphName ] || [];
+				morphs[ morphName ].push( morph );
+
+			}
+
+			for ( var key in morphs ) {
+
+				var array = morphs[ key ];
+
+				array.sort( function ( a, b ) {
+
+					return a.frameNum - b.frameNum;
+
+				} );
+
+				var times = [];
+				var values = [];
+
+				for ( var i = 0, il = array.length; i < il; i ++ ) {
+
+					times.push( array[ i ].frameNum / 30 );
+					values.push( array[ i ].weight );
+
+				}
+
+				tracks.push( new NumberKeyframeTrack( '.morphTargetInfluences[' + morphTargetDictionary[ key ] + ']', times, values ) );
+
+			}
+
+			return new AnimationClip( '', - 1, tracks );
+
+		},
+
+		/**
+		 * @param {Object} vmd - parsed VMD data
+		 * @return {AnimationClip}
+		 */
+		buildCameraAnimation: function ( vmd ) {
+
+			function pushVector3( array, vec ) {
+
+				array.push( vec.x );
+				array.push( vec.y );
+				array.push( vec.z );
+
+			}
+
+			function pushQuaternion( array, q ) {
+
+				array.push( q.x );
+				array.push( q.y );
+				array.push( q.z );
+				array.push( q.w );
+
+			}
+
+			function pushInterpolation( array, interpolation, index ) {
+
+				array.push( interpolation[ index * 4 + 0 ] / 127 ); // x1
+				array.push( interpolation[ index * 4 + 1 ] / 127 ); // x2
+				array.push( interpolation[ index * 4 + 2 ] / 127 ); // y1
+				array.push( interpolation[ index * 4 + 3 ] / 127 ); // y2
+
+			}
+
+			var tracks = [];
+
+			var cameras = vmd.cameras === undefined ? [] : vmd.cameras.slice();
+
+			cameras.sort( function ( a, b ) {
+
+				return a.frameNum - b.frameNum;
+
+			} );
+
+			var times = [];
+			var centers = [];
+			var quaternions = [];
+			var positions = [];
+			var fovs = [];
+
+			var cInterpolations = [];
+			var qInterpolations = [];
+			var pInterpolations = [];
+			var fInterpolations = [];
+
+			var quaternion = new Quaternion();
+			var euler = new Euler();
+			var position = new Vector3();
+			var center = new Vector3();
+
+			for ( var i = 0, il = cameras.length; i < il; i ++ ) {
+
+				var motion = cameras[ i ];
+
+				var time = motion.frameNum / 30;
+				var pos = motion.position;
+				var rot = motion.rotation;
+				var distance = motion.distance;
+				var fov = motion.fov;
+				var interpolation = motion.interpolation;
+
+				times.push( time );
+
+				position.set( 0, 0, - distance );
+				center.set( pos[ 0 ], pos[ 1 ], pos[ 2 ] );
+
+				euler.set( - rot[ 0 ], - rot[ 1 ], - rot[ 2 ] );
+				quaternion.setFromEuler( euler );
+
+				position.add( center );
+				position.applyQuaternion( quaternion );
+
+				pushVector3( centers, center );
+				pushQuaternion( quaternions, quaternion );
+				pushVector3( positions, position );
+
+				fovs.push( fov );
+
+				for ( var j = 0; j < 3; j ++ ) {
+
+					pushInterpolation( cInterpolations, interpolation, j );
+
+				}
+
+				pushInterpolation( qInterpolations, interpolation, 3 );
+
+				// use the same parameter for x, y, z axis.
+				for ( var j = 0; j < 3; j ++ ) {
+
+					pushInterpolation( pInterpolations, interpolation, 4 );
+
+				}
+
+				pushInterpolation( fInterpolations, interpolation, 5 );
+
+			}
+
+			var tracks = [];
+
+			// I expect an object whose name 'target' exists under THREE.Camera
+			tracks.push( this._createTrack( 'target.position', VectorKeyframeTrack, times, centers, cInterpolations ) );
+
+			tracks.push( this._createTrack( '.quaternion', QuaternionKeyframeTrack, times, quaternions, qInterpolations ) );
+			tracks.push( this._createTrack( '.position', VectorKeyframeTrack, times, positions, pInterpolations ) );
+			tracks.push( this._createTrack( '.fov', NumberKeyframeTrack, times, fovs, fInterpolations ) );
+
+			return new AnimationClip( '', - 1, tracks );
+
+		},
+
+		// private method
+
+		_createTrack: function ( node, typedKeyframeTrack, times, values, interpolations ) {
+
+			/*
+			 * optimizes here not to let KeyframeTrackPrototype optimize
+			 * because KeyframeTrackPrototype optimizes times and values but
+			 * doesn't optimize interpolations.
+			 */
+			if ( times.length > 2 ) {
+
+				times = times.slice();
+				values = values.slice();
+				interpolations = interpolations.slice();
+
+				var stride = values.length / times.length;
+				var interpolateStride = interpolations.length / times.length;
+
+				var index = 1;
+
+				for ( var aheadIndex = 2, endIndex = times.length; aheadIndex < endIndex; aheadIndex ++ ) {
+
+					for ( var i = 0; i < stride; i ++ ) {
+
+						if ( values[ index * stride + i ] !== values[ ( index - 1 ) * stride + i ] ||
+							values[ index * stride + i ] !== values[ aheadIndex * stride + i ] ) {
+
+							index ++;
+							break;
+
+						}
+
+					}
+
+					if ( aheadIndex > index ) {
+
+						times[ index ] = times[ aheadIndex ];
+
+						for ( var i = 0; i < stride; i ++ ) {
+
+							values[ index * stride + i ] = values[ aheadIndex * stride + i ];
+
+						}
+
+						for ( var i = 0; i < interpolateStride; i ++ ) {
+
+							interpolations[ index * interpolateStride + i ] = interpolations[ aheadIndex * interpolateStride + i ];
+
+						}
+
+					}
+
+				}
+
+				times.length = index + 1;
+				values.length = ( index + 1 ) * stride;
+				interpolations.length = ( index + 1 ) * interpolateStride;
+
+			}
+
+			var track = new typedKeyframeTrack( node, times, values );
+
+			track.createInterpolant = function InterpolantFactoryMethodCubicBezier( result ) {
+
+				return new CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, new Float32Array( interpolations ) );
+
+			};
+
+			return track;
+
+		}
+
+	};
+
+	// interpolation
+
+	function CubicBezierInterpolation( parameterPositions, sampleValues, sampleSize, resultBuffer, params ) {
+
+		Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
+
+		this.interpolationParams = params;
+
+	}
+
+	CubicBezierInterpolation.prototype = Object.assign( Object.create( Interpolant.prototype ), {
+
+		constructor: CubicBezierInterpolation,
+
+		interpolate_: function ( i1, t0, t, t1 ) {
+
+			var result = this.resultBuffer;
+			var values = this.sampleValues;
+			var stride = this.valueSize;
+			var params = this.interpolationParams;
+
+			var offset1 = i1 * stride;
+			var offset0 = offset1 - stride;
+
+			// No interpolation if next key frame is in one frame in 30fps.
+			// This is from MMD animation spec.
+			// '1.5' is for precision loss. times are Float32 in Three.js Animation system.
+			var weight1 = ( ( t1 - t0 ) < 1 / 30 * 1.5 ) ? 0.0 : ( t - t0 ) / ( t1 - t0 );
+
+			if ( stride === 4 ) { // Quaternion
+
+				var x1 = params[ i1 * 4 + 0 ];
+				var x2 = params[ i1 * 4 + 1 ];
+				var y1 = params[ i1 * 4 + 2 ];
+				var y2 = params[ i1 * 4 + 3 ];
+
+				var ratio = this._calculate( x1, x2, y1, y2, weight1 );
+
+				Quaternion.slerpFlat( result, 0, values, offset0, values, offset1, ratio );
+
+			} else if ( stride === 3 ) { // Vector3
+
+				for ( var i = 0; i !== stride; ++ i ) {
+
+					var x1 = params[ i1 * 12 + i * 4 + 0 ];
+					var x2 = params[ i1 * 12 + i * 4 + 1 ];
+					var y1 = params[ i1 * 12 + i * 4 + 2 ];
+					var y2 = params[ i1 * 12 + i * 4 + 3 ];
+
+					var ratio = this._calculate( x1, x2, y1, y2, weight1 );
+
+					result[ i ] = values[ offset0 + i ] * ( 1 - ratio ) + values[ offset1 + i ] * ratio;
+
+				}
+
+			} else { // Number
+
+				var x1 = params[ i1 * 4 + 0 ];
+				var x2 = params[ i1 * 4 + 1 ];
+				var y1 = params[ i1 * 4 + 2 ];
+				var y2 = params[ i1 * 4 + 3 ];
+
+				var ratio = this._calculate( x1, x2, y1, y2, weight1 );
+
+				result[ 0 ] = values[ offset0 ] * ( 1 - ratio ) + values[ offset1 ] * ratio;
+
+			}
+
+			return result;
+
+		},
+
+		_calculate: function ( x1, x2, y1, y2, x ) {
+
+			/*
+			 * Cubic Bezier curves
+			 *   https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves
+			 *
+			 * B(t) = ( 1 - t ) ^ 3 * P0
+			 *      + 3 * ( 1 - t ) ^ 2 * t * P1
+			 *      + 3 * ( 1 - t ) * t^2 * P2
+			 *      + t ^ 3 * P3
+			 *      ( 0 <= t <= 1 )
+			 *
+			 * MMD uses Cubic Bezier curves for bone and camera animation interpolation.
+			 *   http://d.hatena.ne.jp/edvakf/20111016/1318716097
+			 *
+			 *    x = ( 1 - t ) ^ 3 * x0
+			 *      + 3 * ( 1 - t ) ^ 2 * t * x1
+			 *      + 3 * ( 1 - t ) * t^2 * x2
+			 *      + t ^ 3 * x3
+			 *    y = ( 1 - t ) ^ 3 * y0
+			 *      + 3 * ( 1 - t ) ^ 2 * t * y1
+			 *      + 3 * ( 1 - t ) * t^2 * y2
+			 *      + t ^ 3 * y3
+			 *      ( x0 = 0, y0 = 0 )
+			 *      ( x3 = 1, y3 = 1 )
+			 *      ( 0 <= t, x1, x2, y1, y2 <= 1 )
+			 *
+			 * Here solves this equation with Bisection method,
+			 *   https://en.wikipedia.org/wiki/Bisection_method
+			 * gets t, and then calculate y.
+			 *
+			 * f(t) = 3 * ( 1 - t ) ^ 2 * t * x1
+			 *      + 3 * ( 1 - t ) * t^2 * x2
+			 *      + t ^ 3 - x = 0
+			 *
+			 * (Another option: Newton's method
+			 *    https://en.wikipedia.org/wiki/Newton%27s_method)
+			 */
+
+			var c = 0.5;
+			var t = c;
+			var s = 1.0 - t;
+			var loop = 15;
+			var eps = 1e-5;
+			var math = Math;
+
+			var sst3, stt3, ttt;
+
+			for ( var i = 0; i < loop; i ++ ) {
+
+				sst3 = 3.0 * s * s * t;
+				stt3 = 3.0 * s * t * t;
+				ttt = t * t * t;
+
+				var ft = ( sst3 * x1 ) + ( stt3 * x2 ) + ( ttt ) - x;
+
+				if ( math.abs( ft ) < eps ) break;
+
+				c /= 2.0;
+
+				t += ( ft < 0 ) ? c : - c;
+				s = 1.0 - t;
+
+			}
+
+			return ( sst3 * y1 ) + ( stt3 * y2 ) + ttt;
+
+		}
+
+	} );
+
+	return MMDLoader;
+
+} )();
+
+export { MMDLoader };

+ 1 - 0
utils/modularize.js

@@ -89,6 +89,7 @@ var files = [
 	{ path: 'loaders/LWOLoader.js', dependencies: [], ignoreList: [] },
 	{ path: 'loaders/KTXLoader.js', dependencies: [], ignoreList: [] },
 	{ path: 'loaders/MD2Loader.js', dependencies: [], ignoreList: [] },
+	{ path: 'loaders/MMDLoader.js', dependencies: [ { name: 'TGALoader', path: 'loaders/TGALoader.js' }, { name: 'MMDParser', path: 'libs/mmdparser.module.js' } ], ignoreList: [ 'Camera', 'LoadingManager' ] },
 	{ path: 'loaders/MTLLoader.js', dependencies: [], ignoreList: [ 'BackSide', 'DoubleSide', 'ClampToEdgeWrapping', 'MirroredRepeatWrapping' ] },
 	{ path: 'loaders/NRRDLoader.js', dependencies: [ { name: 'Zlib', path: 'libs/gunzip.min.js' }, { name: 'Volume', path: 'misc/Volume.js' } ], ignoreList: [] },
 	{ path: 'loaders/OBJLoader.js', dependencies: [], ignoreList: [] },