@howerj/subleq
Version:
An n-bit SUBLEQ virtual machine with test programs.
784 lines (764 loc) • 40.3 kB
JavaScript
/* N-Bit SUBLEQ <https://github.com/howerj/subleq-nodejs> by Richard James Howe */
module.exports = class subleq {
constructor(options) {
options = options || {};
this.debug = !!options.debug;
this.width = options.width || 16;
this.putch = options.putch || function (ch) { };
this.getch = options.getch || function () { return -1; }
this.timeout_ms = options.timeout_ms || 0;
if (isNaN(this.width) || this.width < 8 || this.width > 32) {
throw "Machine width invalid (should be 8-32 bits inclusive)";
}
this.running = true;
this.pc = 0;
this.cyclesTotal = 0;
this.stopRunningOnEndOfInput = false;
this.size = 3;
this.evalString = "";
this.m = new Uint32Array(this.size);
for (var i = 0; i < this.size; i++)
this.m[i] = 0;
var m = this.m;
m[0] = 0;
m[1] = 0;
m[2] = -1; /* default program halts */
}
get pc() { return this._pc; }
set pc(x) { this._pc = x; }
set getch(fn) { this._getch = fn; }
get getch() { return this._getch; }
set putch(fn) { this._putch = fn; }
get putch() { return this._putch; }
stop() { this.running = 0; }
start() { this.running = 1; }
reset() {
this.pc = 0;
this.cyclesTotal = 0;
this.evalString = "";
}
eval(s, append = "\n") {
var oGetch = this.getch;
if (s === null)
return;
this.evalString = s + append;
function eGetch () {
if (this.evalString.length == 0)
this.getch = oGetch;
var r = this.evalString.charCodeAt(0);
this.evalString = this.evalString.substring(1);
return r;
}
this.getch = eGetch;
while (this.evalString.length > 0) { this.step(); }
}
load(arr, length = 32768, run = false) {
this.reset();
function msk(n) { return n < 32 ? (1 << n) - 1: 0xFFFFFFFF; }
if (length < arr.length)
length = arr.length;
if (this.size < length) {
this.size = length;
this.m = new Uint32Array(this.size);
}
for (var i = 0; i < length; i++)
if (i < arr.length)
this.m[i] = arr[i] & msk(this.width);
else
this.m[i] = 0;
return run ? this.run() : null;
}
loadFromString(str, run = false) {
var arr = str.split(/[ \t\n\r]+/);
for (var i = 0; i < arr.length; i++)
arr[i] = parseInt(arr[i]);
this.load(arr);
return run ? this.run() : null;
}
run(cycles = 0) { /* The ISA of the future! */
var pc = this.pc,
cyclesToRunFor = cycles,
forever = cycles === 0,
size = this.size,
m = this.m,
width = this.width;
cycles = 0;
/* - We should use "function l(addr) { return addr % this.size; }"
* to limit memory access and should be used like "a = * m[l(pc+0)];".
* - There is quite a slow down from implementing this
* N-Bit machine as opposed to a fixed width one, it might
* be worth specializing for common SUBLEQ machine widths,
* such as 16 and 32 bit. */
function msk(n) { return n < 32 ? (1 << n) - 1: 0xFFFFFFFF; }
function hi(n) { return (1 << ((n) - 1)); }
while (pc < size && this.running) {
if (!forever && cycles > cyclesToRunFor) {
this.cyclesTotal += cycles;
cycles = 0;
this.pc = pc;
if (this.timeout_ms === 0)
return null;
setTimeout(function () { this.run(cyclesToRunFor); }, this.timeout_ms);
}
pc &= msk(width);
let a = m[pc+0];
let b = m[pc+1];
let c = m[pc+2];
if (this.debug)
console.log([pc, a, b, c, m[pc+0], m[pc+1]]);
if (a === msk(width)) {
let ch = this.getch();
if (ch < 0) {
this.pc = pc;
if (this.stopRunningOnEndOfInput) {
this.stop();
} else {
if (this.timeout_ms === 0)
return null;
setTimeout(function () { this.run(cyclesToRunFor); }, this.timeout_ms);
}
return null;
}
m[b] = ch & msk(width);
pc += 3;
} else if (b === msk(width)) {
this.putch(m[a] & 255);
pc += 3;
} else {
let d = m[b] - m[a];
d &= msk(width);
m[b] = d;
pc = (d & hi(width)) || (d === 0) ? c : pc + 3;
}
cycles++;
}
this.pc = pc;
return null;
}
step() {
var running = this.running;
this.running = true;
var r = this.run(1);
this.running = running;
return r;
}
eforth() {
return [
0,0,163,11,4228,-32768,32767,128,-2,-1,1,2,16,0,0,0,
0,0,0,0,16364,32256,3840,-30598,0,0,0,0,0,0,0,0,66,
16344,16308,15094,16042,7863,0,16344,0,0,47,47,0,0,0,
32384,32384,32512,32512,31,69,114,114,111,114,58,32,78,
111,116,32,97,32,49,54,45,98,105,116,32,83,85,66,76,
69,81,32,86,77,13,10,0,51,15,15,88,84,0,91,0,15,94,
0,0,97,14,14,100,14,14,103,51,0,106,0,14,109,0,0,
112,14,0,118,0,0,124,0,0,121,0,14,160,10,14,127,9,
15,130,145,145,133,15,0,136,0,145,139,0,0,142,18,18,
145,0,0,148,0,18,151,0,0,154,18,-1,157,0,0,112,0,0,
-1,15,15,166,6,0,169,0,15,172,0,0,175,15,0,178,0,
15,181,0,0,184,0,15,190,0,0,85,50,50,193,49,0,196,
0,50,199,0,0,202,48,48,205,47,0,208,0,48,211,0,0,
214,45,45,217,37,0,220,0,45,223,0,0,226,14,14,229,
45,0,232,0,14,235,0,0,238,9,45,241,256,256,244,14,0,
247,0,256,250,0,0,253,16,16,256,0,0,259,0,16,262,0,
0,265,14,14,268,16,0,271,0,14,274,0,0,277,4,16,280,
16,0,286,0,0,289,0,0,304,303,303,292,14,0,295,0,303,
298,0,0,301,0,0,304,9,48,307,343,343,310,48,0,313,0,
343,316,0,0,319,344,344,322,48,0,325,0,344,328,0,0,
331,350,350,334,48,0,337,0,350,340,0,0,343,0,0,346,
45,0,349,0,0,352,0,0,355,45,45,358,14,0,361,0,45,
364,0,0,367,0,0,226,0,0,-1,0,0,226,10,46,379,0,0,
226,9,46,385,0,0,226,13,13,391,46,13,394,46,46,397,
13,0,400,0,46,403,0,0,406,10,46,409,0,0,226,427,427,
415,46,0,418,0,427,421,0,0,424,46,46,427,0,0,430,0,
46,433,0,0,436,0,0,226,454,454,442,50,0,445,0,454,
448,0,0,451,14,14,454,0,0,457,0,14,460,0,0,463,499,
499,466,46,0,469,0,499,472,0,0,475,500,500,478,46,0,
481,0,500,484,0,0,487,506,506,490,46,0,493,0,506,496,
0,0,499,0,0,502,14,0,505,0,0,508,0,0,511,9,50,514,
529,529,517,50,0,520,0,529,523,0,0,526,46,46,529,0,
0,532,0,46,535,0,0,538,9,50,541,0,0,226,46,-1,547,
562,562,550,50,0,553,0,562,556,0,0,559,46,46,562,0,0,
565,0,46,568,0,0,571,9,50,574,0,0,226,10,50,580,616,
616,583,50,0,586,0,616,589,0,0,592,617,617,595,50,0,
598,0,617,601,0,0,604,623,623,607,50,0,610,0,623,613,
0,0,616,0,0,619,46,0,622,0,0,625,0,0,628,-1,46,631,
0,0,226,10,50,637,673,673,640,50,0,643,0,673,646,0,
0,649,674,674,652,50,0,655,0,674,658,0,0,661,680,680,
664,50,0,667,0,680,670,0,0,673,0,0,676,46,0,679,0,
0,682,0,0,685,700,700,688,45,0,691,0,700,694,0,0,697,
46,46,700,0,0,703,0,46,706,0,0,709,9,45,712,0,0,226,
10,50,718,754,754,721,50,0,724,0,754,727,0,0,730,755,
755,733,50,0,736,0,755,739,0,0,742,761,761,745,50,0,
748,0,761,751,0,0,754,0,0,757,46,0,760,0,0,763,0,0,
766,781,781,769,45,0,772,0,781,775,0,0,778,46,46,781,
0,0,784,0,46,787,0,0,790,9,45,793,21,0,796,0,46,799,
0,0,802,21,0,805,0,46,808,0,0,811,0,0,226,14,14,817,
46,0,820,0,14,823,0,0,826,841,841,829,50,0,832,0,841,
835,0,0,838,46,46,841,0,0,844,0,46,847,0,0,850,886,
886,853,50,0,856,0,886,859,0,0,862,887,887,865,50,0,
868,0,887,871,0,0,874,893,893,877,50,0,880,0,893,883,
0,0,886,0,0,889,14,0,892,0,0,895,0,0,898,0,0,226,
10,50,904,940,940,907,50,0,910,0,940,913,0,0,916,941,
941,919,50,0,922,0,941,925,0,0,928,947,947,931,50,0,
934,0,947,937,0,0,940,0,0,943,46,0,946,0,0,949,0,0,
952,0,0,226,970,970,958,50,0,961,0,970,964,0,0,967,
14,14,970,0,0,973,0,14,976,0,0,979,10,50,982,1018,
1018,985,50,0,988,0,1018,991,0,0,994,1019,1019,997,50,
0,1000,0,1019,1003,0,0,1006,1025,1025,1009,50,0,1012,
0,1025,1015,0,0,1018,0,0,1021,46,0,1024,0,0,1027,0,
0,1030,46,46,1033,14,0,1036,0,46,1039,0,0,1042,0,0,
226,1060,1060,1048,50,0,1051,0,1060,1054,0,0,1057,46,
46,1060,0,0,1063,0,46,1066,0,0,1069,9,50,1072,0,0,
226,9,48,1078,1114,1114,1081,48,0,1084,0,1114,1087,0,
0,1090,1115,1115,1093,48,0,1096,0,1115,1099,0,0,1102,
1121,1121,1105,48,0,1108,0,1121,1111,0,0,1114,0,0,1117,
46,0,1120,0,0,1123,0,0,1126,1141,1141,1129,50,0,1132,
0,1141,1135,0,0,1138,46,46,1141,0,0,1144,0,46,1147,
0,0,1150,9,50,1153,0,0,226,10,50,1159,1195,1195,1162,
50,0,1165,0,1195,1168,0,0,1171,1196,1196,1174,50,0,
1177,0,1196,1180,0,0,1183,1202,1202,1186,50,0,1189,0,
1202,1192,0,0,1195,0,0,1198,46,0,1201,0,0,1204,0,0,
1207,1222,1222,1210,48,0,1213,0,1222,1216,0,0,1219,46,
46,1222,0,0,1225,0,46,1228,0,0,1231,10,48,1234,0,0,
226,1252,1252,1240,48,0,1243,0,1252,1246,0,0,1249,45,
45,1252,0,0,1255,0,45,1258,0,0,1261,10,48,1264,0,0,
226,1282,1282,1270,50,0,1273,0,1282,1276,0,0,1279,14,
14,1282,0,0,1285,0,14,1288,0,0,1291,46,14,1294,46,
46,1297,14,0,1300,0,46,1303,0,0,1306,9,50,1309,0,0,
226,1327,1327,1315,50,0,1318,0,1327,1321,0,0,1324,14,
14,1327,0,0,1330,0,14,1333,0,0,1336,14,0,1339,0,46,
1342,0,0,1345,9,50,1348,0,0,226,10,50,1354,1390,1390,
1357,50,0,1360,0,1390,1363,0,0,1366,1391,1391,1369,50,
0,1372,0,1391,1375,0,0,1378,1397,1397,1381,50,0,1384,
0,1397,1387,0,0,1390,0,0,1393,46,0,1396,0,0,1399,0,
0,1402,1417,1417,1405,48,0,1408,0,1417,1411,0,0,1414,
46,46,1417,0,0,1420,0,46,1423,0,0,1426,0,0,226,10,48,
1432,0,0,226,10,50,1438,1474,1474,1441,50,0,1444,0,1474,
1447,0,0,1450,1475,1475,1453,50,0,1456,0,1475,1459,0,0,
1462,1481,1481,1465,50,0,1468,0,1481,1471,0,0,1474,0,0,
1477,46,0,1480,0,0,1483,0,0,1486,46,46,1489,48,0,1492,
0,46,1495,0,0,1498,0,0,226,48,48,1504,46,0,1507,0,48,
1510,0,0,1513,1528,1528,1516,50,0,1519,0,1528,1522,0,0,
1525,46,46,1528,0,0,1531,0,46,1534,0,0,1537,9,50,1540,
0,0,226,10,50,1546,1582,1582,1549,50,0,1552,0,1582,1555,
0,0,1558,1583,1583,1561,50,0,1564,0,1583,1567,0,0,1570,
1589,1589,1573,50,0,1576,0,1589,1579,0,0,1582,0,0,1585,
46,0,1588,0,0,1591,0,0,1594,46,46,1597,50,0,1600,0,46,
1603,0,0,1606,9,46,1609,0,0,226,50,50,1615,46,0,1618,
0,50,1621,0,0,1624,0,0,226,1642,1642,1630,48,0,1633,0,
1642,1636,0,0,1639,14,14,1642,0,0,1645,0,14,1648,0,0,
1651,14,0,1657,0,0,1663,0,0,1660,0,14,1753,10,14,1666,
1702,1702,1669,48,0,1672,0,1702,1675,0,0,1678,1703,1703,
1681,48,0,1684,0,1703,1687,0,0,1690,1709,1709,1693,48,
0,1696,0,1709,1699,0,0,1702,0,0,1705,14,0,1708,0,0,
1711,0,0,1714,1729,1729,1717,45,0,1720,0,1729,1723,0,
0,1726,16,16,1729,0,0,1732,0,16,1735,0,0,1738,45,45,
1741,16,0,1744,0,45,1747,0,0,1750,0,0,226,9,45,1756,
10,48,1759,0,0,226,46,0,1765,0,46,1768,0,0,1771,46,0,
1774,0,46,1777,0,0,1780,46,0,1783,0,46,1786,0,0,1789,
46,0,1792,0,46,1795,0,0,1798,46,0,1801,0,46,1804,0,
0,1807,46,0,1810,0,46,1813,0,0,1816,46,0,1819,0,46,
1822,0,0,1825,46,0,1828,0,46,1831,0,0,1834,46,0,1837,
0,46,1840,0,0,1843,46,0,1846,0,46,1849,0,0,1852,46,0,
1855,0,46,1858,0,0,1861,46,0,1864,0,46,1867,0,0,1870,
46,0,1873,0,46,1876,0,0,1879,46,0,1882,0,46,1885,0,
0,1888,14,14,1891,46,0,1894,0,14,1897,0,0,1900,46,46,
1903,0,0,1906,0,46,1909,0,0,1912,14,0,1918,0,0,1924,
0,0,1921,0,14,1936,46,46,1927,9,0,1930,0,46,1933,0,0,
1936,0,0,226,1954,1954,1942,45,0,1945,0,1954,1948,0,0,
1951,45,45,1954,0,0,1957,0,45,1960,0,0,1963,0,0,226,
14,14,1969,46,0,1972,0,14,1975,0,0,1978,16,16,1981,0,
0,1984,0,16,1987,0,0,1990,14,0,1996,0,0,2002,0,0,1999,
0,14,2014,16,16,2005,9,0,2008,0,16,2011,0,0,2014,10,
14,2017,0,14,2032,16,16,2023,9,0,2026,0,16,2029,0,0,
2032,2047,2047,2035,50,0,2038,0,2047,2041,0,0,2044,46,
46,2047,0,0,2050,0,46,2053,0,0,2056,9,50,2059,16,0,
2065,0,0,2071,0,0,2068,0,16,2077,9,45,2074,0,0,226,
2092,2092,2080,45,0,2083,0,2092,2086,0,0,2089,14,14,
2092,0,0,2095,0,14,2098,0,0,2101,45,45,2104,14,0,2107,
0,45,2110,0,0,2113,0,0,226,14,14,2119,46,0,2122,0,14,
2125,0,0,2128,46,46,2131,0,0,2134,0,46,2137,0,0,2140,
0,14,2155,46,46,2146,9,0,2149,0,46,2152,0,0,2155,0,
0,226,14,14,2161,46,0,2164,0,14,2167,0,0,2170,46,46,
2173,9,0,2176,0,46,2179,0,0,2182,14,0,2188,0,0,2194,
0,0,2191,0,14,2206,46,46,2197,0,0,2200,0,46,2203,0,
0,2206,10,14,2209,0,14,2224,46,46,2215,0,0,2218,0,46,
2221,0,0,2224,0,0,226,14,14,2230,46,0,2233,0,14,2236,
0,0,2239,46,46,2242,0,0,2245,0,46,2248,0,0,2251,14,
0,2257,0,0,2260,0,0,2272,46,46,2263,9,0,2266,0,46,
2269,0,0,2272,9,14,2275,14,0,2281,0,0,2284,0,0,2296,
46,46,2287,9,0,2290,0,46,2293,0,0,2296,0,0,226,2314,
2314,2302,50,0,2305,0,2314,2308,0,0,2311,14,14,2314,0,
0,2317,0,14,2320,0,0,2323,9,50,2326,46,14,2329,46,46,
2332,0,0,2335,0,46,2338,0,0,2341,14,0,2347,0,0,2350,
0,0,2362,46,46,2353,9,0,2356,0,46,2359,0,0,2362,0,
0,226,2380,2380,2368,50,0,2371,0,2380,2374,0,0,2377,
14,14,2380,0,0,2383,0,14,2386,0,0,2389,9,50,2392,46,
14,2395,46,46,2398,0,0,2401,0,46,2404,0,0,2407,0,14,
2422,46,46,2413,9,0,2416,0,46,2419,0,0,2422,0,0,226,
46,0,2428,0,46,2431,0,0,2434,0,0,226,14,14,2440,12,
0,2443,0,14,2446,0,0,2449,15,15,2452,10,14,2455,14,0,
2461,0,0,2467,0,0,2464,0,14,2572,15,0,2470,0,15,2473,
0,0,2476,19,19,2479,46,0,2482,0,19,2485,0,0,2488,17,
17,2491,0,0,2494,0,17,2497,0,0,2500,19,0,2506,0,0,
2509,0,0,2521,17,17,2512,9,0,2515,0,17,2518,0,0,2521,
9,19,2524,19,0,2530,0,0,2533,0,0,2545,17,17,2536,9,0,
2539,0,17,2542,0,0,2545,17,0,2551,0,0,2557,0,0,2554,
0,17,2560,9,15,2560,46,0,2563,0,46,2566,0,0,2569,0,
0,2452,46,46,2575,15,0,2578,0,46,2581,0,0,2584,0,0,
226,14,14,2590,12,0,2593,0,14,2596,0,0,2599,46,14,
2602,2617,2617,2605,50,0,2608,0,2617,2611,0,0,2614,46,
46,2617,0,0,2620,0,46,2623,0,0,2626,9,50,2629,15,15,
2632,14,0,2638,0,0,2644,0,0,2641,0,14,2752,15,0,2647,
0,15,2650,0,0,2653,19,19,2656,46,0,2659,0,19,2662,0,
0,2665,17,17,2668,0,0,2671,0,17,2674,0,0,2677,19,0,
2683,0,0,2686,0,0,2698,17,17,2689,9,0,2692,0,17,2695,
0,0,2698,9,19,2701,19,0,2707,0,0,2710,0,0,2722,17,17,
2713,9,0,2716,0,17,2719,0,0,2722,17,0,2728,0,0,2734,
0,0,2731,0,17,2737,9,15,2737,46,0,2740,0,46,2743,0,
0,2746,10,14,2749,0,0,2632,46,46,2755,15,0,2758,0,46,
2761,0,0,2764,0,0,226,14,14,2770,12,0,2773,0,14,2776,
0,0,2779,15,15,2782,2797,2797,2785,50,0,2788,0,2797,
2791,0,0,2794,16,16,2797,0,0,2800,0,16,2803,0,0,2806,
9,50,2809,14,0,2815,0,0,2821,0,0,2818,0,14,3016,15,
0,2824,0,15,2827,0,0,2830,19,19,2833,46,0,2836,0,19,
2839,0,0,2842,17,17,2845,0,0,2848,0,17,2851,0,0,2854,
19,0,2860,0,0,2863,0,0,2875,17,17,2866,9,0,2869,0,17,
2872,0,0,2875,9,19,2878,19,0,2884,0,0,2887,0,0,2899,
17,17,2890,9,0,2893,0,17,2896,0,0,2899,19,19,2902,16,
0,2905,0,19,2908,0,0,2911,18,18,2914,0,0,2917,0,18,
2920,0,0,2923,19,0,2929,0,0,2932,0,0,2944,18,18,2935,
9,0,2938,0,18,2941,0,0,2944,9,19,2947,19,0,2953,0,0,
2956,0,0,2968,18,18,2959,9,0,2962,0,18,2965,0,0,2968,
17,0,2971,0,18,2974,0,0,2977,18,0,2983,0,0,2989,0,0,
2986,0,18,2992,9,15,2992,16,0,2995,0,16,2998,0,0,3001,
46,0,3004,0,46,3007,0,0,3010,10,14,3013,0,0,2809,46,
46,3019,15,0,3022,0,46,3025,0,0,3028,0,0,226,14,14,
3034,12,0,3037,0,14,3040,0,0,3043,15,15,3046,3061,3061,
3049,50,0,3052,0,3061,3055,0,0,3058,16,16,3061,0,0,
3064,0,16,3067,0,0,3070,9,50,3073,14,0,3079,0,0,3085,
0,0,3082,0,14,3313,15,0,3088,0,15,3091,0,0,3094,19,
19,3097,46,0,3100,0,19,3103,0,0,3106,17,17,3109,0,0,
3112,0,17,3115,0,0,3118,19,0,3124,0,0,3127,0,0,3139,
17,17,3130,9,0,3133,0,17,3136,0,0,3139,9,19,3142,19,
0,3148,0,0,3151,0,0,3163,17,17,3154,9,0,3157,0,17,
3160,0,0,3163,19,19,3166,16,0,3169,0,19,3172,0,0,3175,
18,18,3178,0,0,3181,0,18,3184,0,0,3187,19,0,3193,0,0,
3196,0,0,3208,18,18,3199,9,0,3202,0,18,3205,0,0,3208,
9,19,3211,19,0,3217,0,0,3220,0,0,3232,18,18,3223,9,0,
3226,0,18,3229,0,0,3232,17,0,3235,0,18,3238,0,0,3241,
9,18,3244,17,17,3247,10,0,3250,0,17,3253,0,0,3256,18,
0,3262,0,0,3268,0,0,3265,0,18,3280,17,17,3271,0,0,
3274,0,17,3277,0,0,3280,17,0,3283,0,15,3286,0,0,3289,
16,0,3292,0,16,3295,0,0,3298,46,0,3301,0,46,3304,0,
0,3307,10,14,3310,0,0,3073,46,46,3316,15,0,3319,0,46,
3322,0,0,3325,0,0,226,14,14,3331,12,0,3334,0,14,3337,
0,0,3340,15,15,3343,3358,3358,3346,50,0,3349,0,3358,
3352,0,0,3355,16,16,3358,0,0,3361,0,16,3364,0,0,3367,
9,50,3370,14,0,3376,0,0,3382,0,0,3379,0,14,3616,15,
0,3385,0,15,3388,0,0,3391,19,19,3394,46,0,3397,0,19,
3400,0,0,3403,17,17,3406,0,0,3409,0,17,3412,0,0,3415,
19,0,3421,0,0,3424,0,0,3436,17,17,3427,9,0,3430,0,17,
3433,0,0,3436,9,19,3439,19,0,3445,0,0,3448,0,0,3460,
17,17,3451,9,0,3454,0,17,3457,0,0,3460,19,19,3463,16,
0,3466,0,19,3469,0,0,3472,18,18,3475,0,0,3478,0,18,
3481,0,0,3484,19,0,3490,0,0,3493,0,0,3505,18,18,3496,
9,0,3499,0,18,3502,0,0,3505,9,19,3508,19,0,3514,0,0,
3517,0,0,3529,18,18,3520,9,0,3523,0,18,3526,0,0,3529,
17,0,3532,0,18,3535,0,0,3538,11,0,3541,0,18,3544,0,
0,3547,17,17,3550,10,0,3553,0,17,3556,0,0,3559,18,0,
3565,0,0,3571,0,0,3568,0,18,3583,17,17,3574,0,0,3577,
0,17,3580,0,0,3583,17,0,3586,0,15,3589,0,0,3592,16,0,
3595,0,16,3598,0,0,3601,46,0,3604,0,46,3607,0,0,3610,
10,14,3613,0,0,3370,46,46,3619,15,0,3622,0,46,3625,0,
0,3628,0,0,226,3646,3646,3634,50,0,3637,0,3646,3640,0,
0,3643,14,14,3646,0,0,3649,0,14,3652,0,0,3655,16,16,
3658,15,15,3661,10,0,3664,0,15,3667,0,0,3670,14,0,3676,
0,0,3679,0,0,3691,15,15,3682,0,0,3685,0,15,3688,0,0,
3691,15,0,3697,0,0,3703,0,0,3700,0,15,3712,9,16,3706,
46,14,3709,0,0,3658,46,0,3715,0,14,3718,0,0,3721,10,
16,3724,46,46,3727,16,0,3730,0,46,3733,0,0,3736,3772,
3772,3739,50,0,3742,0,3772,3745,0,0,3748,3773,3773,3751,
50,0,3754,0,3773,3757,0,0,3760,3779,3779,3763,50,0,3766,
0,3779,3769,0,0,3772,0,0,3775,14,0,3778,0,0,3781,0,
0,3784,0,0,226,41,0,3793,0,0,3799,0,0,3796,0,41,3802,
0,0,226,3817,3817,3805,21,0,3808,0,3817,3811,0,0,3814,
14,14,3817,0,0,3820,0,14,3823,0,0,3826,14,0,3832,0,
0,3838,0,0,3835,0,14,4225,9,40,3841,16,16,3844,21,0,
3847,0,16,3850,0,0,3853,9,16,3856,3892,3892,3859,16,0,
3862,0,3892,3865,0,0,3868,3893,3893,3871,16,0,3874,0,
3893,3877,0,0,3880,3899,3899,3883,16,0,3886,0,3899,3889,
0,0,3892,0,0,3895,45,0,3898,0,0,3901,0,0,3904,9,16,
3907,3943,3943,3910,16,0,3913,0,3943,3916,0,0,3919,3944,
3944,3922,16,0,3925,0,3944,3928,0,0,3931,3950,3950,3934,
16,0,3937,0,3950,3940,0,0,3943,0,0,3946,46,0,3949,0,
0,3952,0,0,3955,9,16,3958,3994,3994,3961,16,0,3964,0,
3994,3967,0,0,3970,3995,3995,3973,16,0,3976,0,3995,3979,
0,0,3982,4001,4001,3985,16,0,3988,0,4001,3991,0,0,3994,
0,0,3997,48,0,4000,0,0,4003,0,0,4006,9,16,4009,4045,
4045,4012,16,0,4015,0,4045,4018,0,0,4021,4046,4046,4024,
16,0,4027,0,4046,4030,0,0,4033,4052,4052,4036,16,0,4039,
0,4052,4042,0,0,4045,0,0,4048,50,0,4051,0,0,4054,0,0,
4057,9,16,4060,47,47,4063,14,0,4066,0,47,4069,0,0,4072,
7,0,4075,0,47,4078,0,0,4081,49,49,4084,47,0,4087,0,49,
4090,0,0,4093,7,0,4096,0,49,4099,0,0,4102,21,21,4105,
14,0,4108,0,21,4111,0,0,4114,9,14,4117,4132,4132,4120,
14,0,4123,0,4132,4126,0,0,4129,45,45,4132,0,0,4135,0,
45,4138,0,0,4141,9,14,4144,4159,4159,4147,14,0,4150,0,
4159,4153,0,0,4156,46,46,4159,0,0,4162,0,46,4165,0,0,
4168,9,14,4171,4186,4186,4174,14,0,4177,0,4186,4180,0,
0,4183,48,48,4186,0,0,4189,0,48,4192,0,0,4195,9,14,
4198,4213,4213,4201,14,0,4204,0,4213,4207,0,0,4210,50,
50,4213,0,0,4216,0,50,4219,0,0,4222,9,14,4225,0,0,
226,0,8962,48,634,0,1237,8456,8962,49,634,1,1237,8468,
8963,12589,634,-1,1237,0,12546,43,382,1237,8492,12546,
45,376,1237,8502,11009,1312,1237,8512,11521,1267,1237,
8520,26886,30318,29285,116,388,1237,8528,25091,25977,370,
1237,8542,25603,28789,901,1237,8552,25604,28530,112,1045,
1237,8562,28420,25974,114,955,1237,8574,29444,24951,112,
814,1237,8586,29190,26739,26217,116,2587,1237,8480,23299,
23872,412,1237,8612,23299,23841,439,1237,8622,27651,25203,
1762,1237,8598,29443,16496,1543,1237,8642,29443,8560,1612,
1237,8652,12290,62,2116,1237,8662,12290,61,2158,1237,8672,
12290,60,2227,1237,8682,15361,2299,1237,8692,15873,2365,
1237,8700,12802,47,2437,1237,8708,28418,114,2767,1237,8718,
30723,29295,3031,1237,8728,24835,25710,3328,1237,8632,28677,
30049,25971,3787,1237,8738,28163,28783,1237,8760,16385,2437,
412,1237,8768,8449,2437,439,1237,8778,15364,27503,62,715,
24,1237,8748,15366,28005,29801,62,715,20,1237,8802,15365,
25963,15993,715,18,1237,8818,15366,25445,28520,62,715,26,
1237,8832,15369,26988,25972,24946,15980,715,22,1237,8848,
15365,24948,15984,715,28,1237,8866,15368,30821,25968,29795,
62,715,30,1237,8880,15367,29285,28530,15986,715,32,1237,
8898,15366,28515,25708,62,634,74,1237,8788,25351,29301,
25970,29806,634,64,1237,8930,29192,28527,11636,28534,99,
634,70,1237,8946,29700,26984,115,715,0,1237,8964,28675,
25697,4486,634,960,1312,1237,8978,8965,28534,29539,634,8,
1237,8994,25351,28271,25972,29816,634,48,1237,9008,26628,
29285,101,634,40,4386,1237,9024,25092,29537,101,715,10,
1237,9040,25603,27760,715,12,1237,9054,26627,25708,715,14,
1237,9066,29445,24948,25972,715,34,1237,8914,25355,27745,
25193,24946,26996,28271,634,44,1237,9078,25091,27500,634,84,
1237,9112,29443,29283,634,86,1237,9124,15875,28265,715,16,
1237,9136,29444,24944,110,715,44,1237,9148,25090,108,634,
32,1237,9162,25350,25465,25964,115,634,80,1237,9174,26627,
30821,634,16,4524,4391,1237,9190,25607,25445,28009,27745,
634,10,4524,4391,1237,9206,23809,4243,4543,4391,1237,9226,
23361,4231,4543,4391,1237,9092,27908,28257,121,4231,4571,
4391,1237,9238,28163,28777,814,1045,1237,9266,29700,25461,
107,814,955,1237,9278,16132,30052,112,901,1966,4654,901,
1237,9292,29187,29807,1075,814,1156,814,1237,9310,11524,
28530,116,4658,4658,1237,9326,12805,29284,28783,1045,1045,
1237,9340,12804,30052,112,955,955,1237,9354,12291,15676,
2116,2158,1237,9368,12291,15932,2158,2158,1237,9380,15617,
1267,2158,1237,9392,15362,62,4698,2158,1237,9402,15874,61,
2299,2158,1237,9414,15362,61,2365,2158,1237,9426,12291,
15678,2227,2158,1237,9438,29954,60,4681,2227,2158,814,
2227,2158,4704,1075,2299,1156,4704,1237,9450,29954,62,
814,4728,1237,9480,29955,15678,4728,2158,1237,9492,29955,
15676,4743,2158,1237,9504,28166,26469,29793,101,376,388,
1237,9516,29443,25662,901,2227,1237,9532,24835,29538,4769,
1966,4779,4763,1237,9544,12802,42,2425,1237,9560,25348,
27749,108,634,2,1237,9570,25349,27749,11116,4789,1312,
1237,9584,25349,27749,29548,2425,1237,9598,25863,25976,
30051,25972,2437,1075,1237,9610,27396,31077,63,577,4769,
1966,4833,634,6,4386,634,8,3328,1966,4830,370,1045,4231,
1237,4243,1237,9626,27395,31077,3787,4413,4386,4810,1966,
4838,1237,9670,25860,26989,116,3787,4406,4386,4810,1237,
9690,25346,114,634,13,4849,634,10,4849,1237,9708,26379,
29797,25389,29301,25970,29806,4470,4386,1237,9728,29451,
29797,25389,29301,25970,29806,4470,4391,1237,9250,27652,
29537,116,4871,4386,1237,9748,28676,25449,107,1543,1312,
412,1237,9782,11010,33,2437,4643,412,1312,814,439,1237,
9798,27654,26739,26217,116,4650,1966,4923,376,814,4783,
814,1939,4914,1237,9818,25346,64,901,4386,814,1762,1966,
4938,634,8,2587,1939,4941,634,255,3328,1237,9848,25346,
33,814,634,255,3328,901,634,8,4914,2767,814,4643,901,
4386,814,1762,2158,634,255,3031,1075,955,3031,1156,3328,
3031,814,4391,1237,9884,27907,30817,4681,2299,1966,4983,
4636,1939,4984,1045,1237,9946,27907,28265,4681,2365,1966,
4995,4636,1939,4996,1045,1237,9970,29449,30063,25458,11621,
25705,715,42,4386,1237,9994,12802,33,4643,4391,4796,4391,
1237,10014,12802,64,901,4796,4386,814,4386,1237,10030,
12835,29246,1156,814,1075,814,1075,1075,1237,10048,12835,
15986,1156,1156,814,1156,814,1075,1237,10068,29699,28789,
715,46,1237,10088,29446,30063,25458,101,5047,5018,1237,
10100,24839,26988,28263,25701,901,1762,4693,4237,3328,1312,
1237,10116,24837,26988,28263,4516,5063,634,40,4391,1237,
10140,24837,27756,29807,634,40,4902,1237,10160,11265,5074,
4516,4391,4789,5084,1237,10176,25349,30063,29806,901,382,
814,4927,1237,10192,11015,29811,26994,26478,4237,955,4988,
4658,955,1312,4658,4658,1267,1237,10210,29700,28793,101,
901,1966,5134,814,5100,4849,814,376,1939,5124,4674,1237,
10240,25349,28525,25974,1075,1939,5151,1075,901,4927,1351,
4945,382,1156,382,1627,5143,4674,1237,10272,26116,27753,108,
814,1075,814,1939,5167,4681,4945,382,1627,5164,4674,1237,
10310,25861,24946,25971,4231,5159,1237,9768,25603,9327,1156,
1156,4783,901,5100,1312,5063,2437,1075,814,1075,1237,10356,
10243,10532,5181,1237,10386,11778,36,5181,5100,5124,1237,
10342,29445,24944,25955,4584,4849,1237,10410,25349,29793,
26723,1543,1075,715,36,4386,1075,1435,715,36,4391,4810,
1156,715,36,4391,1429,4231,1237,10424,29701,29288,30575,
4650,1966,5255,715,36,4386,1501,1156,715,36,4391,1156,814,
1075,1612,1045,1156,1237,10468,24837,28514,29810,4243,5238,
1237,10396,10247,25185,29295,10612,5181,814,1966,5275,5100,
5124,5260,1045,1237,10526,25605,28773,26740,634,98,4386,
1543,1267,376,1237,10554,16134,25956,29808,104,5281,4710,
1966,5300,634,-4,5238,1237,10512,29955,11117,4681,1312,
1075,1351,4231,4710,1075,4681,3328,2227,1156,2767,1075,
2767,2227,1156,3328,388,382,1156,814,1237,10602,25607,
25966,24935,25972,388,1075,388,4237,5304,1156,1312,1237,
10652,25602,43,1075,814,1075,5304,1156,1312,1156,1312,1237,
10678,29955,10861,4231,814,634,15,1075,901,5304,1075,1075,
901,5304,1156,1312,1156,1966,5375,1075,955,5304,1156,1312,
1627,5359,4658,1045,1237,10702,10753,5354,1045,1237,10760,
29958,12141,28525,100,4650,2158,1966,5397,634,-10,5238,
4681,4728,1966,5440,4763,634,15,1075,1075,901,5304,1075,
1075,901,5304,1156,1312,901,1156,1351,814,1075,5304,1156,
4693,814,4693,1312,1966,5433,1075,1045,382,1156,1939,5434,
1045,1156,1627,5405,1045,814,1237,4674,1045,4243,901,1237,
10770,27909,27951,25711,4769,901,1075,1966,5458,4763,1075,
5331,1156,1075,4769,1966,5464,1351,1312,1156,5390,1156,1966,
5473,814,4763,814,1237,1237,10890,12036,28525,100,955,2227,
814,5449,1237,10948,27907,25711,5478,1045,1237,10966,12033,
5478,4636,1237,10576,10246,28005,29801,41,544,1237,10978,
25860,26723,111,4421,4386,4810,1237,10988,29699,28769,901,
5505,955,4945,382,1237,11018,27396,24948,112,901,901,634,
13,4704,1075,634,10,4704,1156,3328,1966,5567,901,634,8,
4704,1075,634,127,4704,1156,3328,1966,5550,4584,5512,1237,
1075,955,1351,2299,901,1966,5564,634,8,901,5505,4584,5505,
5505,1156,1312,1237,1045,4636,901,1237,11002,24838,25443,
28773,116,955,1312,955,4681,4704,1966,5600,4838,901,4584,
1267,634,95,4728,1966,5595,5512,1939,5598,4437,4386,4810,
1939,5579,1045,955,1267,1237,11142,25862,28792,25445,116,
4446,4386,4810,4578,4391,1045,1237,11208,29699,25193,5055,
1045,1237,11232,28933,25973,31090,5619,634,256,4446,4386,
4810,5047,4391,1045,4231,4571,4391,1237,11244,11529,29300,
26977,26988,26478,1075,1939,5659,4584,955,1351,1312,4927,
2299,1966,5659,1156,382,1237,1627,5648,4231,1237,11036,
27652,28527,107,814,1075,4658,4658,901,1966,5694,955,4927,
1351,1267,1351,4584,4698,634,4,4895,4810,1966,5691,1429,
4658,1045,1237,5110,1939,5671,1429,4658,1045,1237,11326,
29959,28014,29793,26723,1966,5707,2116,1237,4693,1237,11396,
27909,29793,26723,5703,388,1237,11278,28677,29281,25971,1075,
5619,4571,4386,1312,5047,4386,4571,4386,1267,1351,1075,955,
1156,814,1075,1075,1351,634,11406,5667,4681,1156,634,11426,
5667,814,1156,1267,1075,1267,1156,382,4571,4902,1156,4584,
4698,1966,5761,5645,4231,4976,1237,11418,25094,28257,25966,
114,1075,901,2116,1966,5779,1351,4849,376,1939,5770,1045,
1429,1237,11432,26628,27759,100,4243,4536,4902,4536,4386,
4945,1237,11564,8962,62,4674,4536,4386,4486,634,896,1312,
955,1267,1237,11528,25863,29816,24946,29795,901,1075,5390,
1156,814,1075,5390,1156,4658,1237,11612,25605,26473,29801,
634,9,955,2299,634,7,3328,1312,634,48,1312,1237,11586,
8961,634,2,5293,4231,4524,4386,5811,5825,5786,1237,11674,
8962,115,5839,4681,2767,2158,1966,5852,1237,11698,15362,
35,4486,634,896,1312,4536,4391,1237,11718,29444,26473,110,
2227,1966,5879,634,45,5786,1237,11738,29955,29230,1075,4231,
5862,5852,5796,1156,955,1267,4584,5769,5124,1237,11760,
29954,46,4231,5862,5852,5796,5209,5124,1237,11642,10243,
10542,4775,4524,4386,3631,4650,1966,5916,5908,5825,4849,
1237,11790,11777,5209,901,2227,1966,5929,634,45,4849,5908,
1237,11838,15879,30062,25197,29285,4681,1075,1075,1045,
4927,4524,4386,1075,634,48,1267,634,9,955,2299,1966,5961,
634,7,1267,901,634,10,2299,2767,901,1156,4728,2158,1966,
5971,1045,1156,1156,1237,814,4524,4386,5354,1045,4658,
4524,4386,5354,5342,1156,1156,5110,901,2158,1966,5936,
1237,11862,28167,28021,25954,16242,4243,4530,4391,4524,
4386,1075,955,4927,634,45,4698,901,1075,1966,6010,5110,
955,4927,634,36,4698,1966,6019,4598,5110,1075,1075,4231,
901,1156,1156,5936,901,1966,6054,955,4927,634,46,4704,
1966,6046,4658,1045,4658,1156,4674,4231,1156,4524,4391,
1237,376,4530,4391,382,4530,4386,1939,6025,4674,1156,
1966,6059,5331,1156,4524,4391,4243,1237,11978,11778,115,
5281,1075,1939,6074,1351,4895,5921,1627,6071,1237,12128,
25351,28015,24944,25970,4658,955,1267,4650,1966,6093,1075,
4674,1156,4636,1237,1075,1939,6108,5100,4658,5100,4658,
1267,4650,1966,6108,1429,4636,4636,1237,1627,6096,4674,
4231,1237,12154,28163,24934,4796,1237,12226,25347,24934,
6116,901,4927,634,31,3328,1312,4796,4789,4763,3328,1237,
11810,10248,25971,29281,26723,41,814,1075,901,901,1966,
6175,901,6116,5100,634,159,3328,1351,5100,6082,2158,1966,
6170,1429,901,6116,634,64,814,4386,3328,4693,4237,2767,
4763,1237,4636,901,4386,1939,6142,1429,4674,4231,1237,
12266,10246,26982,25710,41,1075,4509,901,4386,1966,6208,
901,4386,4386,1351,814,6139,4650,1966,6205,1075,4658,1045,
1156,1429,1237,4796,1939,6186,1045,4231,1156,4231,1237,
12236,29455,24933,25458,11624,28535,25714,26988,29811,6139,
4658,1045,1237,12426,26116,28265,100,6184,4658,1045,1237,
12358,10249,26988,25972,24946,10604,4543,4386,1966,6248,
634,634,5090,5090,1237,12452,27719,29801,29285,27745,4430,
4386,4810,1237,12498,25352,28015,26992,25964,44,2437,5074,
5090,1237,12468,16134,28518,28277,100,1966,6276,1237,5209,
5100,5124,634,63,4849,4857,634,-13,5238,1237,12516,26889,
29806,29285,29296,29797,6230,4650,1966,6325,4543,4386,1966,
6310,2116,1966,6307,6121,4810,1237,6121,6264,1237,1045,901,
6116,4927,634,32,3328,1966,6322,634,-14,5238,6121,4810,
1237,901,1075,5100,5994,1966,6348,1429,4530,4386,2227,1966,
6340,1045,1939,6346,4543,4386,1966,6345,814,6254,6254,1237,
1156,4231,6273,1237,12574,26377,29797,28461,25714,29285,4509,
4231,1075,901,4386,1351,3031,1966,6370,4796,1939,6361,1429,
901,4789,1267,814,4509,1267,2437,901,1075,376,4769,1966,
6387,634,-80,5238,1075,1939,6395,901,4386,814,4789,1267,
1627,6390,4386,1156,1237,0,29449,29797,28461,25714,29285,
901,4243,4698,1966,6416,1045,4479,4237,6406,1237,901,4501,
2365,1966,6424,634,-73,5238,4509,814,1075,1939,6432,4643,
4391,4796,1627,6429,4231,814,4391,1237,12800,26126,29295,
26740,30509,29295,27748,29545,116,634,66,1237,12876,29446,
29561,25972,109,634,72,1237,12900,26117,29295,26740,4479,
6447,634,2,6406,1237,12916,28420,27758,121,4243,6406,1237,
12536,11779,25705,6116,5100,634,31,3328,5124,5209,1237,
12936,30469,29295,29540,4857,6358,4650,1966,6517,814,4386,
4650,1966,6514,901,6116,4927,634,128,3328,2158,1966,6511,
901,6478,4386,1939,6497,376,1939,6492,1237,12704,25611,
26213,28265,29801,28521,29550,4509,4386,4881,1237,13036,
30468,29295,100,4237,5293,5720,4516,5063,901,1075,4681,
4391,382,814,5140,1156,1237,12950,16135,28277,29033,25973,
901,4871,6139,2158,1966,6559,1237,5209,4674,634,78,4386,
6478,5201,29193,25701,26213,28265,25701,4857,1237,13094,
16132,30062,108,901,4927,1966,6582,1237,634,-16,5238,1237,
13146,16132,25964,110,901,4927,634,31,2365,1966,6600,634,
-19,5238,1237,13058,25348,24936,114,4584,6533,6577,5100,
1045,4927,1237,13202,23366,26723,29281,93,6605,634,634,
5090,5090,1237,13224,15201,634,-17730,4704,1966,6633,634,
-22,5238,634,1237,5090,4621,4650,1966,6643,4871,4391,1237,
1237,13246,14849,5074,4516,901,634,78,4391,4888,5090,4584,
6533,6577,6590,6552,5100,1312,634,40,4391,5074,634,-17730,
4615,1237,13288,14855,28526,24942,25965,5074,4516,4231,634,
-17730,4615,1237,13338,10049,4584,6533,6230,6273,6121,6254,
1237,13362,25383,28015,26992,25964,1156,901,412,5090,382,
1075,1237,13380,29287,25445,29301,25971,634,78,4386,6121,
6264,1237,13172,29702,26479,27751,101,4643,4386,3031,814,
4391,1237,13426,26628,25705,101,4584,6533,6230,6273,6116,
634,128,814,6718,1237,13404,25189,26469,28265,5074,4516,
1237,13476,30053,29806,27753,634,1966,5090,2437,5090,1237,
13490,24933,24935,28265,634,1939,5090,2437,5090,1237,13510,
26978,102,634,1966,5090,4516,4231,5090,1237,13530,29796,
25960,110,5074,4516,2437,814,4391,1237,13550,30565,26984,
25964,6768,1237,13570,29286,28773,24933,116,814,6759,6779,
1237,13582,25956,29548,101,634,1939,5090,4516,4231,5090,814,
6779,1237,13600,26211,29295,634,1075,5090,4516,1237,13626,
24931,29798,1045,634,1939,5090,4516,4231,5090,4516,814,
1237,13642,28260,30821,116,634,1627,5090,2437,5090,1237,
13448,10245,24950,10610,1156,4783,1237,13688,10247,28515,
29550,10612,1156,412,1237,13702,10248,24941,27506,29285,41,
1156,4783,901,4386,634,40,4391,4796,4386,4871,4391,1237,
13668,25350,25970,29793,101,6646,1045,4621,6695,6848,4871,
4391,1237,13754,30216,29281,24937,27746,101,6882,4231,5090,
1237,13780,25352,28271,29811,28257,116,6882,4789,4763,5084,
6695,6856,5090,1237,13800,15909,28514,31076,4796,1237,13718,
10246,28516,29541,41,1156,1156,4783,814,1075,1237,13840,
10246,28515,28781,41,1156,634,78,4386,6121,901,4386,634,
6848,4704,1966,6951,634,-31,5238,4391,1237,13828,25701,
25967,15987,6695,6936,6695,6925,1237,13906,27910,29281,
25963,114,4888,5074,4516,6882,4789,4763,5084,6695,6865,
5090,5090,1237,13924,29283,8560,6695,1501,1237,13958,29283,
16496,6695,1435,1237,13970,15970,114,6695,1075,1237,13982,
29282,62,6695,1156,1237,13994,29282,64,6695,1351,1237,
14006,29285,29284,28783,6695,1429,1237,14018,25956,27000,
116,6695,1237,1237,14032,11874,34,6695,5201,634,34,6533,
5100,1312,634,40,4391,5074,1237,14046,9314,34,6695,5196,
634,34,6533,5100,1312,634,40,4391,5074,1237,14076,24934,
28514,29810,34,6695,5268,634,34,6533,5100,1312,634,40,
4391,5074,1237,14106,10305,634,41,5720,4674,1237,14140,
11842,40,634,41,5720,5124,1237,14154,10561,1237,14170,
23617,5619,4386,4571,4391,1237,14176,28744,29551,28788,
28271,101,4584,6533,6230,6273,6121,6264,1237,14190,26889,
28013,25701,24937,25972,4888,6116,4386,634,64,2767,4888,
6116,4391,1237,14216,25356,28015,26992,25964,28461,27758,
121,4888,6116,4386,634,32,2767,4888,6116,4391,1237,14248,
29443,25957,4584,6533,6230,6273,4857,901,4386,634,1237,
4704,1966,7170,901,4386,5921,4796,4516,955,2299,1966,7168,
1045,1237,1939,7150,4386,5898,1237,14284,25604,28021,112,
5063,4650,1966,7191,814,901,4386,5921,4796,814,4789,1267,
1939,7178,1045,1237,13862,25349,29547,28021,5063,901,634,
-16162,1267,1075,4650,1966,7218,814,901,4386,1156,1312,
1075,4796,814,4789,1267,1939,7203,1045,1156,1237,14346,
25607,26213,28265,25701,4584,6533,6230,4636,4693,1237,
14442,23366,26740,28261,93,1237,14464,23366,27749,25971,
93,4584,6533,901,4927,1966,7266,6230,1045,6121,901,634,
14486,4698,814,634,14474,4698,2767,1966,7264,1237,1939,
7243,5626,1045,1939,7243,1237,14476,23364,26217,93,1966,
7278,1237,7243,1237,14542,27906,115,1075,3787,4553,4386,
1075,1627,7288,1627,7284,1237,14560,25092,27749,108,634,7,
4849,1237,14386,25347,26995,634,27,4849,634,91,4849,1237,
14586,28676,26465,101,7304,5201,12802,74,7304,5201,12548,
12603,72,1237,14622,24837,11636,31096,4524,4386,4608,1075,
7304,4231,5883,5201,15105,4231,5883,5201,18433,1156,4524,
4391,1237,14650,25093,25135,26229,634,1024,1237,14692,25093,
28524,27491,4237,5293,901,4559,4391,634,10,4914,3787,1237,
14706,26117,30060,26739,1237,14734,29958,25712,29793,101,
4243,634,76,4391,1237,14744,25093,24940,27502,4584,5159,
1237,14764,27652,29545,116,7315,4857,901,4565,4391,7357,
634,15,1075,634,15,1351,1267,634,3,5883,5209,634,63,1075,
5100,4849,1627,7413,4857,1627,7402,1045,1237,14778,26377,
29797,26925,28782,29813,5055,4571,4386,5003,4398,4386,1237,
14844,29449,29797,26925,28782,29813,4398,4391,715,42,4391,
4571,4391,5047,5010,1237,14602,28418,107,4543,4386,2158,
1966,7463,5201,8195,27503,4857,1237,14902,25860,24950,108,
4584,6533,901,4927,1966,7479,6293,4231,5293,1939,7468,1045,
4398,4386,4810,1237,14870,25864,24950,30060,29793,101,7428,
5027,5027,1075,4231,4243,634,8766,7441,634,14936,5216,1156,
5037,5037,7441,5238,1237,14928,27652,28265,101,634,6,4914,
814,7357,1312,634,64,1237,15016,27656,24943,27748,28265,101,
7512,7490,1237,14968,27652,24943,100,4231,634,15,1075,4681,
5027,7527,5037,382,1627,7538,4674,1237,12972,25862,28518,
29810,104,634,264,1237,15042,26884,26222,111,4857,5201,
20500,28530,25962,29795,8250,18021,29295,26740,30240,11825,
56,4516,5921,634,46,4386,5921,4857,5201,16667,29813,28520,
14962,8224,26962,26723,29281,8292,24906,25965,8307,28488,
25975,4857,5201,17694,24941,27753,8250,8224,28520,25975,
29230,27182,14382,16441,28007,26977,11884,28515,109,4857,
5201,21033,28773,14959,8224,8224,29800,28788,14963,12079,
26983,26740,25205,25390,28015,26671,30575,29285,12138,30067,
27746,29029,4857,5201,19494,25449,28261,25971,8250,26708,
8293,28245,26988,25955,29550,8293,8239,30032,27746,25449,
17440,28015,26977,110,4857,1237,15110,30723,28521,634,11152,
4446,4391,4437,4391,4421,4391,4398,4391,1237,15318,26628,
28257,100,634,14908,634,10998,634,6,4386,1762,1966,7690,
1045,634,8570,634,11044,4621,7662,1237,15346,28676,25441,
101,634,11,4849,1237,15390,26116,27753,101,634,15398,634,
8570,634,11044,7662,1237,15406,25351,28271,28531,25964,634,
9634,4413,4391,634,10998,4406,4391,7677,1237,15430,26883,
8559,7720,1237,15460,29705,29537,11627,28265,29801,634,42,
4386,814,634,42,4391,4486,2437,715,0,4391,634,8548,2437,
715,2,4391,4486,634,256,1312,2437,715,6,4391,4486,634,
512,1312,2437,715,8,4391,4231,715,4,4391,4608,7733,634,
12480,4430,4391,634,8548,4454,4391,4231,4571,4391,4243,
4530,4391,4486,634,512,1312,4231,5047,5010,634,42,4391,
1237,15470,26883,26990,634,42,4386,7741,1237,15612,10247,
29285,28530,10610,901,5209,5921,634,63,4849,4857,4243,
4698,1966,7831,370,7809,634,15638,4454,4391,1237,15060,
28932,26997,116,634,15638,4454,4391,5626,634,14936,5216,
4650,1966,7855,4454,4386,4810,1939,7845,1237,15628,10246,
28515,25708,41,6472,6462,6525,7809,634,6,4386,634,4,3328,
1966,7876,7559,634,6,4386,634,2,3328,1966,7916,634,8,
4386,4783,901,4516,814,1267,7197,634,46,4386,4704,1966,
7907,5201,25354,29547,28021,26144,26977,108,370,634,6,
4386,634,2,3031,634,6,4391,7841,1237,15716,29701,29537,
14955,6882,4516,634,1024,5084,2437,7741,1237,15836,24840,
29795,30313,29793,101,901,7741,901,1075,814,2437,814,634,
2,1312,4391,1156,4486,4386,1075,901,2437,4486,4391,1156,
814,4391,1237,15860,30468,26977,116,3787,901,4386,1966,
7963,4231,814,4391,1237,15918,29446,26473,24942,108,4486,
814,4391,1237,15944,29446,28265,27751,101,4237,634,82,4391,
1237,15962,27909,27765,26996,4231,634,82,4391,1237,15982,
29444,28261,100,4486,955,634,38,1312,3787,901,4386,2158,
1966,8009,4391,634,40,1312,4391,1237,16000,29191,25445,
26981,25974,3787,715,38,4386,1966,8026,715,40,4386,715,
38,4386,4231,715,38,4391,1237,15674,25862,26980,28532,114,
634,68,4237,6406,1237,0,28929,6472,6462,1237,16106,16129,
4565,4386,5921,1237,16116,27649,4565,4386,7393,1237,16128,
25857,8055,4565,4386,7534,8048,1237,16140,26882,97,634,2,
5293,634,6,4914,1312,4565,4386,7357,1312,5619,4571,4386,
1312,814,5055,4636,4571,4386,1267,5140,5619,4386,4571,4391,
7377,8066,1237,16156,26881,4231,814,8081,1237,16220,30465,
6490,1237,16232,29441,7377,7371,1237,16240,28161,4237,4565,
4902,8066,1237,16250,28673,4243,4565,4902,8066,1237,16264,
29185,4565,4391,8066,1237,16278,30721,4565,4386,7357,7350,
7386,8066,1237,16290,25601,4237,5293,1075,4565,4386,7357,
1156,634,6,4914,1312,634,64,7386,8066,1237,16086,25348,
27759,100,634,74,4783,4386,4810,1237
];
}
}