From b6d0eae09200856cd6f8ad72bad967890f0ec3a5 Mon Sep 17 00:00:00 2001 From: Andrew Milson Date: Tue, 19 Nov 2024 08:57:38 -0500 Subject: [PATCH] Add FRI layer 0 --- crates/prover/proof.cairo | 7 + .../prover/src/core/backend/cpu/quotients.rs | 60 +- .../src/core/backend/simd/poseidon252.rs | 5 +- crates/prover/src/core/fri.rs | 1101 +++++++++-------- crates/prover/src/core/pcs/prover.rs | 11 +- crates/prover/src/core/pcs/quotients.rs | 77 +- crates/prover/src/core/pcs/verifier.rs | 13 +- crates/prover/src/core/poly/line.rs | 4 +- crates/prover/src/core/prover/mod.rs | 21 +- crates/prover/src/core/queries.rs | 114 -- crates/prover/src/core/vcs/blake2_merkle.rs | 14 +- .../prover/src/core/vcs/poseidon252_merkle.rs | 14 +- crates/prover/src/core/vcs/prover.rs | 10 +- crates/prover/src/core/vcs/verifier.rs | 2 +- crates/prover/src/examples/blake/air.rs | 11 +- crates/prover/src/examples/mod.rs | 2 +- .../prover/src/examples/state_machine/mod.rs | 4 +- .../prover/src/examples/wide_fibonacci/mod.rs | 168 ++- 18 files changed, 881 insertions(+), 757 deletions(-) create mode 100644 crates/prover/proof.cairo diff --git a/crates/prover/proof.cairo b/crates/prover/proof.cairo new file mode 100644 index 000000000..609f7e523 --- /dev/null +++ b/crates/prover/proof.cairo @@ -0,0 +1,7 @@ + + use stwo_cairo_verifier::verifier::StarkProof; + + pub fn proof() -> StarkProof { + let mut proof_data = array![2,669834069653915666220908527724195983660126423798671519561536329895458869256,2136614191183578507262287312846808609871943586477759105633016820152208535056,2,512,1,1,0,0,0,1,918590021,1538103563,1240606016,1283664011,1,857621996,579393,1886472159,1141387647,1,1534361743,1424065546,1315986869,574402211,1,1776274287,1824602525,505883566,1952694182,1,441302453,1565786491,1896807940,2005796219,1,575312996,552644067,110651897,896704099,1,562020057,1164732725,1678667336,1542162725,1,774242549,605793907,368607156,1298110946,1,739462877,1705099293,1881652757,587620080,1,34571314,376225783,393019431,1068255046,1,419633059,172311017,853083105,434333282,1,684349264,991770017,504557305,1427933262,1,804239906,673049399,682050191,488888567,1,1242615052,2110598153,1603072353,399752417,1,903581914,1233857236,1496585314,93758669,1,1032480090,68932220,571262630,2039876611,1,529614693,1079262832,1737058238,690237133,1,171417064,444819270,2034507139,329943624,1,1656686878,1057339409,1444702126,34379427,1,158930526,456625501,880582415,635959611,1,249821660,2094788201,1568514926,1199997475,1,1302169581,1079830724,1153507653,2108158711,1,1532014637,1149787158,1331775817,1667099128,1,223699880,889507749,11383482,1084154710,1,1258978543,1212677084,2116693640,903773556,1,86176361,255331140,1552278283,2068593714,1,1786346509,358792553,342289476,1029578414,1,933069385,223210457,1452056930,1076381034,1,732395302,385130873,1964034802,1098642998,1,1579358655,1738744387,2143278084,853935721,1,1438947333,381368398,1772511357,1164999292,1,1157222870,1986813482,236780090,4612901,1,1058313787,333302955,594540761,38479721,1,171427161,1410603681,1644240906,2124092306,1,1138950450,1841738032,1701999368,331650788,1,1124015632,1263883562,546311005,1412384690,1,1660912544,2046131472,1386932488,1559301528,1,56097298,910445013,823314664,1886219405,1,103716676,212320623,633025876,1980320113,1,1337542032,91633403,660720061,1820059347,1,1345434560,298451270,1818882399,579643479,1,262965188,99405997,990610869,1400910531,1,1940196339,639294569,643189988,1659178677,1,627430581,1532870198,1253446603,985109972,1,990938268,246094173,1862224194,1335136426,1,1816980376,1962770272,470713708,1582869650,1,1346421884,1743473729,573799630,2141254676,1,1035952,587070274,2104015958,470424559,1,1946259762,914845881,1607594546,262265231,1,812005651,1163284043,1001738651,829546256,1,1375874793,79992813,720059706,936599102,1,17968077,1243460072,1930857246,371133811,1,2140839852,1101945509,623051928,615124743,1,1112648920,183182344,748756234,1244196918,1,2071123148,1433820675,1728312754,1373058523,1,495745983,826993448,1469238394,1178454536,1,689322448,531086176,1929929987,751378915,1,587575399,565865828,84052151,1822130582,1,725344246,448815696,1853398014,76508639,1,584550822,1892431437,319745912,1757361188,1,1916860785,125343443,359365477,133492528,1,100316935,1592015245,1728839732,927386671,1,905945878,909970188,1098761016,854876287,1,1659025,1111400843,1586125281,1644671844,1,2130873220,174288000,744880718,711326344,1,973356141,1438352073,992120219,1813236537,1,892799410,1702996989,485399864,1486571680,1,418334209,1957714687,1198555342,1883553015,1,864620890,1587779284,1531955110,1273340133,1,605263607,1725263401,1758996737,1130732543,1,30331826,1563013208,1827831926,1633666904,1,1867429578,1614699092,586545538,595113034,1,396896520,2134063059,894270600,1893259414,1,1221027864,1852171659,794673640,1921641251,1,387469598,270663899,1238285127,1995727261,1,616825002,1914296017,1311350896,229006012,1,1750946639,524461605,389318908,527078894,1,429639625,2048689784,376140410,477560795,1,2112330429,1334803502,716719009,685514010,1,1623946822,279972123,1649334722,1913093410,1,534658244,747040906,1070086541,2037341106,1,2131985912,1795789324,1553997691,377833401,1,1362522787,1446841524,1530796280,1269213117,1,1884782166,88198712,432397943,1486280106,1,260317367,1786008790,1437316052,1913566995,1,279420111,848401749,1240335291,951193453,1,2024181612,434126621,1979666767,1391612818,1,1724445265,1973440030,126880028,1825892448,1,1027890467,797210455,39637342,1207591625,1,1289194301,1756354792,1002000465,1702517173,1,1059730373,437194505,159922392,962159452,1,178963160,2024748338,780323125,1382811754,1,2055688969,370310796,2402481,631045633,1,954436635,1776944329,1862857781,1439881478,1,547681652,527369505,66270632,1723679843,1,2128841734,143948033,1894141058,1896881643,1,112064753,412891606,1942008348,1444106980,1,1767955315,1786032652,1690681433,418393477,1,1620904098,1230712386,1311772698,1699625983,1,2121353443,483123789,948410976,1399955691,1,553787367,1326629205,70362127,1741795717,1,1555227798,268615563,935076263,1979942857,1,1138101962,1024630148,1488093612,130858673,1,1836493634,1766090551,1538723866,660176008,1,1181288589,80765155,1857759418,1904851272,1,371197260,1457133303,1893221428,2127826684,1,438920231,1936864399,188868121,1195376979,1,1938237800,83240236,1914094546,1455419243,1,713410763,1589258647,149545778,1175720760,1,1170953238,1921274966,1678622507,1546769107,1,1996399575,1296087874,1238465665,2037260782,1,1460209723,35374770,1169522395,292747215,1,1967817466,694460497,1529423051,1106725223,1,2067525001,1304062419,234199068,727037896,1,121012997,1853532293,1481504902,436110580,1,178944695,863443302,608559440,966395922,1,1787203901,1327281025,1787422970,248015955,1,1612175716,1263400446,1789445236,788229196,1,808229404,1783583976,1154981755,1349180863,1,1052332032,1336254840,581715305,1328359289,1,340375673,1744816191,270849947,686694620,1,569680252,820569227,1170323871,132369755,1,933484637,238171620,115331231,497808944,1,1133950662,1854277157,191235619,1357043905,1,2138724533,774757623,1275237999,407652853,1,1004911749,354511718,2127530935,1862153442,1,1407230085,913116343,1141142496,555550740,1,487490439,91940400,838675286,2120766429,1,114188848,536912977,846876807,1084930836,1,1319504663,1664239355,704046899,1232477533,1,2090836074,1664414914,1555595463,650549165,1,2083337069,532862971,152044031,673131030,1,397725239,2094181546,1699915461,306654808,1,1404847575,115743763,632240297,919878675,1,815931428,350464186,1883144675,1548615226,1,1903335933,631556154,948572222,2071186900,1,1969120692,1918973851,633327261,1978518679,1,2039338193,1446386612,542383600,684604333,1,1016872462,200693814,463477461,736740860,1,1156568585,654765204,93103854,1959813657,1,1938618875,390574513,1048555490,1314296587,1,977279469,635004046,64080645,1251307046,1,1291082788,771159281,158023545,691948200,1,1874025664,1006370132,837202611,1058901673,1,1413250945,348537617,515371971,976971877,1,1790932906,195426840,1029204419,515798901,1,1368790262,1660461292,208981484,1630548797,1,1527935532,1305599632,1688418043,1561586263,1,50054067,1715216339,2131703948,512340723,1,1161597044,1136113837,112172583,501461430,1,1210487943,797062143,436513549,517635498,1,546155599,199120544,1254630782,773228564,1,1282523920,1320568594,862900593,2084609671,1,480792467,2006001643,2130833840,1053965724,1,113263673,1898467668,216875862,589594539,1,911349537,99922259,1990688546,953731257,1,281235163,577521231,1186387193,1640302558,1,1466236346,985317249,958671236,581555311,1,1969500700,481109462,2018863123,1512864775,1,691288475,12209258,1008174641,1648447095,1,1213081106,1824010627,1303073568,78634180,1,1650729981,3607212,1993739312,1318679960,1,1961423247,317818064,1484794712,1035907418,1,1778965055,918046708,1761367263,1240854790,1,1674347267,1648303047,132188566,774412345,1,456762292,1675221687,159276414,2045612462,1,117213337,638579378,1573638779,1248768215,1,2882298,1718411587,1797533576,851137722,1,587098070,1831588350,1002482491,903338378,1,823299456,1208601024,2051922991,1864454535,1,26516134,610670925,2128994738,1002359753,1,1301063361,294482860,1338165923,1869010850,1,771421649,39240853,1054558688,1692000876,1,1964659322,1219691818,238950569,89862010,1,941377425,750601787,725678656,1995293005,1,1688170994,1953105733,1333238181,2062193080,1,1144951620,1710392146,654572592,650020386,1,1704482998,794814603,905367043,1722314719,1,763668410,1569410643,1259884302,2122486972,1,1369014668,1029271074,910458256,971071253,1,1806385734,365993569,63068080,1519285433,1,2008480975,1795552515,943879082,1287681772,1,33177891,495007056,126317371,1813138437,1,932051808,295544632,1330232613,620193572,1,445190323,555740917,503011386,484142951,1,9393512,1365045962,1835593266,191916864,1,402747517,1034965454,1550403366,1727580773,1,458888195,1134152171,1749211542,1497298819,1,1974692935,1425336700,1778505731,531870464,1,1653034217,2062181154,1488876292,1180561689,1,467440035,1630012797,837719421,1670176060,1,28307738,1236696976,1412399289,261636408,1,632287841,1774884824,924413230,42854052,1,237818772,1965679286,571379501,549016213,1,975993798,839880079,2033046031,36523439,1,2096758365,271639735,1330249020,2022970566,1,1771453484,2060456210,587655537,127405828,1,279794338,808688382,743086790,1750059778,1,1421439559,107973332,1707519098,534857360,1,166791031,833894651,1723578689,1606714827,1,1797366055,508279615,902175255,408061260,1,825914362,1375146038,1272409596,1815275763,1,2064687381,1526719279,1113296859,1479001784,1,1428794813,2064617367,1350655819,1552886997,1,1057034410,2038759085,573702782,183860283,1,466683839,1935062278,1174249625,415436031,1,1904941961,829329902,1655893832,1556484402,1,672109979,448960844,1760806955,205079099,1,482463367,1515820536,1644682521,1715872693,1,1069811750,569197816,1681328085,928950139,1,1241908890,1057424849,552907056,121033862,1,835088871,2099194747,1365797653,1328920338,1,2140984444,1409675856,88669268,288644992,1,1723020101,1413110248,1267380573,646764977,1,1179807145,561913193,1758115346,1017160514,1,304806504,1271069234,950130045,1861823929,1,96024879,30603730,193114201,477430249,1,34617812,892191960,1477935885,104585044,1,575377458,287260208,58763362,1233285599,1,1176367451,860150452,137280848,55346593,1,110724940,88172110,798576366,156742174,1,380511237,1920271972,573226710,1736564787,1,1361458244,1613864011,857636759,976314889,1,24443735,1368046071,1171588791,2019878868,1,418115801,702757422,1152961620,253127919,1,882341320,1108343697,1933928566,1410047814,1,1164805004,211412681,912911125,788038677,1,1005847027,659053469,1015129599,1877036510,1,1540505523,1302783142,1543353356,725261164,1,1863125063,466685893,753418470,545421169,1,383757150,909997495,1639530900,787641461,1,1714134230,1229235262,2006545650,2060624166,1,1835871421,23042336,2093826488,602682866,1,181724850,724911652,2097525413,1284029929,1,367319126,2006749028,105997782,1338660087,1,699193875,1902725756,1449850962,125090714,1,1876401081,1081012903,1261786871,1183529043,1,1344961885,764001269,1484250324,545293062,1,1054034412,938559106,1459869296,248134058,1,39535454,1638662634,1743545777,1271821930,1,177096021,660703267,939152491,1535763606,1,1481199030,510288753,1191645715,2078876849,1,1315152250,673351765,1260894206,967374513,1,1768009434,1976450102,1781514797,1802142111,1,1069534006,562612707,601274607,1143223129,1,837709167,1266770107,2009534951,6761319,1,403986131,1565012749,341960912,831656460,1,1306526485,1209811380,875083325,1759983936,1,1873945149,1503692548,641597582,1176491394,1,87252257,887511865,875700210,1105487024,1,238776000,1618737906,760530102,1472498483,1,1010891091,370431260,684773103,1907153650,1,1823756388,1411274550,427667496,277248146,1,1591888152,574231324,547435395,1629887785,1,1795260168,859490671,1372246924,1549637327,1,1593018480,949673448,161925032,413629725,1,1054116873,140939183,2036970211,150391626,1,1986149120,797695787,979340838,1439011787,1,1224076951,1203547140,1870583169,1851642034,1,257456510,1321973807,1539865712,864180377,1,251453747,2012078428,382451727,1843808391,1,160364820,987035355,1360198593,1337729027,1,525695534,44093093,1613427303,601727450,1,1109574652,1520382752,1373807375,1625689437,1,1484954207,1480560259,1464336784,2118496393,1,1425455488,1414395946,1328722060,1532042255,1,2062317856,1413085170,1116391122,1556176029,1,579161378,703312434,715025288,433475875,1,430579424,397417868,1485943629,1212281590,1,863463409,326516979,52328961,846652003,1,216690395,1220210444,975788594,467894988,1,188781787,71164067,1892080236,2036477327,1,68168813,99433708,470811517,187561335,1,1701433685,389087834,631574473,1436042330,1,802553047,1893848060,745347823,1280242579,1,1579900233,1323047801,1398759814,2029654360,1,626840363,381541946,362177538,1955188974,1,918155003,2122643837,14752715,871407294,1,1274238534,846741656,102183234,1144609131,1,541377695,640965263,2065226139,1996147521,1,1030505543,958825599,1262146664,933087223,1,10213554,1765473044,610826925,1755703346,1,1991768804,475954637,225753628,1032668476,1,771836455,1975643727,653734920,1646182021,1,2136793570,1068332796,309064186,1568038665,1,1179946774,1402664301,837514362,63054417,1,1578649091,1186478276,642303575,1687976522,1,1477176140,162696471,1540072251,1001988297,1,1550940864,2125436546,1960598779,276020022,1,1310269130,90517213,1509091297,1099402534,1,1479558067,1918987628,1676622985,1044842576,1,546806709,1661455138,895756932,2112363634,1,484368073,1777902111,1474811708,167056637,1,730590009,31244651,822091643,1987473922,1,297495984,1472111288,678718492,1245881399,1,776712885,1438991639,47912707,154396376,1,196155878,1987978690,961724314,109405248,1,1518540967,941351548,657326567,993172179,1,2017776925,1349596733,959835711,609319167,1,1399132550,648505036,505101663,952090453,1,1182322449,1558271874,185706738,580837655,1,1170502306,490823913,193562633,1022943812,1,2069268560,1533353478,911765984,880950052,1,1775234283,206897396,1800857598,181723952,1,1231413842,1502085596,2025296266,440592039,1,104732220,2011508138,937587729,526749476,1,1224972884,450769111,971546211,1479255753,1,1262811336,769955228,1334144474,215252410,1,216247851,1895927764,695120892,764374576,1,445512905,884761360,42578561,1238909180,1,865395398,803103852,842116950,1551552630,1,1864700048,1878795208,1207161686,558532841,1,1218583970,1685560115,1699224063,1988733372,1,1215063185,1694866064,504747734,1507338940,1,1000784147,125587987,2133506858,2032726321,1,554841191,528186423,1482032309,1349919687,1,1897428993,1985295485,1231114536,1393795594,1,606501022,149398795,505330066,1243242621,1,148479961,356941481,408613246,638007063,1,865146249,1022548907,510926810,1994994933,1,398167968,487861832,1158242739,810764969,1,1062977355,868404598,1876499996,606987236,1,2056639083,742670783,2125171917,781924418,1,1808913529,1141414029,1996482531,536010127,1,1864649250,1006311428,864312262,1196956902,1,524463389,83695132,1405481385,2134774854,1,707182512,1023958550,1994695145,1731246324,1,1748361954,574046232,396224105,1823073014,1,547745299,809220665,1037217753,1989627617,1,1520711382,2109790828,174527211,1900251173,1,472848676,2010228195,1088775345,1949609447,1,763776419,1822487244,1705393918,136949773,1,231571686,1500154514,601676311,1813101736,1,2001505935,108391108,326105345,1949900353,1,527020435,1292209755,428142878,362207224,1,2097171424,1151038092,411294254,1708471518,1,686740470,559411396,2130398351,354602045,1,525618040,522798335,1764763772,2075719221,1,616402304,712018977,356708943,745887229,1,70789030,1879800847,1058504144,359271052,1,1407054624,651528704,538743022,1477948624,1,755477153,1970615407,1274737992,38808094,1,563361045,2061152544,868686978,1703062939,1,651927457,810958429,353643950,8478911,1,894408897,1777554763,675727127,1439702495,1,2064250577,1513025363,1301260931,1615284290,1,531306901,743268831,782921455,314901446,1,343964618,922506647,840457236,87215468,1,1708817123,376653526,493907726,305575565,1,1612715912,679081772,1041040648,355038001,1,395847940,1843170894,193168591,946252017,1,1798171487,1811626423,1347504425,165776156,1,322314383,549769059,546572503,1898945457,1,1629167879,1043776039,1407592693,887470837,1,1210486980,1697576258,1000466657,72437335,1,1631239645,971575610,562264634,458458539,1,878781948,1561042675,1694094491,1739743679,1,1889232382,651323402,2054776548,1036858260,1,1908148272,1616925610,877076309,1270272028,1,590864367,904728568,35169972,2117593228,1,344207354,1776766003,2111180052,568661504,1,1252039795,2005641037,1955544740,262234034,1,841238923,571083359,253559700,797212767,1,1746348545,788052071,610000265,295964091,1,2070189072,1962108272,1183351180,88405364,1,1765690208,1466659837,190779719,383260210,1,595299807,2068124465,660540363,348197928,1,62287558,1515249496,2023405197,1064486085,1,553476185,995279234,185946279,539948200,1,1513094644,423751361,26460303,1015127555,1,1939307006,242152750,1048182369,2069135950,1,1793111355,121400909,1717658221,1556582383,1,178703303,789236677,1373106736,2023800196,1,565859258,216279711,844912205,453987849,1,414983600,1532110626,1676712083,1533005410,1,1357365192,1900415615,2019321571,1552668233,1,1439025670,733785522,512256892,74404926,1,512719620,1643956872,1116967674,1197395361,1,238597838,1140398671,1326418115,274109170,1,1519998429,1761318450,496094929,2033161953,1,602039885,274782225,187698969,355920853,1,1454725557,598859933,138250312,1981251673,1,1059399266,702469169,1404317988,554010502,1,22183937,845969240,1333933755,793316782,1,734121898,427136559,1324221327,1243084408,1,513471613,1837062076,1677144930,668264128,1,2083785821,1859407726,963137584,2107301799,1,1509950865,476283702,1702737910,196000745,1,296153780,1228843666,544247448,832143091,1,1835889222,31575778,73781617,1356312182,1,2002787292,252618495,994213345,1159205851,1,1489858429,16829985,434574436,1151949590,1,295736745,520930790,1345381992,1921256098,1,1311140368,1019307303,1997906575,22473962,1,1542459377,221784544,1432022453,486676451,1,1368973657,169684090,505555321,138679444,1,1499256359,1708434246,2135973951,406088023,1,1829160137,1339679636,1049392036,684281917,1,727860905,2060582967,307914823,1869996268,1,309047803,1145470429,1457840078,92933154,1,1421802133,1053718295,1835128853,187797786,1,1036399409,2064761681,1042007232,2094026879,1,1058053359,1412936930,1066056883,2104307903,1,1722367377,829661741,279256052,577737675,1,11123710,386891876,949713238,1809731344,1,1845898268,1187727867,496801203,1365770127,1,616578493,1661293397,1786456914,1900521914,1,1754918708,678797191,1243396654,1867079772,1,843063847,575607174,870165343,68133520,1,343873870,974046799,317804593,713434498,1,1181561046,140844639,916021025,55740802,1,46023310,1588472483,560101694,1304919580,1,1481741152,709590011,434562486,1561712301,1,434185445,302902060,2046620744,2145873482,1,1042756478,1868593122,844111114,1602466979,1,1214248069,2039541099,2043899693,1582213868,1,211100001,1979954330,1144653031,2079888990,1,1460037689,1834495892,297670809,253451617,1,597194499,290139766,201491867,329202462,1,1377601307,1502555869,884565654,1746945713,1,376656784,398656841,1425474835,711764602,1,2127473111,1199856381,87536557,1499896959,1,805393915,112456813,1234971960,771740657,1,747859104,2108179347,1746465557,483652109,1,158487351,1971300085,194544048,1709176553,1,1762591767,885029288,1180238367,2050229791,1,1217366392,1325561118,1548534397,750791907,1,1146655857,1673291825,1252677976,778214737,1,1835571178,2127567054,1425366102,940349887,1,1278381177,1707798321,1614225762,1923690679,1,108323272,325040382,1992945703,2137926155,1,1168707502,152476307,903665631,2064366525,1,1218646746,411698976,271203790,2005657718,1,1044020124,1558063962,87463952,1705861293,1,431734226,1419934682,1065727753,1835595168,1,2059169203,1100054160,1027895503,1417525166,1,426344053,1878933652,1977252588,361599400,1,1380695864,1923943933,1609531002,1257078729,1,677508564,380130142,1797415147,869759812,1,513176961,1646455719,964563008,1670095358,1,1568691484,1890159396,951033418,981180663,1,634357529,1836336284,2015932076,370942861,1,578477476,212796312,1811378581,873239512,1,901618776,1596803575,1014076504,512422527,1,223703374,789989895,16413527,1883387863,1,1374666389,1354611634,1926927514,731989306,1,1162965221,1012054024,221552341,2012972370,1,1725170100,1131990626,337695420,1798724695,1,53114807,644694761,1202124159,728345025,1,1067219104,1060314838,1827988333,1680859190,1,2015553950,1231977134,1096158346,1554618664,1,642724628,1959827471,629475562,578751273,1,699077620,1536480932,437843932,2099434730,1,1500943095,2073844316,1110380182,1753950613,1,1154776360,1346192481,2045893505,1635290485,1,1884971259,924599588,291623380,441165815,1,575249191,140759199,1076454081,1179224328,1,142995784,582543869,1663936427,1689822874,1,484182786,1255830681,1533633997,787057299,1,190220170,1796541981,1719313837,709104592,1,1236868910,815599054,555587635,634870064,1,392886541,1038255445,1290305558,1390160262,1,1524788307,405758928,1210211652,1691826881,1,1548664813,234968654,763397314,954532063,1,2108890058,474358336,684251168,2010990898,1,1909434549,648390744,822085713,837593684,1,979235221,1150295096,86599728,1457143951,1,1210729579,525716345,453127636,683414811,1,696637191,1295224568,137323386,170055540,1,1320859876,1998906399,509486764,1097196581,1,1065709040,397821082,572682848,958860181,1,1762603160,251021263,1675569765,1685183353,1,431478864,563152952,1570736875,1876221962,1,1180490927,1225869236,259594896,298360232,1,68253324,920706402,1366076641,555150875,1,1211678062,553713379,120702926,282400498,1,2028171355,299738588,1597703242,1173086910,1,1976385500,1295008150,216370149,1540992676,1,1935955376,1633784553,103027571,256036510,1,429979869,876018695,1561382301,1945223823,1,1806492533,788016523,278921813,483885162,1,1547456057,2107442013,1490661934,680868852,1,2037174872,1631457486,1694421590,1569250562,1,61686611,38507985,1400305503,526660147,1,1303438604,1562745244,387969632,113627273,1,1848307051,1954898322,1893290306,1112149226,1,33021176,70400544,1032966054,1067132861,1,1024721514,1019403715,1435289877,439025146,1,2102702780,118318467,1791091078,2081421255,1,766974754,482860932,729231726,292322125,1,1896733689,1514961906,934794706,707334793,1,1303781977,1067506504,975677224,341866469,1,1853470486,638306214,592458426,402566471,1,914404977,480007277,650567891,2075108738,1,1287927893,1333382397,1450211788,1408891951,1,1551386826,1048891265,1509474961,508010955,1,1542109079,1930792045,1818224561,842637370,1,2007267334,1978196534,934332708,2139792265,1,891105711,534981968,508936967,269189622,1,1186787241,677201989,1110370016,2146611593,1,833095998,177505112,1077611867,2053015061,1,216875753,252419742,1516224208,311989632,1,944126535,795926460,314779093,1922821025,1,1917753772,461786725,958190514,898720401,1,807378051,944555861,993804967,221067432,1,205590484,324396513,1513574992,64388321,1,1118517770,1926618267,2048108067,388486275,1,1114508638,1094914396,1412577681,1582815303,1,1550780622,545770125,168293638,1274704169,1,810979443,192333986,1301739635,292188412,1,1656473368,335992341,614052654,1158608660,4,1,1806429729,1279450398,1703020382,801630445,1,1965325036,224932691,1248218824,1796874031,1,1143972515,894536250,843395795,1983326522,1,791545698,403687184,1742669678,123300997,2,282,1570416160507867866452981021264819753507214325030352111005380901443823048124,307841901867255356994189591499040325625115231595817788730881099192174022736,1825026773948573546750021861091226547021549546773250884351588701090547961609,3507128352639047432704863131521891551943524013458696349063365068581491356703,1981690338745589327109432245493061704191864136095786973117059086781503775227,1334655704474783303049994070279466498106699007412948943417667618889520857641,2989583614475260995931666111834846609445672319860085696835772082942272526480,1800147131140237890188101563383983256568615849416265542593100159987345426211,1840820088218491359446197799031905633259491897013687059479852749124703761445,935880049883260177483297222409162496744250366834243734716522225033686121234,221259213258145303175009983028640356537263350794414176868726311033228970510,508492768309663650033448823449290402778849936643803585230306963762663600026,2098564358476963378471608205180503031982598198012320674812921050189351916841,2551024899741260980879129861712066384092682248762591437467309820376019608647,701057995970645087613197379385902215856187986722477824842222131350441934382,3302016305466150012353176281219524864693746601877946871306260609469458040865,2458464954788621764484728765851899201010121947828868058912830309423496475522,1200679550850957798765137755294113680028845538907697590894146484407759032529,2287234391056861236065666156602638870737177412220132248067148606586447574516,329542958129644009450664691612692777067661497789195074686663048351991269607,1186460319564569780334421213188604739191101233653619673558317566349533297769,3609722233345713348908355875573624497505938487859117916952538271406188462604,466856216797022618556397782141303030396923377609522981468574453633562008317,804169870108138763955541770058070751268002697337953173101028170002825899457,489588008511334385839661911031643016144924493877011886163386062807707783390,2206408937446236471173265354653777762121572997286267589433402190804873865666,2578805358721593052587793001563259783399525202324663736450183037542081409429,2248929149660231029072451432599574966580104896512960834941057223601807333374,3062700335462561761697293347431915934146121306460903990218303002197460934194,2718263702644048195247154425097526210858912108928733343078979234897655691345,3387146612284002733873307098176412307361043773767167332853058581002118256808,841017826022831579922224372878079666720352260492333609989677998700616451492,1394671273810325207605619215480392267211829045636339012770435019156204866109,2793844553364314125773781959146356574963591363862166329224918309987105844425,1960201811614614156042593421085010757000222725521033004262968666044124172877,3195012208539775318105490103446932575983366435577268978726065901110282114156,1474645640251684126775552945694704067788097351741739028585441455424369387715,1850354496411446416791292666977272634098060791787025316775102517234093805259,1841831753650967983512850922514282516794846414359473876051144692276232296898,2134285773553386567228510907575662675060964544589773451505928718494186724117,93408728772030669848669605788530228679939172209766589364013703150956122943,1981332382477340596583667399435136059425894793756540664681199234928504061458,44409193640252839142067319487549058474142225062183990727650546752042131487,497599380631217997456550219249539489434510890555696489337228878867057353165,1381437665260272905975673042123680464943737666674885168325817261190585564926,996295982367183722318090986640389193079069521045504656116312170339661651903,583257056238851367075659222157491822918594006475014056837474516016411384608,3101963785411658680216352722668829261053002000434810824215921558283722401984,3081284505803269237195333126764085007708617108200330477237414507163683023843,2817919788399652198254877858751633036270606521428569122478449383510887695475,2364963171761821778277904874954890367338284175044666834150396477871591461109,700320495623082373620279088916908468022168075606942947002710488805936882207,2062989715320686851457925227464781161617963059973202893410745175143597836701,2045784630514560042832821193421184125487091879428385951871858875007375473029,2339225554809960873318926292832175801255612585522617205875454288616398288366,118663055686401038238997721889834027076162206169346195453504617184984719780,1203681010193482480165381762209430071211757849264832424008534582651964155643,1716396385064660663257406366545178503913638544245877797517781816483580028274,2113370811603290551379185837489061016282993107196284751031110715870018027383,2125906021462151900453337977928123266603488353515466149739836032600906883549,1900013435134690810363364816669357304299621659699390412393663061141316541974,2312151766900233497204195219720038366786885140645015673338227254193643344318,184995500876521439001971331884679403842324268167620476413614181198048116256,3392722880899077621661926148050788105508966903536603436651255963635066617589,524604609753745217177088722127241145207840901625926794558293370656824157441,607575171425973802830439991957347971164079853196711563923504740702436446294,2402571455643489834336958953425988386690851874109583798836443540310281976019,3207814604975894211654168391395685108667696762594924910695669411601738060824,2568165953919479199627857022163302100460485709008998513545161048048895533890,32138345373057239754082240874983700454757893539889922469555832644905498352,173351849046369859083535725898811095958436297366492793783785587224667990338,2387606286398620277050544039727323698060656548076262355749174460615244134214,851021410936154415150385255414726236437199982925794553368401320310372855737,485871532879193463455054704765126272379241598120022652585547417041560328633,2492929136249627863083670755642699262145621685759372250721234431857454671737,2944376775187660601444046726576842563015299164869834927040475524879016942232,1930407018156470042778222120065247561382142438139818161767573297809414155325,1241526146195907977049892876916592237371343492329165817735424432021025557818,3572157536230294373173627273770926547420432922902839991660749828962283562701,3031163097509234341867813048962576276049611924709038280519801889699347088179,127213971954449419832472310866764620826883826352437942338747387172187501156,502466431963006950701397331097324596194116421734489557266417650820959761880,2423895713334599427387582748955805210219236021791590720419099929495541161450,3382990980788376472562702825654110781283147745896714756086342068742963056238,423457798768112269437654025135812810849073401126406653928117317834648890873,716125807945395918836008261793221104090368826623844412879451081739963381647,883213054553474390971996779908555517429235149653182733971520859952582538524,970637914062036515722309047077412642234691811600320741043351580590047789484,2743214772185204543787189235284313507852104756649289198324355061195139158744,519817360693734281165409244175311432956532862364444818471024876196369883878,333934719757239627087403873973350957907645371349144635096152593882408026935,1247609224827719984896301636135428766553110849671245939483209186596505298227,1808693600482977477789479130574338472373592013306844601828036578481957639199,346162947426450834821003163532809179261721314563615439572864057677696771995,2517635153959939992236107502952071542201550443086468151070649290586687125508,671430062575652464761855085361672848511688769718593360889049953527325255347,2265517231781945112877961254372241085880537767562684621585809879330992775957,14676617574967939097027005375059786897371285327044397618945975392794396097,1389654387968682256341863552707809075741114288726780245095632266939257040718,3556384651734221053241770417735031545236520023215847414324164626578121713276,740774965695115777410179832263451918533852877330026361815896105086830717883,2429626662316054603021139019113752370014349680507338454859446974856601032421,969018591362697972603212452744074538348227849875989249122536366959000245321,1450293473722081233670393641337865855105623553426108639172748775504285723802,1723875992108691830200025909133712373268735530057713812794217413384588853135,3348122335457934042855804126555182183283579991098640202277071554331195615011,2383663785252118888773900402061075302203457939742893126125534540421542250748,2683156938416768530492367114537126975250062110631632309123208451753017450463,194097825632687209161394445096677980496322655551829440347131751714351132041,2082825330089786616653673527307194327603129616860213498203740120428043001329,1078814798786031684068065075590425186956427734512099807235935782914414659839,2584340439759321494150543151071816819403636121510994393595358759790035814115,1792004829169743825977736843543215152016508625232088659714654133971596930700,2772635784241573869126122272125558755600840278497593790260766791368504137108,443550127470855032739424872216330722552361093587796900584751550547421695961,2657251791880077812899345932123794948023277652843773781800481800778406425367,441734544622488860649073210379427772952976606346413292018756082736873970265,781129426677034478710852712428512902729691524546741245661352216920576114791,2447626106338806152124225255603656405936143564904803731427821596926999137385,187289165673647378145732318349829162510076173328589019529480356604663008118,3316233248120496191921444588164822234915434972227329782631898961092242504486,359499511119171056614336553435501428090917102066087336740688622228605577220,1641637254797251320434933978814686888519620852976665935964714382143870497155,458497168490421604604850119126565265410951904028966201351674868267999074906,890129591954323150455688564262365596826638985498896851314731220041725674111,1765728377265725299209052521480446860121233884412471939653324497403908255826,2576524399536999203565192377371531230922958913236627146786161540274236313055,1958062628710119400385987882309909748851098871087043558315068959784419985300,2164089117599546344070847326302003931248401249462974149702161859682568090786,1440373151736622002208757650294597593109273703711420985263623378802685705637,1418457058634649217849359390580571049729964686979871652808401600223271346690,2780325823742028720537254702430773235852809873837464465383718128768732237026,2266490771134377716580198507512477831457995258644439993519265627745738793654,2852106397956759158090094647690501852017266203441356744528740200619285735090,1465359144012189687714390589466256458301011210311428529472261077532132073872,2618428748041628562606633364053523322126580809593914786031118666975752107415,3416121202355522498199503097938784311796069586203506066809559409602989062313,3111651253137832127544607830471007518720065200360996551772140415063102765758,3417153123555994296046648640876927215442794314292307657074902493093565747597,1534777731055420670888774657471103964438497302207231006025424550676933659697,2458407670437552101221481620976435024083729431329829501649177583212150020349,2405821133547547949339185313637491543689751826484066296536231372478183579872,99673929992984105778986466252474038928580865635649992928312827687537634505,1425298345072880951598498209352097024279297796267311751328923507834457609832,3542840128994783728811804918263403532810514343245018891971750339634822066309,1485894178173671222295429468632319842852645181395882577874359851556063869799,3516196002532350938444627526518053105418105340889932711946781769355153419039,368147372828802225650065046714990375473912243202149459586694393971161498681,3043845483499845227238685944789051191238545245580632562783744805593070938814,2421707802607897669196426975715685268920602487927844043191461299142468674918,3071780822930548163652333382575881426168814055676452892960492789793755201249,3290704022833779449248237440956219120830687089268828848752360024647314973041,813979376935583534400959684616406778918521858455985738157408296555238555975,344002917771306524508294454477584669912704961532930334504638885133965657856,790307581556515151491339343254110194139442455281547104662362971989230106033,2907222029932384660586081411094436223645895727335978159106263669496016853697,1264601894036199550172768086231590155597037266484578078797647769149051971969,1270753958191644876162927601454006966350090977815006055504185861167823624943,1476761712788019948026596068085903241372104020431226661562516363593145964613,1492985518151249108719157612665043659818323397598883433300101392594456678241,3075022360594498514979176186308432607624505876175000119622121233631494359985,78536109137110166741513585122039229506132641937528919205304036741830307983,382438938952490112795499369759367452353710791298473147503946139649063871867,866416536054105643439588027138746640918857146967695300516122428508221614636,3567820103286724624249669185908698328438055268690275891831037083172975011982,2050883169065474295763166620779051891653513925208389084852490655095234832286,3133693236120726627517188588012618252270563882260974198862873804910049460781,2897305868683683282916487510617282122239084180988885588043108935517302440852,1886776531886878713821647874732954244274827083186290281123085116970678677473,802732141579168068990091694983150186960471401690787180756163537505108660848,1670496750992238508112724599900214005761362487230811607434350111160221580601,209785097764988661681285312108182062678138604283513561824711062523339863287,2989018317560299509360964950647591589697916517697199785286016417806670608950,1571708843080640099520438868299335493254635291041709098243203899975987277641,3409077940153582851981707931283665117408487357258179366542321274273642062542,3355283536996819265187569090359262616418394588101775725915663938742705912231,1428793001785671681834670223196395127156282921687051299156331488416095547097,2080053204933550825837640444603031652684431443955820836472214826623693492378,3558456051621416135806347355910713715525687914972992194087337497598341028063,1157740629519835303748457132354325589575730219389129016107433889466983358919,3365299097862129458308389564398849755636193554625423096059244900020717118841,3423122553828452091059850489623314779374405269286883508796164868639362673679,370284193719810590965178056433091460693301432818115986060317896184285297267,1237563800555921518194277454900675063616244699418032304719118181761931478213,1692054397553859213729068725230047916062391936192042817073077686892218940436,2311475535416364682467451323063164608628011471732118484946586036858573156670,1864347603528528933891525393002085818671636231433735565559508016535770007113,3152556027913614155689159183164089463769281537114460250603322348887883673173,1586732089671492105161665474242772639519297477942595202286120585546079616276,2316572197716220946087332057917774957593352333010945410474470149550217320148,2871619911949219729515609617728461865824517185122062771648609260530874336721,532063115615485549185246714113746745040498882970012347772627088170692443155,2437574993540213087005919460512857020988827971116413573549336491392193092072,913922738995418615983362700961759755384089177526252523287358247190033207655,1660006720870501239713073712022070502565259026440388923389711928892919763802,2329969410826826317955691330461972494907850052254700523757300857448728558203,3040263225058210145301237703006695478929868298853263001994944741122177821836,2243087414960784398983537496357354313272993123671376647606956757196855973882,2238060070823729243218289076551856250841671173606726871819493892395122101579,1355387153694513746195709265158356770932989487096249897944670061388578220272,727544088729500316109271536426085818046037176890441016881031793355232615665,2401643965784684717687511750270582376562163912046309543122022404913612429803,3003293998279620808402145670435087989556039276462865667074993230217714236996,1280277549523968319908383969227586548336977948289055408264183015086536564861,201819979522288889116118993114048215383414041422718082135018709526540103620,2465534702795749990277428965037568578501081803236865592734398554102452949570,2590312723478905211222847085688864607744590749869044882589475721383439158418,667456554744661706023415101569406443020792508573751944656664627564979131312,1922325672612620648639800444456928636563070483369594801315865789301851379206,3166421494552324367084348817246765698941972703148975323189523400046937692741,2616026626618971912631476876324500324630943894035784971575473214150708007588,1857546365946174046373377654984623303988208235508958207973209760427813626971,1571128570852244276894070664583381237689463646005893180053031763600787842321,1677902481941105528458437540831181569363339876741225054513990695254470757845,3527936312781138241756826041199898580681068546931510194796316327466336527897,165629044820138706795839704311825375325927783966585812856479495651873157373,370887227513328815695035702202928168648710621863457108204519517541910250369,3239376262804905829150583522869627797866155270911833846729178917939397486710,2454207818015238236112274251886583331631392681499100875266367726922753656816,420661902963601988670197593603973084268132854126976604500852762018944073166,2684078901723174438207125495688510227300625302209178196576308365664049469893,981271520984887949079581420973614480944900505467775377675167189166233002343,1627398845480186151739882716193934964876117391066077160339552249771724934588,2801472965714910134374703567642625833099051665895888760448750897429408806354,2181783955989964009142549641566300678990924867003654035610009656807565528822,2404150171720647889034117864938733196861032643781108545549243933137136897915,1802122445188061277861508579795294421434350917486384539618883413114888896359,1652745844458367763510789795144564664052748808211889233580128609845332453622,2474161146480492270158309926107030226881769466950712330515310278778747895222,1508703634527036693015468987352113808528065736670197253733424285995870584098,2862962567576511758443382828356942586128499689440161282565889575120065784222,442887384187405628717313439096688532856922685311232058114526439370577736872,2293636542454766557333221087953866536229190179881266928717595026419191009923,3142489429707907341828258683474898185547198271090446273385224564593397622796,2041233609092926709690317105790699457825975795454367547426231333749033933842,1928208024392774271710881581213411920273036112878097939433754545601315983362,2656630705456679999514266929471348837348344493041396026990043473616955969972,2119215985364830859628336307869658607357684402630865223635830191369636887430,2159279708273622978924011634834655059942714226697333890242559634351542861709,1747359102139247020517877220259741181049171915895746408992467988432620406714,1005818224296638068365061942136497422386987389072888400671375465675813292464,3440927627144406141639294529563324475722453232539801690072418377904733810994,817169237750610327339460566307946940924215606588777621143346124756504055932,2843356785768127781660327190722328462953225828639806081947545855872080840006,1919304301402579214604830549661996547307795399609595038752071293161775397145,2665009987554518883691060532691181966317727903828586879016485059112986367195,2462508351034868403633414418437308851623977993103746558773913610084707578189,1117319014896811632962910444818379760662089998421570486312616202368240748919,1703206809227516973294055796990403413850019882129832060228040150550283670591,3300069738028568759467880655513102984512211975606301328023418663339777114641,362946867333203509618204808129317037522035564242871936445955230358250985378,189400542977815971469933496267728788410516297729061465353629808940863299056,2634012267782860001383086797645976821499086845124351163362654376449227952134,2110440234591116125024341731402325973586475865908878737215709531554213608603,566892009013643976010318978673963674130466461689084905777808414626700520188,683133313432302084905406488421308558874073207348374103977844074119052540656,2946607088032535442011182783755897618748409033747101076659346172371775584365,125761790463161114636779300495374916320663452875509279668901234206061906643,2512095407770137565893112981668537325940939129447812566194951757798154816036,2682300996065086874574531364914408480464362914587833733102915541739267707331,2387664379663483049843787261937464037624221100911128167824583398248313800451,836257136852271344512248729464347037095957766858761281523864158676415896011,1383651694168633933080843008676076789261430903606720372154944883876991030336,336527891243217247073967760374779330397993830356897952651844898105079000586,1473321660810762926081767142816233755113785742528446023911650435203308327501,2168080488054379971184219531092692173958814034314514580026794165844259387989,3021847506379870929349019384184053936077566581001333961984105853474662988245,648201511802809069250799177548859301443072407533273474002234082460181343527,630677558373982607980460845930081087425606974147999825736813862661678708243,2894007035646187674165271352042179120774670725975821571914315512709108494373,1967154112256310219859891840392455040295977455798070691338310844172143342368,1372627656489474117539439233641632635499712803999840947293249323647130995753,106706335335040652455069439608085920033899494678387799394753442545885774334,3357410841153030168430927380756352929006159323520841444698954385397224164058,2113379834232441814048108346240978885531597200490652343742617011533663558410,2003794182325587129130933127637348947855156561182593065146445488691821598133,150390332158845659437399142165663669586189824259118868064442752663026928068,452059603368787663356882252913423112048904924592640946669599696960172237752,843670065067745408899754748153370186965802021871813595101094615580029957381,1698117421752582584566813886761035265713309584254863933088651775844138843537,407989252739451455711524952420533482048439945775864241872294055696942397937,2233899915856340376043356273109784447620702323370115973335856498635416416912,0,297,1335277996324932658960780369899352113416081740599257424480575333001359125054,910028994387772380101143412745911457474434409176521240231385157122270140236,2416783845724676268197641434820799390358499334190129300855792386671114172774,1332214669898381807387825865014864913487827590093897490093550239690086970597,1137089244030442794524329712910865769339800904775199855871581678853027299921,1851979591571123235780582548488788942565881755252050322490829638365087026261,1969683441999497080344802106987590104246669627762137219529914258628501156636,2155887212845703463368310680563992092130347263799888568506112529125244170430,3257018915272131128125221670884161217234496966642995306172712422402666213278,2579912110827408371643268483070805273236380893676689201476424679664545353797,1712037619540500113430389665982782249479781359683062068147663092695316658198,619311384488354251314206622881237494094365665740161059211481302920115968571,2647295647090541386383941269102673810509086589926089501624688972350454674320,29437518611214098085039095806623310044717456942045871478390615636601660189,3283084361054912714872375333572203665616751389926312126212612884377541486706,3042425554135167969751485031205761888798455430288384979855580294443334946016,3423639172007269813806391157314994794206783381477455277477632171935543133078,2500163351275110483384228130380651152975364907537702086234877027058127804657,1936628669531854150656879269889473715470122183679445438408020652964974588626,2618303127212523372612443882119113923224141067851169377310865292368750053936,188736994052599601257637435838057430550248035504139468921416747104025229986,658483674391098935287813110198668616313581644847740859392963006511586525161,3570139118336538427244765979492770956231142217350633072023278200814590016256,1749780737326744678191443150664208675574301496337095061343136637497710213541,1538069930243057444746650451999326496369483952155976085905289696922783243485,2724679607947705941798549397240177905939581325432217582343414842073200481444,32220957666053103295994476609045418260765307169202693006870335579131952654,1820285129207400646262634749659613529971509431863009305116288294459957537549,1281676436807482906589656949783493020983433132270795192846356697863730018341,713851575118213179568745520174343811597517832076096028201999362243951438729,2673018263324625522015752229081658058490251692610421884068271675052632176356,2011831606950421799332706699265023718138987157538942567361063014852396677824,561002146253244862761241289553540980323819454700953141526351309828913115999,1588990460288804925622281817091543944219539882162239733404416237917793928741,2319269394770121367074737682322856269765614212919467527134395018065609218806,3498585331483018086275678803435257130643506510144169886258592987403426188245,2412122806278396323359352918007968112685565004081842181276957394219282543326,1998309767326528814673053694859627771721261523449962489591533432731149498316,3258660617406549196619829951490976139637756752752105481063366166414537495299,1228874771926168792631560372246659089923427833995115936831023104642126591494,1053172736161422849575648389074095951077695208610389981431835882811924260028,377443097997615592560323390800967435697448508602047915402564738339589865855,2001033813644298784929151808536064166550137986166323560526710916292921117326,1993562616798201663994776178161178455126164972607892587959096212699985277644,1480789603869401119322603197706369741931553756575553465728750154973125670804,3321697453209123136988337557811513138102175979996000879656251459294399345990,3239915248534882915317936582199853977254073027390654924018740452469358816223,1522325922831763474905560102664616551839544407589484182974328150730637017784,3043404646246241667072049390381529820992799299690967450492973228903834132828,3325647945471827661793835290883853143889276653774233872429028683205869051762,1699141706090024156651531764228297143721226501612135596331399480726308261294,3174805137243497424068876428189522056326533996040575906266834959911840101900,2710270440428302899130298023930651765043412637549565584438649945351017173471,1476406168940556092038988909628976111623748296560208072160962976644837948835,276779813705855786286198621939543769746869441137796549011951439675557546394,402225539959499720888255948325946800643318171450979097653440596265197918739,145017871822280377632416965582043165496838305481886530467692547323558187055,1456188735683036895197694161691052814803069478219373110051882217887673320672,2429886700606812839147992216036463637301791730389586969759188111887435342381,3307578332495609244109452186973022745259197777146610410933525811934929185886,2049068127543724319616272352613187753220845976998151733646152405892808680830,3412060131585698114360663962428085018694676265928048096146485023958627634923,1268305275922605990450504842192099573082849088766806374534454665736589548989,3337515735830936091765595042157488896347174828053763482123785481222822428318,3433202148070481797445257861899488862267694716545892521938136196337228843712,2468306387433075147872170369054365677881248087284639568770423284204246543773,1945768464801253836695968549496689807770479497029062802016983850287284724707,537468289325363813096311293661040979367028606568637248452613080817439316382,2336864317602535478929538298083414163496771156491937710081966542872403506177,1800090595544251434791833452487910026362911045800424004992182838535084894738,674742443076818877265162098722383788508373744394625038778866818240624528065,3089267605575387219435219144738083892367327147039911187811777933272771077952,1658865397641040787737928080628614960533765305041969269018200659414046257538,1666648915246357609049096181062818084715818289360970246168119785839018253696,1288061294162135297211959733164641630464121977404785336896196788454168164435,1179454183439133209240533359455949083562947709892567846579798251754656083227,1772028202220990017767220088633201555635439558428734785467574473778093000403,1311425636223534549609318400068758921691334881653066843119664320612558617578,2858644120523072127426918174124382780537592152934039457901309856412569001118,277469781552770989357198436681203520770191764377216529121901580822942685528,2809857877517844192326362896318658943460356702812685215993783035422246763581,3287593021178651494566254550703569918463853471926921094441518436431265240302,2997983491921179200170392288710551679427347539050964794648022658027354181383,591494505923954048168407958063180251331789856918502417780183988358892126480,599759505482417476495058329534123005809193525748328977253310935022407837912,491347548509341936182489806681246005424244324645340379624373726729180025222,2490319500225905009621591820581192862785979266333400263390727744971926878875,254360408445784359653568297637107823596682237907573687035516711530248552947,2297330356832239379388532398855104916707746122827106862583670204255914657121,793471151826137855338343795454009634421212860621143223508752967579641058537,2935809448725130210990091175920026075026081513077191243020567936222270535688,986469943908792480488768051363789953986250695714673896848240902959459472508,103293547807717875049718061721990273948055709550783026599475420390103934543,3096007099031211611388250809803312141828436851435435046914601204856653770039,2434934200234890806085453565507249598595233820983088315496334563674536562578,2676764887836364024064390509809417606897063094525869054773450095467817694549,1461653361423423069487776633309392893904741069582442385087054569215739875834,2729994183467435378023293359355266605389845294508967266588670335199083548941,977627637493355899031131919642901161698299831692267961656116798898937634416,678595012454701206370411657855087549894087050563689850830571592878027177791,169934711626723382578694306657477885985775214690320797092976744701572759701,2502203362726301025078486667893961588857305169656209750048093727950651026021,2518890340899123726290356521016416592436473692908229727088994747443732812151,131072214211096820606578052622882016271030247719856142894674373190946481340,2856606407146885675973225047071519058898361745679106509184728578696231307587,1766324002327286484393562565288816991817565163998116265664783476781787046510,2804516686874409085855090108227455411142007796376486585513735035997981181312,3506053161162573186061895979702227897448093013569303700494947068108506926098,2865756004346947236116347611768186741268487270256086243680168882240544534095,3241971322167368375317513909808851457260988105348910335222233748172291329613,1279942731190141738462185293160169203399721743807763503479148643812324527176,3005400207098427599040111543814869619242584306943243500687341421005810604553,3476591637163175480025446367556672751612011821242840144823572563907351065756,1080662994650828984134529600160607531711547732773586388360379766972592767034,1966765594937779512797694161448050518437957462467909747288493655064529790666,3312536860485195139396605729219097927647519577597820662450469835690429481123,3284732486127313685217720191492359676117990195462214970894843399374346263976,221061781342334257271733339242729080920216757342523384886674501811399605661,1270278224882239600358332404255452833421793647290916549255164346031462262354,1516218118041631077600908514997026734839814386189279155057314700420239817732,707740313583751481188437129729057178565569005168999679509347885118362745701,386268018410737009529492660850524743986531211539737310144235638538853805204,481040585197764489294276538855845292487484200228137863980622285667875742088,2263192705757977483524195089676392113434448053420156061357750470624977578480,1846142351303862112828831581840379082836093960906960996903048179013743784830,2632527924603100638456728552295846526233319609777474009213153934641257032813,3186175534431873621473276357890905147575560984295263421623706283683053277797,535561997267615096438091381763763468543535127412692876600940532662120576999,790083961530072668871914118116743892720761100256683922310798864306732927069,2686351533097907533387539227319241291521501293878355286561328825051232313261,1092359514648525919937608671862071503766687595689771604463365499872231342802,222249023471666566405634828857658753719918350230155409661918400558958836724,1588239815361447118469788299614372768084244708338133408101423936145450767808,1772375756331691254688408744462937485126842501077100808981102002556601348311,2032926703817700441589356412799144699298939676507313328832018748437520365890,1168466782753497614700179607892605234889501731393624465592632055664852469636,1572626618957173878650285411544538322979445541096852363534574222811633829935,554742676964404242976830400138085749357564177538500174598507861071526814597,751551816436278243352133583761209776806308338827232261584965934535190360178,266230781047874567958003530283999004517839566893188722289094960940224909932,1428993008406937324989157001135700012153107371123771198319762184751235057565,1176812348856955318184470802893454312478638866825089377344095719174712371035,2414334248630707431892658054405580653344999706480515734450968510248641185907,1397615442027532021999681224871017802361265760265779455816391275884532759974,3457313818420434654524153327379088064166174982895877092958280958270640604652,789281302142087938370219238818215209318192261977152278289679789833430408716,1346501193582972862070627639353834158867257540732913033039107118713779544495,387788435129770701643847863830187218529241786629551283071881816710492004825,67054278703941500750309000926671123168930659362749372541088821760468549596,1382006920097907252023997579120143180848379943414442168200952892322868090314,2868798548945608245207234172498556216151622098917815069273906178022655473357,1759382843690301929423612439585543745847693456400636349484465950176885943776,1032101263062782443769939834309990327527665412030218229821081883590615174613,2068306352706285001311081241960130817389744571617137778543135047509913652841,869934182842531395847801058700035369904389808941785562526363559753046120792,2837327728754395374149486738997796534335797556406844507806394633110304106596,916637263247901495445689337143534930217750022466865372741527037798559578538,1630394467445822448169998270358984782445588427934549432927813232828947774271,985263471788124696733844332041163202502829889552365688253067185639389025085,419814363255093938825288583099155968075822256986908260368118063334528568819,609637335651997598020391777289198000000118338383354233207412773095666203459,3434647880862756779685814896837711663573379759526097573392277410482599854802,311567471033789680408814178712892869165867931452500646324436605749078889436,2021902147462565790542802626478647816563200584170843674197880849399856707765,3159922409509085472543543992487670712537011934152534630410498680558340918829,677445420981526038341313826974443673704356525425039562479209918222704925177,2590419012541416344260123552918227919484579982534633886868141827791639904726,3248310511322238092428243557467675098246807229206093701043593848858168925822,273240739261412227668797919859470892386828943100541057546661917215006216184,703913735797996012987910672749497505092342430279752929685564510133127324009,171029045291986995940846574953736086271375431679346244655393000197192463473,3015063224948065861214922490655014409556443328530927873016430971279200039241,521960212906523534406340128437574498762828458208517631501659196981861506937,1004301297686704696374214424504486137044672488055193454519264627407825100338,2571326131242098800308746550368417675604528993807343160775956697203870228445,3463317387920472788664594514772951666557891713752381669817023880260237693363,744014099470080936884172856990900788155058089482996616686352997217669590008,3417378450860313263497503022005990908169269385586413027371389749121989737053,2086945218722377647435169563061043885329269777777800586260081206344722881279,2309176132597896074027995729966926531895600255709985683589013323933737535055,3232439961009755236724382213793992052068510085933442240181244820998012296961,1941268602988713395123818366060218780160196248170154468189286111554740675577,2583407161902412224251579579728352398182878286604331007178202869408670017445,3023335950936318520780100084325827112083364724417323135820301953358141392568,1154929092157803828520607553316414047720809276593205585604647334397820228140,2237072367035991248305730519452268989189804689842219946579292667598985226679,2139039413220782288396057785011547845655743818038151936268343503317026492289,930975153448014479667330097966685085936035323617496220497537217633991279477,2392025367069748566600667338099875318842310368113498845383457450562782803591,1405466967989261862648390626524353723605320618707903147090983779252702419833,300628316913637264997900538354221931291639376953976160675646018533911327751,3368088946910067042251077899068012979673592768281817875804259487474124773575,1109889706314723239423152225951095668219953361663545351604733082340421000037,3323672923858984114521782176247110203060615099827555128642631985160674958168,2591865618397472118766497857498973927205282331077817253358496319175247748599,487753593624794986558900369753993515197903457153421568431852893578309483214,2959701846321766755104474640801005981598194985572832581857007504259373370132,2042987765065010674368477663926842954332741434064591004895723830598315538279,809019726077142836489357526095053024971009875345892335099097889679609766720,3273442114076763051643348424728553807466386457918239623832897636749353753760,1579187305235531304598010282908045031395583267950183957029107450231362732595,1233151746287449829239210963226952555148287315419231190888086309620870023445,412127756222544297759906282744434824422711996760809947544146392423349842774,413249871401375546977157464220768987492968778006000400827157360770605947699,84485532812661817959878777232676160493445115279444129100134691199179008536,47438066881864536412808205584071637674618619241801579196643697561416006573,2491117395342137798177143883165100109105360493456923143392503487442728785015,517891267532203318051127364276294618847787201757910436997203731443348927840,3616728888262027685716356648802666560376257406712635931213126856285005575747,556461345819631722947454636989577195139784663349621511085599588954720984491,233175272514077265959048856949762170303264342063997701865305993247431340307,2596186624889694305289435028016976587933099159014225732974583098241092841845,1832372335663943473001457067030472883948878389808452303829966942590830002965,2293141397917527783751287688787665031898157332791989894065351936383756810368,1026519263381697585128020483530777537268853369496505690997957591995743881818,140754402728582766483212945701463031870172990806907521402077032777498431,266984475162008660889659320162549622102415460237694873287974430423842417966,2856552812435576518455703507712000005921126822165424905645009937949459256724,2915360505906896467436377113638057827233909342161167879525057389801383238848,1213589762584415185298502382484397526926100210711701069988687223016466217415,2141349025829739568604696462639482744504036367116526897970434351564740834270,126178405414362069990348891864801823458056293571194004734279291966948291318,329299791900835934508322932079844466866923500074212652406188589886731805083,656901549754471903897895091067772257846570573904953673624736277995187952204,3609551908083060958202723622509203991317368943190370425142261408462929872339,2927758645553874526119810859026632650466356590881676383383138080166670957390,2936317843096538001353109713412329630663603327611919239587328555001967560957,2558933174770926113128902248469951529930177124860701240215355390237337815483,1281701806837373133663876450734426668734792016859840121744507964327234736150,1537959582724781479863144783396047849686573545281363769061141747564726350107,1434174102869815611620505577228034458238201957366194670168506397155572549129,2412614304304581637083179798295864538108367027875964068323367314321674667808,3208421557552176156698497173854053270172247503998640043498876670059133994560,1046803168238540628811113991401962700980907632742587082512556417723084917011,2232285105375141448995178181131177980395106857765892274135831924756253694625,1297604234420479401920675535640006365329681178070387181552391515995399353060,3612227681970346928353930283847031659989062461972823489966904812029780081174,3595798691523065633410651635216948149096644431504231100565176449128634652711,567773346085345446100630383058061436018532761950209278408936638777949253571,414885703643069927962098745841795278955406094073424705831789366161115078140,881924470326759639674243337922952265378068789796967634785036685137206601456,824501480621170467902854745517110101690103742701506521992295685650759866735,1545954793131246976404419079105675559083579895732805840331481261706224633202,1999261766470311272219987812613682993851148606125977100357754051809701976623,2707703532323119372102867233490592260237930333399680165453094424611875736509,1497605991588560151605380643726500239317096909430542608857172215875699898717,2934723607214457203190708409118467090142867975626250701341989174282315277164,1343849103289929473315985217109903748560721371375886256035469491197479326094,2317935075265898145487544925759292830491062035541691665866900562440627839197,2851372823851994419569315481577185016442469488761040424774683123574788676597,207733897294952282855866347027976687246545793566099888357146943553413909192,2658830374659589449884684888030424284770632097853636932584621377525910846124,3191081661399087267332931568137362912396852943159840752870529179668881973698,2231674379199008211827784019889847668214431059593081668492222263505885071111,69968146616692358918468673109862067849184278534147723211480765977473355490,1578723547980180137565002342443367801332955463369369008906732920729887570020,3512872146825507032558740054434837769881023167945569641012016140784228848901,3057708488113597988971821999305438916758443582717769556333382101095240868366,1168634414847218437171889996764687040498484131212504759191867472073205648529,2386662654769664955899328152777745522027602169304122610802304187106119349974,1466580956768736044327115503880006357310715113413560889954215267156434177355,608508723623527406771657690357101199694188940374085103079763047478094375264,2841067168369739993193495257297568606142940869309079462527601415769826740243,3223451446749457324220463637514853325623975655951859982632202160969073094098,2748086956190927528101160923227463572945131289232298901598321913552758262906,1839553926379576942941558371682360883928532678811316562055387849797131662855,464038330676529360389782250321251864830400179379770308975364643513402012629,1615097431165930005260705547032237812743404698046324647178099998007568668817,2903338660537262393244824620326864608636552380079254406187532172815880196729,876385359763849477749409485059120788345529293619717214794791655827303534711,350016530452997037224507961477629933675936235877103657884826222382183532393,1597766650194211639503983043535299076523806529796752119551413328981537627996,2475757222752252004523827060701239985489084770286953330402564986372824271761,3530335275489488886363944007220267868352465093144850150575274832259978935640,267207889062752304852611762231135602404018773693191880578796288844556161993,115961986675857643465917982957658648833173043055221516953989413535562928827,1485965764647831912157523661581646777204177408638785325586273251114700732475,2711132567873321011314130628279097455693838651586439605442349457110817297986,1539999962673766253220309218673484705480381017851242601637339985149237513876,1960001473465056338053214630225310321197805185917979796673377456138736312724,2364244417182388947023383327471333474394147703933418992760716337795299321746,888305556555611802826042314615095565261871114088427155836442301838235843106,2918125290195260016645259723027032401046231858572615690204353554239716305676,199022709070440945914964062220343079083962921032484267903374975988828640233,2438260600791081672710920485092370023610628825886962665148753011415500487152,3408716337776968351937300857867516391569135209071778725681806177765465348840,2280153169249587433276361138617565278405251613780364178663195121218278223991,2624649890080207628149473827737906211447714318884570446710349922972820662804,2550848785617543533096236771704909732005738438278760701071814609926638758384,276017450994279420013475198109117181062103765829354683412293868338574265158,1954960735681572956379946371038491214737413617585693530350890452589942335180,1924048112699847455346042117012402529916899238376120405306114368186325398723,2235608004780543868856210022290605232515097097370535545447497456792084203069,1783284187309129252438776612226593741868198251106153222310587424741208331528,308536902780725996037191251716305412348586001755905323073326405316770895734,243806977981767576043568595162899137158107770191057054099726467539312113843,3315643682026124860529054279853664226833578102923749753825282594652038498586,0,2,512,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,2035046060,1673533984,528487248,1444855475,2018611630,1069157242,886397213,877206838,57712114,325994275,1693872289,585861290,1615474889,896433545,793663819,15,1933630517,1554609915,1741009935,1936079953,524433638,1343768550,2093652092,422106294,181646837,621184567,1775499602,423317004,999174343,462137093,1451478533,15,144268089,1380508113,1990182991,1960092490,145200131,1515399835,469463131,767744781,1431584649,1935356587,222316276,1671558089,939440711,1964866369,1203128433,15,286769905,909435909,1316859858,153770617,819097604,322838836,692511471,2131885376,852931333,1026499051,220625110,342791134,1058716881,142435433,158998600,15,500561678,289423840,77650977,815169921,659290476,699728863,273301475,1342894799,1690543322,1234625235,1505882185,2052708926,1360538044,1513488069,1397403557,15,1710074975,2107907843,432061613,1966421915,1329524204,1418215897,283219507,24182188,844746013,1808092953,1075384839,400580726,389617680,950560415,470928627,15,777754846,1682490540,1969162577,383929857,75884437,1964979454,517842116,599013378,1162802131,1556354380,1797299130,1140121124,1700454359,739100808,705729840,15,135796258,745533208,758744447,1628427404,651462089,159409009,1394416154,1877228108,103311633,1715746987,1447257068,1862505302,1584141430,1357119884,296885972,15,2014461525,1056113417,1898394114,1034093235,390921052,1315184763,923553076,1460543663,886684959,589774934,888066052,183969474,1858197278,1302757449,1839604086,15,1636903258,1944224258,1660907297,1147587899,753726103,1442945636,1360470354,366848713,1742663992,63717942,1281200124,1676313777,1083428973,576956898,380788384,15,43166196,1874928309,2004224990,787802733,1754785930,1134896829,8311526,873268368,1267844543,706279378,33705864,337631648,1927786408,82268290,1755230831,15,1777124505,1713731175,1252224610,1813291283,266415396,681743740,1782956220,1699635351,498768016,2025787978,1874018858,742682809,1868402868,622168962,741386457,15,1721789309,1074572217,1665636998,859989416,1119637513,1068779973,1816393127,2002951725,1181357498,1963091164,1958750017,1050033634,713853115,915076288,267414328,15,519500373,252153828,882978402,428312481,834165307,131342864,679132636,1494005920,1004825734,1444329374,1470252025,536968879,1820496699,859161950,1505648201,15,34537103,392970066,1432959287,1240377973,2057407429,1863145014,1720355916,1989006966,30719984,1340699215,669180637,1035097697,1925836380,1609840570,47660770,15,2035069534,1573577674,242852115,915903310,1001489977,1178045191,1705269466,395782521,1816609664,1188297062,724397253,2080201579,554980661,20947058,865319198,15,1401510960,2032087479,949013813,371886133,1064679632,1767750564,2018416655,1026544420,64383763,627067670,442445466,1268800663,807742151,1610831890,264495497,15,1115291009,1743937064,577684498,1518033591,2126753677,2062711641,1983065479,1381608741,120231065,1839740901,248808027,1581204300,986455164,2035320415,230417360,15,874555733,460647654,1312532767,1502267875,165911770,1744765280,330156396,1001398252,2092483978,1681515625,1275991348,1324104054,827788861,886022578,655824587,15,1675986226,2102156296,553469255,2001870124,1334961057,1395404887,2036602250,1794035900,1916235219,507830481,2132066132,1998289799,659058713,1479133953,1592601655,15,1199356672,515043,54351078,806223709,1041719984,1050221782,197893282,831407717,969992539,412175495,2050187394,1546316392,1483302330,2034253155,1793446153,15,2141786066,759002436,2049747584,2070778380,821574819,1154895658,1338595975,1632416054,196511992,361631863,1652508432,1712919706,1981179472,1913853580,1475087595,15,967290833,1487403049,1079649710,1322503803,1073222067,751572024,1582333683,658911250,2822954,21533368,630839519,871192577,1044848236,2023662065,544718506,15,2132642995,365092711,1569663358,1919783622,12138967,331969655,439543089,85902653,1288507473,166268938,2145399833,401900583,844626390,1377729106,2049146286,15,1606104714,1272218542,240102247,17224090,1439832480,1853289420,1357322055,1110778099,671923276,483051827,1713891755,364451799,1807115916,1683325361,1557180957,15,1458639783,2045754818,1637690387,1935510947,839233635,2128851375,151362131,892520874,566011629,656730299,1565550769,99154584,1301926835,1175458718,1866893114,15,1923887513,1023078392,1701443171,625720643,1126250008,305575253,916615841,191297343,853599526,163656684,1465644794,416473389,16746160,1634711798,1688990855,15,1861664414,576698484,97606745,603729724,203122674,1654840134,1628417824,1064167555,2100916482,1050193045,1187301383,830570681,708602886,1047468430,2102752648,15,1176037961,1395357132,1686854346,1217482242,2105491257,1385120001,122226069,15592219,1662537352,861155070,717511814,1992426598,711711474,1061260744,1427328733,15,686074973,1638793396,1766938990,370833923,1337560659,1444886909,567793905,1568070341,112584689,825986653,722257977,1350181582,1886583153,2081078484,132307202,15,1464904859,949113908,231314611,1551258869,187533406,1899901375,1307593521,981490517,1818143995,1482702574,1956788366,825926463,607050984,205719480,1461104092,15,1762990058,653352031,1290634677,2133976632,243521463,131791336,1427336325,261151025,2089975260,973089019,587189443,155031876,575120670,442578913,761949257,15,1743558700,935928565,576765958,347931709,1860384984,70404264,450406307,723805880,1554739528,1944943611,761127993,608693740,1331691540,934069503,674529805,15,1258015211,1025595885,198029764,183835358,1499384211,535626874,415475806,1907391918,1344986827,68065561,969141225,1514915728,559628634,485116041,585252412,15,670321835,223483247,778325727,1348961207,1108448527,1127282687,246416977,2127230011,1304434996,2009743613,127988539,884150677,889135545,689442578,894573195,15,1180772589,257220393,1432925229,1843823313,622109879,1946462432,1648827271,1396369197,1076187991,1650947029,417128242,486413391,1912000359,819661542,1023556450,15,1560812608,309325517,2127761126,260747339,1885611553,776123998,1360328384,346323336,903812381,2015837607,1961372533,1304424854,1535113856,1176719705,133456792,15,1581835640,297499819,235314061,523845842,1217050274,753676637,1514764438,77582969,1642726189,1653994739,1984376726,1750071933,1283036338,778718506,1741398228,15,1301876426,1225640688,1386018409,1149580041,222296474,1923704754,386575414,404234655,2134287988,1094618418,226889916,509346004,353269987,1564793250,1085058105,15,889000615,1306544134,1075244682,1457039965,840557006,1504576315,519391644,1481852633,1444336347,771096406,215584235,624411352,1155772571,573440237,686622777,15,1267079332,56497429,1854192055,521388327,288342775,341560087,617119843,1068826606,1070453825,1243896955,1990823301,518318385,690340131,763298613,1719274899,15,243765696,1992627963,382110104,165625530,1948955062,16183874,425628582,772573649,1390546528,1264000760,4307063,1963735037,1706844931,1037982757,341850726,15,734536386,700259740,174359607,2124652972,708150763,2110160320,567795550,1781531014,700823033,1973868183,1989486440,1006085288,425663272,1201996696,1444079015,15,1968418280,1350704156,781814976,11598346,1437734883,755476781,1483024865,350443946,1669633180,1255465817,1263272787,522212257,1979260086,1957398252,2005137794,15,232410569,1820349706,545331437,349812188,1834856468,1778649242,1217392445,2013551893,1560363945,552732523,1643830860,1463882296,364065059,868814861,1559445260,15,391490851,1182451668,502343864,1027398411,772425473,801898936,945511556,864055384,1925631263,911606439,1896543743,862295607,1699829724,44775851,1346629847,15,598406898,1917304630,161240945,868991813,446748499,2018847405,2077546570,1456043459,865878721,664644842,1593222630,447641559,1786357203,444161222,221695082,15,880363426,846035461,1439702837,432593615,662582442,1388651439,22956426,636614119,706129795,673966487,1413553608,503319935,1470753490,1586859459,72569793,15,367367501,832019024,1670947656,583207817,141423850,1310907704,1487005826,709833972,311820065,376644397,1599433464,376265302,607939685,399585594,639131072,15,1838479293,1257712961,322279336,1265005261,1306428082,1136033209,1112387676,978116310,1226504566,1553001965,564733983,326145275,1055222303,1284731277,875131243,15,879194867,775953857,48912157,620142427,379423418,366881343,35247503,205452813,670750194,496114909,796282123,1280842283,2131615798,684355955,1688945007,15,242864814,1660285952,184197976,1751881549,2147302503,656339881,1221054166,247054042,1686906646,419337798,1550508823,1633373910,1527252338,956878213,1654461036,15,252224148,922326757,1764878739,1020106069,974353368,1099526158,463614442,1607332384,1003871724,164244597,1353296190,749547843,1790281986,1926348090,1202142907,15,830898406,844637058,633686377,1288675819,1514495609,1708869350,920856826,441316631,1857786862,300380449,1636035281,1648143988,2029292917,748518630,1134847603,15,245543732,1327486232,1589201911,375043709,1826067695,844796338,350052220,1869921896,272155077,1391404192,1756500694,852947598,1308965742,1167005340,1692112846,15,1727967707,727970065,1713075197,946734370,1186665032,1641095972,1430347759,2085628754,638459026,2106539828,503063827,941230005,1716467533,1310843632,383579428,15,1193689069,207894679,236571619,919731995,787995210,1680470102,1325928856,71745513,1198639411,656304530,552122341,558620361,1839232327,522268382,857031921,15,2043010554,964539365,837234253,1431977044,493281984,836920886,200046438,808767218,920881018,1479660240,857010797,1854151913,1337986709,1190652415,454364240,15,317817333,693398906,711510830,1215513484,184681373,1488512741,495229195,671406182,389175398,1136941285,1238490427,1259581237,27475376,1376335198,1050194593,15,191398495,2062011112,1203147467,939487480,226781491,702251901,2020613228,1641929958,862184413,661902485,880693688,2090141998,862191634,2142693212,1800505166,15,403053688,842492608,1819644233,673043323,1565729062,1084797630,2045463652,527665819,153995522,1143450241,1856284504,414428373,1880753950,2004591955,951827979,15,935543886,1462486903,1148377075,637606464,528643926,796913714,597502616,1406708503,2069636095,572447241,1653346352,1931619561,1906723339,1695180319,937526849,15,883735340,2097842769,74611793,1047065369,2039794756,750903729,312015386,898359237,1523293490,2016158192,2121410971,605864094,61733172,1468675357,1451595677,15,1541736530,1281129748,1674892250,1919117028,1371118730,1921315290,638034189,664497562,639941571,46783203,999302338,290996718,1548267700,1268988875,442648555,15,1797400498,2009600367,1862482530,837840080,2070636938,161929341,1139982088,1754806242,1870215617,653254336,2002160379,236402518,1760756904,844410619,1155524371,15,127778890,1602426065,1175139555,1489254216,375616229,1204985675,454190406,1367534962,1481733311,1204125544,1200523623,1407330416,721225802,817910448,1303043499,15,729832465,1042161444,1898540774,2109254206,523883265,1594339410,1393859759,1888465925,1935826850,1485103819,1948762180,1566283014,533552352,361877569,258960293,15,796810059,1308625141,590417990,1463207944,221085342,950984081,1132504127,1797939852,865379205,41032677,2055747382,42889307,1621281300,303403280,2087702809,15,290646111,118244826,2105190708,1602579684,2129464932,387779572,1996887443,1578759868,74805283,436186362,1147547916,5028675,1542103460,673923083,1728507598,15,442297758,996581840,871588856,2009630969,7568206,34775371,866861580,891973337,513875335,544895523,593136305,1943870584,354921672,882322135,1057432197,15,224716103,462108333,1871476030,1191882946,1555698518,1766684903,2006029412,1584951769,1867539446,1119983792,116401341,1513756801,2018089536,1659006046,627691489,15,2067553622,29890683,2014690552,1097255469,516674275,389938809,64139918,844243336,1832863030,1643980506,1224737833,141457321,190900624,536092085,880560249,15,1147894843,1851990048,1502868668,2049260674,192396976,1502272809,17792724,207801839,338164612,886158261,384978470,1157917846,1972978396,1470708307,1638870211,15,1035088335,1057273071,1569715609,1392195528,2089235218,799176928,84560696,584652167,528227230,691328498,618239495,1199071906,1556085353,1436805729,961714654,15,1708658878,1572464619,1666122850,65530515,884957120,1600543171,1150753085,1189455989,192440231,1856040035,760122231,1094366928,1276494317,953030228,1161008339,15,734157948,843849194,244168796,140206231,1665908799,260660259,1348172915,1349950108,1644760947,1276126073,631182165,1011744042,2011144632,1956187700,1905794598,15,969410933,531557209,1559219367,1777348373,1240405989,2123072921,418675888,430263885,382677102,1955023254,2000181272,1287013358,1953520346,1017258923,653265166,15,1680138696,493051150,1093293147,233490615,952250860,1305891849,1979866775,484702390,248218407,737542416,1964619570,645577674,492396337,851422775,112985721,15,104898139,931643656,1818186321,1344518337,1988976815,888771201,2099282225,131923965,567185474,975242604,1777406540,1796523057,643789274,301455661,2065480332,15,982256960,180714642,1873109126,38089860,1034092420,633905020,760005035,1772903259,1519216637,372905174,668458149,2029608,1051620439,82881769,1985099223,15,1968218786,2023394484,1681645258,609520425,271613398,622954357,1544442189,1090660698,1646776071,635758488,333279665,681939090,1763320602,492123699,1717837041,15,370498835,1242353053,22094491,1845002596,1843595078,941279342,203001271,864498445,910395196,1324904755,893929499,586978823,2021740394,1864782974,228957616,15,1465257215,1299102668,1922873123,1880384187,39216238,1952526183,1947625659,840131173,1917627433,2024296126,1185241466,347133677,243471527,1206390479,1463421595,15,1343582575,1201623330,63402457,269471693,1917722713,617920127,984656026,147094146,881773054,403906404,1429928709,2020736588,243098823,73498345,182084924,15,1650707015,969219372,1250913035,876407439,1578020211,541417446,837783130,1993407893,1036028055,328124389,1777864549,748579265,1749584840,404063242,729878006,15,1883260016,1004017638,2060453205,1450206597,600869764,1614287825,179310774,1016677544,1603099454,531814286,1976628415,1696015985,14442388,1272491038,575439890,15,827022929,716540434,468889277,659050630,354067177,1410673918,805502703,1863708348,641654845,1467026885,1300174937,946167025,560585424,352883497,1891897849,15,758195323,47555834,1776106736,1071658825,1789390945,1692465011,160729572,1274303401,726536871,1099458888,2066437257,717967066,1495375736,1075358043,614316226,15,470410011,2144568288,1211876072,31105309,1679591353,775878901,125611491,1533703714,506504837,372277644,1107268111,1319679032,246268211,820579027,71719861,15,719661447,1338188495,275474958,967692648,1333603500,644717406,1253078098,1718522747,1555290820,2060652048,1784178547,1290941652,710280576,2034987475,1410586240,15,1193127303,1045870768,629650212,1256630841,1953081898,1374896822,1092938547,750514861,1704056784,512040956,1647601838,1914808138,2084194233,413433519,939454195,15,1569819221,1872073351,1475935007,1822918731,2060385725,566908769,1533625115,88931425,297017433,1641226455,1897516577,986550357,737896529,2005239970,1529689821,15,1702289936,393587398,125414957,463104944,1479135291,1646574404,1165211175,1497800458,636624635,872047724,2048262976,304848236,181513189,1392972356,165862326,15,1263697420,771087444,1641652759,359169910,150708236,1095720959,32660163,1358893518,1133803507,2142097212,532882002,1029826187,996408710,776141650,1132258811,15,111717325,1744736104,1242325527,1210776985,1300172606,1095924850,1637568350,1179432033,678909549,2087148051,1060582178,1851465980,219079722,2093542248,1787531202,15,435019457,985246992,1262592030,1891857268,839790708,604192462,1580678005,1511293905,979789344,1954058547,2038419594,119755129,762110042,1789386969,1912964747,15,412303070,1368519218,1812127410,1842257687,82472489,526882293,1721140638,152484314,1373701016,2064484478,1171707727,603338228,2078064571,592289628,9783530,15,1958171587,403050636,1775182461,1881054823,173059413,864567189,202505550,1710260557,447237681,1131090434,1499099259,320231325,2114823731,1576438211,349503690,15,1644296995,1352406264,1933835967,1061759570,1878656920,112941671,2076214859,1852118189,2071873865,988260921,1362170468,1461936484,1791435360,307066911,1554394434,15,786721045,341022383,1697589279,1684611508,510160757,1863929430,62743590,510536312,131414263,105948487,1490292935,1481660665,92321345,1955474310,172951410,15,807637554,544531010,777583676,1804077842,572016204,1382301609,1082660063,949797987,1202092324,334838981,724850514,295619588,192558426,705355773,1532333304,15,2132443237,1713378498,776357014,721357530,417640069,1162454207,1455651542,2021437125,1049379461,420276375,1830212263,1433593510,569578642,2000513842,566472883,15,1744465437,84931951,792706921,527655453,1590042136,1304941989,1981184193,1236691129,2099835334,1152263609,1456673641,107753072,1158171175,277043323,1335838259,15,1490283387,1694904023,378435491,2082147151,1747182214,147228627,955826084,952837781,164090228,1118076952,1617051480,2145636538,595913532,1339980503,667403707,15,949484305,1939566033,474566898,479151589,482288364,2142912405,1829023763,740844313,710143544,1488197730,2032288349,16425311,1572929877,538856306,1740643790,15,343259485,1941081391,234720134,1105347216,1100761433,1475774345,281158787,196103714,1679869102,2138236802,868548099,1528370114,153946539,1691718721,1175655322,15,37453161,106234641,124592700,855072096,929556233,690439150,572531819,544448623,1409053983,893965014,1705005018,1695763219,839807515,1594292093,733619193,15,760500827,2095543689,1623571143,192292943,1121678813,596220882,785172948,85613455,180742518,1024448740,569260874,1316369948,79178068,76466613,583486413,15,1902682102,230188139,1085423520,1462502603,1543312342,1621924345,933321606,1274763354,994481790,419136565,1378077342,2072835370,475962629,1155407537,1989120133,15,300898956,887315417,585596514,610652379,995092448,1441682142,1758396564,502088173,2091708133,1968964021,1185640623,249339708,1168004214,1939706492,537369568,15,1127002763,1319169875,714984908,817960007,2057626750,1391034282,952877307,2141187489,2090040638,1734411216,996822480,1958777787,845601461,434458399,1821078651,15,1804752380,1922866455,297700907,57938024,1297827770,1292379001,454144110,1374520193,434207394,2117406109,475504700,144139679,572331287,812134336,682129594,15,1459114688,1114978775,1821860270,846398327,1262176607,1114180302,207659218,1786579081,1394280390,921975526,1243189188,1372989008,161932792,98636429,1989237941,15,735926584,1562813328,1397733220,1789561226,1279152169,702654736,1566018708,746260237,269454534,1458363839,1141133722,1687406236,184722128,1745532685,1946364481,15,1973982825,394541206,349343748,265066232,1140684217,935203113,1283512839,109930466,42237662,1837181590,1451454868,753952439,1909737191,132733468,148337823,15,1527943685,1041152497,877083365,641765839,662150151,1172033485,1475849198,1211657871,888436659,1852950474,56613780,1771606366,2002966508,1254244367,751404605,15,1379766965,787799829,494331948,1989357629,785699628,1120609138,1729046159,1899393399,1610303188,917614121,435829703,812705221,1107450959,423646298,192503591,15,785884045,1293321147,1010446093,1083178897,1742485495,1596662218,1643874071,674482493,648268213,1687666010,1737194695,2051368181,598179389,1780388115,1022387884,15,1983702538,1737420800,420020750,108376128,1789890930,675825079,262752889,1860590949,516403135,13085372,1283292792,81008073,206734208,1919683141,764970761,15,361569917,1978534233,1450277604,1854322107,1111252073,941667788,1695747009,1666620536,1017305993,1583281192,660903987,88769463,274345612,2112280060,121435564,15,1701557497,1513935684,1821800498,1813835746,1661455157,1975174420,951088020,1697150357,128045337,1928497730,63493798,1785434462,1315436884,1260677283,1508396663,15,25022300,1036877329,1705537032,872597133,65287463,232668243,1234586351,721363551,940281563,1274378757,485603214,152823406,1025180325,655483141,1253865399,15,1459699878,898419324,1475645577,1981422285,1131340815,263299273,1582166150,212068068,942448185,1242091893,534701954,733336186,808945218,230491206,370484230,15,314114310,1577259011,1908861681,36182210,671766813,1011414265,1971800676,1125883777,1119466688,208742134,1857352571,541006964,1429505860,1321509721,998955576,15,85533490,114308954,1235981588,1748520402,2031860007,138980644,529052620,1229351192,1743205381,1856408639,1678844823,1148298264,913307552,355263983,1549399661,15,1741834872,392842535,543078414,1382022572,2010039473,250940325,2006613343,2005219004,758032498,158156388,2077526114,447335700,1494375366,1020311332,502502446,15,1946765677,1553924532,1870720456,364552537,1636217512,1017863345,362500131,394355159,1247476837,636503615,787095248,285971467,1605123379,1987366820,1406404624,15,1419460952,1227696183,1882624882,14413346,1883486827,412852305,507527052,1980655466,1800041530,1486653508,765720596,599548227,2057874310,637745120,987874140,15,482198014,2079017080,2071486068,1972969073,989820527,1492296370,834087060,2006664870,1073737687,1522968659,471417034,1373282802,1082005272,1670083571,2035836509,15,723241479,77531865,1724304994,1920154655,2098420188,1203157200,1017026386,663724385,1899173547,1281965660,257951698,77961249,1911967858,1669114031,272589904,15,370367842,1799694635,2094460944,2055814488,418800679,1710739777,477462401,1878003864,1869366234,988496796,1755739459,1776449731,1956186081,1028560780,1564419862,15,1482120890,17915384,1106204419,1352363121,178511970,12813425,1346123219,668289340,1184713440,1327634330,1877211645,983393944,1170566237,21727771,650202353,15,1559061201,2071701995,139118924,1949631247,154630104,2049416629,1280017357,731351232,649863624,1969363705,714370206,860048738,724144968,109891211,74590991,15,1803797798,171307306,1712272169,21761331,2030161825,1195234601,1912209658,637278772,1418696165,1731230063,681758211,1081167917,255310961,1128912522,534804498,15,1090239856,57194331,1808419813,296699086,183022351,858163828,1613324312,1253165958,5710811,2147160287,1066435855,1055068567,1417621211,285328752,1916075096,15,1432319933,1145002023,1601747931,265571139,2099259920,1011673971,2054170716,1394710903,1653097966,1706040244,656139108,212542773,1636632319,1617585131,1164284763,15,1848142973,180667075,1584839258,168727511,1321018208,1012222395,1634238973,988262265,1423787552,2041990159,1109918403,1464117907,1721143976,1743098570,502293820,15,1599536553,1043361607,1327028559,1112459437,2071572490,311754359,929818354,99201112,463360738,754200874,1583713901,403024180,680407760,163083565,235092133,15,445308003,859711394,1341342111,205934093,521755599,30876164,534514857,201559363,823649226,1302054807,394294341,1120408408,1794342470,493785062,450246207,15,1966333064,1285977366,505346616,1654850070,1438296077,148064149,224593643,606949602,1990760285,342992579,280248057,1211276847,1729675277,1669402328,26621060,15,1319473225,594209892,1079721657,900311821,755892673,1614026879,1909014241,353088692,57704929,1854548354,134356026,322352705,1376027740,823043079,927008355,15,1037754969,1257545846,977348948,1216195511,272260101,1609523244,90682837,987085170,643532377,507751347,1769267345,490608986,1246997241,667111152,565337956,15,173188030,2090558080,592719199,873204745,850754483,1425100239,480300008,1464737765,444348089,575928032,1388922192,496962119,992042975,226012614,2138436261,15,1433437223,1414811228,1086219182,1747366798,186632922,1803169805,723653682,2027756679,1663340323,421357889,1367713464,2047638704,1563523563,238964078,1198279683,15,1118493490,224570979,1467461830,807854730,843610357,1077105529,293261908,135055919,2065128667,343183407,297825185,814312573,2034541083,626813700,453117634,15,727255590,527578500,136902296,1848277648,44223750,1432250688,506862434,1117288942,1464687754,1096950406,1537475918,646336222,342040136,579426257,384244400,15,962854942,825169605,1550021005,298247489,1708303476,285022898,374207951,1527686660,188210711,1422352968,1742089645,452027218,1649707366,212721698,423290760,15,1487413788,1300794258,145702970,333983510,529741366,2091928132,1396930802,855602821,940090936,824412556,1120281301,1005441700,1527351054,1417575436,438014267,15,437198449,2099709485,1093957865,798753919,750467490,398059453,1156409313,1233931174,1456371979,2132431754,280740255,54908429,838731627,1283107303,759364614,15,947905664,132717223,2019537651,1686054002,1137461435,764392982,1533166924,1729608573,432309399,1396907760,1200528173,1306009356,283252397,831265291,704237132,15,1429584722,1275819294,1467351152,1231951701,925630400,498070756,1609222322,185484698,1454763813,435786276,1641162181,1849460027,1295644060,1265797550,741737030,15,739534215,439804962,179259841,244227196,735367593,2118277597,41760304,1163945163,1524160625,1569269721,52822434,489273324,1814868375,1383424167,1284682178,15,2100443995,1678168471,1218490683,247690498,306348048,1262599475,557952155,1792084277,1098026153,1922387624,560539708,1579808864,576620601,757157142,1339105515,15,1013257420,70924452,721766137,1417464150,993582487,1185891859,2076386054,1249875574,475888536,1747979170,1909045048,1734513609,386855236,2063496950,1729727036,15,870216024,1741004204,1047709007,1299374834,1823716439,1802686459,329517409,1565536818,1274819122,1447223806,424243496,956136810,724164125,2045964509,1997426784,15,2025933530,1129612665,577474727,796049368,2016879667,1194061805,282817988,664245628,1029346090,1805238988,584918683,1751328731,599036810,1111494131,90507822,15,1849109579,1938050243,297075346,840443493,1199207053,307656420,2117629811,1484070467,473329783,1054099120,1303238701,798529512,1462925028,1442570852,1835806389,15,317740311,2001607301,2005444075,190931525,1510652809,169158453,321458361,654968750,773756700,2032676610,1215647982,1481586525,214298844,792233746,1358889389,15,1996951793,1026316964,838798449,1839994546,418129531,1279873398,1374295830,484218805,1001178656,425849790,482862981,494160872,1511564492,344080609,2031816055,15,693546821,1811603389,1317034351,1068025057,2068508889,863863166,788756150,1672647624,24528728,973840342,214891810,2129407922,616126311,903862528,1449235845,15,517023196,1905645119,7107699,599825013,397643007,1830222400,985704016,857908218,1028721246,1040022139,2093887869,1263948544,1533050734,1264644814,1560799296,15,1514033754,49033308,1325891040,295582163,613516021,1685215203,1027079795,2012825111,1627737538,2097656050,748587159,208547609,1258672787,19952343,578854296,15,2103931685,1347285470,118849075,339224111,1285718617,1725928220,1608662354,500403853,1627466644,1106182571,1030867558,401625991,377319717,1866773995,1049605716,15,710941205,280082930,17111482,2052620935,1683428327,1694113493,1285661152,1261288593,964645901,433034859,636041401,344791588,1606535730,45254842,2003414515,15,1381935260,784825372,1546149697,1080798506,2083442389,375101582,1799051995,1543453061,416729371,1643748034,27349854,298211300,1960101518,1505448249,1164359489,15,817536005,18782806,2029033891,552642356,1712836249,1913420488,1114862555,1432703085,1799889566,366871156,1079588862,1972563752,711732605,76900975,797693550,15,864837102,354688335,2140884279,2023704197,1900974342,807664974,1077164202,1518682999,651107484,188236397,880773045,2083291560,660406736,1103847529,1720280407,15,1933292300,316057270,1972860255,1936464822,1841098137,1044051662,1818100508,1289206184,1610230830,194881598,1528067428,30819437,1992326451,484573672,353137086,15,1245724175,153298519,209839616,1291809801,1705471281,1875380116,1911801374,1834432874,1772830243,1346941978,583309333,1719856190,1288865593,1701372568,115000985,15,711652159,1674657612,669062487,564869744,772818642,1576160762,864432360,645384419,1297583040,1480622806,1439847654,637374464,1141040572,1774964288,2117009457,15,2105488101,860220279,1573605883,1237981369,1467519084,659727251,618599394,122679373,902457463,2102140979,1502712232,1768920043,1090007179,1540084759,1636499001,15,903283182,1658675952,1114141250,1251740583,966119020,1528625344,1490779262,1484295517,1933414511,1893144403,1770100524,2094445984,1396570212,787803424,1375466063,15,800398010,1489044011,406690984,1126175602,513522843,704908874,1175021039,2089470789,1009563659,2074941455,733323607,1886283372,1323676804,1584080779,242186247,15,1343794283,916937570,1568786471,1939175822,1736923642,573117001,179401165,791016876,1115130981,193922603,1593469747,1118716019,2100638600,670133067,1567794934,15,308278815,1545608112,1258611997,2026989075,875572535,535581633,34551098,2110723761,1966362099,1577812632,766284746,1370142397,633324725,1230772324,1955627509,15,376268669,1683825754,1866877932,145330232,20029331,1418137403,1255747514,1278135977,1066242784,1862699092,1082470092,1280563592,314495273,456369345,1222473827,15,392377467,940013732,845788954,1572040234,59773519,1868917858,242734960,851493612,1189005932,2137541930,545258801,919311548,797605618,387947057,878835414,15,486747407,172116394,1175968474,1584273389,173026547,2009492505,550924928,1717189821,84292052,1028446138,1407917263,1190312199,863006179,1781999281,502920143,15,488882855,549428547,1508226947,467730858,430825943,1154573701,1997077920,1133327112,224402202,1373516774,355653238,458338275,1391911317,1558039380,204754838,15,113398594,74512923,1300881917,1814168181,1799878617,909032865,1389672361,1434212334,1477028171,752008295,1624516393,704209934,2030884627,9634560,157094005,15,1924430615,1603897573,1350667288,1618814306,1139033578,1600644770,1810018104,1461166633,348261768,1892391351,643087767,117191056,2064321583,248888547,235180310,15,1730631669,115026205,1278705186,890607679,202056752,299109422,1450308316,940208127,296004854,2115400609,1184632088,849197802,845003675,1499356128,1204714427,15,1563262708,68647395,778648135,1143058586,426934829,1158170443,760845574,250187245,1600423617,74143209,1286546543,1810110157,1866281252,1335871861,1240729224,15,291751967,1114155105,59754853,2002798137,339150783,1100692112,978142563,453048109,1816242608,280822136,1546705537,1351383789,238040465,968299479,342702121,15,1535059847,1046581780,277682757,45834436,685677444,446245322,673351485,1540759744,962575680,719428230,1291629666,847391494,2070820292,1754075316,184848364,15,1345261384,83563150,1536214553,1458487332,598534493,915917502,421775918,587797789,2094101424,2065147841,394417209,1525418643,1419341007,2036443369,675203260,15,971030221,2005093668,221900470,1651218821,2042667369,2136005521,1858352083,1167329904,1422211313,317461912,590722775,1006885276,871482028,1555329403,1127681966,15,1071659438,1208694461,1631579816,781735604,1481924626,2133771047,186470159,934921505,778212394,348236662,1163062383,405862247,1669032863,1220338777,1756733787,15,1511235944,1954293436,1781809502,267811979,1694363298,1431193408,1802511542,1175635990,1655917944,765290362,1178258905,1718747995,1177910521,537136672,772997196,15,1029805046,1940057139,1024757643,134944617,623884356,87424083,1536080563,454274397,796376587,1474515498,1262459383,905421840,481203561,281375118,1405613219,15,229210898,1340389031,1279210566,848001359,1178502251,1323517800,323940920,1951429414,1788155524,1253185599,1150303376,1864972863,18721540,167570550,935438787,15,1932923263,1667726504,889225460,2076675872,1569419273,246754180,664227085,711914854,507012603,1179209546,1762845035,118481562,113728817,829681756,1815960876,15,886141001,124611269,192138900,1925355542,1396155053,220116521,703578195,1162692838,2114531698,1225366168,1322271016,755278504,1096057804,648121907,1577356471,15,1980376993,1715768691,1886012332,66736903,1034723577,310644653,1237944585,504312756,1350742738,81127148,783488763,1051418090,1877684680,1221191773,1413149090,15,1340687354,901349337,2145744391,1998765694,104766490,1067642855,864194922,1515320428,1840047485,1711027104,1284594009,1838461417,729952602,1917670591,1188954791,15,726838044,1291081356,1070804559,618354570,477840406,1111330241,1051438947,2032247694,1955511299,1416177028,152473043,1215946775,1392016295,1223499154,353024805,15,1895574087,1472889746,1552551247,438467158,139523802,1168098658,151585861,403293857,1873042933,316823046,530156216,1981628875,1552912584,1587895789,779473132,15,688831662,621418229,1489604453,888053769,707108798,530172961,1661038193,68535913,1325344568,1781964668,1640344889,366733280,355768273,98669605,996520715,15,832995827,183339531,1844354163,189764940,846005033,1612746027,566393579,1398348004,1791681860,1259459092,1568130505,999607539,1247656866,1749013719,1222806397,15,439883115,1093762251,722936091,319843730,469023869,63661774,992623016,687187607,1532562936,143999383,1554603656,293535217,572319414,712082994,486733028,15,1888105893,1139378753,714690853,1689242783,1216836029,1448667784,22128127,897945729,1063660496,737601226,2124563117,962243564,1673731537,466679556,660815303,15,513123115,601280304,849061923,1599643044,937279790,2062502572,1736515418,1607352820,1115568816,478763981,728568056,1711413022,2067129678,580116424,949287372,15,1820383150,281024083,1427807105,136752844,75890322,1206850188,1244691067,1635123763,2098833112,136455055,279758375,69344775,532174625,719403329,2016951895,15,2131667499,290453028,193841943,567953409,505524579,1172076083,1568975187,1644111196,1388341901,1542397649,1034610677,1464797541,697956588,519282239,1153571003,15,755658537,471492991,1015088403,416967301,1092424345,938278151,1818737056,1681953985,1208056351,1477877131,71669071,371710207,358286845,448182208,1426435808,15,2014141025,2030866882,87027335,5525317,1430133395,1200221512,1432300449,510420506,299777687,918737226,1097130280,1101722882,172863495,647898050,1675848301,15,1176215547,1473339991,1090824059,1610254056,292214256,431668060,842890578,1082961854,1435789806,1284582592,1249534914,14911353,1851336636,1047666185,217041040,15,1202033974,2015193525,221623502,1435420554,1724921967,1755117516,141893933,1206432845,444070100,557682406,1546901390,2120695710,255930724,1585648524,1426369389,15,1769323585,1625867153,2057129634,92506936,950845412,1178879311,868857112,1344199329,997283536,1520044557,637827067,1011207180,1867891153,182113766,1321732053,15,322824555,1199508589,1252338731,512618825,1638759963,1777829973,1547945172,397351753,2122292278,2079883921,94101856,1590341514,1524787134,1720549615,1752887805,15,1419787563,595048689,388150688,39512379,34017774,1206862317,142206442,1983033227,1380262286,2002454277,1744062747,86316501,1625650207,809576155,554869574,15,1450957718,44378908,458262656,1260027393,734139980,2116693905,2007560811,991628034,22039020,768732287,1840614662,684594967,1456444324,594088325,1429135773,15,442627090,2062022490,1321054640,978561283,1030423110,1658278462,634249933,1456842760,1332965695,270206935,924248463,2077915279,1339790393,1850819164,1757566847,15,361774695,1045890834,790448795,34651898,181371172,768345422,1500004098,1135051325,1134883481,8228372,39730726,2144043420,204489413,257953602,388885236,15,249549630,580752582,762712705,2005547909,803527402,1500687463,1008758598,365078499,1801507157,1308491606,1956071547,436416759,728087768,1119397167,948980333,15,1342319074,573379812,1422753153,854027279,1392972431,1029478317,297202708,1793012847,1262132363,1484434836,318248914,1199924896,7991687,355452314,1875835876,15,2131164104,47086761,1044726776,1951530546,470567927,2140652290,842068154,216587861,584211784,1502236887,2095595899,1964692801,1857458038,1785477451,550654206,15,1332703328,1892856598,1849335734,247110996,754135130,1466722492,1240988698,325182050,307746508,1370225515,1721351919,702969217,559766031,943967125,5875997,15,1796787969,1584560892,238223202,1523488170,2103155461,1619090440,986966953,636121806,2011183115,464597686,796291260,1439190417,1356488938,620200004,1078447228,15,399296893,2121225031,2133109331,522307432,534388222,1566007671,99753024,930278821,908232443,1787052991,638752468,939866690,1555512876,411625038,1757421429,15,252911519,114188233,686007769,1630392485,1703693970,150921157,1723580182,796602702,835954848,579112068,1344542850,487583679,1782521658,1848660153,998304771,15,401078230,1546963145,565982890,1316304390,1190832375,460047089,801938955,836634458,159313619,2130612186,665082372,926009148,32622734,1697765324,2072435653,15,1861042086,312474821,264550812,1362931046,1567543199,1686808996,2140611898,1511878248,275504943,49410225,1144795728,341574399,1076705418,102860626,2145948381,15,1720045456,1763558569,1817221408,1441915002,1814909371,1215852643,746096464,916476782,1665521870,813512705,4686674,453446065,179926264,854992386,1520279899,15,1449842447,1888117094,429041625,1196278803,1197223826,1797910439,1494210308,74307918,1145181259,1197014030,1047776980,458596158,799763751,55436922,257963446,15,395222970,1831594223,1266912947,1591400092,237477828,1700989847,843502236,43481671,894409397,26436657,1614001785,444309718,1172469020,1838474322,1989642400,15,775027934,801650825,1765803881,242449345,1997628481,1812498154,392055570,853402847,528022590,2034999669,951439210,981572615,1889426581,326745901,651013497,15,1856869811,1141382348,1929725835,43105638,258459800,1961918865,101417318,1239539452,1525573459,1551472658,1056473420,329335319,930431892,124775596,645260840,15,831474967,178102741,1928370855,1658300673,2033949850,894285358,1235177438,1264981107,1544242404,2027521649,332140968,1065524199,1032529325,1286404646,517355601,15,264908199,577938221,704198096,6310660,826600975,1564679104,228911038,1353547458,910130139,1594892023,974606505,195230096,170783892,1835511847,825296929,15,1603335477,1095989266,225362713,940929930,1572652031,1142428196,8659560,1932064786,1325550660,1549523892,502528750,1276799519,1427006821,1607668282,1686744242,15,2020603199,945527206,2038250794,242880785,642185230,1151067272,506386833,1759061373,1654880436,1781744067,847299128,1996379120,287256380,311949994,247152968,15,2008895901,719897799,1467388076,714545497,1344014195,112387049,1529249892,1606037090,1812284602,1492422926,1102552904,1939287411,247837851,183293369,225988557,15,2097311417,797074072,1468574895,457834548,190132120,1767152146,213666394,1988568500,1031746290,1615508577,1179528361,9766860,627386777,1474835109,1180859061,15,995393327,1539126844,1149416143,1375044406,1265286562,566374316,1313840319,1633876287,144959819,611267381,1464273735,1006521292,918809348,1314683790,267329437,15,1448337280,1951281823,1048556140,937745777,71030605,459049642,1397914566,2071992853,107708953,2098922504,1995493839,335569652,767286690,775564139,1547115509,15,696613414,1398345464,1227337084,1382652861,1335307301,1538517124,1119073385,215147236,351121006,1263604908,1390288318,1571291365,283153038,1865291572,192368362,15,2041531817,90313794,1062312901,595162146,1128712528,1938229677,1755530651,730269374,848074800,1821043498,990157106,1547967774,349435849,1801417146,732029693,15,242896770,167172201,1929478243,1455152090,1552620153,1701534984,205206966,1844480362,607245158,279081863,273011193,1621113319,1291218536,1096298067,1658026196,15,282371093,541378598,1601782058,2133004538,1889548955,1073662549,877384513,1039480279,1826972971,2084226204,1766273838,499044620,1447138150,660506659,651171542,15,263534614,281498227,413355100,2117175170,75082971,1280933710,1759103542,1572336539,979990351,1997855534,1950364591,67314023,1128707320,1700270842,421794734,15,1486547039,1451199326,536640455,2133966121,1611370677,1787351164,465280869,618077756,544168730,1200780447,1730855748,2144958883,2615540,763444536,1063775049,15,185272574,1696828792,83693944,1297208752,1036229376,172715175,1297444227,1465866676,1742877936,615435846,456470135,1959392038,1199031682,434154416,1918197751,15,796098775,1505394451,24109510,1646540384,2070876102,210797544,184534664,1464853638,1216313310,1905399191,517513911,1132076188,339868673,1793796777,1297162345,15,2023767396,42923696,891465695,314613215,2014602268,2052663304,486723387,228353395,416838515,2119439039,822422373,1943746908,1909577914,1352196303,1658870672,15,771942417,306515985,513210296,78675846,450104758,2100253707,1359998757,1293748641,1577663561,1192364325,2102188059,1189258910,30504044,653491660,555725438,15,2014877492,1884454441,1081732154,1312677469,500971591,1537854073,243147557,1656513319,1738582395,931711352,1035652428,696824838,641167354,1726082505,1057710258,15,1020470153,44820618,1584101466,1741105724,199453222,1304237319,1570471249,263909900,881912453,1441264016,64379677,1494287978,329844851,1196605656,212241075,15,1090109072,40235247,1552707626,434582601,1759513985,1244668175,4184125,197135342,811504662,914205034,929800,1090859982,416213715,1964581173,417530085,15,1539544737,434090944,981538276,592415967,470360820,797712741,738554094,562602992,1293668074,388233748,207148151,1664164911,625364480,1797492816,817035160,15,1559633220,1362320503,1629820639,2009217204,660919150,1353260195,870983675,2101828044,1352897641,2017141501,321954819,342260070,483717166,895455639,1451050988,15,984106794,154181400,1996483701,2031842296,1010115785,1199458265,1506728647,972372271,1779716257,44467147,2064080579,926179422,2123066451,1369796324,851459314,15,652865667,701725431,525065489,1850948509,661084696,1552463783,1785544082,391439778,586820882,829263157,1305622468,1224729092,1019982235,1774628845,488019888,15,331925272,1761078764,2011527687,1811014647,885469147,449522203,55312975,1771774424,363223066,138679682,282681398,599666236,1237134840,1125733288,1803958721,15,748465217,1394722010,2034368128,757631372,182709355,1714043190,527689784,785089046,320370775,955884199,396071707,2029058256,2049168620,1031288462,728473539,15,2029024871,776127968,1407245356,1935624018,1876651580,54870869,50651414,2061981465,746428112,1314746779,1797356151,1943864065,208882748,2059111269,61718479,15,2103372414,1766510044,726873859,638560300,1489859037,254737465,1276312683,482624268,598693233,1805494777,1345183840,1928931582,318102103,1203124496,1181826641,15,532121164,793483965,482804464,1034328385,976837343,1697948699,655334191,1935882526,1342045613,1900795854,236115270,599993846,503671705,587960508,3145767,15,1612016241,1635286808,1034729659,549032131,1924959506,1306630590,260694813,653219535,1954118885,1725207263,1317990049,1881946913,53313892,2020221673,495405124,15,734302290,1851777865,870860781,2036415456,519733625,711390579,1816924002,1966098611,867592769,955048784,990854739,1272395839,234966300,51592316,1187559960,15,980104236,439095695,10193639,609602926,770436439,1952024746,1003185230,1146187795,832729664,2096923913,1171803106,1530132840,2078835064,1130352997,1720534528,15,1418182931,1662038109,1374687866,1599845105,2061316013,1716039145,1962345318,1736045088,1445595222,1289667607,125055982,1040169189,314466276,1412097291,901891236,15,1688677789,927439992,1789896874,1017862803,2132417364,777997965,749965291,375889095,1361425407,863070471,1513727195,692928656,2107420749,158369649,727334097,15,1443047699,1050289353,402936388,1883744832,1288357811,395151661,1127610502,729330561,1105378601,1617258558,1980451316,728421329,1378357910,1772878556,2105861018,15,39506075,1842884412,727420042,353408246,307191133,1466628266,374018749,1248321020,295975776,1541105188,222802029,607233622,1143170380,1125209147,1909331642,15,653081217,1557998455,1936259744,1361492966,1649625333,1846380326,101549145,2047008270,481834858,152897660,2044883723,1361982486,1840365455,1381119136,2031188368,15,953783701,677274755,1840896048,197439918,795765748,1454769361,1684243601,1503227871,1586465868,84063217,597060021,130075480,1872718377,1025020022,2125657316,15,530050500,2112288997,1246327409,292207840,1709650412,872136071,830992032,1815610635,744943525,89938737,483132222,1034015320,1069589350,529251470,932835014,15,1948388830,1498641730,550489991,857120297,1742347144,36408787,742693829,1543971354,79652810,1501513135,1765928506,1592302819,5011282,369798132,1069329272,15,312348089,2023406713,924872897,1125913588,967291961,1602762878,1534415376,2055776664,9139638,1303799312,938328661,891101796,1016339863,1069966539,266629806,15,543423372,2045001827,2056432901,19086835,26095009,1873650393,1978259638,875947834,1814422403,124543239,1585196759,978400032,1560276225,1986076868,605894999,15,727399190,1874098304,1853501006,497640671,400643113,2016651965,348931178,754201690,809039926,2048563633,1118678958,1280293871,966061058,1689368750,2083033448,15,991877356,1892899384,109257972,2065874433,420747921,1349490124,432476103,987656504,726050308,286410487,2017933197,423550563,2142748926,1720806388,1075900551,15,1975545849,334082562,77718410,1565163953,915823278,2051371461,756532357,2095248402,933935795,1388255019,1469645862,784133184,1645810855,1910816777,259578926,15,581990848,1739439253,1291733369,1776759679,1542212875,561654548,1572237536,590177738,1682932719,1474554593,294008677,374569215,226363917,1955188526,451292510,15,896854,739898929,1121016496,725257263,1439656545,486646856,1020389822,928469001,1950535068,2120707786,1680459511,1768762755,753371100,1106951627,796438780,15,222459323,428622746,1788703043,1967349812,1996436862,284094137,1119510959,1912980927,1525907685,1658992929,340231758,2064131897,358024739,348612768,456891979,15,1152701870,367499114,294366945,1666909816,1498847688,992219989,1076295553,412535171,1464906684,607355094,1082409363,683290474,528917904,334953110,8570524,15,1118190052,322150693,310509664,1702347456,1605281291,840831691,1022317334,365074951,406729006,216837641,1019892902,1315813483,1749484857,1664805341,142556982,15,980466494,1335829190,284514170,670055537,1289603082,174437042,1260071945,291773632,552022948,339617590,1742522468,1266151585,90961458,978216151,2080407474,15,2122516864,263859468,886724665,1364482032,208949436,624476236,1039113998,1208584211,1081454337,1280561430,923585349,261580151,868828816,1065168573,570619239,15,1147778387,1587797241,1169422260,1626389588,1250695886,1317383409,619207109,1486612486,430834622,1450978261,1725564077,909953457,5784798,1537803549,529406429,15,763492957,47023934,1744992118,515480402,2130905547,1150394549,1442179158,1393523431,90181297,340931654,868491134,1047590058,895685358,1247625664,907154419,15,2075164741,1874163876,529430141,1378230853,67736213,857209265,615700463,1222694738,1979615745,1186232117,1538086485,378035578,1464004621,969854116,301028143,15,1987893806,839837604,1704231130,2007743839,188522958,1628187026,1771978487,929007512,1759302250,1875549014,228680540,248220228,1497282347,1305386392,1868678299,15,1803520992,1503331104,1515736847,1421866215,755604079,1921484690,2058664064,1231177483,2143411808,1687231058,1799802481,1045913821,217820837,509878424,2057338286,15,47254975,192156174,488939695,1243594752,350537415,214962762,1580143148,964914059,579989714,2034397464,2105431739,1437285825,405790398,267379413,2119490783,15,1754347988,1297422414,1250465624,1808236808,283627867,2116491475,1729024659,147324867,1693353289,1795284944,1525208823,468496059,12912167,126843714,1005574196,15,343856773,45059335,1605166010,756759978,815747485,799144535,1821676152,1316803445,1226375651,1588171478,322561835,1547404790,594458767,438991723,1308451065,15,2145935751,1939155941,527027774,45186998,732295583,784340680,1522234693,441959778,236701316,1589267125,293488315,740748076,1507604521,1706298491,559403823,15,1171071698,509439016,883349724,571445483,1881185489,373811543,1301993498,1368415136,1190682252,1319796948,1187698893,1667099375,1086800082,1197941936,567457897,15,2073664361,1963081971,80059747,988243565,1201133980,1498957754,1452928421,392780023,214452216,940185109,1887598450,676396216,143872547,1309784664,1746757282,15,2092939401,893767111,52703430,374016091,1840079025,568271694,1099330255,288946583,354675768,1114607474,1193365252,525448880,1631281750,327187192,2055666714,15,276542711,39208011,520804128,935040259,8645366,218095071,1075329117,1522986053,387378914,950981164,1528116092,1276440225,627802334,985936387,533783934,15,1221635726,977590483,264462124,242916615,1011043586,479008544,1812300471,266858573,1710099993,838650395,2034007443,1473414004,257956055,1995707521,1221283278,15,1202961400,928966998,1871338269,100422768,1126111305,171926796,400951886,638612343,281481796,235418772,2028193658,1307833436,1907011102,1471383863,1702453673,15,1818086927,359055154,289358658,635882202,99185771,1347319272,915743921,1353890818,2043463977,1689232978,545230836,2018588029,519645734,1816185372,555768697,15,921623916,1584050314,1963834912,2006685194,784879871,546239043,1071885911,763541898,661842420,271688339,199328713,1955152285,1083534544,92143382,1490746400,15,827940588,1415480045,698744954,390278946,1892536461,204107464,1692704803,1507483580,2096124753,871997480,341351335,449786146,399120271,1862403397,1634381537,15,528084071,338609285,1108296758,1532287745,946535321,522165481,669230552,1672974071,390959555,793453150,834085771,1568628782,1364050623,1715508408,1369883020,15,199816195,1195709286,919214999,268209523,519448989,176315689,293241927,1728555117,1403125252,785680757,1543486457,1237627001,130664852,526910695,504526708,15,578577153,950998977,779600111,169267191,1555878650,1569298557,57413503,33106004,1890250216,1214698935,2095188395,1756174410,662852757,1938449483,1250665531,15,48571475,1409665233,1297530365,1372795314,1805226557,1681402445,1466143029,1057504859,319780872,364099449,710982988,620742750,552974740,287754730,109855535,15,1932729709,1450168519,583341272,795100186,708358060,1327014802,1306875193,898271734,1348385090,2096865657,73689303,852665109,2063166263,1404599458,53352620,15,1182220407,620387138,673216634,435079737,1520228603,645523095,1378616341,981752763,1095288364,44941955,392644569,1343362506,185514917,1896566012,1542357024,15,924103149,40737953,231201288,2073712202,1314503502,1030492397,223446136,796077464,847904039,1583890085,1166282976,1422962952,1110061093,1021331220,1386717513,15,1677010215,312184483,2010352408,313911276,1979581938,1733885200,800013476,2061668941,1862150146,709717293,213518463,139609465,729996424,495415099,1762251110,15,797078385,1322153286,2118862215,334173557,1211229344,1027127432,215845081,1431184074,548032806,346286502,436430756,2111252591,1998660719,2055014520,1138541348,15,1600386102,29981074,1728106105,1395691098,1740113916,1760025522,744787037,579361727,1156722479,126113786,1463519627,975473144,1213084252,730355454,55715947,15,36744814,156203061,648062778,1540484893,548116408,1710552501,1625749989,1527721972,971411128,124209452,1215377324,373066963,1078596111,828810798,11562644,15,8529961,75357874,1115249515,936651859,209643177,1612305285,113419280,596771647,1028555761,1159633782,1676800458,2124814580,957552687,279330137,350681547,15,1721248436,1801189038,672132441,1886900255,1871969752,2135677473,712056094,1317190514,4129850,740855864,548151371,246375247,1136234319,938512256,1386841893,15,603933445,1449616631,1437857514,1964487179,2046980787,1428863494,808581747,460308923,260591040,19641670,1442860164,1090112026,942287162,1887386047,702052095,15,1385825214,758540260,1283922834,72462574,1887774815,1138180219,1900266167,1803675846,1931009480,1068875434,271249810,163028710,992588339,91370051,500476773,15,714235243,972718205,710336065,1547868579,1914655699,1524397819,975758058,1789280217,551403788,989045886,637385094,412997569,1441882829,605054541,249395038,15,966991682,1863936645,1490772834,1844281737,634093341,2071711469,1388750218,2107003197,1762901510,614128106,465058867,460665490,308042744,551748564,147466131,15,460543845,723993228,1052296507,1140304417,549159248,2055110142,2084573894,1218327200,411562871,598145806,73095667,317802547,1254402955,1062097477,1965450887,15,696459709,937910786,359335686,126947571,675927010,1697100761,87003344,965162653,1781915842,344474592,1122137613,1253932544,2042812588,1356960623,1101789708,15,574049760,1536607490,1686495308,1465875219,858749998,492409907,1535557134,1545321888,2019206507,1572037658,1916988429,345813891,1102330547,564737107,1017907984,15,236105738,1054253042,1369429819,310864751,1280574006,1025021900,2031944896,1822884195,1337811042,2088420481,1767157170,579640132,1384335540,1189198559,1502323307,15,1758699943,538218885,1849073125,1636611616,829047711,383431895,1715002237,1680205432,59006761,1547060392,180870759,43550549,530337277,705044200,1397084093,15,59714283,373077799,224937523,439585961,2022349991,128493299,2044761160,1131936775,1175464185,770107248,1982239911,1713558672,228049121,490091315,1280655181,15,19777694,400426984,974856188,294813928,1005242943,1382605165,1068245639,315486063,180562477,497075836,603624075,1066982929,1105274834,1010436685,2093331648,15,82769799,1513695334,1097102678,237888277,2006141975,555936981,1804209642,652269402,520629969,1954892782,1215925669,1437156313,68277735,2020176989,1803121074,15,422810954,426174417,1312697805,327664415,953163931,1517325823,1510405722,67192125,1857608673,479872406,389788788,1504811800,1798639512,936102736,676046666,15,908491415,1629623297,1357466180,1293475281,1307932878,1594781435,387135856,636296879,1237159933,1718180163,2143112378,2039167316,2085241578,347680990,978604514,15,1600731572,1485020253,1659586102,755306683,331539648,689304446,1083663528,1384028259,1932783886,2079962451,1317540978,91920845,1597803220,29907578,704733936,15,320983001,1863892292,1248439467,870234693,525259915,1453826780,557390336,1319883985,497898186,40968693,877094005,2072068794,584097428,1341377395,1841622446,15,1892268823,805654533,1754595386,2144983038,450141917,647065548,1546679799,166535619,270980807,2017348538,1011434062,208007925,1020745004,73421113,1435560013,15,765348252,1672241797,525279843,1999495290,635706475,165091511,1021048083,57261679,437172954,893831659,1538477155,1008611118,1301320065,1311913432,1893585274,15,1833650166,157953925,1330103226,865094372,242395876,2130832395,292675284,1479400476,631527213,1204984064,1728335261,1567676587,163724423,2035546572,20107012,15,1192891020,1483853882,811864286,1739991477,1430198915,2025407639,629001717,669557386,392680092,153547757,1228930459,798292954,1375783126,24230588,340803559,15,503714661,573722987,1820100144,1803253314,1104753281,980713169,2066327910,1763085938,483243477,1967017569,1141506587,1288451159,1403978234,216141674,1999152512,15,889911757,1336277517,173900846,195517613,692421224,65603096,1089830938,1349336809,417270246,1559520326,1668516335,874005935,4400990,2018329769,1450087217,15,1991522275,1751499414,953769984,1029088415,624424098,295834245,853967094,1409343913,1720741005,1975601431,1752069628,677252167,971364593,264661005,1748104720,15,1021634262,2110652261,1191931421,1582312113,1734618830,533545923,756342492,223735345,1885446580,1088782744,929184942,296218175,462868301,498150188,1907691890,15,104304041,1032196423,1317243594,1699899711,117049628,723022902,1788337445,1410285915,1751406049,187556152,769211379,304550410,1158110090,973507581,1189516273,15,1487656034,519585683,761287630,1249572874,611178331,1247454456,801132982,874911362,2034532831,1587796,1148180285,19844532,1217989861,1274244079,798228865,15,477556413,1415951637,269851595,1270905073,663570494,2094133027,1929910749,2127035068,2030327676,1878082815,1453236603,1356841740,1669774610,855998691,2112671995,15,1336634089,1986147977,740527491,288480726,1306691996,1154443781,1942349931,1237648623,254282383,1391788994,1878824419,903077433,1059398958,2007790999,905771511,15,1424370450,1743221278,279788163,1602596473,156636384,361579141,1245627940,973004844,1266383733,1437247778,602881052,57422236,2036234375,158186666,706140843,15,2005023212,1078307557,1705919727,1351381738,463929574,1737036130,734872177,932055865,38475469,355263878,2057473711,1159083939,297522667,1283583353,2070607975,15,2141181416,864793819,1969092379,832082573,955033545,910320336,1006905562,1352463735,217941955,1413374725,1022122365,1187522065,2127426453,902431737,371529643,15,1002146728,2097019887,1020370786,272350108,1656551851,812611670,1204259342,201254737,53859165,276481470,2144239659,300678741,1121116946,1859354162,764247147,15,704360341,711861518,445286729,1652376254,1749887428,1336706383,2092158763,757698357,1698835998,397907597,186317298,574279400,689420383,505463464,1364942039,15,340787324,1639464079,1490658986,14627714,1164137912,1492205795,2010991861,1077163624,664642262,497974174,1246756149,968304886,1517453896,1522515089,393583896,15,953816410,343800304,908563801,1720763668,594461113,974078972,1651218221,248431080,774086289,256980718,911408600,2133734208,1162513535,1234937862,138509741,15,1464492620,1657092595,562978137,617480005,1697014608,1396081169,1089753032,2064964558,1561268204,1888627441,2041557492,154170877,1252922843,2038498826,1804909192,15,184582384,2076063257,675536748,55729503,1812758887,523212145,1001283970,443738616,1123934357,1155593548,878851776,524371192,231118979,1923953478,1160808441,15,465698382,1494237783,1021401514,1355307835,1812012119,1407640323,1137728768,2050703309,338527344,1764965618,1189242703,1907097673,463328920,619733992,1145845185,15,179193179,442874517,1300820628,471257891,1694740194,1027403842,1091608788,460250853,423381795,1244412400,1008355414,437230140,1367342032,1781995247,684565880,15,680010830,696252887,1421542207,927766139,918399049,1949659322,1399035153,1059748315,1706523720,176789582,14904149,790637899,470533319,126505085,410784124,15,237797720,526279508,1009084430,862522672,1886096882,1737850856,43216384,1394565479,1915442931,538734996,868444834,1308718192,911425276,368896990,2032166492,15,2020062062,163549045,226253022,1606227901,1347994711,1133208513,871819408,586626007,1354319129,2105152379,1621155062,1607845165,2060398230,1523722347,13928624,15,1418813549,2117078922,1335891914,557753101,1994681115,372456027,1149500765,808255787,1499959726,1655011508,329762378,2010777036,407831830,1801154878,1591303775,15,1063217857,1676988723,1963014214,828817672,219229343,467803146,1988358748,667572864,1765290424,2032374004,2145094888,1400010976,502332638,1366403867,1189120101,15,663443281,291624292,81416278,1308498378,1451774724,1020550067,474342309,937020326,1898440436,1210245001,1321254839,1975338714,259118732,1395391485,569798382,15,436184412,257798757,300763456,2131474481,1794770660,1461310391,2024662963,55996542,275178567,1974775277,97766616,1888311254,2091834119,1571447092,29732275,15,1536014727,693886800,2061054927,199395611,303502982,2110727639,624374559,675011241,993015023,1753819053,1268379475,788874833,870703038,1733697958,217874391,15,6536888,2104887435,319755773,809853165,947571508,1844383737,288624699,939994380,1047519927,1989810991,1230449897,1956883775,564572906,2064682059,284423147,15,802832622,40941875,1559684308,33859943,224741097,838298735,636787361,1249189576,1769700828,788646932,27563674,1481779195,50803276,1491922715,970620942,15,1751874455,1300988914,1552305103,1056066613,504648536,1294361507,307749816,498129082,1697635831,1395976050,2073165003,571738101,1102567990,216394636,1549124138,15,1621959555,1113496094,1012693177,142444920,412455117,121491735,273315383,1509923489,1216986695,1362591839,1033299465,1227632577,1714772972,1521797172,1834158801,15,1740745795,2120441983,93968764,1356175337,916503042,1383143558,223104035,1692467270,1901712673,1228958637,1267679163,398471956,1792636913,1681863814,115529269,15,57413064,1655377339,135414361,1995496676,1845538605,418039722,589310000,615678477,150278383,976182961,196615216,1217081437,400667688,1886400790,1260901626,15,570120932,436768251,920273856,1050286624,1234822238,1247786004,917677952,584871999,1690388018,731483407,2068196824,726336715,163297089,1236822616,1892208282,15,820852976,460094077,1374516004,454158421,1833235557,1117170642,1228239580,517991113,1025733203,964319807,277834407,13386194,1323558711,153261165,1574746362,15,885698040,1251533994,2000218365,388779277,1143445844,1228053628,795283376,1439154022,1681758558,286233991,1661138099,1269094509,113948021,1913502065,1205884326,15,404473492,627541430,264645114,680658776,2085815192,172111868,1312176326,1565413245,1400551506,517193814,1706847238,479130566,130176194,1047229343,320285504,15,1588997293,887073969,1213253120,2019925841,1067118364,1853637952,364775743,774480907,831984937,2116025589,961806440,1987866925,1201898462,921547064,1517043680,15,1677074657,1787192019,2029055004,1863519827,632424201,808188383,500451217,1659255,2112486048,1935462222,1910030500,1156867911,1051637341,1836134749,1457842244,15,1339474984,1870954214,756027319,1642552320,1953601967,1282366548,683608538,1861234301,860871046,473960801,1248876580,855646852,1499223398,1083521911,1178312061,15,123908575,2032213245,748869163,1370150776,663581352,125042188,1549064531,535728689,1409814622,409411306,1765869778,1305909684,535901727,2050975236,2026586717,15,1553814020,105845008,365521013,1721260933,1470511174,639389250,72570623,685240430,1890059080,1779488651,1493239034,602283166,196637740,13105691,1346637223,15,1723121552,413731929,1161807881,836037980,2127039170,1909684183,1168736926,267534871,346412535,875585995,1010441932,1060650551,1800279455,173058242,1099314345,15,757660323,747016366,369019538,964850356,1635287259,551843071,2015084561,681025644,415128970,1682783027,329999517,737423823,1540488700,1764228159,675666890,15,815762847,381877964,372301007,2021653824,919006518,1633350599,933627518,1557738058,1915988676,2103238637,607208646,1673305112,717067855,1114283226,1360141227,15,1618292678,2140376927,1408078376,1923486178,1973584148,713179437,1188116668,43897139,1441495786,1752305670,2124037967,1943293562,535580195,1509060251,1113000743,15,988391514,1841899514,1383751870,1198132018,1792729930,594783805,263885247,824713375,621583631,568618761,627192484,189830357,132190768,92160235,1241666514,15,2142767874,1711899400,1328198500,300244124,1670483312,175135991,851150271,1401439900,874189499,146625206,598434013,1265521230,70701346,1575751488,215079845,15,1323178174,1650084689,2012566311,61866639,1019372853,2016996266,675101604,451399783,114249804,1957931675,966258271,442299011,1792207870,920025123,1926091711,15,1376803611,1835085672,1234990829,1738103502,1898959992,479195315,1163373034,702903746,153242091,1887243484,1910794210,204700033,388786332,2078873575,653941166,15,967629078,342096644,500073179,1385207628,1985842513,462282571,1066209781,2047438012,721278699,1201015286,727263670,1816125104,1418639072,2061309920,1637899088,15,1585010774,1731863281,638637312,21729921,971168922,1748514506,994459645,1776629975,356715199,1423975904,805944610,860540444,992867366,473825623,6925313,15,190414618,208654019,1007851549,1955722409,243108334,1361478430,234248317,1693833819,855013641,830652943,15560987,1984832980,1724008566,1923380080,1930745297,15,814126481,160316697,732186473,2005567660,911468720,609206095,1755549427,400067365,1555858143,494256421,878789159,670378860,774631705,1322258515,1511467270,15,922546035,371829747,2017739153,701422813,259874013,187937971,295522729,726937568,1997174785,1288520205,1157602552,1384225922,1156181929,1401637421,1854721006,15,630346646,282708207,609137576,638005650,1798800598,839361783,780036979,764705576,32142478,1293677042,1679678677,1547824013,1693561516,367139219,1706087353,15,1374084377,159175787,207851772,1541592451,1104432293,883282664,126899165,1244581132,694914723,1337961743,1848561772,739136331,897197034,65277477,1329032625,15,1449705992,257695718,547385732,152362128,305512246,817271105,430736439,1587246215,652732656,1143223109,1168737799,330020011,1241779797,1863329249,1002938979,15,1611177219,683057671,1559711121,240092255,2141264765,1360083116,1543280509,1394198490,1756137507,230403644,592382591,1041983263,1030761707,1922822609,393400203,15,688702314,1094191710,2039282378,1554094856,778121737,1926262626,448301078,824540138,1421897958,2111700172,949205476,87034116,294170718,1054199337,883971975,15,1734218231,977625515,619941854,1752856341,173125941,86998638,680549528,754463598,886285553,501817949,1933250532,97456012,1134008768,486706465,1042317108,15,1840439131,1456744866,1892041951,1473225418,1276007684,1182314561,1546319374,407791372,1533722678,1870035677,353582352,1698594563,1060587151,1755585536,1447010824,15,385699317,1461251938,1942152483,158271067,1968670710,1688982309,1584255579,1209118072,693208750,398753998,193480809,193942715,834628549,822174949,1859610381,15,448005590,1949839290,1776327858,1451742727,360412331,1353094608,611848886,1864889058,148387879,524592857,1878397862,691687565,1509279878,1632005836,2118994699,15,1082325988,1799619502,465135251,1021935923,335828119,1697243053,376480915,1874986773,515904541,618759339,587281320,1089395471,847196669,1144605150,908943502,15,663608699,551191830,332321536,560404779,495756630,1374117899,947906845,184569980,484693024,2072029533,1634281606,366804169,694689689,698685528,1825566644,15,1776462135,1747231667,499410849,1344449069,1276411369,151420947,1798051848,1824070152,347615437,909860780,408104165,1099458314,432436776,1640009345,1987831817,15,1645934957,1147130488,840575758,1979363810,1761120943,247437381,1106657566,853945012,1738482306,1951608685,420278784,239681726,1770809834,2072557068,1986515243,15,1134498042,166855481,712057831,2128603549,364553524,1855432929,372122351,2141796190,1306520938,1511992158,250896737,972461504,2146878532,579227381,950906310,15,521329751,219964674,964735585,1775173016,828249261,1582123363,1736310734,458176592,595739546,249008402,36706870,1317512776,1478375427,289452630,1247785761,15,1002601844,2082549149,217507441,1339166816,1161696087,686450860,1897842572,381613447,1692290442,1057666803,495152055,1097940662,387476847,296880108,631035255,15,1230585593,509200330,189364400,686317684,340442293,1964534616,761806225,527334542,91513684,522952733,776870521,2141918641,185753892,195267241,1797772408,15,977830866,741193908,1727267047,152063590,1272337011,680684113,213079320,641559927,1186894187,772912568,14334513,2077786275,1482827546,1969955584,1755651927,15,1670450311,592355222,1608132539,1431150435,1046415943,662256079,205835928,371623881,2132969223,1160312657,1914560515,4573977,1055418890,2119564973,114870574,15,1140256483,1698582473,2001210533,1562080034,1120711539,153920077,1374526639,906462944,1038504398,1379337141,1382411642,332337328,952294665,1872630622,2080179712,15,329243639,1194501993,1294793110,729790926,41532394,1718969248,1402298050,1677965805,1903466771,637387387,1918799410,1692988918,862531224,1586717036,1061077219,15,1966144400,611618459,598332355,1478999377,1164221866,1660632423,141412776,804983072,1593667107,703858083,666006000,685620784,1717279975,465664368,964568560,15,1799973794,343091756,256724580,182449568,283330300,2060372725,1170253792,420217279,1501474250,1206201122,2071947143,1705879815,1956214558,481027664,1189520187,15,363831693,729843294,516209439,1790379635,1628195122,568508820,104425084,1477756800,1670177204,356398530,1472580757,1052444721,495362123,1944773543,166751256,15,1185528927,1313307622,1002729676,1531404187,1686661718,1688782074,1093657251,1871788751,1574245832,1967817091,1204349643,723490566,276866783,390588611,471914050,15,806372123,1297423440,1175212366,422116225,1111668047,909258804,507230034,1747835715,1915698438,1913980012,844713027,1252910774,1078803102,804066671,1027510208,15,1976139968,201520923,1791611311,2080834006,288625095,1602598867,1184698633,106092750,1945525364,1906109056,1157391129,1745206698,1016118424,2087708043,1600439653,15,657945455,1818107075,726538404,971353205,1794265138,1165513971,142053606,1062649120,28749500,1414711498,21164206,170811463,1176223678,995998165,851584807,15,531108758,847979255,1785482859,1127403551,306252267,1826563968,67094707,1318225860,1884173147,1375512506,821636167,354559805,1387515195,1239617168,2026094376,15,813273288,1227008000,216390851,1630637962,1860610117,1949976840,1460879822,1819768435,443581955,131042481,603514459,1723400969,1601291389,1559864405,703228318,15,573434141,126485187,1002327716,744866439,1359215105,924025112,649517442,117418239,1432023039,1074921409,1458491098,1070694787,1829235420,408161943,230393754,15,694832641,1452846765,1595109308,456763926,1939417095,1816344152,239079988,1314303452,184256387,1520980631,1920446140,1973337977,1760626717,776240482,1064631525,15,48625040,1369472829,892144755,1697005713,1865637213,1762349379,810816605,325115943,996907773,1950593398,171974084,627412522,1909469854,1032984811,1839807840,15,368556324,857710714,2142923894,1296054613,329970650,568495564,2140326106,137200825,351846539,31982363,1969666020,713592307,1573896032,678827049,33200721,15,1550511317,2074665636,1705088623,1362899261,1461556837,1211394848,1103081052,679960445,1013988580,1687730071,1567242789,882431206,433956395,1785854622,745961671,15,993028334,1706804169,1478250838,1155405110,2080176269,1635517699,1847059986,1072481942,1109570597,944092970,1271054863,1543085878,1649051732,1939479433,1632070625,15,1433914446,977665196,376508174,598098657,145571529,1810588619,1028397618,1930487998,1612230803,1524280907,1101168483,810397121,1008882480,989270917,783024324,15,923292022,684615802,114344084,1041589617,83177932,147653723,1246844053,1023498202,2011292053,1118933649,2121707929,883715050,1365586667,1434931255,1902542067,15,206885367,292787875,1097432556,1184622337,349869079,375758705,1861493724,958480057,1588882803,1631095835,1409325222,103402492,1166131732,2131836109,1460352354,15,300717723,2133775545,1330150960,1175228038,635936598,12987828,1032456282,1529881304,142010612,2021620187,163977696,388551334,1620399674,1585717474,677120633,15,410935798,1317346706,1345306301,1461564547,139308661,104527357,1067252672,188858746,1559992914,191472773,388205354,1608662661,725295943,1484350227,1172289961,15,1972511440,293394804,847986895,604069974,1900939164,1101090283,1801434322,1326739848,1775475816,253669081,878171901,240689666,1011582826,1455733885,799298968,15,637038494,1755634649,1239024916,1424789685,250774019,1655727426,1708387431,2120268729,592464555,1243320224,1951041021,942559215,416484556,1504180634,2126021883,15,304214745,2098528639,2127874744,656965869,768282054,612772252,514070660,194999731,955888610,1722112338,1149866969,1324753950,1036965955,148665154,1513568768,15,796158558,506134077,193874716,848908290,622473802,1867333974,505893288,231073992,992850545,1990245521,2130537962,836561824,1999054771,75677756,1000730417,15,284897533,1157598262,1028637769,917172970,985212282,34064523,1130961339,825545770,1645223209,1465518514,754556081,1317466509,1120862841,714278530,1892516927,15,1936360874,2042703360,1680011578,1833032732,1963197942,939018135,949380724,551871461,1123636833,1364687103,14470529,426218243,2044870764,1840244030,2047464015,15,833102804,1408931271,1149207675,562300863,64515451,297839638,1136341981,1599931517,1768881285,805809679,1899520948,2040990429,1261118485,976523459,1692223443,15,1083428082,1387908262,1386596394,724702719,244273280,1927081071,453909041,252191214,2116761964,1785523097,1717356565,2083138254,2092710401,2095096387,1909760738,15,33388806,1254208282,112964071,529572303,1518018064,594313833,1705492401,1186188027,365972535,318793886,7822375,1954757556,2132406847,1711509065,453272025,15,1387666418,1706344277,306887957,342112899,841050979,1224090576,175533177,2119111080,1101976761,1992121054,922979858,1983737255,2056235296,2021665653,1395926550,15,1559356453,863447863,1094400003,307411324,1443653788,1031443156,528863395,269083151,464662736,2054683240,908712811,157200191,786262464,383622394,206061656,15,249101896,458091558,1511411448,1530250825,1883361487,1803818554,606679751,2000693141,710833725,544070604,569405043,800798721,188999359,225162993,1204108039,15,1998035997,928019011,879867675,503247325,72622044,1930390547,1459695901,1381295935,471694928,983744640,575074054,1849672154,778063602,1119844466,450648832,15,676796166,1352377395,803260808,1675314169,781169097,734465311,1855588510,511090294,1087789949,1193863678,1566419532,1229323829,374201485,816976844,653106631,15,1806088396,998802733,185958742,1239699830,1293798770,190275675,786804853,884213748,254306421,1560155451,1051791985,1098169259,1295252827,948537482,1635943848,15,2075662510,1058559852,1037282904,1446049885,153182346,853599559,996432197,1078067994,1561618885,1373758320,1428705352,1990757853,1913243405,1868491387,830004398,15,611012654,1779929788,381355902,1430916566,1275139560,397242747,1293089705,1771690422,1457618691,648103122,545891449,1788815815,1023855324,2050439368,1506078670,15,1519228603,1030569795,1700477066,1040382955,1564167088,2097033996,1552426123,619158979,1696701862,1038276906,111662821,760500324,1279368446,1943203004,1552039321,15,2057393579,737219876,2126777433,551141045,802574223,893979564,1873672440,1174605187,636614910,1995904658,647853960,475718875,1540080219,429939839,1308457997,15,249224255,1333442294,2072836296,346315133,1810376101,2112840342,1392607447,456833753,1059945243,1440814614,102087986,711457040,2127586142,592470172,1146458253,15,1027567786,243177131,343897871,1435673333,1133261536,664514321,822290949,89592232,864632900,376058366,1209701880,1179126566,1199155981,754835533,417536026,15,309841733,46665782,408333215,802120156,1299407360,394848537,1334230267,1075484794,1115231555,1669876199,1866111984,124262855,1264010165,763055781,921791964,15,421787028,1191396934,860150121,599065382,719823892,1422625979,680696196,533188269,1815455448,2133210809,430803964,1623248937,1248769256,966247870,1363846592,15,749843677,1196402333,1616280926,939409574,619649029,2108888306,478772170,587979983,1021073208,1266975628,1962393761,1074047635,1330203658,382434208,268417311,15,1795444386,1342445221,485895775,428077322,555579287,926850207,81239773,741406362,2094750283,219752631,2100548917,646752804,904917097,1004290368,952574982,15,502815047,1493238310,952169011,420593684,675354404,195190350,1715674384,1727920320,1029045871,514454528,141638615,1451016534,1529517916,618675633,1273590900,15,2132453126,316082723,1189146681,969883309,802211356,324195800,2028776053,794559003,2019163749,830011359,1369106516,1849737012,1677564477,865854032,1235409979,15,1642957241,1888826681,1866043137,323672480,2057569233,1068021740,1419192881,856435483,1265425901,14890741,1386050022,382820478,5263083,617183477,75218943,15,353941118,1006038360,557871517,1097385551,629715350,1123588558,2102241239,680311812,480126657,815857642,491461071,1038770244,528387487,428273934,1830449604,15,703476368,1511168219,792430041,1527990379,1238813891,1070153359,714380225,284018767,342681831,172603622,1053556446,1639721967,689393495,661416090,1896583157,15,734933590,436934002,2067176842,2091400526,393713314,1889564283,261042190,888369097,301694919,372585318,36307557,1451881715,2075835443,1834766648,676065683,15,1541429981,871548086,915352967,91302860,110718766,185999701,64491118,2051160317,1690830563,1369298256,2091104427,1270999555,494613898,17541091,1604540169,15,321106190,1045163267,889716195,1485422850,69733320,74940462,1292330170,190873900,1292127458,1988618004,1312283241,2118621547,1526181776,2059799783,488318207,15,114606127,1845740768,2047945624,688590185,1444058957,356900489,1287343136,1892342315,864053655,837956801,185217490,1810184597,1725162171,380997870,1307266244,15,221557602,239488556,1251169661,1293248723,2032187701,719476020,1520461144,640777272,926737135,2082349476,195680476,1396047947,1586305957,1858056348,1157326757,15,2112408258,1367381144,1696841319,1328661059,1168302210,562136055,190468173,135911267,1843376721,1273577765,1843917582,1945957651,1112952518,335896761,367543415,15,1490305368,644832224,407651816,830365490,1254776528,1390584,1162763883,807447135,1423748742,232546502,2042397024,4951751,637070101,1841491984,934939773,15,800333154,524685526,417910178,1029314925,889022915,1991181127,2075291706,481770588,371642625,515337989,1555479933,1727770417,982280805,727323745,1386164443,15,1313233379,890182429,2020509095,339416188,751074260,261361358,439122866,1650779180,207585162,112148268,1618595309,1765005759,247042208,1463210527,169117920,15,1540945876,239647571,1331014923,1913576542,1862255079,1661613699,492672164,530094557,1539006181,731239435,1358651352,164528456,293587549,1591761788,1791134302,15,364674495,1888881870,922164316,422232986,1404485947,1787655618,354722689,1741064632,1365625160,156575742,1170466653,1191751582,370250949,1573288076,65921425,15,869865654,58554067,18117937,540091225,1156718694,617043854,1302465751,1940983527,871366393,1418605934,659785580,1344495006,107912302,1399544262,387721511,15,1837978348,324857435,169396458,1051693456,2028720304,1092931999,1968827413,715603191,706281731,465308867,1885685438,1458489770,156271986,720910734,21763227,15,127357525,2135486449,1908953167,1987452208,386805176,815758022,767448805,158902467,2056726697,420169698,133903786,1707584452,515463685,1904173251,2054820638,15,112959273,1591487974,729204226,2045366116,362425824,1252975840,764427688,1079405773,921341585,250046633,1755778752,2087760446,1847565248,1215275430,1437550847,15,1381109887,1812838914,757106321,1930676625,721886416,1329966422,919586362,1140140186,1591729212,701603597,160001094,1727180100,1854341107,1758956374,474039456,15,1591747092,1475930880,68070783,1854757887,1363325145,1560053193,1330861848,920363308,1288017543,533551850,1932735917,2131959337,2036507276,1991283786,1363481517,15,2100220961,1854496648,1391850677,1323754626,1092466901,626508217,1769779290,2081292947,1834553714,326048625,1289671426,172763122,997729371,326714378,119780141,15,1495397389,120933514,153397864,1933819561,2097253616,649546836,1408651251,1487118671,1327468086,1777568046,1855904680,1061965044,1694159148,740292221,469110368,15,1195499855,1893895908,1098400677,25585395,1148243453,1628025007,1229909419,1115471799,2024329520,546961325,715700581,763582441,1329835476,920786858,1565955312,15,1806966738,579422292,598779210,857447352,332468453,1795508050,1370129883,1716057085,1999347395,1614935648,1210846044,396508041,554323325,1631341732,1173887430,15,546540746,382995506,1113834370,537914541,911301801,1123995586,2139493934,1325481552,667481723,333856093,171452955,586460440,514427619,1919089643,1079915967,15,855380522,813796735,314971337,999185476,285351494,1457479174,1955903076,1319271265,1665066165,606325985,252095950,1711692025,1596877676,1402329946,341939891,15,117729341,1584041635,2083141343,87256771,520542574,768355301,1583504155,462531833,420174667,197612916,1061198501,944809567,867241052,1808715928,1873567583,15,2054458647,1760120846,91301137,1347944292,1169161472,1061758996,2144386502,505482537,1777455252,1824378333,409466966,674473291,2085948429,1580811613,756803363,15,688204866,1008632161,563525403,1136947506,1831468516,1353203935,949579096,1509090703,1691705893,726244884,1867483248,1652708264,1329510938,399993825,1825311711,15,1389478860,1236044044,1203526483,1029456966,1123443620,2144702978,1842423467,1516977986,1929662402,364816818,618802467,703648874,218634111,365480846,1736208037,15,1397222235,975682893,254788353,1788273265,723399614,1754851093,532620576,1352347281,1290378686,1253826342,1730647873,361679167,1877295248,652768917,953320906,15,1661041487,114772569,311934383,1792804568,4591610,48239389,531718223,1506416955,2062988558,979164802,1363330230,342963787,546412545,1049119591,405059572,15,1525789202,172940170,1338000344,612332550,218346588,883793409,1050029323,1967456859,481577808,624802710,901733156,1214045250,333513128,1173461879,421640686,15,1619134455,524491019,23923540,432198731,949177,1991421704,563017849,331353054,1141613028,1806327038,690850054,1393976189,161861216,1879574206,463665622,15,1906281626,318588096,531289692,207610437,1629140704,906599854,1372886753,1533497050,1837627260,1758111645,855962804,2022440578,2079815421,1514259106,1896806280,15,1152810201,1896745016,1298978900,1275732326,484065775,1025316468,1159284635,1684044190,1847417404,1038455798,1445081319,2083549046,1473246568,1865543398,1344607692,15,1876171965,1628450625,1247136980,1881954085,2133935890,1600153336,1971583067,5172103,702406884,308139408,1601096465,2091934550,933366596,1937565677,260542366,15,1182692705,406858288,277598102,1524886725,1815417186,114927779,7293196,866968549,698765257,1401857562,909164538,115473184,226277569,485700021,109929824,15,24248166,1108320706,1252509152,1801232140,620427660,1293038702,1801845136,1036253869,1192275383,1290819319,150132182,622957582,516679959,474191362,104864915,15,2122937368,700700017,480006080,1774564870,1853250911,1380144139,548610778,2036447615,998932888,824697363,1782654594,1845347042,1349566431,544851788,701623317,15,558100790,1751077585,822265995,1853948059,637639159,339772374,1173401169,873048961,1712992810,1306650571,1052191365,226808477,504054522,1051691460,2022500222,15,534183011,450838525,180817371,1196580681,122247140,2095277754,331260802,2077304878,717094357,791819011,1544299039,1506863106,1983560969,1752050296,1818414554,15,950764697,867603163,1020083028,1739789710,1289313060,1985190480,1155285893,1938875299,94334971,197867563,182024295,1541261863,1261380040,901175050,1026722400,15,337987381,1324104007,623288544,480280129,804101346,875414808,2024149833,1978027041,732759166,1827784283,2102142241,1772509001,2070413344,533276563,673316890,15,551954274,659399491,655277100,7744721,380179682,169667356,1806658069,1861925970,2013533310,1206766946,1271011444,1631557899,222957297,1677801400,1196032774,15,1178665114,548810733,1576351774,1699686603,923071886,426045061,1344302037,1005796980,745399962,1187161786,1770459731,351648687,1014493364,1625578994,930552896,15,964447318,537910176,490406672,1765050304,666190327,1505918436,1227626583,1222099267,876485805,1653519637,567566014,918455794,1336256455,1443452404,1069250524,15,829086188,40733550,418756327,1842722719,1672002083,479764544,1132590874,1751988234,1027049311,1647630121,2016092048,1685109160,1661402216,1241734435,1297622873,15,1450798159,309124973,1990917825,796115654,663053683,1020591555,190406523,786008223,1003327015,814451063,1457448542,1083176454,1537298478,1571869301,492191341,15,2146455473,1467095611,353114589,1660139111,1033418371,1490245255,923957555,1422587407,713564519,358637581,1734210999,859660447,1565044480,786607088,1113621291,15,1504378173,1484649093,844115572,1222551072,736357410,1572116364,804850388,86680252,2132799896,2007708963,961016791,217047344,108983537,806513834,648044279,15,385730953,1300771368,2041015464,1606053614,942486919,1657157417,1906607796,1497762392,147491003,549031649,1045309439,1704569326,1135205966,411290252,47948096,15,1893044226,1025259257,726117381,1470316031,318820405,972935516,51329410,813361562,229748863,646302854,1322844031,1293813593,1867829275,869962219,831712771,15,2123578091,1907711933,1139677184,498376412,1945673707,2017460628,1382474825,715710311,2045449940,37692735,1693721443,1527825273,1480202267,585821076,1932197179,15,2019053074,1541689613,1542777708,510559172,1810397351,508879820,1215810745,698312706,2004568288,210047385,307862738,554031121,1457469132,1453950117,713289664,15,961345871,1810881514,493888274,221845624,368733008,907936735,526174749,2116445380,1443280396,959759460,235085316,142869654,1687898398,1186432593,1980580434,4,15,1979338213,364335237,1226875288,905214559,64854308,1479455640,1216505433,353610836,1130697523,615487171,79929493,316058174,351441197,875502543,1601181008,15,1793999853,785205555,629182953,542326075,620741502,455307722,1750523706,881802579,592637456,1336355699,175290591,1245173846,312782380,1881357613,1148299939,15,1672487376,1263834751,1561437109,1160911809,499667630,1705872991,1585206207,248531927,422272679,1496964579,140304024,1348149943,1828362968,236814861,1185919926,15,81767042,456589321,599861400,1629643856,74749743,1115680580,857319306,1463837821,488894410,1788923748,1565674403,589940409,1947445300,740628920,2043098416,30,366840296,1997698946,1694163116,512730187,2072696962,662247664,974951511,1881517584,126051601,1887347575,1590970650,1578922065,843906429,1925110,437636793,147316318,835354217,1364939732,1092719538,2118568579,1756508726,824261601,1887156882,709529424,457914605,2085091639,1333200197,660554164,271212,1994689649,187322882,724036396,522841145,608274462,1859039290,890432854,748588995,715614516,1127978014,321392303,162617547,933021855,1236255547,1926501746,1776947362,1867300527,1421943957,516779246,1250299695,2139612440,994179873,176772938,212367324,1502058659,215688244,1252038762,764137827,1802709561,361735889,1102974363,1013221040,901910219,785961741,290063952,184815751,1020632537,1510571071,76911625,1690109328,1911119,1068553096,1823962946,754161607,754909819,1558029212,388695124,59004345,1486262958,211648271,1299104482,2113621923,261216953,1463063190,1918630446,1381111544,1413269250,882969120,833774196,1855174997,1063986711,1611096282,1392834995,1223176082,737452068,406170212,886538258,737093649,690952742,1432428253,567623831,1179729981,837057897,2133991531,2086820730,615651711,272189482,1788968051,1232147520,1500251523,417277886,58514869,2040487146,528175096,1873055879,108498746,1163019965,861914133,1747161028,1910440017,196555344,475350351341958243692585667089487776905812936048836708857910751887849824215,297,325713017018581929922092260805929698157388183467260667012041375447443198499,2679387710079653583365570053100766499613303421043401767938934246581385618362,2798194009652856904039341434691459812827609319443497125175904749295088883410,781880622975730555629438574877508449656266982814775476409145031755812664739,1951750543073758571150120155807089654809110954685492111944849699064364143083,3085568318544325730398526046617400818934681260596962921868598876463221548650,3180988515148903523832035185633249248256306723370764007951976169443966659929,2293408403997934520320595421692042513818888500172781998217619772037733003953,2374325292310515736307004739042064953184915332482568029293520515863945217300,2088830650819464918381962650831293972948306632777053546264048679337471054277,963717505093931810496500012981165979306803419662939365040997924774979103318,2742298224710772036871493956633156387462987996903887403943939947627242519045,3417712445681819859632679852912826181392812248613797576917385990352614523127,2617581847838831205335848077091881761466259825615164279228385481640158861642,3225884412500474727874819196963105375059979801715354545307518948237470291785,1037456913904218035906154126585149437113278366883148138617654828556620767614,3364901272616417006259553689552865758069339145389806131304903327543080832265,3573718544380709062772238325615943590597272848140548144415658757794460082101,2354789761012630912897083573839909081601104659055144217510408112173452706514,2085479557178092636409351887594772061716625219833565450124024045846718706593,3578926157694579567146937278008252886885037702511563310818416921984068178549,263795967674516779288606050508240221578680590307427196563554054660715167373,3020347441205146837906252662580523317318428560608019592811903953291041497344,2264231861079691875693211806310829808372438289540925096816553697247535497562,424725296456081892201431211562607597171079116441624108361592567487981163687,2570608397394596475513629533289958819778326223772985376788824346468860721239,3061976516831648384469428083481676840428186500151299849749221232143930549840,1615202685698669122181751427393870184165547866220331608714665597698426552666,1429202064874448328723467514924720896019585210860946265915974073176175372548,322244988084656231812914143270957604662589242145064181789610235559719671170,2695345703350801067313224943221057973838839658518275132120751636428895354932,1773065492143697091878174217965123337796890033866458895981177403685834124074,2660964548735594141809368588148610147275565572870813987387762036765924893937,1638129111358597260646465836433567166093255536562752976293361644594181291052,3362620710412667530817273071103158244767474170276922488891061858929815141430,2710679217098558939284814897298848611750433520800584673461072454548958006805,3443278056199341503072447511267354155067162906548199510460546153239999653442,3222404502175741764206011283795473875569684627157454956586760283254981507329,233896272496335162881695633458699384147434117526602538714968351032825454509,23996058528041928828064199463847715470608610903084859973295829940835509749,3527812473947006109596563003821283154168588641373638785893388448017262889513,3291106291433896929981026274176255473997265804623132049094442605745165459392,2289122316423980780306199191945626663873436930570161794249042017898101975166,347355222866598007940169078766958398526825624892080046108616929630169992822,2607744515576853269766508403445405790630983607451872480104235464074991993353,3006062098737532160356620511773375625841631661852072513389656602560319029344,3504589049921321146026212658062244293175504204686448559768822313011851988652,1176109360570713520861555347630388094186570829336233197307477826494007752355,365499510689684733948965173998662579898093231672813417467391067296936749283,314743215983183455244570325481640308580392888883898812095390321743274659466,663541717447384843123847675368050512941229551718665254685737245276700438602,1801650861862773012397806073953168002838146203240200391978935792273067564650,3441180929746443585456899758435263285636294003610211604371343786327504292447,3247188214628334253647639914128978713454622009986480928724609552169222502327,3075369363936386414507835409575861173079527736679501466986238503579028485026,594082296124628247438278238433465789044934851543062955688944608481773572812,547268492349613316608016315756326229737407418925202535035654141329499836499,3495593774648489749605323995635862304157790966571966723592588101744537792643,1777090013410459738685690695076552511650472113190834513615572379775237840694,2668851928880448941935236545542910689688862224709724081767259661338329852877,1467578512600856023719238011239264379071284511798909061403788911681539173365,3353812906117936169182119405124819446699038189689273083534092642452446935208,1881307630161133545610816795710860870987799240729944566288819446380525561783,2214354821248350688942578758708642503109174699411120913807131688120325079611,2698008923287405928768347008242574947927031842697768979843241547577459087464,3219074330999639716055288574961619676818443684193377257202779728995783593445,515771531236878883739029129492459364879285966680838126769097493880649207123,1708471988587612232058027232231299719633493104636306786983049027729948639465,1824009767739484959064918963178026941449982932076747907148463227478762535100,3528713425909312739389440553316257599186132778377205457856263009193050332963,3563319307533910227123551508734339945224960210452133748574906610119550454026,1840823209215234737329270730893132347888981017249020760030028986755776108467,2266803001000784878239384701302969228314959644515843726075571983418624917215,1889665129143156099281893558890155970263571571324592264742640999607606053526,602202185722954479308031458029479496399711108793775624821089301118934980046,904950769997223648569321731258536668368619749046606289539700374660371876810,61400826158749420784764698424398773733289546546831226928678475926400040023,2002492494976224772108412245388352389263529913703852018881776509338652213920,1242582235275476818522281348147835650073133870372125504241507874978168971957,2488366475045659318312388060915717355107832392452244193882600116221065678029,1892468417400038970026032363734918446955337002713350484522666134796444598799,1272330415048103454286748116728223711440865126005676452270094478738878634234,2765331167117868658150942497788349311464286420836591793523756816310148448878,1717548341553126596893159612804121080495310988858384747803581119780975877033,3429936356092450550009075691938623522148949599714461207040431266560424767819,3323772988467589835862404892597712633038547996362865228386598749050585433325,3292507484363845831290814951775640838916578402261396933101374544269157074124,2840621718451545824930052379075214364247380016198949090419022359151174070530,720170153088688682301117003824068068499785065338857325090900891114670022954,945627539273704316665752195896388719936390270486980441734243164649702718882,237323828870116355468291940369274009197492307405762853622549357358472720596,814659193308910513998210915169075315599839920538045990211156396237713321639,2219855391684202426712150590460452206188157782135222733447613544395594676115,3300388725003211426838059700396459762351307368968450952240723921404450444207,743279813732172274222670372288726226645670403701568715489234479174033093331,1964507457724086009110915144807992337744495485162940354837170890417660046973,1581983208065838350116308632780745029208131767189257228619187234502145243590,895456141589287912894870296904269355594737271390732204854718540087333397381,1665562486707638279603790906212646506316052073008267756447984956116577393766,3377532033465914489837514170705033934331393873900425731314820356327072580364,2019412023758738758935521118829389551476630396866708069019137300503476241378,2837222720367659961416981135778780615535461760053582830725634952381839346124,1014315856253684542006536906763107870807093583471307845225072534150550649071,118240628166035903875211075131997977373637523435046762858493580541736949590,2541997663201744256805004772246047064443245600618312772778864705202349793656,3493242434436296055818342981966587618673586735070839639160027857010726692343,1784567314129154609986793254384167491526735135187319740140826440738415758753,1366091834111208030538257304074491974626153608766179974828098072056253986154,940237958362329288204487452653615473150959925951579320145918274239876772642,1965383834782651388781057895770133160149351923801407517646132062378112332561,3154519957808672356400118180217831505646803710492173038599797963669332057967,222513670297198005064088481852228351402063348945125400375535354397311833592,526629781934798269337379877137124528121068335943596712844102979327850778076,3124646672869362191903075601053958516922218138876333548448955064739218901851,850592534785932027476168688079739722004838909672791570151235832952309516790,3559945040730072554897765858249095620504982348294812622698573903109400544560,1501039677584374624235152443104675942055085595314832357390596727753378321077,2763312690932793986084342159712454207548735956004014723032308022470874240417,3388409268519072778746075444919862182588873325954106253945872443991163121429,2897932967287317110335871271679804804295572759740496486894999125177816040695,1170353982513361278816676377425501148657491115504428647527936389495018319949,2099184415933079187503795587904757787900452867866333718227508357409667545866,2920609537588882712589818738580383771779214856266520570024903625105140129425,670124934905923291299158510995497413748452834380064585065410133889625687355,1209516081425666714672514315284637381525493188295973418038453629341988566909,1731761391824286894892866414139876548442389907851712803331785978592929297284,1991895323935659459436100037818592998226479488827304312316462612924229527748,2121477584582765362473529822138151553211573602938909350902938499831500309641,1549184676755740634661173969680805859163524345182711282024109072218004830704,1482617044731298674802864876562433070460934398948889917565643592604295156581,1081251684622416236005329727764454335520105176167961133761222530735483381731,176582795162169579003022288137603736711647759043477059277948401011732855981,3486174448842949801589175803172152590833952595005372110425200252109760645597,1531390818379912280425748248212295769393117907158527028535170963804132099897,1239680212251448445677452300202233200633733106352978972458996276980537557290,918503465190498076252957971340580211463413021837484989273583732661684728925,614891625462090085747865938094702091528672897029682351256345382272481423783,860222177615180422353811314618340566919306459643022523769791030561823453530,1176871290111087016200450399941274219201110213566075732529507334425475772531,2742900965260710302127077787830148606974389527462308940438340706684939135354,3423903617427008161263257394735068181092705426096246231793071706078756091911,520689869185609372613474532845467025772152433786622106891476788937483270774,3239449142832418821929526120751725735729993679331468066876906948719221000729,2585365955588208239434221314242333513976113068224899619296078036645982835881,1463503127667713197395094731899451214451572499858362828438850937870737137442,793654062486373661045871435086756912272760304353624184963192003407726853265,808004371645879135883147210347510504958221615960194087441686300259436500248,1689687366818746946843835217811890730062215864832493134237849514108285416148,2339031673153105290373855434029777467767578241113702587800332899539137742278,3227502412802155522520160756268778125243109856050358853883710966829916444512,468284247811867524655578449321417646953877963664167001717649605487041321539,559409137566825429919166289335927132410383828530866534950517074425752668563,26246531915116930379324450815926349180014860939405528079266317042983920869,731974682273774266718988918191288898001495486581472310232037110947640965319,1152629627445358660764481105143155855691035413326429995578519527762980448210,3269776174103950202625249253529407520186026641103565850119454010643687502026,2417338996564044415868526572199516015040838331514641707632821206550619025920,1865675617219029733300379123397457029323972540112239985409129764970576105985,1867218407845493241519390795365724321439128733932915786982781535752760526045,3327162916486563681341743472568992985121255795289073348551972304422330032616,3105906906792440330218745438890257664798634942614541167530605518186309292880,2505943927875748056708224170365581066818381080854867265728828632207757592539,641508591388435364712817698794225070054640357643370265506735260788509600703,2807901590640828333483073401010707939254789530955171836095404791077286362334,45381186184342445526908758107115892154619312044222608086738034111939773102,2678272529976003997023472779612067734412600778348502103219481077626756215699,601976320546397858425612598829181793068877549564434624291533838388685262599,2963725204930122378610792878113107248434340655183162036080650061974684449578,2642736457768636598096136469574356628341874016598456601661639905333944890084,2534039108829048563512672760269034723254207673711571185660878923492841074525,1387928607833960242139385896286816102343772838002175632419547614673209010590,2947743290385714601537509853886177554548155411067630347685837598340361726685,3107842622116116292722647893551699066461009613086764726736137925103763673919,2483813568998980386980173820278858043402797632448055561766702756375802045621,2012067992195691207231295617256205000302325620311644895086749230007809004808,3609365208132484378448397183451973814685905400035187587893047266712599210544,1457138929313707573571461402863588332855019920813308416671677097661980578416,2154720142785722178762980807116429891614538208232781119550879814799009176065,1605725459529494439304244994447774269110005190326347725248491957915400343906,2980868751587526982980507260798427029767937264959818504770004292937225046376,3448639708860439510763365913059776587791116798051868480394550727571020837739,997562174848873685755475991330153232887965766518320254492085584427982163708,1743604041774064798748201637584994259465114930675996824511950875306870124659,3312515785458997589987038983711998018150183938574620726292268630987928785779,1340516660525186298522844721506873729456769907606495859909563841246328147813,3358944729859834575654421693926591210311200593970161779597023863358867416811,3517689716073757270473662113654472058179629018013923120639297021273776720118,3113180933977465089482132988134614912076689904644512823332508978388730142393,2901442555187736397590342364600645588352860608008758190139194382986636913703,1673470670725322636584361977753740107121484018647012228160654448599296519821,1386911565715946466203910894583444754886427679118709836601025286262297672248,477978505657969621332873483852356958033116381475073016129988828321615424884,619245822238096949712981806631798595225213859429672094324979583967484889782,664388073032282763644004521478734806735017908396284699926948176879874115496,586195717142374633623380453334554379863922628054329236261321867669439624740,1056698740720678256574122048517754359979443637808839735465377966134658808187,1548049667339957676736477840761689634780953121464052423062940408958679529936,564307397757376824926097951746046538152506002528509060759685946875580421830,1256949251563921375403201387266954248219114460568155521669575404783022958092,3593104866947890934703675910802398019362080459129708203015152644944280558136,2793908857932592578554730374089238656977634227579920694889848301184829073316,2047657644808164493770302212287495645863802301349185276073784846580696431109,3356384077434123922943942499816635286700355048228099339849343670192026040063,3005292522458060520578437286828477086873568343865484627229036153720386602423,690549927259815617125036269326189051538244576057872053835133836007719587468,3445402927723684147795753549502418599620337029283455238642854959446142085016,1009962548067754241483304582717292649134295300038779718837476400553362925674,629727161848163229743072561419568006262601489291058692513198436014669060981,490233520660320031004160876967921427514157842719357086060888454383080385893,2087714817246174297758841896602066467691023334514347583919561135835889735625,2945260329424823717167392563141938156483450348086349882785841047983308894385,212062930171845338550759181736119541932398950761483337716232438580649994180,843881402815806539147151756357154508400095372919622748282902300373092118148,642952159437835306425080078805951752461449706103876485766108969808170186586,1706636876912303028313984388689080623827173483541831126761382165467887277501,1446595307489721651869546517589146012440289778876869774008887798032336733262,3104277135663802324667508524003629914721873885217289543202748092007207933434,1392957018119185443697430605176155458603791237056878576447143821533250655488,2464732705900472922191355371386158795060706070839893985674889233763629955611,2481019608604974562592028121065952737093630626788914832415504627677315573232,1836963879088010921938267057343369001651530067518901274106861767589609640569,1783047954268606614044704296430877737661766201308720396328880379622029375142,2807203483845237516894130046045755318075407478076305061387497736891122244967,2304436271739915649494897045069634149462192427314501058635596501928935141384,1632221496451138894757193127688696701672635901281253203086097537065608685666,1805247843718046535525411081201841475096995863196035390367896192547930227054,2152801642031247504719568255704846193912867677069397022762918269202557607544,2085575760126512221124335566274122529087804205712996760935450967630079031681,2877966520415768226643892468185322148492940141249035511391171166439437396387,3427256329537375842083201981831000437225778865831514882131782143540356841569,2858839562417446473403919551618513174420929638496866670896271661233425374419,3487426397862660130184042434549119284953196189657662218353142551714452088196,822404222125099772915850652778239418845617769495847417365637351065950821091,955651234176072496958421233187709297892042446402003852454227444798877442245,2961247166661401660866116197810945979496864394075730289070670338804318179059,1384973070372840518785269417368094852414729028239993902358628601944633417379,597717559957309954117268052040697024533602294713205176775259485836304865908,708058362804388322942847335000515042612375284376063613398929259356157751619,3124561739640173994920011576345057759405282721575281747933923263703941684834,503596233284877680025685819302336156286041441233581507135651749985287307228,2527342841087638546416038474133750202304257459968750914061883600650241781081,3386075514796830739001328805880335768553620602588828337258411818201807603257,435186061541917680506414631524623246007258392754314859428926658108662468180,294696525384500932207688872618003868376982830224811282477676866759781102492,1333272011544331867629960849634930974432894372502743338230795437277446712664,2030048391874337370768319300230369840364149470202110025324470649389633789233,953208819026627921094045951121799332638851465960098443588840432911084869073,2765951668308827572119222431314658294426108112288380643712560153601186891926,859062835602299250809292938727277170501192280415211236401680692558483614758,1364420753279971444395564523654022666932341406859843203462261051637749260158,3573440039550743476954376222238271324197277101835290464700275644655288871901,270423783065381665726678152639653949841804223774740738842244661130569589952,1149459019507895140158847846805777276707583240733142979405298843861846654488,1995998534082562909250493994972868752345654556011928352797005259429742214360,331713242991593247420164554119811561004885594753917002218883085069357910587,3219893836796815495556326410566706722297156956707037200253231484295284999081,162877599725815348863977124693735257950167870603087992609832801517207858107,2705427783105604350768852743882811644961284416896212532043739890330270228297,1361434580693145299457396637221276847520325648463557997399394134791373562450,436398610409067887287868364862393085399848188611504299851218432440038203456,776732011945523344676449189597377102631253412040238160645328951550465723353,2971814097327518233367157423222259947178276896141288912004822391825487988941,2672570691595434742132626614232349236930234488008277123249215909214663922926,1052685279111140245303098445153635397481503383302500654871059238271404766924,3200209022554350171389411276296284858322704191528196010023414789378039962485,2359356089323075410051117176133821325419860875150847664385537597243708497519,2850361437318115655382225254855755926805547340422607396005669942526806731503,3515784071601220142088414328147839123893347287846688233834150929188944392315,2807370726445857125706877841073316683328811777334263808910023884811957229226,2497280761731104699637048443796358219789788966303786226902688410447524542447,900558632705035570791549800203129984608532755317800207965114328042745356363,368774826138217402847245428520327900844839705797466449484140506875764013962,3618172297260461876301103383091573556014438116115626696113344415886122545204,2944507004985281685087920947448809585498096441144252453316718577060762514442,3589790043355567238839597140143986446956593836047389483269148465628150958705,3141104350170324606604634038922967842447613133255851581758364977598845660401,3255448308290010143534749475637503959912450665680750301495641755831849275554,2613843096561788688637868256606077560554384253363318085405109357293744952277,1844190386523720716436160535524219232809744101176687611162683569036874970202,2755435882239391464837884922554425520496229081440767868691934978668913445321,55953467116979768145266969721725308766690698415809714472048903598810449811,1341210543998744490426386832559363054629983085190098331367044093602598210867,1227466047670263092927716480669511024630712536281194705227922292175615718206,891814809567087487816140186744343716706038386375903751107377840584262236494,346742011942923387018860848793401143666609935650172872149484058514831238405,503385360584235641234347734716926870828684404046176255458704085589971408587,1719994496991674532990723002001341028255436048471630481735530874833747238917,917433993575032359853837186895545505157403050453177895905497685558973631641,1201614905597739671331050134637698231001956110441663098061001338736727005743,299932836845574766603265293559111123419721896411014789830711295360492155054,315877875188212530697976971922504312268336520276864042872170570780937087828,2309555634794561607730167884194556310527516011193992985957229476727942288233,1325855835028135551763666583470430036402175201971285431622571779431955691667,3238958240273022304814781730893395860313967225028927075975226940149194354521,1753397974315279786832220256828398135914611904171209405364920505092285820544,3023931160728248817981057234500684991261121654976697625598785752511896630652,669103368806200983177470057557067073438681243619743299840942569529701902185,0,1,16,15,1838807019,818661407,1380626763,1501021007,1169971413,1581319657,935184848,643063200,549207803,182343038,1979069850,1447098598,1755030563,44762713,814131403,1148170714,914027520,38492743,163999542,484824761,894103231,1276243327,1253075214,963364242,17553380,756554308,1356097325,1887069885,628398000,248933504,835472361,1810252284,1553696439,332792514,1511656032,1204960592,1605305242,1507991058,1440363673,805492582,1299751628,1474336471,1519118921,1141110301,1186392984,1441488800,358553527,769816513,52535014,1838261260,2067250012,602663898,1296118570,65010112,814792188,1347143723,1566267796,1134658562,371906964,1271246843,267,2465523676579039484170498574308662680315490062303177877568246146455718648733,1298021805395383055563067813502590160197011063636828325938616672891727078829,2136510512906966392757088053045862403166937979046590626944032369646811056132,3235868631138704617893898905097576764511449367818682816385383157105242299959,2005662786462724078773303229682438217429065192645268220370717115039746392897,548583985841918270066157735974194357300017017966578405037852130455696003422,2511226974710331149917840295340674374131734850358692359535979578712800142440,2010206583534519587892103118717908547090530618308503823033650650609972080376,1159338746721861509879128071779448653135078339439580085085952331586283022727,1275164831061768157890583772714045663846437150680851461499092260707875089519,791848018744817852225478137195699082100941369156669365882945306338691119968,2988648818727435598712350689124457115825208578728346529291274466024801912679,1353419521412751113039799532965970952619921185618238797170954285677634474640,868507093568541745097479785618092408450083027885166882142348441544878153993,3198402034500563600190231618196234288716765585029594171331303565040825062654,1844387507944534607423379016906711778460346472281563748221107837718074364807,1393367782742425323885178330479886279668453567541753968687727984068038648217,2111636326438002414685844521119975898587613442665420807292912778991870149646,1711792812394847309157161165146307345535203844919835530824622921604297347797,3418161301307719230198125174732155614868938773705298267193354259991962669723,2382747603950769301178508305094469901504448845739019298827280201903838758064,394282995522913950912675630761664527290076855741278756458980211859438084034,611981667615253137160711802189304288141409174915771637440209155987197882150,2261750844081410205419136551845438800121889764258406773343701063094592353680,1628198950262261386212214522038019846394124215789392912596165678547378771696,739783634136004495476620228246768685115864409408708770698220151434808414639,3393805760049579421505227263890265889032909215696303898170526911967206870738,2307097995168895051532352334837229175675073363845696609055585684559732441080,183428578225952911866162818493432081696853814705056474453339243429941615697,1088579530844587675315348199300325166014644201152145455267959984809085349560,2320936194605216299721690995073037399467015677008970277193990629487465979810,3254919436499768683949736213167697132472261376618351064613415583940176332981,1952356255301377948992703860033037102772575102941334913204634201304055380209,2699132812448028104193165345745885646745307344584149844085360010123511543272,2775512813241897243962962734994067549872908684209527700300921117941026138543,83566736592377487771007026237504748024807672039044676235522337695338370793,1451201164150117220946248078622582715107934941467513957806508000252499328302,1957514366476104340745090682728447180515057101269537095139782611294015393097,1124503737951601968183565329283763902253452801682733860825055087481996002642,1839742070197090412797321916584171795021371037871405874889666348592560836216,658122026453893280889633087330089060493750970406506483838067728732142023236,612597014514327038132786683466910282776956268015507264232221211240214352780,2275308001134689372159549925839222380061244129322845723487857626297458375391,101268912686411174465265068324439395358145360645963279150611498543393475837,2156521818980140532308491098867014348279276852827155174978784548147665976282,1873908052635120171025114454388876647651641035607275985364470488047349266861,3057934403514367129205478801425492514635785609686288961722982160449901753836,2176093470443902419288745772895529890650104225711867375139625553395901816858,842165465826449530773195420375846434438975639387053164144598272836077975003,2240556591091274205690825178274295138581361068144626711078472283614687900212,2007104677313009895987534584882205507874362558962417809071316455323965693910,1816619429325735927136592787159829826371023053735221072641265783908661472449,995876910378981620651396246123193136083315059078687706221632855317434744301,3151277155318793540835998828658023052977230098957791448215025735726602802689,1702372444913388027747806483903793732818536117809983541946336521879542916295,3375487079316894561206196943431607992795528486476123169204313052395053454714,1643580972250924224879369261448810180523806946304436829380272751448153420827,2629351513041514150342842658392851070058410867434438909091406754935448629107,241835707790997521025868027219058274998113043248223811067026023807269213540,911593363542225248768078132543146756630906489799399561192382789155740862137,2324188762360133525653405879279400234084449293945917161398637302423283863680,2136626245008912022230018450014396019615924565703751537397291239249893035,885831663230125424245509073068408710630471211488195970646045010323721730461,3392577738593880320134639007486283280092802252576172222729758104130690614916,3137781611900183887616607818379069606601527810390060841229948015580363971415,1510473019810550933424844437430418736294919318299726317286009429347159104987,1709544064819428809343386941438835957692972180317444301723290332083171423477,2516596145122227714590856520556148693082105308877881146406614285773127750556,3370144792134941474742499285029823307679961473945836192074094980450859781,3329115367579362110400378795900106818944090169602893855071822736766943492848,2569693967506335471454333401555515411144009785929515828228406630760959439074,2996914871887578456978717464358499758064125165240953950122262244662536193491,941437142901738129423529090996573874657053147443527733185707591031839251166,1458659959560525209477233426887352114577107530231350416848556161260089217053,1452606206005166736332113843053936354973699535548420585982341354786408375518,126099253407198600021961042540598602846795761794969046511989641763502069067,1922838142634706580082747109383205704072929316185940342280290659478669103034,716371104861792069024661196912512888870328959035777784517509690315673274941,441582103014849177874768539494696797924891245087545373127739928931762398774,3490721789811254943112614932671242157557408617718703533779837682341032670111,3364591485062029013447834036155676047360180080948726277272077285985299082146,2135069899543499938398877400602553075326786704027527037578911681712043941941,1231857580076742410223994121938249387594014308060088544232072500742570912079,490629374354719705327426754404355300260148056947263105497488444169407241225,357008324866111262127999409993186733616806650540649164379153774329559857790,3077119641804604426504042957690749181814145595992911122289525000851089018389,2745063831897048266569936703353501590979212458897828043895647435091388457248,1279734729924629663650508258892464686099385305251632566864146576549869292566,3538616732265219947707985716854743678580839369267907345026899811784441033385,3125216482604385504843134088853501204896397795527553690421679856863357096470,748252736502531506070649132177672890473636378005802292916260231807925004094,3091299700502521422087376990835491744205922279689896433670177977769670920956,2529181389802894438643425714754102164978744681858898630413167043625642627744,1840709355035578996800741751821228705905972294468955785563858410533818732880,3471870893228055471417438914455753544849228067634222904783572885954224006383,1378356862237864670411320570460517434595880519496880726103810365027993948111,3141821944297336834404402805482851790155975346887228050549084350427330331971,2306705462036685737608389826205880468381277016382814794462640569402479706499,1476354220802612825515377589990886462499058193383913595674349118784892626978,2565540805931606112860051260515000037575767730569487096628219905768154851228,3076960313003829187662391232939305159533538344725922768400600724631517500344,706369274192821663697579253315382024631959568101695941314245977830891611633,2802911177683368359423594188302939179256246146619278622373972876891371667026,181675716969096875090862194342733617123219385712250152800057418457053337506,1002481520082798683920114203133007367496138695662542201602958708665603412883,3175118111865746127443189732520233726720334244830973022721900574543474675281,2540429870009692354790861111320117266174043422698321428100784187609833198355,2219513005161552107028333785478435196657412930674338481442421072841031246956,697952556955891254022609205737927263457619262585760935371952099406479931200,503151782342765489595542418857174595097662613748925339358218412576008788904,206311082120135614196830207745417727894520613055385391021826482666807738499,2443805800273567416846130434764282652248144961821854483218927800490015411424,573571548698393888498043943576266551151694340477773573640400037059403504920,2517080217322742665310761125341972596699558620219415165727615242319824378953,1567077785386610301217489690508539695478929734586402784083864753944227625951,704939664366783453350176115452877993163584474629893333293861590925674800443,323011249865626449707271331718493726155708076410765483222302465157329574137,3024585182629614199561599219513303013085769266578664009385239438481527193019,435866954162898651678954976325119673592208947099745739541264309971423451172,112002001932572230342844499813767413841234901465857486290841169687426633841,86628852671137512931448541580698243153393447506722540165288572339052561431,1087320468444423049565557225884626165031104203466035191132814714936716602034,2490165719704647179528844944607862120643146487104760757661080309284257828141,492283987925114600876100488905453114639241735223856682135105925565620232089,207783268287530503122808027510060555054027813143231650580938593593463350665,2294257049012590715514357129349360288375323155364522924759457515282862824378,119769245596731169736988799413350397787356654870491844160225582993624587083,2568118193627375643346915222103831665116163398264001506611374338537670543953,2674762678329724501155519922513740920819783750554490527354066191876517250583,1302257477201711607708391063885988953882362341648814842964301409482352021041,840034384085303012132491489811761946463232543588770220819010925038776758381,1122588448554783935741093731663584290275863233454355376445553833887440037203,917553347818001542051316635456608595152247190419979699198511722672108761748,2509239837743034743919703999946953172729168473135382151881280797085509928622,380743374085305838737051262145541633939499288376103200699242286101510935488,763013995084631839657715220668983869315325863261672373397485197667164629713,2079630736422228475757395951415592536188147112676021893257508565558736699762,2073362462006562643205180882704838183437661945814836279402210100965711434821,345633969371122945961863647625992709531952417799824028440112281956854378809,3338062233157893380651862335764650335766990475636974508177101017149244343633,2774210727524314653014795800468084199584018766888942902093761559318159936187,3447021264220133919545854871477578388845276794150928541630088230171279803753,1047070046341532904819967997985720066487193159387956415023137675699638362831,3367886193298821586125622337946283640885504641107218844710496202623643631404,2710499588183378338449003963005162892758582702639298713893999111472785580514,2994688569106852729918465101733953430462791073316766478874021131513048099749,556762038054435172700847776277077062101256750361616802962643784093795682562,1069938826778803775308570112206051654300252218578947279878787511285998542931,2795976063484230652261547755311301401442777503743258814622182207909633698857,534786245187773527299073425931013725467399979306299164944902986261577609796,245066073554111001783497592901405298885085723612473232456609115833539441331,1548187471875512667787928912078325807749109816462883491489649509693437436531,1345536981863201509053886893585289669360735261812875511321069210682203198506,3048623953853791319912326475481565027939478253384378479524155828456881161818,3321413558360940545673824855586871964744820133342932489005836811798708831024,974989208286690309917157154244144324279774830217364631866314573673200394308,2826360207243645780061872141295476062405861664891172992658866803262684730801,2484725028482619832921436834026733320335038814860136311838807090408017032991,1602816533512732501838468636436455499151282947903681134390927575348349515058,1487223126050277886934578069186008917396371816473156594329489333797619273257,3428839127898392102493568560568654741123929234904991724163978458881068962808,1201786770638467482502143643701352807774462342441083753760443949956150259054,2879740091126758110897914731569537838885071149501534148981218024415914164470,2333369858029494577137108588600471874517763555443141469118305290999857688355,2843991052708700831671119187846659196522496027506904835870354404972473961245,263264621872193241360491463330964371903775394966975392576404672509282322050,2616335045526839314764112826038054087456500923206823024992179919263431398873,311612004562642470003429725690333205689573611662580167031169122417595371576,2877891898335195447476323803246031347662528628965741901954605782195250965557,3538950897085936009252718916373781692069669663941467861546475708351650008491,4579957065498563214327658498618701139494808286623257621744190186944528285,168382719863278394406856414556135408285290517694490528644150881035681852242,1740076865227981868801257451691296139851059540069800197832432186176613383382,3448462689161140786107597317369861688362492400267592817535484680546526877896,753698969052473017622720355332363171323795427191783290531688578600472368538,537239693459023022578577877503920566502756276008463791125731339136542919825,1722186149551253357504477129829730214586097103943962727468286621997833780448,3469740531447198186272464263043216726798202837961959159594026028104232621274,1727956839724132322941736804996907910264774487624750092602687980713277445728,1501818224026787050395890952255011198287708473851711118048704038374257479147,453194168636370400083710944481800107061870646363940202479690214582380575109,808944646402816177754767262792159812344646727309925434931144092422751790543,2283654181409174082176306646668207445443383439480098217652597587618200914056,17611419599531857303251006984444456595032221844688416384821849102474659574,3200308690656378995770788011921977090802000337872425488920380162150782274812,3210467737706044700954528593543186132177408406194094903963870683424592486510,1357990482422678733531404610327490160518852255454674350076297877637936472106,1028203959826129205782603761988487154823748659189800579984214417346750312468,1414055082442705919964232432302523502251601635616522261009366414767413330451,217959436062843928633250436622009608176441364151614297694811142478433629024,2929937730201314895034014958044696206124297964443097213410640559664080542575,2708258527430001905903527731222454694950320991030591872775951993950373296250,1446558795415219053389216405393928980336774744286775507270580953307283724815,2235619241454564098546226212289723884503142787163935801435246696184400397967,3355243480080891382002329288232565684256740172971956137128113365356748749400,3084811299926990045758265964173592240755318845957519183862768062091172476995,837845287213940323567468893118037641799650486805685320334235307816319652378,633803231090872753926368552445001977443738431328907676959578293427112599414,668214081330364975940407578290997206421695285784772519039975550190179324696,889012929700404230835611614099765604094227762232078808370208446733739988904,1978265493384676322115139931282279066953637881792864689113926182633432517554,1068477601359460277087740713198364659464818923428958909340897800766177733252,2994212512277456218962069870165850151677046391283581040324805330956695102314,3352294829599112921388517548984191895211650882953562551761715502928376212242,1986575723991241659377747705050287963757361343137348678082880818681810987902,1066238252154393454944788149421258537207219719076115272357277063813763172645,584583774675514850512783978543999627839451962501461313466066185687472080198,1628594311767783940362178169083593375990897728075931433044834702843418864132,2048606755735759776409986597996610830946367427247579321335595884480562199240,1531748469179876490645950527001218050134289921480992378466625861811356313260,1218730835522089968401575907570047826906203883936788569978353154350093531782,3394796494372362024935987296411194284307290879564760730154325704412450768745,3093568289301511184152946704512384551869308811832512667984721394260849920566,2346478978003464621208060610607592364574591056509929362364849224127232979138,2176192313086109062919414040765939151616921886512220221621088383003934323472,1580907497120237586823612032534091670842041130302353775509192007370466547780,1912779685984769630554747824305765627475180572104002597087120304234761826142,3501074368957693269521672943148939286126938285502566766096755464287478986443,1248319149444667326688059240354291716129090807679122868343554479833339478844,2350044735879043058645016997807544711675994504647767948968361895606463225038,2456580389626543156947066390590514994885764487694583265217296960275002695251,2381025576310119391213828219177661968781959103103328468937790688803859600628,17146762270601984429392594069588622784778748206505069465421533376446240247,918331534493361133942622286251048535855603201217750237100516095260191831630,213187615221175084358848840327475125245644722139685139308398836061563559271,2547361489921288247288858419010156283941260966705563124155996210827113442227,1307564320618537818559604092099710238920193740302012673032077546893885783123,1087478840242537299481503349304611338772588649412834378762067797884312478012,1545940615302373945818898267655179701392253673646131513093880006141056866198,1311802153603931363377792681673583356453010538605369003766664750436336398907,2854333761794402928756925165320752946717407124693070892684043682079990028264,2396280688086848315578271872713799585820148614134524194230777006143206498867,2750073613501819963373590760439699253024088981644634126509735188132176866688,2882489115849255997797992752202233708314061317733882388337389344425218375043,1717607108427140358301001553914139754566955179222650900155877765235510863436,1321376484420770585012608546683381040198209817587786267288765881187238845261,2881362901216839276058716560713894092475105281483967165107756584133114217203,168874351970818807742959746888649008621542945596492851636470250301895773990,3288570320399418389661755171215043605313508374094171728730973360680280938073,2879257727643803166399699960914813699594377590870721371527421170802030073271,2745172324401520133860308974378288351646936092731772807363058463870153303664,1221681673958162407543920557640620667062767514977368789727277814936400963864,2301280353448413654005964451249947979672073521803172651454137395213719407227,2849583626741374409495537995316272771720633737237296918990265245696555482594,3083541628048290599418203430777185555022500412010353238974110862897909107122,209869106763399840190483776735651330576480331788010185047639480255243383186,1406083633583589286117366677924231756111575943755230704955405641421877568208,2189228788584659896833817119275407085434788581228365742405679804400566077394,2220611750072496189884212938932794459203426250850864336948050882122125504696,2441624030262050078118990887562132635725114117349054173257158609185639912026,2516666258552706674664985552868457006774012379886262397241995837505080038458,1028838571631018905050546176113559357208196819018309557429629378990081354883,3219308298463851312043395088277215266792974798262006713589749841116067111291,3037898310073536166731054487517616028921720807977200026030668156030497709934,1851912999196159682971631003120681254533806260604733664579100127464006363136,1806032478867093381396594663985052912102533592201153463231423348732788482087,1896923349644732318858368606387041784018282765822514382436167336089600175574,2872701175632538439855690485223169135380800469938627819006745646191792391116,1506898219001690086502693706684268800057020563015170344094869462172152206120,921377289472333711650145095633519763878047957692766701641868158242658449813,263578876951895539095718760105844629494586696028466607446661257555300946805,2859048659444692332083420318237191735433305788303270507966046414214412155585,678356916496313007348226324108411064418179372693973977598585138088311710855,2262702429984568075325801328664862283756556878342220825670487317978202798101,3326986647754764023814166256776273914281878758842768393855534644460830841201,1382927891170813774626735642646056386942732430104683712497644219777351072928,2624530387381805989896460352339881039582577842590085825847187852082710104881,0,703711881216706733997348380739674830489535935949972749703595240798596029425,15,1730706910,1861175616,2119331017,1522356716,209105248,873870318,314710674,402208541,1578893967,1898346183,4564780,1048671185,1129265390,116116274,325560594,1876080754,55338230,1723260587,1088673741,321274033,766519827,828977649,1051754398,1843749774,977635765,2103566351,1645452253,1735402575,338132432,357792609,911478487,478437280,1731669189,975613856,1015719380,1714660116,868331770,832283279,1093009805,1018924505,664739187,49568172,230273276,1606864777,1988119199,681466268,328370896,1831237118,522406033,1181439175,1799737638,1407197794,274944407,1028979885,1619646982,470082864,1473868778,1558376414,288450335,621428590,252,1554396873430977439358746220340103302926319354636178111845380226111159979342,2775134765942819119852138269878875780163351299893416950112236290865195887737,2806886901471761336355688352345243502502926994314538518005060024091308742094,2635642973874019154912345854334448441021351217926828304443593177585726667966,193157906422453403613360608673062143136069031782888290656342498040698850257,3153860628055169291954230930808655544429851977197326863758220716654330887093,1066137152413447206480726958257742752571169198125177100441447451486013068644,3450146126333308510596125453425127631521011669391125166853903234861097914748,1084816053938912013316977631995298019043438993974189985895927036712904726352,438141113484938490539976071329623819552002999816630673226255292949638006953,406969677560233092245170904162056256344627008583952456399989898051956429091,1944135899714271712737291305116951481498113348773809385899954159623691129018,838127584669721579760600899889045632450969666504879789926210400376078179159,3045772334699605490038489085941019443532353175620410894239957153401600227060,592516151023551351574100585685710622132206228701748579307380611820536396093,19047009276530396372920117768549521056635648123186863693636528813359252498,1655328280852179105223221765306924674847619057580148221716103468438011636237,589994913148102467967590556657733445673112168841060261407785025784542894465,1100340521771582417649735588122582656586569015315769068494918814175550661154,2370000487270860841685846622798187401267177109297857131692335132576484164403,829272539187380789783267713112609082320936279097369955762275865598464813899,3228178731258693272388237715900940075885023516890505565473815611933282505732,1508558108909219063223215174572006463325027837575709254637521410414953056909,3555314522438610212210583083089788972536372985384404214678229102442708356191,837197279192170623858908433950930916981224064685214839107139058024784170032,3473350815425612429331690504078250565057617959346272533016880127813233426212,543076611971401114961444589920597851299808133594985556467943102405116923689,846962808694884523712535374932243751988383546611529127927478687968891802544,1824654423571650587343763460651796436776356032790862834561533511999329629371,614525351371555551528166033093689013011833481327516634832330417572748583309,2976869195421038527930470056094250727065625306957350989751843733935486965541,2554486700084926078871374735103456120114356389709134150732794160572817983053,328266231692530990101546200081495142236056785835942397891018877757772467688,2954005629578857080009172576832703000730398287189978409174377137027394837764,859968292195440316838113937941083282591149275220316926018976857284482143690,2136217479886937496617218764480031010729426925371872643895876111422000788829,1865734916450783750114725140356291058098998518098147159865521865600886250204,2551417919970812862257066880284562502475908630684990912013814951998342930979,2609486679502732389387849654160595434068858660776034329397758703970834659358,2352059911351493135370219773978319350603130204672535865925483022370361524720,219564486874939437535057241620796952434622639779779615498979136649819713481,20563815472559479257096471298547166797446730659090425370359728112739834915,689848835031448287699674762735489107479183271881990602369878826015331023031,799007483414404664105598969509559690356749304527431971666867069559008530797,3412371142562347268798083657837670874014269770167866537195554094722567802151,3308665505755314684393584320015175784065557211236823721428570997478796833836,2900302032450721432581764037115935529818276910487993615449532346535135557427,656657919209430074121776036622481084002610265819078365858296201368390615015,2283243818362024479595622199550839584922236451940466123286603845612063698087,765745485245672184790896129173169892776998769622642848139657111639418107809,1468248922864905385274104172954733830002782111313617686121371941032944818494,2202550586004097577022216683236693046688907500970623010836112669425540565658,2090703781821945959298255660950456758463027142908961516175604209598051800033,2802025742595438631441403545611806865192816955850772525798740422198283437288,3161576611412575078967940791822888129658366156728538364514054011171782425754,2571396014315991945487966620079935046672388425543989547046050286405465994444,36829519638504789621248790346359024037016956531492634674049755650561460736,2207698234953035915080462984204799025542537082826198238002385327512391030698,2721707062288229946426302123782150777630908151407465689864156561433454455377,1020503352793159424219239999530153859603726093308981235414473077250723204822,341114266219839346051139978069868203210123837787601440593916511798436045677,2324669905556806259883121072274908933453695404320684945532582953478579038276,3454956470303711315752490955798120739717115647225064030788581821705596639621,140376014763679400038785033765416704795228023524978545109109214814267493898,3328868753382161565636168976876483289947939452499667139597741830680241785143,663153672529152287174489778708784066062287144420359573740815009593936530285,2233142176332430399632229910273265337485694695775861658975511818105007754661,2926853703576571362227245723011949806181191437456751542070845923177965839859,2697414921987647668373900453810308712222441068095188459732506179738130046019,3003650182828504341543128660256134168957066861864438485973910087956845714945,134325366321448285628447267775002922826567375461569500451452751828032700901,1485229696164203106142535849185340328991093856436281901882233918893658233711,1901790262784068194958435729569131361646246535899444001241355344685801922418,3205058452741139035438228618454964353977422927676777440023489025959319019490,2294721921410109186949928188899236998633718422988637830619292658198529505638,340385772241527518239716515858082491757237518750047663988378917624296576083,1401096151489090955098540150852622355917701382520709301252686617672201912299,2807102988310687207775658745798248276954682651544361691050535798773618896148,2846685687274738338857594567523480637492052672560774578934292359842771185650,3336035994839137458034749744031653943185115436660269071717673778994736450385,3272987835522350749211554843046725403618716891864647048919455041170002254176,1063690732771392546621722876269112256571450420751493520765298238386135579952,2864278077212810286747713889026014532381445083143691605710730734853763115950,2100816208112370453461172774396951286419371689727161531260105190973809463098,2549889265188726409979625088105485575787009176515427000362644813817538841828,2347229995141223619455358494736769109726647752316469059901316703115393788249,1149338179731606111610644441656184183538818628779006886369479800630262548160,3111063588756362158845940645515730259701896615771994436654694132002558642320,1417716823997072706369762760327181431352608846175538279830672064008182005391,2694567355302075850215802435086957751051447707151743189414013395628254156140,1373777887011559642670275787033122532249055730483477917906475347006419836165,1955268816706192260973436170284579441095811626887653190847911693225643421373,728347126307615657967740967869784526417118992902647721236473873939775145236,1424405927333434474516135323325192124443279688530940501331571038489598636583,231433303318533252044225185316908295134857584782225669373449254951721865455,3378215850138489455815081561600499653812400719571425947473204143812305771242,2570691049402097608310433770813325836987975517708541344742401462302809960415,2826898728693266615365134663579312369965099771742866338011968680482337089817,1846283109149738089254659218341302772481589012651831818094160407935096732106,2244945533809014288769709575056321121125276026870508198468307084172481391884,3442617253652355359372925720527422156839488859753929827362615563753346826016,463471126477844879995824185499782793628086774649416533497565195055439272525,1218875237401804418931191348937301316207306033112789053648506183097909603921,2938400547287336777195142031722823795184681622822792396142498229187126982431,716943624273638277054781282247620239299574439771662224902357511477584385979,1411378782564736860932722094251730684676174436703488933395250980923462189394,1303483464516785990240762327971493427134913783638088902441509946350684370438,368385063504014336122099172558794359864015660931421006625183405316912580016,2909749811455484576733921647312008852653314855379367269815042119329716803766,2815652737633649942392791344054835873092855066054331152873363700033531323453,3271703887797126343418792311345309162145391080310430305976728689369154695051,2363114212928715772573512823058394462473453780659079855376399976391079862634,1799704391997087041876489950362866536768773734843144707118952189822235831519,1386471903165796608048671188405687901866008045201127501565118622486875308616,1886253378018216817346844629075450436208611778720870630351860025524627388905,1979555135325784549140632159671884528916975767966794053041567609080369949010,501436773391346050314983602680486873370551313565427211463079059712377699011,89930621992687994816740241782189101850155798789984018431980251407286165492,3282868826369017580732367055612592388268611727632742172790906247002034162008,578305562740490300970119859545138621020970223355838104149456245406285807508,2675506354368132850806734281661157638821124137866085848457345301081496617090,855847393608937613640261494682839706645231074802803027675507846101071515079,2171818327876148025869548495211722367571999053680703143761485500967727014337,39358212170435823896053225649391660870782488432574979423013748193945887332,288191275570492030611028345554216621205641607654709145155086545878077722628,3249825448429532928462372418668669420703794848806848965515428121412404941602,1066998292354739532750969233627263329900521209355504629829764772528593728670,3062206275286117870975373736601541435602495170534370186611598288126975344101,304474546554598039012981226626560080976249490617791218001059982888787701549,374409633170000078658918449930744698329897425067278454916019435036521785115,430479039186117195564346183108770552503261918386312321406733782781129061289,2527398128784897033018460441017608228443021476238172649344246927825482720527,1880525138091237137561729911070685565017656907261247243688292461838267515027,2219121339981201938970354209312425311753133101190322790265338134791049813505,80093843087059758576234667939527078397499434480063118678600505439905246214,1118430131045708839439948639515543027485237594692059361790591919010513846859,3464254231777301373445048371540402088583655717901847952054264034292429993584,132888159470542797153990430971334230517741766491901556304829647573048464812,1326195434590805502307654890891699059937118943590845595156951465067218200897,2308102568568136802118720458570659282004350741713764058598493018786639019390,2561365866669697847512689860651153474932785803807115504657468865572553401120,352902834613267595444065307871459952328212150009532216824562631935982229435,929246778360955416541799222699407483032440080481253128173995463992243396935,1476984354095353399070333885728664607987378183217509242294790149038115777063,1902196111312738399860273679822258139170015296999347967448734773657511899506,2844717812449471056596623863359506821858279471440474444336441409953075644456,601773681035710830782262392268670516103625907140990933838632130873216369202,500141994516238422220803134125819495359985189017168891073912587885603153166,3595631454718695710225624128802858652788100183329560214356368924506247215165,988861632529095337150584851108402557615174229891656174971514399633981947603,3200144121955497185208684453802821025059544171420374197886775070127392408493,2458065326773039053674596698453093754741572077494815927580948048767141317224,150702864015989346575236421418624236351368014734121957981623369846791386873,872442736312345400492355599946324745887198675713315996732655273069422109343,973243036055112574026164527533946079096400171652528472497442383218200987119,1989812701082600300311186576155130390591752528856186423351207664744264168,2327704012094945496065976607350457665475593093866122503696929165321957568006,3320869578779827153914919957161872643792931067934967577673388729032665902013,1819394411542113388271385052463686947273713570628942809267693062303481676377,690062025853873048265187444902438591156595115348338367885798815140829386146,2140053360949001044267264434840120733540954403186134524735268038836307713026,2348757128692585420205678579634793004994975022211005581977533208005110337071,2611137527273885042922432088105825792668377265621903230919310680007572369276,526874554944783060706243945808428386131169588318694531796549741106240522664,1403780694696308035577824431745585856772687483649011440371771012120157138723,1477263277746546209436467288274050043094946829952491113327958574835691816824,3140379712662425589489033555810784942953076728848210042280089787720511280689,2832164671816829574935594360401461883176891601089847112328137589000521347783,644615345195702115852054240395377949782656337858675556587591933329773666896,1102944181914777461007998895352558613433041642545648900941522670839315119187,1625165778432774337721579829047822947713987980914809235235923236723308949710,2377027934413511223046993250810130853718839077590890064725518342671047145125,159530002241200913212086575903738615908939809768963280713799394882789388034,2122893853646336715322503001913085842255152462903841528175693711666978903577,2279916769567864590206585446231975595240620317592604294738062469186387705506,215442902113835983329482887663346067665421728022085171631918157028918001032,3474483213265411790036318798640916368519191028166345940450569502264886748610,2988269554762395578807868311483036952991083234177310316352270652476737842797,3595757748510927823814009640710393652727472092331782425653652531033374131827,2299270720605574841069730833827603981202565130306795285010919282656170052602,1067070946016399054677108543761482258631463873949672354352448579200103378927,2782495435928510886725001953034015505064375436454553114598906805334664644528,254238502955587869800791493001168505888496201528723336519751944982945544277,3054878510454100958190470586788864240613862813091782027219501631179765481149,1032764993887488495444538522322199452919794169950890400818859372159568210810,1850867792009516889574357704218624385410419620709522292859868074654939571687,641661270684611230267805570130736885606962068934884784048690864407699577804,1854730563387289552920793524762810736786446165870149844783154187907147168844,719272700456033605925354418033985472182880971605856894657644132150430008584,2687893329224890781802279115983154639638030889273308421198668787272329838221,1873860930369557890068606451730377043900201687832871771211863721415428288070,2733582042092136664314124481536427195074379039510939613900417976192659077878,2005421821417096848369398869548147682098925362986632228652269722428997669590,450840756744780703538902269018843425319686848819675817660909464750030825297,806874389994345976802530153967684355924494204608901332411221510603884130220,3593716714219008976711600330355305024353311205852512135190334369800549225734,48962157337641104058754452108406590810380899002822400628190199349092544849,3420744390908444997934611114143570188139230513544829066831903357410570243020,1630205448178271406633226402520645604080991060841592920699765593731647115273,710891021125201690736992180352066357749315628247946689218844923823840846447,2925679562287428700158004767008533938867987721281669993191445745141143087127,1491958005822724201985032733257957396643364830416641907171449653655172886212,2116881048900375235122987004588808002181468249289967762610561816397957202971,1626643650821356529471542446892452722175622346500170623310417243707146690414,956432375741667736353936990458218436624693303922960978730343074452123539092,20661192192870367389573078300179870549693191293158510320778807295009708797,980673155675829143997289999667679849951196084672710842126562406648909013765,3078653461589863668920517663629386153183674264805371559299077593596880366283,487153090777652686656146043361756414557223221426702360763135383633136145439,957381424344215218072705722973678436197705582979719628816242186701587273023,3078500294181869830628827431842015198409270297720178252716468918166069193452,772004095104837964538968152147272928074789309268944528976259084176613396479,3402580364071492701348505812101156189402260452920843448244528465419480649227,1809112676707417474829976305759057393612412639999440525151907702512447901463,3192866721882232606676710888573840457740033655110249728694362333028083247530,3126407296263948460932432986967775762323373065414382623270049599340849075561,1564352237147000474591217646707231851469819163776573241456559372309779346797,1975884634813769049907653705727473011631662792753844216827155320988069004677,3231867952621919563517725354332203592110568716944713391918485532673124330891,1355009924413217073432032743347696526711164943344409806608619122694656977413,3081074704968421120892804801985439606855934693282085560952033603136308189960,739706224208942753562567842078401310343146627738211563610203303791078846905,3039608011008678889692231747322277177885483303245580725858537891776233991018,2143828302481348436212771190590117050692094727524151727530599771332345929477,79428054052864678022772204429628636081513048768859999899015928128565277443,454572258449731359829654068751886448186276312026018200273400854295856517318,805091251171230934254084748376160513357704342568760028158937995473077827420,2394144657279931685053489992578668923715815088830950206495862483869184596535,3534965585927627215781117435557487861843914188789657743394217326489784340594,2726999391436601423193907130060477499460279016323258002412625069915745364483,2512183570913587194528845093909594381909987905302122622928640786063709451325,1585889673415662199499015974703277864335736510749950208947208498709739507304,3482384829866685217735528531573395678994329069084503071260850202223617792281,53061523711703628042383215454888329111081102701115157531142515820749596587,3285877258143945967467297974310736613251685436193792137770312556028532744360,522128953165576752421692245234534430095121650618668971114073051346745343725,2359574040881248205004279899655548194229202946631788751188251634303187725689,3324786953681276022532164951815818326694922039423133288179875984239534037839,3536316763955808122645207122596771826095668722556147605148746244509458535866,1301298230670103818708998142049351958627819224225264822797719934306934658116,444544833071505800543493985521855433275076623131020605674102281028368602189,1433626595546930044098371539509255132271625081918848518960907796686898215257,1349074865384826372875381038546938557738583171903947870923936863265273986796,2285621112156530488132710861835928911683072919389441987919812225318239532845,871741254688986072047329847258648865309292667168491696928443440617987979420,2067126639788850190328298325346830622398437911494273515178659447533008030897,2776590393814911331560053852252825582519104487084754256396315939065656128000,585610327685382537378200481118932086238533417473942092959794561501949329657,1200251567419072499880009311918473651511040307194111085311722681069973743245,3525834798521147806171405885356026326034740002555312632053203842661874700724,162554217297342344933362874471717541885007275662334678308673704759040416824,3360459432729996373045051950684257065526722690358735365015262843370893606365,0,3032612413731360610101975432344996668521245580031018963277842290596256867340,15,1824947238,1919887490,1958497838,1567590902,1355231460,391356805,370486681,775397312,688830819,1174381776,72325896,1119665942,1482517024,1017077469,841679317,2016932049,610715136,1139022645,801866982,2067132310,642939644,1651008584,368025461,74972790,2120148759,1845340112,564927840,748503097,409264589,1079993223,990839031,233712182,2044844834,565873404,927369136,1995019123,1458383284,248171625,494035735,862652214,951586692,1038465737,145545078,723448182,1334836008,1014588778,969922282,292716607,1838178229,756113420,1352922556,1845383492,740583978,900066404,1173039206,2056194530,2035356502,2051431102,1621586599,1059452394,237,2874825686628432624315191439364900503261650843944588051318259911103316166995,3291695124069702664988971159391813364526172431695623511991593783694558893673,3304317877660720263249212008386629309725792813254732579375481071037982193566,3401058268733350787920019347623169399366321390303100710332574687110691974844,112438291262753147332449904932405816766732340091607712300070950197536689063,1987112483213896231710177482797947838819218302587472439384037477619940334408,1530774740094251041870440688027258292184587914013719130237247136906130902832,3160393666297799121003985789090123926501889326477780272160049625848382178267,2157762521642952228940875406035338693926175891950158570563111092810868825499,2711766189680739935253459879897585725284536192764194034598689551346763519427,649691529576666346442516475345246573072220035258469663969798416957099021327,1254125393534298288813181790179694043986329988799432481061953287935888651814,2041557263680662092487564186764085543409366896489844813576710913675363453477,2881125781894788839889871814645650014366280311626486807841858892879443839993,1497056507053455449095346028213349003440708915904858308242474629630365852836,181821687128025876916764896526294512809057564576303699262232435193471021359,340254960866004633865304812285861016181291765786587210646845373120251858509,1097620421004038538808616428096712067199895716544827335929230011120182723328,2610525069763636189695969929462445301378730991156299819303946304099573174910,185244448854534770592831860975646957544660156555130402591583153000367188682,593216555508870748221249846997355308714058034373654181718093281632624304878,2127321304689210381448144798163809746782625915909379859785043799534597033547,1173226948976688265099241239460753469608755010164607946275510081682847069428,197622714703056939804214252407785519691127015175644981925257162809244072330,1796579651681063695873566657642742308493358377721844386333312352198824480559,3000065851151168944030858288323836575313699559538564280713063224688569937176,2772374127574512360644388432986300524938204645436189865855102308941310607543,1607948036922861092112433176488499456910866382807397959447384123103625691298,8607622604187164637892566161010358527490048029694360536107152196619304627,3374603823175063196512152483494698389558685680462215114632361458345371954461,3434500923382107363066226475407586856826574019131391484587220641366587373094,184235300401367793890243695314387000065572837448428898081059626923163768471,1556466157956495245454005596668361438922482695156712696007611818280834923019,3414605317154683541117564590485571292137339274981694768588077379482180994810,2234454102093349582178283488559830213738729624818921666731039288454418435931,2981395077335957340813035851727253101663384397562180020438043249180407453273,1053752189980128303117619310208642883788377852664331739524737760961201809627,2080582215021962585115715241137632244124580775337923130680811149098144548303,2796485001102094022798275858682722781204801300154713179501795530973434677449,2809357068906376991010597540049184271223655513397751906603945204888798886704,3021890939914336900397871915527913669566703156855691593456503766980952909081,264276065527607867449268777978377168207524771728310893702373083145888074111,529975017292083197181313642031018919030516477465508306420300436023054340251,1786289445088207086824780912751455420810081417286945993530945898312728101427,387343539830815008579722169991073709872839937732083912284643406803343194544,2013394149195149684000495151527437117309049824312330712895918284416052736262,3216933666009512615887911602435640512647105396093028468554434569407462851448,2357605289197108360088801495109352156394495196503257972084945239438831419590,789616945287652921015718715137983095434656332068889278715323460907171023277,3008448937643385097576087636922438665688546834493891471535481208571856768310,388837614501570546605783522109627921602167821293973998561565637190937841895,830209612739660534287438950693946269579041867807419230795995665231414579519,1670420327300068493042448080732515968272480294820674649645552376659190937207,1891646707417760053073157740355457709768235952709520685389759395167461988893,2066438576722544054245419507221642035021494148489427258564661654027372113803,2374522238319532000720766146012749598693686603424814037044070366860023528186,3170992270061381881034495616353834369907044864738700982597468529628965976305,790336345544078351028655999381528682781282790905206536779956395319263281798,3600121988118811852619197596986275606305778762553041390277806129305785590579,919858781020427706650394371173589849429794102538678603988423282904842002140,1181120735577398010812995180205342536886223365757720951549851456380849434213,2856746201714667856611192166611267357478096429689172230543525350640677507052,1789170543916836345460820297773506971165638190495920349788289285360166192124,1410251993157140883715923390692420630384213389622998990806825196136987851548,1196582912789206511007137910970720536801621619847554624887926271446791389065,739964472240695568119703285073581743588225714229975987973476821916238200363,3035771163948862368230826783945338032191526403161421378003902428075828187955,266844445371018539642334701512464936413605494350054994516769037851473587220,1589133483625121432384433540423152106297050164719234573413399429741807760395,2769429702725689234130498089974398615451247847713313491382695983915097787081,350869560634106338405901324822356872364862839400451621471584096223087862050,3589767545683785787520419834682019203853411431828157989219387595949589016163,3170641786984360605345804324163984405314711172060607644678598883742285639772,710134642212004621483820028899431060834935915538329905989688171436566033457,271228849486114373450985632444979179118634926984301633551471784472176325085,3157826853432552870870383980046833513805225913339854935745259764378007374318,280169020898917217922386798764920068422408368969956696027407340210593848504,1367671892098418523378756666840668153252956807241559207742660994685217319327,1461817357366266297779518101098307090525458721923849635424552381386550991230,1480865345017226060152704928720920030670230999427508414479699028180017765096,2525862209282036422026438372474919138647858909607480315600713764385363261834,63478266867328186369945210903093957732556720145482025288186972763145614371,1265245637330696155558377008716935129136522383590499200036382949568084240311,3103076898678003442196508127121458975962497700988964816812462367025308745924,2506609543338008916453724281294322912552930025993011357790229201401838000319,2590840136173136058209021566123138521844758564679674874110995417960160122440,2659396616023050782304556617553222173117089441692710816880029621907022382249,1742231893583181449640826284912245068906824929827139815884061764455559678185,3046232875559581543139158991032577636528287461576187410018350435758921946690,727316741969274047797005484188745638945720445048481250714011879617561655153,4091632536022773664592384872889185303842611649874880181903748843280647160,3323596788384480143255334087006238145826437893336255714189258371092526848188,1179094077749493848101980861671543105528907284097958555614312252060389414718,2492036286681225350025989192060524844281176578548575501959099286163447984859,2031072883662254283449218725479402088288779439103221283123961900966397101239,935560974612282615270678269579238695889951872632503531249549253971128018400,3400626632062701978625437728306432044838168594989156868823638373639239690549,3340106519864943161019964682058793415203001020757672149757798257393990802305,732237680403792867514787075113658134870895656685277054764714555909262602264,1816676952771624974731822241857616059680256366121263048451304016421007510811,1745438468213969240021335722836594155076873073691225517658171515826398779962,2287212916416975873063870435998920275189327004030149047046081029893772220823,1398015338843581003151672071427218060912825162605476134066881136420939265502,1201776883535917203154047113230439461842614045716234486611651676179821518786,2283253507770517070880520916981253443482000558781336570098816287790229437692,273304582467494391302318354438253959771419026231346902138966284350976781275,645432345699707958673393244803320360001333470353339934300968434739741540674,2667098902213900385444666276074641593534402235104057007128854635744445850554,757832381031649128466296282213711803487632547950587834151376991434626097883,1237604566311864707459835540880052126408972487794874162542627373922741578022,2941850488396404553832688959365861702602659367492061580946790439073423231193,1002190890579687109757624857776007129203331430113692607221276374015567907757,3517167194736259621768360586380066699502758033391641349587277734567101625070,29449417673029503136652048521448550696562633500495806733866657554614932561,782353670372457617115900429522240810503567004783900115576299246841780076187,967692465169642762309105527861666806873358975073923029887117382798738458716,3250717742016440439679770174831832509542000497170805681015720093774422022034,46569553014641249837411221522212509678843378623196408086827377588465299550,2292534170450300073470876186689285421974703269906207525007190972166658375573,2078481315416173098476592263444306688977441704808219879192693756414946651005,2190734551435457228917890440733819439479474347188888643602859626754895793782,1853225333348576868767607616693568721115423069463728400310215476965844687224,614918601761871538708638950526850254518512250213481554755616823877474582479,2445609987361162015121288861499935378115810740106881948311550215559602031194,1325998931425458681750161274811871001435875921263972057241759232072480706581,3180326623641353564806829017686208438831584262779272860204950423537844991877,2304353145064183614557856291468115623774506725143117901942531126859289537192,434768549875695729208662730135452123131710017790486678109627039543201007948,3452367100027677998281896921774338537312844265462314278063707306509422709708,397688894615429073363444612855414671889405247548569503606900489111204113964,747937900149412447936279973092703626928612026708758930585038480144774370712,1002227201505574606915730252441752067330325191755700627884727716988301787846,1899403895712145734817342820730116023076928924673511631466137486213854406397,2184785511297443486040261678685122469013183231963452282623721981415842081237,3462568354977500067629347992532297738940848297892242845688990224980163969529,719250301368669241989540723471223998377787854114868527416320735830212941420,2554754602889340052542102312433675293114606012572484880400607324299742717464,2890569962406462518159370642363087845214062563520889331036071901532746569025,3276594049754976501556720057375347044139012712490655706538011561914927348284,418661842255491892324290898062384805263840363785711172978724070708669193052,660554643768708049403752834511116108188833097692398927470448008832493054605,2308969679465581400077395405528283698510160887116412552395222612221620578485,853082653587829629333439413370604208645993621763029610655748601067531699767,1783547588143053405379555101670064460229013813952003930106657523055504781496,2151283175494488759447112584530919582403437193422858931832907392176714200939,906413512527685383915540024281992217984554166980631593200429541268143677997,1998882510284673819976118368945227549006243380776100174989072990368908169470,683622167505602615562634383688009136257853207492357230335641711501952814817,415423360051297363322813803126926640048671882315698716434481532331655455040,513461706186734559891879029195158110370399629887144138593981670517655938010,736940088995334404456896993812396038333343960305423017732708123162111299756,1037239267210829410514586859477671831742385937658413673831668490859436618917,411978026450548979979492067175724048906415188122171649317933549004198870837,925986948787643964989378698663223810330039261042059115554491167874113723492,2289018264525576863231284913213859693930251536344916653382082181143219756419,3023239478780212934424240215242545826305865420847001773371549390803634459186,497715028842400976861647294024459725894642094608061172789980399009796106105,2369264730725300336279026555012302964737321632184192224665056457940408306085,1386168757450949748083164284410490779171402938335845091874440694754166195441,3343595292047883475937443008224254303925101908523349268401921751300247560606,3050576694731113614106077973260014353539331584712816381040780221615022739216,1803296789455596562269487463584793350915729971640293784572514594792973773205,146974353816669127560537885959043724683914088088070456869306497953345990866,2789393267988031768198546078487452417570982166234529819953602955016327305932,447776701414142038386785929201343495060501232418477369210812356504753014523,1603930788435809517012272907161597400903647744336569042914585175460912602345,1063653684780613603262382222934738908463636896936738975133944942600394509918,267771169246161847243226609134442274162016407352302373781681257869326983004,3439425576925473153866291611080986111694011782933659964978162593661967119781,3541533385563566435879820391252516394103887415043487621717080953691203362962,3481112565633056519206716431200387704478806649029327394700786000620686610715,1682311194083682668526908941961895889175827752773228258697241254125050223850,2945789961244317110835591455195332913526522861441885984169009586176786260740,2872839646906839519122105670027885657824870570334868019033081909721021296714,174377560381699543902390093521819127139010998026718247200006700923999187896,3322273604628095493648616916093223180288580547099622184339017487468410382294,246343457101190440487055508381175585164544712395047494227596810375070052010,3218963395381563505920967278354269776176970772755767871699486488623672418166,2529479725356558588355791012915142966244529059847397550300764036898348772672,449776576678283876845801499256138850051372501356284889978581712582896709399,3502569968944141422363572331841208537662375821285103448313621778236263203594,978029093921638865578376096388088205533569581156105361650278919400484536662,2879748573641678318175495103231325076252741305616863517404283249939429536118,645944436002943668041664536146576873624540624425195562614889715489145738280,3501810643903875962041763113008812671123008977307715721958758744426655400822,1896930556008372937742488917252826519852772617820403547131339617684255269711,3208443245756182735969991597608375596642585000582828188817795972341005345414,1755675037272617662281072963662535039053408758334030127005788575284527577318,612335428328474322596129961694488558831188671288189164095883466390607420197,2382523305679312157345450117535739671970892581040245452840163245225138020799,2213048498104322592612945123623617363875692838569641373654028528938089809872,3117854072054603829586645247772477011598689153600075328791033285540597673403,3454980164331452710057627154820556776412350880743236195907038098591473179817,624127590903995759499058928714778835314732771294563931000609585189025217684,113550243696001804237725444899558371481557863796944521111589580110076292862,1063128406554495322213963938103204121084610451020204847662733116075881332492,3580428877727768473319681799351655096783370227747901747018914807346150531219,2152311212925752565658980528025292768670774559095232206463062099740000564128,1331188005986265120267721965421864896903720742181804740010905152864129039391,2426116760141099966373897618456751154037269595674962735406717710569044543097,2108629485970311856378964909537368202313086353584084846717298922051508812853,1812033620506773740406245257788329252908865200279540435176287991890654779421,42998461113961485263336020442154242612109230056948624941054162814447936966,2306967174882351069162231224990724636515357210343133498225284852339415861523,2082761329825219803370143888650270191087571649620576816075890902694298123976,2341527443792155830811814484592643490523936511218105217402256570797626384538,2634172636563550949078931641615193389814577423185870117119804087848848153971,2028315078143282344993465991753495772190897227592261328259965833391479171828,1855390004621377521133916120532013779833540834951976829592395864577737867895,2105397387469570016455573423099334062227708799990210449169318323611706390130,3340715299683090413290531230762046069049700841072757816413192511080423591628,1797110802854519827627925074523459684468563522660672413115258412904497675804,2949623248042454497449084313941621499585765456284520342108514237410448931483,3516217345107175313310729332972261447082734251798237838806411419538849577759,1705962785604415165196094103620476657894686737160607973904064867985710263989,2178749537946560389586306782848431104264034527562963537431205854598018153833,1790334226299879922104055485674241095517180390403279245571938525880690761869,2574491752341548228461336520039454466441640515764425565768308048581940990560,911798108511891411812036908501406840510436026675737800903597377096126767372,1294373516929269282659063404743398206494128537805078281961751365746165389880,1330358092039486027749237075679544898251210160511575288829772937865841383667,487701053734069786042049864943220644998771241200104903974893669425216295919,3008614427229318670201698506670568178623157993243867850088225363902881788204,2313559250714065137463044784984947576169327011304603211287939495272228129419,1169243084033705881320363965206645688664533392798398356849240507559017800671,3464824275894358246493290969966113272599014194165022295528424874578493357807,3441313930745090116534437363291123545960580590783257056701248725364321089869,2480157089527815939323167404934584510410755118345353194883756516484397942448,1760582352859004015511668260557626794839585006462436254619812645251042470984,2306990073583531124941933709384388399314773549747902107304700490279439519059,2686672766527781038626572333156530672848199593494786530894891093648232995827,1371179928982769543437789593029566728889835493432806600713418666999503388379,1764826819835871810780050965839548100322715368484088670922757616731221452304,990889793975159224536356615258911809038045290113834200947197065910430428238,66567962355996601431525901493987025222135821110587767867899936987351338704,2334634994329992987438515727021747757689558314329049040781424060253962241128,585106962332158499407681884213406678490360152826566350758802145693418399659,0,3599283571555999874128274521819235981902327268273101952046802492750789906809,15,945995459,340422044,1706349636,1161882194,821635540,1949661165,1920075995,1934117337,81685811,240922950,2105533686,41215698,1397168595,148466934,1407074386,1783048477,543207742,112222066,1944392973,1002296809,1954044056,1788894617,104926136,795286284,1845780740,1259130645,581380166,1972063988,578489965,458984845,805278494,1743377613,1307879122,43215079,1952604301,1362813675,1259019164,1593748856,1646113826,451724464,83596716,644807003,752474494,245203774,443547546,96446721,1138712774,1397645196,756279683,1728459906,708865099,537908472,547464172,2024663022,1901397041,698506770,1772130009,1824008897,1310992916,1511245008,222,968457427008428832802604815358635171737650390844129240696379526415472545430,354044572832432995027583196237157156111668697020406170805544578996313567797,2230839546202355034665927622901128570311707989154243308248141744815276343553,246458326750086215114223645842185223674146280056197902473071817403436957674,117393011680609400476568866485591425483270998479377216528935144549732712930,2970256973132499885971864767687742116411176833551652402631044261189327600186,3459307912259791339632496149935871791369071147575303744293106572372963402316,254508978225155314659706466428830268151416606960638265770664561583409655073,410678717176961375239555017007597948412867219061365234658064609278819893701,292034459694818553921838359636934622602642618329828197938490948989419579411,763754535359813151415756527669828614941021063908469570063725044234145814989,2087554022748772792357817073046461296519922756834642472553318319509087487650,868272423429961974110418492106610460442674902669286248716511228980427553793,1157107535409797321483943966567501479055197734464842104712270560675050110283,2201075903054088455950339643061883599020069631562114162639076591174856886605,1330338450530922309541526587841018578345404508928725387678761846153675657827,2179129460442238146482086319959912193059657181166736692249399616833209837313,599252604151564394632370299414922386383321359028155594329541747726027936547,272499758180636620224865344394842650449527227713224736901783566493348403662,2153618907545777393377387673773514263259274201523282204519752492174423223999,2480626895115412545612251662497301454309697263952388529990338210794523055596,2010853330280878312332981131851424834396960988305313970722398604817706784935,3312670978718494164068217693761927980808733670074649440854060619312066182466,2988456951334285193181729100586931798142449155851222272032676005316631692032,907183891295102885181644928406928082611271170224789583386680578251535189255,1726435035196813190846669969314911984318619136955047805653735684497253031623,2526643968005441364064006829531489054635023072374169783502299209248579252548,2383232783948016442102503765798827589288055685360969683801970411493790193956,454523845978340682172589937248578426349345941089749862894792744117204528702,2664774123385913384806997508306815981746428475387144304071129660931229646714,2855840950649092168910678244640340132348197685296987151265156405494152835238,646717364702353214648072524151993943014343169451576631590863741080056153475,1596097994523802417968589062517317473808242996029008333924845916715591193660,2010506436767984580833503454367084040175858950401743753349853687919856568583,767636222919888233846023295368293048078150771088912701011289942874636685899,2473885892919625982856533876842625164999900187655140597244245335293635184562,638177045620644716281723857027253932586298389066576158554182151072475990807,3306438762662348356232699136566092537721003136968897486029179470730701704037,2290988942944018031904413223790703933920233757468401713805340951599008418979,3048798596061195096895625605206262025083502113190360227096038824957507838514,417144254555266305035886482023446863060437137423659860756776369651549333099,2723484807888137071690617063968178739471309500039980749284857796884647482583,2936710954993955946866718694562957550960070699223052025755405730885065026496,1777369654962456848269040188899164251553447088060175818810139404889696813389,180809015394613862284654542232976266369462520950546426310611249769459546870,2395950441520689335317286039900048796737809335240780401695976881821762921808,179496411269893335836574232399154408300995970619235722152864851537074887215,410679061005132231917424995896964348637061498440071120135364811451731172449,3143734176506449138883263202554784710378600284537878174803223425825964948536,3330481783957035619515731137788419659683031487581023557812629672116292782853,1645199173654201932534695794398247579736643340083723334231970315384324456867,754767667518482371721005078307054340127729347128703349236984997819816427779,2928721385040215953868541180917045967346550451477525165894783508766076624401,3357559454100135646711193730096748938238697671007120622674251259345232632131,1099030713113818399717265537279257984742075375877376257916755169682972656986,3012030322898323501812780590055412334220755091097946706870323783854629024920,340913949347369607715424156421293767690677559736147849215978767434514086389,336766113775626860920690321018040520948558662249351212300511947025075864131,510093013174309387497508805040429682046225933276326033251035136652417316634,1209759577917019399949690655094760531315481257736045544966279093063214886509,529792748023826177362123076161441041513789812237581754880463983525922712936,2095132034661683545760780712373355113633768158617632873189988424102452744007,664626836084523418098132324950812012945463906841228410794558282196087539804,3595186893464753032884749319005002219943156425531611450424071380669376973925,3135598519595010373198475386256751889382972267071254502143461715304155105278,2551215828097165847591671590753179582971533857151556587313438862765655454171,3102847809179025238035308367070337345262004873538884454507342039551229862084,2182884191109859507902089809461642819145748650233018155060174590473224782280,1298509634338683767901338646122313421465763242851861333486651289858577660984,1565998993169103772015020366269373223437089746577037600461370384059172682638,3580899596969430408619916188619604738755954432561229367987193286681316042726,3178558869319368491241551928529150382355894281686873099435856148539456286297,2942162924974617415491652160956965316601018144946222591549834607625504455901,2010061209414804520885013728614293828040491247257865627758017710491061021876,131963831238394426701783291800825034973423964462939344833074704791311585020,2616726153822601513684853808665139811193940353520569218440279751913331756600,2979451847282111988154714407030638374984606165717727620165411766912342683608,3446126258407353547004368687449229271128671233803819570161789449191815880297,3222589642447146272514370284718500649928709103894726917309847724488682937176,1359985349113851011612125506968507618000585902755888566861599842922057134712,3385069994428770443448344800445456127432904570978610106017714240143151119746,1301992782547011852333936046676890997208103448341571572033908054482804343424,891597215595477289359859780169076341823718399915750691057120939712313217220,2236452716647877436070595572982134732160809654489512535906547057210074413976,2570938456661683736418690222848986209917158055631535881231608203775878618852,1938238083257847483364166534648507995385661246117310006516400458348676527531,527758505276716180733497626545473694108643261815490523659709842352222311952,653622272405407971249328632844536521013308035337292303355242520893227462918,3585104048986646539799235491208563225446576146228899127167478332311552406308,2638584124630941543407919813100577973863884086030905249361149457897254035326,3028837202637066143719939700576618972320137088610579417337597829093588354310,1761256602233469598722182072743212062492915484997580678178864557987938260991,404387465852892300143711061389590217578225896125308062076729562480207197241,134592053702820765712105269454984480944378452822493343668833888962454937973,3504598256642207787924576424848699473768956338436547346542570141650568171037,1940421082606434711540133055795499610461065754105038246338270332071923370423,190011659809624518977314405391593349975842879265808354441185750165602599903,3553945311087497842693595190773714645485079996297902602847386352414700118766,2453456149149166922769472831621339814810959848723651108914099825371099002943,2579469254375864709510035339872733254223910932521442264011387633392166377158,3388709489573617970783471049033031244617080934159083036190261223618879574455,686161673430568248700036745977880880715855309497595485554902081291811923240,2947549619757426646319566657688485335083066105664022110781955519075718469834,195107651214484893591477333515615569590870420730591243059299904410998733633,3356828454890437882903595717712118376353296176863427207320293657137948833967,1732655189118691380560723311117209930041520995119748415617798156738484908348,422297140851708674925175718136147146287279732474291062081442527890915065050,2878102991509778709671392043705811986154555373254025940744130174662579106316,3566605972756181893914849359316436497653211213728473840703761098041403801891,1120393882407427746438818796833145774072147075937358637466185939701066491301,2512268201465486058518557107922605679631628994894155311156223921556859950941,2777064044084037709198425400065109239892125597194021445053670919625804378361,3036467426272886027462754886604389376028104850885296035666599074567216835064,432862519139230796490217358945555806115426340907501958960213228130192290014,471102452712978718061031653998977414191517955543167850674184184388602591441,3251831011117433651140171990951351937215918557166820511450622013341627475808,1749747142313993387509011497406320437382523506112700595168201880243239536628,1020327435965883432795219139525237561390088105977157243994145673867329662287,1843350937693541823683952174269336774776273753131235644609181928866050252605,290654678335102236653640711555544483151907760024484856606830201196429572055,1259237174592910075152243717239721531272035506240239623923036410394776949738,2608607677497125853125283218947567917852082040648637093385813778557878446872,3063629343121157618221083947321492749907299305454419682609763471064419972170,3138683426260686460118015850240314176022200397688388868579733200934934187727,2843430911277300269013833718659546478362413115824431884616465636344192125140,1374362606206328341017869762572450923705605184794081664864637398150796474879,2879453435837102321871945007772383429779732644401746683779549013417391012871,1588126492690823994283164799023395452647562163917068204944209787235316701287,2914910949820901695439219167957201776064889540791016949041553843854199190644,2402670930145419186308442750904762726776755517388599776759419871493834897162,2851299562378218493642832040034359593656744840812558108033737731593369631158,1883308430973115148111261509935631216163136693261865174215050585605314423898,2905002431037689293660583274239893305333012273504968656882065537888595671268,1638192764249098519744111396422054846570120646667593317745414091556651353855,944433922525358265709551393806713693984009061317298171395795409937347596802,409602196318220649583234883289057126888289027567496320232851782166356113485,393403939304301637924995544838090050977696905016068295285719454765939584043,2335500761210691532445201923450006865216657040748414779986158617740173804978,2770995437462980611108875135491742537931975017362866086364489217045390965636,2552676739974527779878582511614611305557457476518974212220895358988336155190,2783895626788537923563512134830353794679880110827601054934731257534537582028,700475498130269717513567767178027126975879151825191638865756825466079853989,216061235997572892473301755557188602218833460310856290161657449621287750106,2249101297488388834026474550069453659365799009717377042131628679713765463121,249682110498033397066607631697634935256031984357060565867479276806306743857,739409947735503341099754179358734848978916836754232114185628212657337983076,3161155514638286469876591555467295219341909769312076133852611503300343312627,319416896544468735822083076377542027148530922396491902520887580819013188528,3361608341991976094452154995519124994250661392294676480874810021734506735207,1504537757520435468831810401991880247313276779315937912800316289005186982665,2209102543578266833588247901913672603306675826689754606718017618902422833937,1286976521307703869141961664266616110534125340791066750860149817345810226008,682336522097715586131918057652063669608817869062995194513437141357605903157,3453517791897276247910848482707241140456727496138831235921563525241034651527,582622283406007976104356029502885218647392871213229428187691771441574650081,2480004571560242951128156366334904331203731969206853652773639425493634659674,53427294014099887772738888992885936356643003396771654995359028025125690640,3265906541580508945596814085921400659962807400691937715735953186225341478490,1505755412597994868825688782007372557166263528004602927256597457401994678260,1926261694860958677586951307154016584607573377514027297606987092359696288001,1128340576947625867457326732039860490031426332238555837534142598676152554740,1096519138122150140982592283749534525525032528283450729946918296560144868770,1895815435955028843399062679154655513910366045751866542082747756958471052648,3087433606621918713408126371018058862442108373794693477373256986917099011895,2238256489623842864906738772674708306406657114378261972613194202670257991386,2219098761478291824092567118139348365343240548624716750542032146975511312783,2269782645759511541933513921895934482753229418957026485556159863348880156018,3535022529583989888478578648172405352191087434256100493439592433911487684349,1830820474147682984380680828253535457944011380811158043121597461804893372496,3526116160171869404861457686803472456170756590692704793519053617801753011199,1583115943585983009291741697349613004374479989437154496817632874050729939990,3263952495514228641295768603151173025229211760089884865115204805326204907363,1407342463527631843192502015886254039510244405043706115170718042061504490504,1920107251791783196749021486366694782081833975495934853946459101154688958036,1176143708757288934902093468241046765181623614904154206610647462316558705987,1960093727932562308210252323865345929616671065704963089466892900981805894106,1204721259269447928186087371976962528914661723320627711477182136561663756997,700496692821942261209776751551129685517278677090694480600494428588455516130,3097089129801728382926163800361027583215039698118053855676011961610076030012,689336046938509883457385901204036190133710593802391939648794466385614368206,500514817742819894786769664702839774796302546187583453305474267963166179860,3535282486023473405929067689223016326751913658656219095077005898313066283610,924270457508976759680844405931645264085452962018831062604877569436001489783,2274688383942754751681520132708257694571636553501565265489870327751372232693,2780779358017648292792646669295717754738480219276130506237877610389157355673,1144581190114905047263523623784927242406674786393729145673839658204067099239,417980209753819624595451524153048052425310473871632726391153794215345857344,454806715788198751653837363358139273846308278731233357793076082854255345707,1425913871724258201995134023690802855907454066861348711616741848953002257704,8405407102937914096097478222525643463462685823669539201312114878120928893,3460509859877729873864264933580687361730750741171275702310513016184707272744,1779645725254085801802105873122857929462738620287496268152216191641639074379,1296760661088838848379340547401333749068825451039304418980033276817532010170,512672066230226486588139040735980074261855124780422514778358132347350285237,3048751536819164935138117591262091086303874376258630726529325426930404041231,1571745767933942466068926477389569883659050622413386177714475581477741299462,2184087192817926258380678554374039959449168120531060411537858637547809938305,2511503424372868237541498897171962707527301700193104899128097906864405372385,505371940296297575140601917031189472146314940835749410324306976084151491331,3069371076633563674962989199890165151740596751226872539977075996869469274395,2896426627103522915939997269053888088754353697191193374007694485214420531362,3415896023426340820324887543745299956502404032324002975750096081896796339636,1829481200479961818036628728126070258513680474342302138866074894940415323521,748790659395846428696686772934901467697822368086662835382517616942767492614,2916437121043313448975178537841765141731816982460275202081678188232316398413,2127515171874511855630757608428892809357217626882056323579468693790233702370,1078283949507494240847957571602622920624131266934150309118811869468771816002,1066083675522357735944970030391028173952710924209853043008331739597118052041,2125435151030287609181637948429047861224288337296890425641934760388428613770,2362685284976875499980130641887238295610125210232948272964460718926690077183,306080806194361960718643639424798475600873375452042296063347347711401732344,634730362070416607093942505473768815737741289804719349241619150210401720948,2792108420710505495307700723821600223903758198236074093835964167787559273015,642563462233779068485331738469327727799137936366610733437702699327765178315,2705367858507168495087867084280828188510636675275481438361335200235269382567,1975669073118023575430559609020527755154731465404391779545002233431277939498,2140427364503525019743296146985632137730742993152574291168441381288936619467,1719543961361435818994418910796492810128521671362051477810248698921132813134,1819619342459059283645745933226141321416642349622754727133817192788047447805,671946970250134010494024446377680117804830072968446202442747022039234311281,1865697896823425076984240386356732704431041811492286102304726189161508065477,3332249760972520954980052913593258276243000767212001569381352493809146602781,0,3479530141553329390655541321394252536215776062249921901594853638733923232032,15,1698375034,89170900,216536735,415994806,939318219,424190667,480132468,1215999542,196086520,1479185948,34703981,326357977,259009895,548529577,788541624,1543193917,1819694320,832211516,13118011,284103840,978961112,628998939,765644290,885026922,1800200922,839696179,1781431201,311453638,529321158,1435755025,1277831470,524973158,1153946829,1154535249,2014564108,1916041812,1271735193,471902008,772751157,2086819474,795021070,1212584996,210164204,657325902,1756355478,48038204,957135547,1133044344,888754697,1854100626,1995666560,1915827971,47257415,15959276,1812201750,939567422,2073209169,2136418019,377098156,1547783057,207,825420541293200176335296129057818508762621827583385514315387213951925883365,756343907936103000152801489033754677935892227852826652986513532888397271525,1957308292624114804129649765107797593478917916371173867728021797029111873258,13713454250278977296358766100279914785106238269839755589403231014015426076,1532743971047761253678721300732721440238294174143654741881296324613160120128,2500914083813945376499507196484563170196280694081426381432681983174466348893,688125673027378901445098911236460677605480191550855099677083294572678554978,593976837672183376652896689033538486456974460800638184118592842454859892484,3081286875202528033786908683319803189234280686885475873056040959717492613020,3499465109683821829717022690916151837043763705359835404182007640326516036794,579796131851515986803085543797266578518795967404114632767359724937237775968,1979139928000038459183382772939847917782982737653085853936979968772017045763,2082124353822147987503196472391365964847129444676135160659330082701344120773,1332445732047847660718753515642367871304300072199445393774350099858691172253,2928406099985268080336312304873635493321929442145376482431362713382338118826,554072755539903988757615756753188944612234342427761359864524944646118950640,1132330875755528378428659318512976581606363224941284179317904380578910521967,12369776236390399301302691398989008536230607568800606422318965547280427937,3045946834290310084111666649352933574562636465620955189988892974813671516094,1227736978975685117376784327760002225858088222501775854509842526721049414850,3044579081162970660886952979939752434516059317815155786604015297747686590403,3030330502396031967112635424957941892139643898582194833223068793904834375561,1125218768441109896897078018902375835234263148433863079857183367113991043807,3070943914211598023736433648971239042445573138909788128969199962132931101950,299163351032512343538646213274567422900500990834537714191223589799080053938,3216905325086102112338559662833165504043690995471911671038119314188237553755,1435970824811063778616453531898561853435584373959812291576106031796384188220,1016913254187403768495571047343571142677951497551590645446091906102347394531,3162063193159990054965979099310923976825796203150800923901966286143697313802,1875531129318063232163210666400338103271309729258111539363039283049256931957,2632792810276971497097762797189088438430653932426562630476669085352394865374,2461436454960017169246834255738397057430384030821939483548835398908196943763,2623180940161402235782506431661666380858540469388447853669015420289578702277,3541379518409195530605212082914190616720959550744699451845016390591628982886,140984860278467879858227383101389338213854849050906164108031369603269952665,826717689357408003963151659702668180742065039681803194268080341163324275342,3397926759567470717061186016305983224349470357498753069049885905373224069742,2103940590599921802654697856717008278780485256377798183122798031625069281384,1688554065617693667744087381891310180469020014345741952998049190160688832591,2625221405416674628487191267121521079632838117645534951048703896227998501831,3095038891200238799385600269832616937543062392479751755838600362864852285361,1025196997541079222084867971153929796049150589696271961946067794859622500296,1115755290797962900980963037166606772414925164907561283693936402662515259387,510417257202558396942119102085452807914919528578726797160224234737135487512,1832790408849550705530325232927485614188869115399632144462505853438009289687,2964434641727475131737853070782739910097051097852778189273284409536770904573,2864910011548167437073710300404007376864234355715746887555183535758606906916,1021895702746002725084943272603458565322031406873437424217813652361314933218,3482659049952700341524777454488595252405091722512935285169492174958055075703,739411910955517076370546500752788865245858902877304232660274958929522190699,2747904105592093257414709599576909633418754168707655526090298966213423492801,3500655212191641635043725068231788822711729262168413083983041970478522169260,1191808368358451413402082207452883213222815735762607063800812352898228729448,2386575078552728207345788708831448780746196153896180920594532006418407818031,354066295426863717417469564434848546056002915668280272102067383612478877287,391971594307856212985584983596369354844849438826029790672265310616326543535,188970936016399882631320557064959603321918997944147920682260463532076251074,2761482457076703023410056811028927959641562815449267817629085663265999191023,2251398872064035076959011072182553212612656646955934048026859225267113798483,1468194911785611230211760050188391678922502297085479189139418752436732195181,3457689716234149196454502868846282145228690646113206286476603183597758213100,3273534522283048780857842270471112096698868068800515673512277707509777149734,3422808371467815483278108448650303778423244831098503953210977256440597631643,537028050862543683888987324609658481785888633064184622986563465903046278423,544821478637751200330333950260939520231454652354009515420929057583549667095,2133812817885863843648722143960184204853862833136331599637669139865760095882,1074582251688690920711342166552764353655283482393436964139305151900475197283,2512421861704598582045765769187893383384463366179507448241554374834917573018,2825793541038034630246629491416107437877573247006012809227617242373719310303,2769574773666619229549088179613264587849056253622337208017490007697136045514,1107423004719757482883777720786602409307236010099468772983634548592365564738,979584237784816729242320088664341969410582301449671143294443802519416538871,1661451665245422352568418992182398861972681611982591424705642689489453500192,2279098261171002856176396296096826380377680274696860534315444164438558306044,2277759484456767264385019466563064250244494560743218408513439263022545245816,535866358253532234609554627090540732533293208616497738562695186398980727876,3051795055856524726332520862238849805169407826954779235577527821331774530193,288904060699684284626764684875918071182240121480924125565797165078466957734,2178660019685653059476165161851619904533683594494888760079373686224887045297,1901259519770777699244504860107484618268622177543088097942659190669177940810,2273014941459718623588888249295190497166932298755673130621665388839727253690,697447675087878647556046996875343238880775627854295648791092186953884481381,1226742491987612625081703279224977470999001157718256854877190125516521811088,832911233949906128814478800071946322112409880541276009469182960630511632681,398449733410019772091666243308386837357545068355321022613721358515708890372,748545388539087661204564641666541770363705509564371978648189305820589036305,3339606547637534698941736386835044542949055003317657314319600254423532590234,553996622823884450446047424422743318795780375971343451531119633943204014348,3104335074880800053522702616010039334986573801102676544037779766216659292024,858489806042270909295296736320312595210401866517268196917884817625878434274,2690034981168649035391846900280545630721409036227259292097395793710197795424,2511342783005273835933311839614728419511706083960531850983811424087944915351,2690832420279582145950323856652879731936676937925202598398581226106280658369,1095221314502796171968111065361135402262023322193769135599027847058879092927,1981396829043068576991277338076277728341538283963812450806883891812631074669,2572200350159182642706587796350242615031823187008318245341624153360881522420,425132026709343876822088013891544114756736586920534247587443436030435598453,3522457229225941456079922791548684315177788288945024983990505244383552836399,2362942906887296996548317885992977221890049509185465760543339624163281149146,3103616360969140200746902980028688081092296897726006481861418231329029778411,2883939009974399696816078793476671558816695502948311566930172415127373518767,954565460945216037968926402865566052519419859391689470406563423298056602718,3536030234889913653467265152824098696976293866516669596598376913565801566776,3494572416036566394848335561009041156067593621668346129709953818587253000286,2852094813319796242130696131263697950014038296733009082718739791369510909915,1948720605322211100868993266201168804028472542660584154446052623461197226311,2279921544056552344863670590839967474688207829004399079503942375227305079039,301712668919864062259760956705087843262087743530873840416188083053792288821,2465447784861693713379157488557820665304701420707640453665635578106782412437,3343041623247606596136413469807283851222651277867051714569180719546642739760,3130509959338340211797744677885556924629568028657231312679336355527751253263,3073857991152155094917266753756147458160514903675310986165036485520698958942,2491980406213268179114828449234015065775566421850207837259899426007486968375,394162641465918738424537692105756434286230226821463838914579209218736604449,2955252853903559385689097740974670835273977512527571744326048379116667549468,2202380181488076454287901488037085315015137797551929102797115000652147765936,1660475536126124410576396463669014135851904654248532272961547158925749347616,2848610714939340348168336444055154016443701830782435963313549525782524016483,3211519694440715921386284691557626054558905849257889009792058165253790338938,3272220921944963030325576234863063828547878266957350888357343025702653126676,94130640514568974905421683087011856763889697650350321802321299344055547312,3489562248777207638053497470106355045759933919233347968122916562154994594010,928453029504562729209129077967156168922760862203429902785371992598602989921,1063359075352699013084667974575885332740648607651737859565830242714033629515,1183021303208616937035922573986370508613911231109686444886530429804628737446,608122539440608639404141864029669631996038053827639501649932920986773782915,2646838026724098039205460580583372894726662329738528967604600781464441690108,1043205226526053807725264696805587959096080163989566364038997454852062822830,3206186652437873850978304929875405994700907378038283681815788779569177122486,897156560751027979220959520778514614545137731788523050139719617082135254843,1600626184690841944649239857762214615787170627953028086397157899212438260210,2522648293612483980553214775828832476406370847459504982081611624975744447705,1838831490499651704935237201155199795513164590037897632716676400314506081579,1034593514048001422672621169222039176629116756034377388105736001767786634396,1019909327512764052205400550063706686226223414128263144863704391469815013164,2926875770360099817454160397817138024530174444251661732159426396869777914239,2832513216383904366827840335956304337345318502147531682455631907961476419594,1737558723679891170447095490814098422580447092786928998317903443935494631452,1596365256411301602205275056347819065078711664689007951441125976589805373228,382248972157179627705475572998474300238262690465891221175577396473270004108,2413626873169691550392612162395561060790694481371440995445289068177355984537,3364508956445091097846322726657360124429549417408523852529082171963254351291,2747610680318469746169382958281260747335840714331697251938953521844850183048,534327520804619246892904938569675100070709887919211362236671300210375991487,409133806223641737414932409919108251186730129611045764068797480853202765938,547653879560516094453308071662276991527770455501138898275811821941149217918,1818718003916779770194568865865347985964543429832192219826881483699139752441,3378249298912343875358496591783791529388799224763512644923056711401761229220,2579619448970150062684528662577909549263759691439541706799768739636439431997,1390022179984230581978526690762169011111457288671618976342227084721774545124,3040475907421176081001164210004049143637549157100458543756634339044637127853,3106506773720451107519416436303223675328682896045906091999700730426070947238,2152209313702091505868893410120304620147446954601534846071030524001948093128,2587517855183591137030614256261081822421636655813116033439841709668951573502,2079073175081555640154248682602415124427673149039293567341544477188610986611,486346887388741933624624448093276333479067947131090016056757204448470030896,2852633954083038838159983973011309075996420925721107390730157607733392108313,2691719242001860599540479358580856969406190492659486774036916746748135536731,1460016870162750548372558301895841127755869109421351521113275924081577518957,878498938317894678678337248692729738271023708252525107412374363238656667641,2928748075872356285638664766871132287494300141797395604901255938189759494512,2825037350037905661905124570269084869953626545931034494674401190115680745451,2665466504883060551341951910873216180655206723589792296931416856795905442478,880849172533966970410548152401957039247172968811819409238576388139605285351,2795166675138278782079720247260332268324155942008568635184799043669045135995,763814745685084833512563267630391130652317874613474116625270341411860503157,217903582116352387077915657093352486807955585535441691929149330099813764753,948189348600033944565019826596219405468272267737713611012488106411195635570,2749485842666100731958812744435340351504616735229585090116504604148163873019,3183463430289153550465841403096183618611503909636288593831976440284816435592,3493985206886888727739821301940447912997381187716581789400727866114206273980,1082682434451072894079459369340066454756140043152449338290557739345062152939,3393060309485333032904599902077126309540965037425773303571097316336975174810,2913593374379990766062049247213692417839352549237435857211294708743326280053,3264617983103605552250782524865036008777586614325340396672234065846224184590,654111996138816320976080682492179489154860321843089460407467272905129021227,3407008466661542926120099652048479230272608355823528728161595712597706283330,1654802316229093320226022080675126989439985507118741250544712552409281915783,3319514894948683968487366761539184934511660085745745559009534362277660963323,2444832693617601519455581151770484761117720376350745398657333277688274017594,1399557496456348224316278770411796093485319027057415100706882379825943459601,1693110698719910065226634996812477946456333891388953764402704943588107560523,1629607982293677723808683096989407472176815574892962452036024305366749698268,1720535826969402701651072856335004965536301252178149720230320546908693342232,1771602518930831088409989017353841040177848142518221462121145498397502632807,3325762398468536329530797333024077260405747886110500797214300376058819720592,1362254409674211467930137458345072140845496399131348474863787484959017842456,2313943618491866124061874959390374750615486552790710435672238208906990176728,2525157451973436792581179821943225889277323203927422277731198251860996784792,3517852555410473006759946973863575806596372961943024565399612796660092583286,2210556994671814383368260902034684062357877959230840378607225651690474983497,1746728337777983993134507703388866480302706269972492691517165480943960721271,503524938657056692491209782529895527783812229070357090512937728280177812816,867506558182016042826607761758140438697983721048005262787601121181889278526,284933305768981874992439960311859682870791062700666526092393038252010871240,3532488624931976066204328908376178664845472781916924954821355526821544612784,1543647799897557181720728075830835140501574937852839508857367340427578424760,1190108921518120521851869326859044314477863005867467449917475855892728300352,2022746091798339762394535098848682925692170328002405534193304581209475999288,2837803499646509813084600411679647266802363506232648796342817757584122533666,1089198915751305915291706192940663252927791591632661806822695400936365216741,3475577909777775799039986852980788873941765610164614800162242667119556634020,2143159844680738973059639493390063830151411595795393716754501483630319756933,1879016339705032994935766672845936719179113537236751329764177282906892735328,2993596327338075442139121377418006410923688887418529967033964477812577459653,2236414948609616828977429499366026543749785235523162919636873019045351017659,1076876522351126832167375645542034540901996655021309507402073312577872733702,0,877363005741917961135977575934766600595771521084932471920307632447277024082,15,1554287839,1716276991,1205594771,1199542746,637873333,1871336515,97204783,753324986,1935587171,1738964274,935973100,1293078216,2037800352,1337612860,1739637332,868824520,1294694255,1416800191,828428619,1442416315,778645347,1294148210,1976423835,827668421,1382974971,63171698,373761567,652079376,1308912076,218490659,195469920,1805918614,512583561,1527060299,1391664354,1073566499,70353777,1699903468,708896592,564312054,2039408250,1088272461,1522426426,996553028,419555574,227329754,401297763,189758252,1980461911,1279851930,483397777,1847623431,1939441392,890231821,1779776662,1141302979,1173411846,1790842469,1088762018,565962268,192,3378312177506882559082911256109975012733837551972628180534075891719538450653,2054867827491815558594968379793277881231399930239622872127745411840730617762,1915532944734718482588268235514853622949020620711053115479736325112001157328,2023311436519926897831399040011246089036999675502549662300762929465584313410,2114750358036509547070510426964996289217563115242899932196252093900939417000,541218971783078163062626705577102617572134494078435801634722845268051996487,455187870349605066666958912451174512537070630923379594967586997945721509316,1522073241631152647937320401382289304584898789509342096642482838761986876838,16642298188481136509315610092224470647292751686426921734365570877160684440,2015007552791636677013536248434220584333510266860442289233543383327444995878,2600231635560937028965233165028449716875606327432124680165868833642933967068,2248608189556095035420838067768466477907649508362777277868135191584100634946,583667495972854153831031948264800079316844788191353639361465994132064942415,417056193712970192200886550146452456911790323512341286619412516119680591951,1923887918076303476573417539765668923605486446653210739110860739585927715214,2775433524108331131123730852168588349935130503531468834093540797160137131667,2508200825064124991952855816973696258215457086482067273538536589482802932346,1370879932724044972320373399624313854106607386472120838128964199275038863340,457669954116197847551891004049246387975129455130793522298858318208600475434,3545842045603924857346607240082887392186923707826081555208088893311014078483,2718301701887850831397117609650604121580863307103500580085544553272981808065,2905074433430424773812269163806745714844722309385283307324849976428711078827,826977443056663041463507223525975594832970269724383306681673767368114525412,2779920256264030853709205911631152103309775304184598117971732827539687445179,1342594329992651599877430075716261220201275274247011917842046827294819024531,2967006570525029358244052107253557478804466057601823996461766979581087297676,2271423866145518650068745526401627928840441717742850170046389412137320249627,2648882127401219208938293558703959020787065663710735990510045255065502860459,994331205048589077736379689606833562769136807934387890732681684104602011713,2988766626109654428557343498874480371508293797207187259136316431319964812609,2264283112025904838771359851824855522671461377010638240070734036562051137706,1171028062445278726936712512200139139576269575113916680517919127140012049669,784257643348221634281136356818843013691696591036081512460723113896625482733,982877260987807203577840803894355594624305892516022938485647401283038128810,1695336733948359099187021493647108486179434251977693809022766272905894059588,3384005155991481188591685971043703844595855403110594109136161929373215407684,2108202573243080581279470898290600952177816147571419228164753007835076597389,185031624400413527498281223309500845570614149685268341485025689006255182476,2139762838888575829562591414996645922488723975193638437587132218569222243166,386225318094265920009270583333704159619353105103331135772203382866429067185,3064054169600687638840615079144293822657184052575318706718859206921572302107,1993315240584627998764291298991623580163969149301036059420316892304269290213,176964093888257483875633289119628520242729550766296529870976929434677651257,2282305937107170845345649727566550122009809911134036798793713140000010687979,3013446368605799377112605537437268535814023643479412177490485645293494179823,2201889991010180492779170901779913508195139327713683631047755121467534925187,2963545737448531697879644543933214398466175164059909850483437415114495926134,761184446712887531655177947623702894708297549743468851374320265803589549277,3433244094707517867046462810225424276473205461792024863155963011867735656896,46797914272041918780578182114908910244640040138284013271537996455756666743,2312135907983721033366506514935207203548903024803656952833046637722168443459,1582668779134335064905714693645371799388278662843139984950450538539143926198,3495408364289522524852007796691206837094448881315047378425807785504934904498,1285986060122754458648916744691876659411935723536212679916763160250201792635,1777296992960394196097172682686500714115428031949172903152855267161217607200,202495680710690708865132499319537769243160393021167786663294212518252129298,739865457670816786763914066290401016958758849967915120951475940623036512421,2100857408348764236836504852425431913492819437250576290708243077608465477778,1811527947440143026953100737696738985129789328531197341731280806179481449090,631458822495277721498492720586968599355112575122301101127583148736134495884,271052109826171647977173555917600435763873230716147030297540642529401145227,2777095131641626196658200413339542660200404015369663815666217214572582630239,3434775525840758035603477092306787202991795976575253143533214169044011532996,871709322319415684841845499631186971463735712349648528418424121148139545201,1270669976356033818633118331148669090260663498612893568830544500965247954823,3388568721958195155978376790907108557465791343376541903368137460478787204626,223365865542662123078881995049994325805054244261488861770179721696132432533,3194897669341289971501264416081712863275808539114760561504995899922146711562,703539576756984017751510459353717418520537561666727615929930362188464521876,1925388514272345675225676495113131896676937184603803513462596997384226935110,1674240720263717689734819701996495553971320812035363486206129922622535766340,1981918087249808636360429395361946008348100225555964513450150170020429540935,1286756917071447720812926149160256788080924517427901846488604422825917572432,1632403719264850661735554287910930748346867875033512747016325816438403248711,1254252563602953123131193600638348974837789991389114744207626114167724455319,2238229916040036796134950049398262783213887211103342553700329930467395550171,2289550961605294156077795190020887288924309957346975642550355755913774783090,960946927727991158970220546067606971302766910344383630466415069291535460877,2925454641331129494244852974768916098596985666523194569830789930076276674974,3042238137791672906177018332042453792222478762869328718092914975051540055614,178641798145561336611675421082284257981146328283772497124398067126875465066,3135522255984210841427393794901467524250755233850487722499781005156862642771,2283904335811974400677460087702255939968820839723979989885420040936302755336,1785484146019699874368358635079459068463016148835114432363324825334739171422,1277082857877568865403922928009652749269006208301611490679195433381046295457,1581570961961004490906324857913699276515239755873746871702574726888497959291,1521639025976778957821103140806454240408937183039626047069373225659961881450,1892387551652822156862688574931274954070019557201166150245376762368359123073,1900134684227528044521020531966336660836710040768251244061691673569732041152,458906425261818245088676758788029376737954783230793984967949390566568631399,1680724986483358636416190175800427517193702606455068641661043896714603780959,1551783145146220484047099539407725039400452920681040625446559988123660601007,509190291528888675446228185786238760008381760240528322181887560911962027034,2468440621085227981960719811612556970295843518808811329198200100023768348552,1027155927854297855842032223264014366778546769408343593590325712866213109351,3362833853264301240106176991867061681679043683024484740672434462652414804177,2257487905945832210912017085327282605743198304612508290219488944490742459646,871995614292190155156201213521179853215510214818964700651228738554902245028,1576739881024398071206318185999164147026917163748507674330634661328045877103,2386420582270173234758935577977494199818031525099745790969860829619544327767,817496761251537018688232638580737349938071018133630634046569170415921403848,1291981489020317357039228756270085195614611355509467771751852389433674752869,2647091387006719480889909794273784486975691333055175313045162278742419433816,1519781765887767884654681913272280057018463576688592258995492499960286253932,1729722632920445024529898073239992863620254361116201136684529611530370371886,1403374925579819261479212577910900701276763557223088476698903014188571937913,3183967328835600194842794839203288899780018068523178188577955335186751121330,3027749800192416072363732338213301639633571444075621180542880426172607651364,2099032172160996291001419779010479159921999628722244005149470973972164659509,3282362480294582452912849804113055944408039967625055553260255469205368955611,1526344463533771346897630422922305375031971594774308031830196004421778616583,2234771729102603032138580577722508400955405450764124774251226005470928548175,2719598266743600972163792743989481728173310852839650301450392620950143072261,3388884553092756336370593257784042889076225251485296927295197090344645650107,1517917162968774089781286430391706616446993407260023751229362735583529441094,1302132629372293693524774627289714745001714267580185552925744546274845841821,280244794998954701562652893757956219412057868381636132791708601694143217697,1387644759838747844926576380878729211640016685641410088258464458033718480668,2213801417801256573724492982561026045478949222966938372484453965369163679831,3086265548735409981378061382706064516470394450043652729896506235932530464478,1807543367066551237761729210444056495314995287417750544688487266432547512482,1182016234214861697704651701857531781268917040042290817669792301616546702585,1502502947847303320118461825717702946072067942185519085231005559757549442671,2773376738031813189270672600737502690340386494102109285806556516981212632816,1005558598503883487690909313451861094907845635389866741071395036752503622061,1862842698989198796996668168343079559029059074735523510961577942019554146260,1623707086088114233854128685308562073769636784464250610410895473963090079219,524019768548799691951832524131650873172728587303194697097790208902078044142,2826046116936504466875797642543696851836124321154882540510748513530555415344,2019510567931463853395146515459097228562445027001071295891140111476303548789,1219170295123121867650106655062079026614397912590964992819171507956526063547,3350026517782092119971609895332670241021089748870997541578440496624176552087,2519225572857961885789902309815871311802791873551107484035901241362763914373,70145877479718475580033240986457857700440040949552717617720428364907881751,1959945492599498016551977264112289556943147427441342281979920878648600963115,2265298424179335199165657247669259922168265001087196002099776554847422434366,2002434345353713974088481805631995759411467738943706547465438177588026868245,1528231265861011293475690300679500080605332249129907866732022005811007211475,551695760150890767296225471734061462067024304316574082919757615422937754726,1990880153257366830811132562106871792690179685803372419569515723341070110561,842512803307260191476421536104989275060796829941128147122208457952342991286,3301319632729791504687462746722273363081957871960713157944006331142770713243,1558152553431453761224040517717170832199160373553811759041622194252147358280,2417729718481242787552304872024490327925408983335118129809422614469516367362,2172960080024594326319623947806316754913619028149680701225171334836771920322,487221450519578424792391081900816572197955467992277856327018221114734280156,110596826304817691052825588511269021897309015324503704413991121776079715014,3298075889677724858863276087619115744741927469389597536356594197036135136014,561401864847960708067200164282838372057746401902594842219326591554827919383,162486602971406312971969249256849773562231662410225966676167473283441824536,3289655549521219429683483257072315542252494880360565386489635219147040469807,2343193523310897452042600394040208187837382197171494225855988499164391144053,256097674143349964299199270893874453364041668430574763228532443475652411025,1290151941345173655759007417692210564936230534459311318295662208061175794737,2183151260528848919974274084557427826411164794160429695678996224227463603602,1586295797147477714742418589698489630612620826782859262114060895834359084405,1001160808046787834837830130479598524043923837774828304396825813246014349675,1716461623298318189556533522310890575462671038909601709025255928911737566347,1165756668229021907959791737068837328518778719686521789194434941796872032523,2552789506336786487227375940856020156584869279712008619147388354972747131139,1282841276175158023456757800052878405869150038464107156128816279429456508542,1234124981928445169847677953071271954634230572624729841393402285457762050792,963619641675602850218218046800313171207987449467986566125800038041100034660,55838033662485239232478807417334152529739088836044672657075165224169381263,3462981158232320479409866268855186276729937123474998995958931589545482572120,2298653751852915368714347024800687497907167248446274626284961289506216066325,2810676217182024851467571895530491261695529329333120594316833661638060264361,3281386001810968515961482491691962781027947435502243994582694738917813969675,1532635745451728342953294753760338654644224310788395903439526999657929971246,3176079269905660241067538698736265619927723068072124495527451243618639835131,1615967062472764721515245864174648972932299423275775325660406692310587368970,3520503394326106163673599303538281119579864385252382295417352258136701492579,3581035775017487031901577507016342424776649114768292758880601527020892060366,2471663870598111671574892142516978023908416229696481153672121391628911054557,1993694595268808567894928403138075851972198305399095114897008027031580880698,1476675701961351904506685246688804159025800805433883940356265213183313516906,123835679022883084018778564888219763531490281731261080008037098186578893170,2090615580459802344586155463099299514003879888755796486964281651533263107411,607469669184029112647811566835645864531490761030965177440295137607737493764,1854740418069040874744530344706206894471639441184692834931985038116364354383,2857949693039414489077274367087962708719502792973640746398790087744678436947,1245746625899076022320220444224658013672322224868150536003763880198447997241,40978245414331668208380728531876059848015574669584714084766218892354516302,2629050864479493111541824624621096071552068085678339218773362002493961938466,3118866369252508899827331186312191601519375019670189081121672840562367726832,2436180632274146874578874064701530447247564223585848861880596952686681465926,2553604436019719457576234840535724914523432407753393699017532390024180550017,1186453030460286617096118718259758348106540384515791869762347909006634965452,374941485872815464639930798273844385268017024312539363402685506771392383475,138084539972725327733045675420100416453340833226070758841069627004902670796,716546930783361409001873225860101529879716705388107268208918221030702342669,2056508735593614306231201440326136442216769399425726054990118733953581715511,0,841371801334721271554963743116536470756594227893839216499883933938444077402,15,1668276049,2001407047,2002263725,657443542,2048394982,117053877,1487700407,13474709,436642210,169770834,450787678,48976119,678920007,235365457,156622323,510576120,669318076,1916543318,1972211253,1925269927,523280710,2094536881,1259956600,465509955,272241618,1503601239,573825039,1878021511,92781776,2111536159,1496422798,137544419,1679791199,1107355678,74921870,1642112105,1167572027,16538979,333697688,1856309299,1939841773,545450046,529839945,1802638503,409278250,1185206572,1807416822,339615540,1880995948,1217626324,1113081911,1241463951,615118027,2011583335,2057499247,2119503958,1534721516,1708633808,1409269695,923202895,177,3280842761583465198925327313401263875759058263686543733261962446535370602278,1614972666225178433469170446801549632067702580526404266026665231958716403491,1744111206366267917696215168323277095423447255589235147039507254761607422602,423111510406553548195240746552971740054854693114860457688475095665351550108,2517422600666134516594329906483472845817157169957227525976672531049952131859,246558040169846764214208952312770709917209664986581883103392867620495202857,1240670929221295673810445049356484483619202102572269199216298083441549593509,991328854232919743585616801188921415707613066169300193415056690925745544723,1796511106728057285275209777016017780033192798876273793951208360450002549339,462246737541679430537949962909044803536713733101202602919602219154750735056,524488524128914195716803842203542162997547374713525934625710184140018688643,3440094785136576703413799206783688378891640155436265346892293551270199150334,660777065851564745974247159051358738084694479189935295495549811829481890288,358901210999264704885948212244001347160321739715458873810992588879790679378,1763958520257617667750549430753076954379920566398597362132300276563661419485,143465498758423937493780196790247423964043527261628900979657238405717940767,2984469674947881982631598878129648569211083168597019424038248216352104513977,288526619456902348580469632662496963106443523027951658489547855654888813212,146213749336512407012344830805354944302020009852505412822497432620064233248,3113461550970170162318384123787741295397828573151452747736174664141245807323,602529957973911783777946272322839376233993310559077601405930670653552503756,198832343098498580751716103918643115103027209619248454691894387731555741966,2334641299045330589992373685755536543259756391489638553815468696948639625041,3612859021763250009315190731806973161991038505293978549367781645840455619470,1690293160729106015781992203212382741185976222831758350608255202687252998994,1067769744023968238118515182207824224234592414231968281479679880389000246006,2642223099160927829881334767162576702116018666619291447933520268954203118850,1756675376347400049874331039427786734792025408805853819444003324257201260315,1695552096976701112947762852237581058129257263742283361705820723851196741967,874433454806829865974489193689220085049967354478662071027820795330004622749,968204880217214329056954170284734555445081543537327047412649399493967486276,1171821426903399658576193880294184554927488636585051023390136060513459913053,910959205981155333631466468635871153786249282814527230560045751030375060767,2142426541145216054932688404409621312874645952683654804441127893550297748396,1811704503731010897670034477623160885086800061720709809623425296790118898133,222606487499607760467252567284233633734978971035853892305074178278916220584,3594525292411990743600281750572088658830523780236639641724357368060471004383,2845663564727054609566921419940300220751979538674835783704229718139039484205,1780501016034468814546709478433407804147144713267155631104968745110443478920,2079693603777379538188563433057799930922354006251756347964893461063632298018,1051266097802987761054184522971762899459379957793449125822862388961637018726,6678071189252637931219762277562811717694902639000983897608299593913384249,1493946366893172232087794611178204102538881235840320814607828389744550658278,3055239942699328625049997407613687655594760500759030857121573074411556170762,1648658981758780189534533488096962877463112867302168768699160243509306254745,421182757323534384861112546159455795142759556039547399922107804695825655060,2932916989521497774208318675313151723304418964551618050797695361188938718341,1459077169971174473088968150879510754843001684175046056175013365891447662549,2479049386928914799489812897038716816668273173289852857529563591135637461393,410120939883775221060260078493681480143323849370481964557003511931863280319,3433859665798205962738276104265265846358620634441001721474991267833708164081,1949962795984101072360714974876595154920755835619382753668135423746326178040,1121653303437334490181468451834294822552008744229021832437976140304546456291,2668265852676684263634059137598979536911776236451346820307553941417932871025,873302252200631309039048794215369179937933383149635946390204706254802555491,2533043940031198587305107483166231025129782396678236035946032121357918305667,2340869357894586786844525282912613339154649684255450414151965415166041639528,1122133785042110123789452900442579316683639814119129885831722317862450650668,130151517351809909434839532898817130949422289094796712732898473112423723077,3533591867408146578566840393469198374877133441232454775175717949961812754858,3098055450871344154778536314164031666315427853163713256421685087391206796576,341946215593874292490340557269750343440446951377305727197108570185690198514,1997429572851586664272333877631803796103022477353169853940692825237564473231,3293535725807361100122300970361701885686070857776552808772959160337824913604,358712908847133322383851152480575465162541281000418002660081045327459722319,2849416091347375057614422238292686886401947940022497892628727440279502736772,1664419535872112553752287928275528098493083062929410820720938223717238857406,2351701863965675968103927343904159559264416029456040109538498638993828954077,292925996773066086193705398797867151329628166047746370009786499089063331906,2807313020358787739405575681063858106059485923643797506823547268622425584876,803108268698148022161542875877254208204494170009437860906238684204972053127,511133931203398424600890285756523162098852702285938888567415625684493330535,1896118300680149196617407162712425638526146461469050249784679630435658055726,884069335118428611625030877234283740947444367993087728978188906738186190820,3282225366308098646486410964669809966933952527658378030764338923229727331080,760579711511552980654165319023493746807014960047421901127095637574686139595,644357511660452165121442704362649168454171491595791610630267186013943117085,1249480007140470637070225299650631677739115499351287030026032535557860099135,1937138492234422182126446185625793394122142379864119420265935673134024683173,1292059977040067280573817272181215679318042689800260297722476826625273637307,402115713983339335181187795495132687334978330210130177653605984343960107084,2219397741849586539946468442922829531419237154374372387835592537849813841388,2859865634449520415227499796978279158365832858044341557543289573718280060940,3134816237890853804513235431885030634935781359873868516928707300206609717308,1183099321982080006756804638629771581577640631421760484463051837307816559512,1469883171701939286430440353659158038816881450367498746087868235992434763987,2391744275206563369391786966902207553926782572915774105140836977223239763864,3074926525560123089938189221684403248569081661793032437315843104159908112687,1628064505799407622375813274927871950011995420702304141925983633142159172355,806312904821383598932321755740657189274127432216604916254135390575483364413,1710934217175746877605017489858726739640994737201867238304754444779974989085,1268769516082141293075117492737588722889840859416903541997801049019805707701,2264178911345469053153146489943440827113253227271770451285376406775466741933,686702006670930586077463291576733539484891267120270030780710050002356699417,1239660055072784999184343681438913537917060184810061747036458179235034259317,1253677382037495465435438242606252260065472756396476592788578264895623777601,2196314101761932544157833627426158611255810082523784596190035411579869475147,62657349352942650981164533625382931080402399068373421125449687550299359753,2546223783565070762955755573097493098078654495277769873113124848612221111443,2891553791004153489964903226198233779569055408236644734404435405013176906778,47835985025445750908027075431861847793275755562050145953868215227732691022,983547078648647113797291326557141542488157313809736564834044748712364293237,2546706584354096614408993925613781480559094452523732297884612369489461202927,382999236378833541313780452755072377296905319595473811660647821992463039767,3377419753232047930157877348602007945579501134596149245029896613522569315213,2539855133281611447066562432132188520095452515441397029773905679355559747537,1319035858613144678407643052255003848911073876191940232678926307681374788245,1374485844604096581622745840503014829451216269343140829980294681296376851741,2615228832472840826665941209204422914222088862823462246468033479229715921059,765609417568985792829452951874959376666170583257377903352064477098020251168,505298114698413722792751706798411612271140498640142274395752490939289881180,1172407174930593171604479428407721957141930260576960248665147594329349935132,1890828752721216207420418914293152636253209318847601349406604667184761463292,323402274177810591248983388432405312607191730362191148125174107701164397941,2795927850388909344208728764149377995820884388313847047406408488929608159400,1565989902832364243261018760655889286029196180923083852365041321570853077265,2023714150577766134343555759173432604505628194071142476994538866846121039033,2748544021189235138748655775425253959613294368070341378479348650646678651190,1264085235996686381658856436493016158809811960402432096666691513730635617637,1014343241156704244769612245073672153475888965996059882545457240803162229931,2120604900715862619744367812731329795655901047449566983842496653880156367485,1519296589536232263973648704616973690110455721759579753114960220213276890295,1417890327677536870997733984861271445114990023263763342739028048996051968083,573641947635606267500016002053932554975778320562135867632394788509332687492,1262984448196800031471218565301646029730618036734663578791522365563177266506,2282748012686569766078885076315859971364968734981809852694859509919311501508,2952607959892623159617891428800485872169698350416668677713730171137694715798,1109373200034358072797817669230891354215992535124535110323333238193891669360,874135650188987551063721830915374856594415638302815379025116266697079750459,1154296065665006319282207633257481437187115649948634531815550320104935840771,1563752351383496540534759767912154499952143839017235102953094600629373741432,1536722281990786418550693721901452951770168064503612830313562140090443641737,2096833990335709895087212167067358723796151726054147873380389307242996694379,1646162763940349077439295036181248233144516325059256339753287530490953057165,317663686529897277819690908676964184580939680474065781130377156008576657194,872293729693826053451227009476673845903858185497824517277004697918344714820,2103526215818496439144927916773981289518395350241567928764747115283826342841,92552433839622917175183181634850566116791155015742434587290368963785885933,3243208099692953317641950865142999221752013397028934880680610956192330927758,3303301388496598076015009828601398187674265530809296242741047090574131288595,174972100651845186014740214512774781367457223745177125243868049173364406813,749826704330747573411263371554152836585906531358540010552445098585351127550,2162566175309626614288126396399035335907191534947260426208677374495528030346,3167292505638972884800274693622966882115992313893340531174250928971347134623,59188934540242644341831883582420945389559982151429612827953015702119991913,839617673410540613315386158568822182138857342383379737118715138080799797889,2392131113219062316887845598118083839388558674987343132278096082329485372568,747228336742360015388558830502009818632181620938724961577523871055974374917,1993016070486647796701752989976903770367918407547759847654748387926734005617,1629629498496655424683645306048505226840427374189852163710504080736856864330,1376109272247712149293188965562791773393146410985960940079317132372990158862,450819206449017238024439558331318468795844024569275266757898095422560857857,204518027142413915684369642825709780141630822609870341918194553074574778945,1990832386468899445757903878763825901172704559842190390107544186065498745202,116367612011129696916007810814910151858912467500335077617323634783682107195,2256619193510173618785091291921991687590135823401754181404064312883881712338,3387227487855740080746975277759472873685807689249631055894929924363962315437,1765682086403095159667299701612897797340822517645649088373737013962418694635,427602455427380231968887481431639043442938234604265417162490552322927356247,274180032242851612573843331543729377364657656351108619633068033905761818729,719179382336106889592077157566629127149537841357500416031832584517064008099,3376744979089387566176715220637666378937621946805667840269827821625071536630,2851230921753086576719277110187018262554039485161736199684881649019173701988,1014199673412027508235152703516845935395481218604958825799387668907240934298,545637481146593225209869585922330515548087039363985055909700108630573526310,71974241082446378576067523872869838425215556186700256281426612943500194632,2936639509459678561119719133047818819624689410246006158789444595218246216419,1400206131268966162249812427754075818386914587098534767147076810892737869904,1830506067315356240989333793113512125022310337748660743198729272711905818389,2694980786458692857065083541850333697674232099719918468841905456688715997389,1942211923412413400010647187721812141836514313766839473101657236116768680299,1181477832966349163940998310236722504682932483934125747374448283381148514689,653668394431640085988218473860661905759172881624386468672287592813641720174,1681419375479708506159794697356992199200273890885714860279948350402365105619,2905824976460513252281724122813921754128684456123241960133355880706961342973,2778298336150307588280811741152391332955529836794031736709132898088838962542,459063670294254917390141924620407926854332006815567159389432576104833159890,0,2125732531007321446993208996183151858184090246860067480261531722389705095467,15,231953188,1785237392,304454362,345296231,1717797858,1479910038,1624614537,542212311,713771444,1665673574,1848360414,438028103,1541308844,75452409,677188561,1894501167,1736846683,1393726560,1108648195,92577082,725542604,1542105866,1001589674,2107785496,1140284014,1280491294,1273340951,266938330,55516626,53633856,617837013,1937579718,990623669,1151399976,1221421467,337853003,420185698,1091084813,1714411962,1810416282,727848739,1816969022,368897587,1966930726,116716610,2007511468,472863524,1039175196,1269013768,1016989170,115237530,1855393310,1157324247,474664673,1869132949,1327431343,1694855754,992385228,1215493465,21132699,162,913946310360311731809011397332553018568376659062364906461673832858505299151,3548319274244036983558889265661430351825750928554048809017687806130370461573,3366291125897215357706981388418791097999741913992034979739013233236987579819,637729290960172295965767991200310383304773158214260540201176654693349145122,1119926013914901149317875863247766279859387753591026145785110330357740590863,297807521658442701625487322552723650785746339203597711448014202867285088614,1660923697188628154462920738807225711490304795685295737455736955770108001082,1146415042172658237444310738936024740847426333424912018763351191068923960773,3222016516645216217530149814017901338880349094577059058949680536256993510856,1173621739472182261897964625236878228546827751579972996471858771514508509552,645345066176955935074847746367167790796731186888166118520046660455265907010,733407973844528691379139750272970523130473349324952675849265192687735370195,3656192376785007990331267983892082053628501112950105757281246042909245620,1542490552432344918728829659875487616901925571299869685564932853447530673303,2000770997916801905876596097901127358232117475091109606831654611024139343984,1790567033307908731311554199053788157736476395209682499846229538887419568463,2961682379542817693251608762467735605606893525715522988069259730477360296908,3564194431496126375013140037187599006573530129821419362139733640070878772366,1278974191694632399789580688795370939744829527926835958365960906321798850760,1315960389153043356869986698037416798658094888683421388187637558525444002232,2553467347877888464124547929884756775459842886216465906932845277875083092571,616015725128769368906913406951009365519937389002160092091705171019176996427,2057556828993264692680130618059921767433659687496097470628591328509730706526,1230893426363248636004268164976294322471671266716728351874139246476198529718,562148198385162554135198330021464445176553535813416018995180032027055321166,702422790906631456765030861551539303622746843925500086993224608671265877821,952987309208202231775750954990655247576518236492678474901498520565943170259,2777910758187987206310164247276855827892410132005308989159172546013889557014,2230297316942574049294225222777006115041350695565269139853035716646393819969,3572119966970118029889955376776086619171549035654704012020749760262988624774,2307564335470190913631820045140896592174178892251406360740165320694678366537,2902501514182477457886064805540912812870165385029129071738634608842219563944,1824972158371236460276489360483514903706801062179967748663012519511405588566,2831868849773911193803647289383512886840164105300196883005437989379006061844,2289965257653092271604085658429968439064628665228697569637008271146611269932,3598623986531471447906300274544406125236094795512324414775532067971458677427,1109791666128679703937373300770353078210563883271822867533389075843209102786,319670915636943466179205995963863027593099642504481402786048259737571127963,2096688918504515703561416928021012628665339446259614020007772593084116492507,3038604292182945559670443376288588905801763798546807961855042330576398086148,2733631990657292536384324474904850785760129059898531807891591027944617537158,818527526292567981235062448162216252072519492774508844855962212637304405439,167698438921709567706389081167966032606282690092452108531387475017835043680,632515594266918614625839254614033939123353223561518534287956675243086951394,2570807873539551469698969453488806573086129949448066219689566522255764954548,351714690618901146580755590259780171240967125460278292660541037582592513350,1287758541726417615592932371690764687373712914567696116917553653966238366096,1307461694927588806262895432132140214490830941031104072340716837455955819336,1962535149650838141924997326385299866814969493492631495007310865889863280841,3158099096474316072573008871329926794363055707193488681262446162527330873161,2010127477140448818278520096953155127672434489023686599867291190837917461501,3370651227521853846437405733995968449636799213834135086340865935809564724902,3309897047827934615067639955456060892950144290665431191213363952111971981823,2447228744522107367079885418507116634443070322556915426340342029345995769956,2349644576446943164654098755882750977270924206333143786188500312136370918067,2015556108315649052872671272404550261016123559775114814139394402627548460014,2528237192603232594778692211221535960075842646357213606151273985802620637766,240785700680169786811540756044786832821284335445626356545962102811321363692,659863528017652011120390487995871067782812408788811238449417637417919507468,2148761413143052224816776630198315994848703160176276466613188720540641458342,2774180194720871653175920900178043624291070311111736169816355653621367613388,2896362648945188595712670704037814992292690672693219126428091964739156610681,747701598948034460091960776578069443128497536920236358330148110162950847146,1694712936278223374434900804852460886336053529776311718497239533835651853132,161883803061768379345248350667550130412045878105451662310723262380132722570,3432424745712332697934439875508105188284030439154242765891868850934791689861,176592726586648942724004737711399827815592554949774634378465488036601794048,2151672994106275849504640308824172974747208232542265094600732060979706564827,414934947027312490383174374274810251222145054411896448814188776746940081967,1007148676515692856866585928815500552613592348454626325819157748865972377459,709589843797215505299447854561248189371497016342318888427984683804709851598,2295621011347446789936191119604678210211674605111241994747056643576384150087,2154724500389812310358831032004908903250140063472837674044485356812482544054,3112791653577453615704976568616980112567519006750992362808876778098335299471,952350555460959808207635168338256690584211726488831405846885181685847536800,689805855234186835230497840175525126445111568223851422593282464814868944263,2247352914668442683911501924927245547421793215009822464751875159850095706189,3075579919151445077286367282340180331830790501994563281532337857094264410011,1545280510208351906755795564903945416930365390904259205541071648997795177878,2851267476584925246377791218477239092841472441865687792061987437361289189556,450256670217303509725319823557373255617733166633451558204262164209390371100,2771443308516889164823220498912608320426786569104190003432832155016194023871,175690479201002671206337960696298822447183576024355713518906085019195008601,2473826478755604125049444547785894003487685842242407914801385647781582112695,1425935132447440130794232046498857771193706574705836751645594194782907082023,1881866684343678489318268805488057770207254306972308002389471304636077035522,2097149552580755022091872078449733068599357034769562704320975183478556627524,1878638609704984976909247830762075649995735617660637997718879115655249910808,103769243255300402407352080948345824808141766908044093273799555288986562921,2037159957248922720646356088923775475973270002860707405080787908056412257528,2929869056638847551248275979025266451169626900256490813410432337694072818319,2391572377254836103128274786767881330223780095345559443384811897946731095555,2309952106228382269010690576374709101037335605851693301513764861282828765512,3310311749157592667487311194145240915694134489113426595504325896076017467612,841444189163429464496923421850549572519464048694588088181426440057449503187,626928664772720057588765485848713907555709801745169292660256811866860968485,961628263739136203449011649085325208501954090430496372610987626593986212852,1650088120884848139248487326752182622165177903228741695943474889524393508765,1176838717140544061990451779532976502317086403658722794664849437213145738081,3256987849794468179132364091886629118028016929457733151519852232418795931532,3542258010325196072847452087723756265297399505364298843750526665125432485608,2258891167166140307008966990010591347821447585059514794922046791156493555376,423109579498466376075926087128774557289309954880512434413284204006724447144,1714326921059356601515002268656320050516127529345956393979464161703016077084,1992180867340189937987151257161326675117584973580733794286039674420793206380,894277456355411013613059209587987552470862564596124403210659543196983853107,1623466392196278103827101221224041500266886421065815507196802047996661645739,190867428271854669804120426559027991396309927226930030184045481489482317024,2252181254281493681303999064524051029772522413795362317578630372281284290699,2829242484222272620902630980869902327459062777467642695254819573559707135287,1339894838661881236056396659662814491766613225182853736542027903477909882857,1009966905534986959475308960175307057264908615040806821795743575373740541143,2346365044936664561413559805482441080377985575459114935733786659396940836736,1962386961682227133044666859313233522110406396864295497072466073282486398891,645295447563876830451293480001051984887050933267739820236673764747898689716,41131300283540870689392458764584915892909637883995936521047805327520509379,3358827522238040256997919522604744880193922576211449849482013235267186276605,3328481519347275593616908738001295091382461063914093037193967825280169684099,512321691101627010438961654957040324288305721002176489166000637094596955355,2518809941332548359338707908596940239861123567183601519034692676571167673543,2282003819268547418843075384694432112786975615272439931784570199797786756294,51365351563132214641270784644537752785025594927164610975798871563356921055,203327625986337708128743818603364473619062251332976401976408794032311903145,1515993361370593752208798222474104074047699993766227606933169288049335010597,377370720576472024132021450930496836102075384101722225161857524247751280638,1203125285414801819062852529968389993874993598516993587106669081665739535220,1231355685612358499494060380505217442945073366501099111113797443954922338747,3295591201505757826062722922685265282072381584223418819362000391566079251548,619633331604650322762269996923794316286232335727465141181103316847788712829,2015706510031312720843342261949101539235731408972953288722869625614175230959,2241557083336933917956701805181314278864995417848948605465860963463107014064,2529144577488760207644214432113909981452758450544529482153448417734837740973,1750816987664387850618530610031235535696905064907994782302588739373748361683,24174708445303377611427839617588115826776913602844700399128025779359961063,2327268809238585077602764724614450541758977821609946395093113890467436783671,960821772484797769618975805535208778922758531916856914478435451637326467743,3327450835752852346054128154247082698259499580217037030093713823445461711288,3334606230521619484332304579084723626005529288437085391553677719563822144027,822824281098589224646549596281418010646661682807800267535164049406607012635,420198413559817872750253976765714184992735198122212032347093855767248597847,3070792240968638326363703259498796378361614824630089548970939912415423072595,3106923899228949388518528193581420066128875203825298771531794481447622815308,3456540590748558039416621927697928628218629731646839366218642294174084135044,2227498093787484682711938302362081067561380888753927113481973684041726849923,2741205636213986306891118995620212421125813147792743864015521635312720578,76802269465296402104812705306804332700207314042798786049246803888354847874,3282305987169419362356171765787522962306525654705820810826967420973569930278,425219222446014568719727650199031621770763550670282614317831099910635562912,890675221196559298986414506179615853811148730496748633632833632314511048757,3261601351976067449287297151821518027822223348695255070926543200353673378410,2946273037710598228786067818214938167075710726376739966893440177970471267751,2275704930127182138497646545076487662166973067112847420497199438413530694982,3280106398426107819795363242014493857292213637315148149737872078848979784715,948869274216417132506451600207157220971932683359424005665198025767944884235,446214742606245625509985771929090359262663185458347729001571780316137506841,1156501524391745168468505587276987466600971412923012263852546763963480734586,3550146775036268203592782051935331623582749487835049476352167103707812443219,857247246956029356512338223013770998736249581970946236301320412695309246214,390640288561522986330987966741862918728342496064893769577981915819858001111,1855542670960264676520206912349585542313450414582446245708349142201047554767,3424932199392004243695802668611689186956615459597001254943231378518693463658,1232292827637091192545279439158763398282866446076628352766161052530783609148,0,2432054262584973925772431962187914866135620402358457610591526024779236092036,15,1529532558,984865589,1314128604,1841475375,1294603384,877286603,647250276,2039606577,1874656076,2027518786,362111602,248738151,1973353947,1697297130,347103377,686096844,1924074064,556553896,999100861,1073676987,237919205,1738786377,1147734129,1941499267,1519131785,228298679,1561208365,454333252,218387163,1857719346,1881930561,557503849,773223419,926564777,1807471846,1858184495,934469629,1229319335,1292860626,231894256,382719931,562771187,40276945,1753457288,1876666753,809812527,237029234,1498999667,19410474,351149772,1334908868,1532138719,999257800,689169151,1796547821,2138561185,2064275800,664946100,870042236,438982958,147,3013458136776643947014429291614201243963786170736644535986579908890682447188,1489676869428342224033329591726339190922322228427024614106559490279681301290,853155479109246630807390690185924999915283531139602140269295458447206196612,1583839406246513415325110847807191857103195612318935538784219485385448367378,1705035765033290927679868658919257554499488940135762842723823364049736110122,1197639760558763284537861667047853332156811292367670354871713262608401551168,3109839746995815589748098225412493520999743302223760467248972043170965596668,2751819726978108104018228784185063418877168235641956511441825872376640605244,2423754397449645396349311610417126911908368498935304707559444441963213135854,1561761510822993718526364832700401688334385127315590611120037503955400667137,288851651690887950821384064782302931835926264095890682791359324638394100259,116618093076631727534647983349374816811044053823507497943550681299404517658,208245583181104389634493973648124477221755448093546281090222361557645046089,1608307407164233753686631263913113932807117735107473326428587874873730460262,884179265878767116392361963454115362932528551204996386456597856421431672408,1630579949653386571019696704031640395581259411127476773791000464880448248404,1718610721567458459078244319501846598692575200296831652244005358899769900761,404888361385218402918006670088202747252642697887535612381197592679366756300,2299728623526785330038806292619869970767102007763840676466173147184178546280,2120749717156871765302923497320375187161370261237981953416658499504389189310,2734273037079856434481590513352740030027965260871729718891757821848097246996,2895496095266960839817893073410159227329185359343529536431284943326051172870,2687219667901103123664300785886008233442425421556688696601477398972407498435,379928620808401636790771897167505177814932621449532611316082659323364065873,258824417418707953420836240383487281212230865938649901734175384375201877814,1864079261455156743647704882144094318799932954057349869170918232975065833146,940900267544902176391293026283992285014496919985681540925318252011429376992,284636150251960564155540951282269782979804565296774898092796907358240023999,931073835396012550186096043386253887603658571900838738245265711145734953894,1933781764834217958002900649502781725446570602992186117377548069749884605053,3309684869716143690533334968880721019764225638803739737717915624874179939933,1691386875136134064397362176376828009872129087067561712352475387802250634493,2315037027077354316219800688558676537673863635312808949655801352283649822868,1824213920731307175521367915554836500992527538339010274185855660154555199697,3053536525896149718881867278112279782914480834573070220367306430870329987475,1856656812589841490713341089102427017731183534037907987192113247209888558063,2154473569602480900751941831317696659269595610895412190901619805795696229744,1915601127900859127930792851487088112405226582842343255366243151652710444729,916179879087598609377212204121110373339654676846174100288700123739721529581,2369657711810377049800073104298150340742706446776365502986193032988141401435,1224869619348241619809877950815639439045836265714533779127321279057800364277,2883670474407510390099039542838924982900714804997075229100467607362301018287,134649901446498989523731533142408072248914887309256282626195246168852254077,1272794049483539648360131307415389958118183305226163228848738150173346081493,433445681358962294167569048985718042224842501838650056003118976275334998703,240706670702811970298340389022975406428768682652232300365973254782051747114,3518011495872584605680823081555319850636616720501765045183191175171934003615,72097480477243756750560942492049200956327642754716226848428933194427723107,287556837240384360613195471921066888952152518529788466559719236187246568788,3251362312684577134765312110854926481906868633459587764274754270332883670980,2087822452279184430511367239069206899364051111512477967294206252827468533920,2297755812432300738447333492940897174261824095418569410666392327977071860454,1227857925921326898982969228209310107716561211403058803124265246273126246400,2436648149470547510041778491326151548847601160576554823242897348863392201682,1949488853324428825596321315982284023862031804304524300224561291711361434212,763854117527364633670547565859475736361063980252458824059174678305234880347,249883928487198705171878354028288932279617073343696570522444084831458697926,396672958711575164466594617012299421604545654316667693579745570774823498112,1375136676314857300147797711217359965673520339197243973767440472305052658060,2631898308404672122861906644914024469872318455852196141573293888570176043776,864601011909975418389434661352434003817611688267323370635619339277908809643,1757810610746467284932458236040107453700998741546934865597953527046482738821,227591969338640073856756585295262843027913914901676668782452668154467206046,2276929487230129983033062589054727304299017568476850385909805141592446668067,3538227599651074251396052871713347555668283395879939925264151337675814950035,24785412115318726561291397060717256292924696915918090470875882034255940384,2077802950023946484734450752084053708539980615580119287330229364012126734856,197609997672379724410941858814622550105724530150446137221762277786874093637,2320271713446718535023024656341825826518499436585761547150409647554493451196,1732085740912788096869864055863457178415315798899293943880668595889268487783,973879424556187590973501970791654899709716588178166214738302596574298290544,1523081033856915661734811625758244845491553861742566863490551451281818190571,3440011382111709651255260126772297012734835464233369367914336557341458974774,170592600106427155835060269888424163058083114939746285644648842283377610978,3012394736243749874437600902682626533276471207907564149810318742165916224368,3194143147397971231897643038377071606951702348923184006247424454358742445911,986370818287344166894956110253312624015555431395972518964151621895957312700,3450528094137115078779126996579368914087900033649509682939985013172443865784,85014307184668152665966683465724671230146605215679461193426982143136463278,2219878963724339748713926752561845045012516889420055714906319052067280276070,1014851734644779932095658314831727802102980451064671044725930952424770204453,751081868800011520768389293181045189963995475941050663567649374381961048935,2171994946861023629928558159423141477329209826603997386980712700759893683165,2592808028405786414525164726841621987230989731043516031172381309175038209771,3185864879907608085510261076219873151458384608150443011444180514710130444500,3117707206658319580422595924990711585184301520757778244081564303738536760953,2613835228813615518952930211077967990898212132242318011405747946133649710519,357522934584372362536338831608367802950665228231554920779116899803451328126,1887514272324768221322899571380105835819738622390268777174043571962066058588,739712440885866244959704095379357174836484251894803507393809872853317311627,112986739206602189793391776373347416625429702766245079821879450860897264840,2609915039512668300474672578344430749621573696604358407844909889723803575759,1176293540112754858032256453812143864877758983852389453535006376183039494299,374760727124802575925679847736652462913740097438082106803329926416828537379,1357173294234685713028893148245148365358016061568730661085230198079898185001,1203025072360909593366021395915845231890536432544296362575959378859743453348,1042447438966430578093350634496206776128996682779634220655537795757419149549,3313128415643415355910217919123738842060652221985956864884926717028712675050,2386837785030800887328102948244112097782239820044948206203533060103509362805,2477279754368510625552679200640125219245918497096106509747715671534046989891,724307371056866524155127206385139358574423204095427833008039645314778334980,689585259728109848683852699547894372657898058644737390309283567074673121311,1376186121777204163310301096252146562500173426985949962224391554318024124590,3587106310465557980869362920512965318407847515345815690510278913525450146274,2792301750506775220678506289254642674362985859156292295195210239107179565345,1995922773242357997589544537523974296671389566224032435928942804556965475126,1465057463070361604588925538904966422116767854542180390800903409277150421779,2724112443117233229418071455251961269913055505640761506414751837791726134600,2225538009940108757450307729992430753256580275179187778544954902987127284948,1303373829902295263830243458771661363161530224940682752157580700824400000413,1535431109395990680657404164529538147455522270268620676246532983962276991770,3475179102996775574137058919053440617208008062233496159082910562082545661975,3251460752279260116548607509104348439372056385467768532227959389103191574342,706144826725566962456132228109857125726175605373958994718903903709345790079,406792577304452280794006413800110627909704539183898983938770744953848158586,1088865511477895271744617359975832917985239019690162503943127233516391661020,1498064063030447014493120853351376452922321820203533428991848387050693071836,2353523965436643054222727234445098878649033133245725801437394196887150640069,2228741341923808280969796146421725375213302739649436280186630525701064726739,1400859368831193944827802432116136465951291904636513775373997661551901905923,1973490741855842351301130546841343690098729506929771290371371819361868775769,2111403904098126354510705972781141388399263532189027849170712583507236358855,1846191081788134180294206214297822672223431022584382188834262979565764991772,2170939380528034830029903190691448323471712657765884711884470957093870472691,1095244461145948515251757136003500237599909239855038733140371945665399760980,891084499254645005675586688834610039938348134531735482693409697032974094214,2912125385673650266455036489416549549143327008762496431041171555796037136837,642818884636266134968296611929259316502431329670381623352353783685948490681,2469609036180933080495005450318931007300842106052881224387039698978234271083,241661830530927328288926079724362235411636716909316983323415986010570150820,1445278814200896832516650137880205834752777481891002505118585709064859730502,2533032410973050309129759323225358425328177710645573886770788113459382027171,1650937058976800656774985957490281257892170642107543168376428502916601340172,3023653922605708845398710221953964977459135849338582851908378989945289067337,2638363412422282649074160621327058762461057513450675704724234967434443866115,371780706364859947335648917957067927078986565928203314844876350529712103483,1745435306495546766229398845139419319724055231104919035809796215479285851707,133248694894185808336946346446750874829567999936703295352288148486276610377,1585902871573947118361059444827049314752335453932754490141119340763940088698,696709454681524241046747997036168711754989135180807233099427391209318329057,2182914722215558999178094680138007695652393753729478884433171155938275311558,3389137917368972839727971609270866415870448899865535695521070035909686523210,2688781931761312884080114588492019707039338101694468680945549525676424141989,2900537839350652709693102879916786970970718218104514239700879618272051112842,2227744787555161530867531429503762222484741540410099534771205284801657595302,890842317035007333425371145107181790597280749654373729546793442600674440402,3081694308518158061808101024194683486469300626838218572803124521067872538838,0,2748261442572689216867000533193531713796941854022803316267407687554546915005,15,1977694041,2098396792,1839107164,630565686,343159859,1059099176,203221739,929211412,1468838465,170875222,404507068,1750947758,1233228619,1542757915,1797873939,100629425,1397982998,181667979,1143428650,1106800998,521612390,601937131,882607371,1939874640,1313351988,6776512,874232915,457810797,518719830,417918657,1287808220,53212346,502244326,650030279,1809151218,1589249540,1078789432,1243308825,206670947,56322500,1718635500,215412967,1506675716,1678953325,475001258,1457574585,381121270,650469972,300608683,509715502,1096870801,1774664362,175369700,1683592190,1378560501,2099990469,609377745,1361421699,1297616806,1129563710,132,3192840331752195357622446087033496821991060425745279692824252265779018980674,352040669585933510991645626907136905692744120505893295221258638716157722074,845006081890336871009175231211651786662882399507630892606367630778712599359,2324999011766077861883479081877514818265530326270264354375532205488783485116,2895765374575847813683424586894850541120143358527396702357514556700841425766,2062666201727454406374696472867249336302582142117835013395755900747111855881,2896268218682993627513447954377197418313184355463800182479597207020290641648,639683348593188097819628131525804748444976530161237537945121613269830751213,922241522357392972363205852787990482187580031502837460081457905040148255760,1458766739581704435916304453500474254877568876577895704540073894144172718521,996456626384406153157885057697292304054386024500308249216306348819538539372,2448529860464622957322489153315074278814213662779126238794232550211414620400,1015680582353395238022540618972366044326553700521976783358142661225628282672,868479150221617853239761289675793499375270438144960659178035763977900219195,2454370817164357702171806787676123721119771198838855295859666151109074921166,3150893677847890048826716758685151313738580864363769522506272166029344784922,426212540827105671599989293462113859616646226430136392667185497193980414885,3226367717099986743304819580518400454617542080519579406312762861636886263769,395591843441588208120790228014385209546903189251242785105182331297545207299,1401593951957370196160802485657222684476440629328315931831136952305302240571,926702964351658861222522645026310328753280473246613871705939787742192348917,3520489360067945593094060392640405165332024165783118472063227507937231266862,97647719848774398055817710610513133361915067637885413967821593595036674636,3413829948670953136906004065605879655380736971367272432908593811599121755554,3527632226524505988476491545428562840111594287152478871010235429975056834594,2133324360620879322097263354727080912333400504194455161355917066403259155168,1164524757498567586836173569832025698219292027782401607220149895887870077788,1834434567904624386590055548652896175743110181271750478126191878771423611390,2936754795797839961576861789228713050598168185925696356632414244992865544487,1825989401198020750928066481240866546259663703011198649762184028217755326669,2962911621151957220581283572869626754642638220278261229212781897781354391594,106871533081784869850137200074961245881650728851111806317263724493349483587,362943916954778515155430229923513424420770904650216302756696187810817203878,431827033456395216990882083838998867872926565669577232358194148164781793997,34499203469972280853739159969616204446230786503902509436202302968547844902,1449410696496913592238812834941385989541784825236720306493512127940141074222,2835931492389777446153275044340110067934027206091319208490221075698486923526,1515172372056754315592288183228478023230394491177868808503046977647774629215,2930608527127487330626191109549000330355340595745189917036140431258947512134,2102096291425986793937211005486069858923000165994614245350067323462412995634,3371474588424517045844349534121773969192735180643903706524955398737050532928,3220123351105449418301124310376525204864536773570088097601667885998338684405,2252726299434032672712107238344735949851629350110532789673840887669500498666,287381057730591998036222073070485533656494696407882040123001723488719864440,2634390490656792722044232901859164441077337634763261930315377065970254777477,635244394416480101311178888068349034884279825392788703851530730328115171534,920294884084813349135853465814575900555818003102835842951055886266072644137,3044159916443060560804023955403653449078991767716290682387245399004339176719,106129012603990575441260311403180978231194873809247976342355995865733243092,3404352169866641743823784618037488034790656645041798923569512604480220238764,2689813622000842421441388208170495150597402407032614604758693594475604381440,2048946424686751876571524476576673880669560071783593526932597376142743121682,351164137272955756643657684616879485195663073710061058901369735999998409419,1386962103336391447731589399071134817175420621960008943772314868864668730056,3086741511947701832869114955865616595172979684879680045381767088491980011012,1526722541180999657174359868493070197104210370049316057014734665119896510838,1721276496540311708769554215975145598790454838305439272445394950560254354391,1418121194507631631155215487015352120689014910002958676437085893510795091749,2178233958295868692055347535715240732693980687107549222284113145873248856736,918202129007099822272203781890155069849123510039999054869931184713084040659,425679481637474709295653084751557655007788151254650505831850513780589658523,663238148540455539222918651411856404529199458071214656259047470306725371879,1603146404802819475188482998954882333045720830269913386750845977713653357999,256269675654593971472776438768724331328294679107777875290836796185783964442,3418118215743469147586941248687557867105851926644270606349193286143348233164,2272672342961597953374273963390001649497471630176561163306321440248109964095,2889411749046057180974036234288720620777233017989993565984616233678282452873,3563766909728752706878659245529062299325887894155818726371418418877599049064,754383442012021414065090419927160595844871282741588039311397179623577153874,3006293608160121450282982756020573228452759380274299596802896247821205020846,986581688044395477810845483768817802800220872309821524008904070494015862921,955246275778830530022761293427305040947551919784391729499558176105547103888,3260124962890828503966269824313297751257619569277712759527212047391333152337,2887837914973193578580094250089514536722050829725679628267623958430531874949,131546858828632619325421962052009664135748741014974216356241429252627658861,2641496104229333959211565234278394744403896674513003826938648409591849833704,1520378756234399869534726494975938519719940450143711618713232738226415965522,1110823978863234437039063432735955537504241178520791415443266661992145711944,3461458859743800679970537314486816844157017930051660573982272118379908361926,2268479864920927153644765836969010662843771922283410719422925525843945662893,3327716527644363394903915137967298084605647732280608871654784360411932521542,1566089472756848885236042420253102396150307934196668213380352268690008630832,2473080054142030060133837398407851893502559917411588057875802274578475682425,789734401467589335209782276129111222788418425676460425679561390188528201818,2515023642528631373446915702471991887346425111893374334275976068643500126099,134392485399540760363154915928307126258161723079201346128300363290367433770,1073539200308577763349132583213960833620783761624032662271141124023981584548,597097511874716919471259441876724362823503773520807602829690412756563251274,1835727285106106898869497071269057358648218179322933916394063722487606111483,1939523749259868814943970456684303409997568708286133129870311081417616312868,993905888478545669162947095856556874823979426577306773526515455279845661041,2043604302313691831048696435782427808441011865326597542427459792184189987255,2701938270794343991432805254490458345091195597485641163421592785563173220036,329007220388134695201043069398874122596034173606762277155516619423754045653,1576719828571808900867041699039973543788137411097167879375082633403740102924,1025056080157680495332304683875499270471558885453410906329240673258926758385,1097383777486918386250831791401015801532200008013187189587103855827652848586,2078674299277072059888848551188097709181648714961814655703956341293972560740,2345176182865791759792984015449949721722210710207490529716847414346460245114,480655604299245967953717071466086018295499273579947175056657820382809466841,839093411340391770675841735010171244965535130994936867542695246074384861327,1500556319961754288092433621392981402070615349456276747848482645443933590921,1293486758692689957626225860105677930988082972383921664118386028981009792766,2592243625330482279934850145781846977064185604581039953362402650728923005360,2294440653904076049571920499102969335131892175603771390695464627600135390522,1006561501544873175149270961919932147586417344033915901393710855255429098260,1613769651569247298211978212441510120017554927928321247654942835379292654234,343833455820606175615618381371570330472405946012270210937806390419079359785,423988617188014142273017209061065059105131594562611803017638556821848659901,85287284015202535250760590305334879397192953118043523527584572697387204460,2227187600424390592771205135758856003112990420555628079968834759976655761724,2507657249968799001785224957782802935570178687284667159885091976582859185554,2467918447914133294131027359463305212103970586243569874928323470793277723010,1199749297512068394615352911437449950391445354688957549382228467685749952383,1307550799847420270230079554580598449261218878280724333320135997341144002000,2588648345519322767820498371964265375254536160649799122809333805194034018553,3071396845144417620780642911709432973967520611106467360497526654412626649484,773891160369235274199959638214051999627362139227041412980141595243935814330,1714419933568259144842296122693328642682516893534997618881554151981159828893,1901339157330984960457286742937873236234695540774287065038137042286029885365,3086151708828701343623896105360428020981766998838051677746896960172491371648,2704059918923575380552233725620636476798883132472895589596665603955161250863,2007272071799941820724406974981463086342244486884536287454478582329471282316,2221250392363792057610335403310756120080744545928934828797093838236351176058,3287587493735057163749588273366126712825552950736941915850323463246916456668,395012731105409897849344927542445564637166643244627873573545526688095379443,1631678205230760327205755699108549205062403250784985621405029645716463500802,1252040384472845428109656838140929772909170467229178474137488076119420857950,583185764894559187514855011314074383648895099460037097705430754107458539546,317212847091358304070117535839073318907885336188528190831006440157585457816,753545290962465101799124534582386110680291845338332609078157202895034692226,1144099920353964423071158689300245658896504669954406259039388480634187737386,0,3487637437212311669763549225151932176130749235530027508457181833307440545058,15,690797363,49659527,1506889092,1604405241,1862847306,1132335326,1193781945,1832343782,988937139,1365364653,109680478,457338761,2097335426,925648039,1646119597,59972109,265947090,1150639914,1658566290,1550711471,165829233,2076495216,1377769522,986608104,2129916425,1246432370,1574757295,248133305,1579644613,1859620097,336471615,1222430447,323477709,1704377457,115140514,392503994,1178350932,1695848447,1601475624,1500249934,426184960,1826917537,101954109,773644925,2128964756,1484595102,469823827,1091538456,887478759,803352263,2147368068,869903502,967355484,1007317188,1182343335,288411357,592031468,1878195088,1070245522,1692020662,117,1374671066056967771872850730941968833033953273507292879635701781885953674453,1370825539515601646601957670541468513666598993179372904149484289984330771640,1947126169287344140386836370305812106276709342902311849482750750547688505743,2395360362973201447384804693536635613265290232899099269834473531167894025662,2875380201284306506923318160428390653528307368494836584674608360569856318696,1832232831615208107878386239120416874459016049586942632931780333954687688312,2656520752812368802555325732078843900744968949994082822402944742965133042059,3608725952960374947982382077983261521617747025325696959525644782772726710320,427449867932167677532729407770153231685788175436853796987848782401246476966,2057160527934336926271755634928241698235248798945884733727464913771948387601,2266231830355376316473883389806549571433304814529566372039830074735734312250,1225027458885091920118630163070895269886736964439161526556047828587727083530,1493043179590064246674271990999286986894597699177386636150786103220015760577,1865655732608654862870605551280554896191890054089519757606635277699818942208,244799330668521966939727032617559417526971906683341704826163683618798786924,1230298989907734096306258284172370529089541613030885265790988665099472895787,1188800537898819211663961246972788174453265016654353235426397576869242046588,3352032408893772899127952445471026362514386917727526226823838234480990685657,2104722954133661216989392054536015038146772486345392327999443548391570886398,66935003318116877212078653487630004912573974989730827085915710846139544696,2833243753072545649854183231107321241976001655581690806775674389408141126262,9807487179445137349266072148168196131974539265924454463885048413417798871,2885040560930786880638725262486717049657923928991206751421255303915311613364,2615705968495576757040784077402369951815409466042081535085177967398676335941,107523309108675192410539871521248334869615348370599976821250501924859782454,3515913567377481516421059396456219868418490890993039128275790864396558025279,3272646264650110018921332053442300418548585288755939453501973560168735568866,1726250328230829537015139775119416204902473405907181945270351527392449544632,990355441569107077976216367746069539682068416490950521681069030869517766908,167681687599663451899568400462725287302408403795986574471745576965462407631,2312250192126196177349100371667931024255659283815185351847645078380634547159,1993780791549592808446579207217247137838405738359436124855283362570156510329,2312220837467406755956830381941816452166695664243403702313838774850405082891,1446366250165823846556910098197209635096643663893466070201207494835122901284,317006751068829354728641854107983451893364448418285486021783505312858605061,560987465297234965374531975232286389188348525624625806346077201955894646366,534111019999201570393716111416549014951254055952658093865182350180205606996,474498259245792092466152123436381999345912435731280996849123989166745516351,3073177675481356101693000478032346976338625687137203093993392766719384315587,460791100519246576771111094801399880605405659971360325821191258588439847642,737786249607445106443790182588626921396224924590767761135505297145939395910,698098070606974797074397751260851999255922065009815471654303729887269294921,630865712052118532555058147081749680376801754177789754145824660085029516356,2855485674853617589260715041840436529554539787398807177673341462599563829134,232827916171336126357585393104708544039188367093738061677657671626763666626,3526815547742470358237542247292120952190915283885929728425804249803378641595,372845769001261883897427589094305739204808830519216718432938517875129106259,905064545496031580348020364771244065404877774412853997253010379291280493570,73958823664798120886003084827694088235862312465977763603044894334121702042,2488554799329398609756907051873873124597578870159137140785402896995886922446,1658295018134754296524027640965234310936370066482313072881650663060561025368,706333740651054675261865031856052169861905282382819639396610877386071734960,236311694607306057458271287545755304256453656817949793941665342189145492351,3466325774378294094658940918192055480736610345483596294738410159258633791299,1482974543097571134861716685961811434418837291606214943587880838572432806621,3462727490753405188785426321679619360004805351413212397142207305726839580488,3517135855899584533856297836499253457063728452869768107790643905603936350223,1957458392395049241855928425361548756236386256066625008226429508788157032999,1379280225563666232133944753575018699228709491050184604167711054537172006412,181539615690423275235813645211691877672287929781152301174767423064935858102,3191949640347422677220910544612697558229087191468749548432443049555261974359,281858448183572657369937375282755132951040770602312113936282498041802328333,848780234832329944930564516222976162182701614949702456689943580247154251661,605928503642103556037175518193987403009649138592321982733007371740224977081,2360341525948619637815772720861954170009255434743395839000083067360160217875,1111295537721777544947341219190973101207122071987863262023506599506803541490,2554223901528361004724281907553621847653001944420818802071703245950373384240,2169776847644796772229910600174387557843047160529010023477588815414580263194,1733531739522686995894194433568879911445010862992819513358241498546089989734,3460024530720107088031858213855031900534560515288485765855795289963222037924,2108191543030112219271539399404001794071828695268951965698904630230337280697,2493542232268655239446776962604222914315038097877904186150182957029269472602,594044557348401687397351082977742362333088778931361593516509434133190698309,3360281291168530635837093151639536610011073105500619888358090929954813334009,271183352709601759204794093578039888327504199239031741653225200029044114159,2797892930282559824136253449959433354942884068244591010746744334009294778108,1703173621417926691235862589253658257056151506454510101900883897629301840387,903094349112025849294543257476941389477663153542230382021290214709326749649,3270365321180371430252881607692075453380415031997712717198273771607117736522,985573251501108732525102544504973154782741076287543472875100535638784605268,717759971159747406136686568247700379609829548247778085646825667560522727991,2310265759081602105341548218701423788832764546662314776463025596272910984004,2206986783109059370752851733527601279451180277902951721221413704499570314613,3434566974018552018595662332022349102442756674143855261642841093454763729929,260664427176246852709833112250354436796900138960401490748831253854756603269,1208709857243232875036468236017277026670080753224643469602273577555281796017,580980273930893491637861996869750377569991563060755454918250386072707373283,1831712067809124801607737493779343739205085145495804326004992535040296914448,1708470859578476919794563447569239993747406455372323000975660473323065557138,3369192658844148023866442077810955521956951383367356035502529867255639309561,483943120080295236433471108997212982296173620497720235174687494024831175067,491393215324202256347649864216309688813449251825790105911529769958759030925,1619243074828313546707067645475057922286490157901329158789271108723247064384,1486188462932229636148048739966631486616837495759873239987707995008745256618,659546444087922405374028510822270908256292673599318635517832563878483493065,3077789876768532859647658871352151441799217354434915210217446191699067214595,1392331820962473245882869984847999772590691574272593632296379116736523162914,173270017990855243941238650801986945547501002556512416314459331732731586355,3245797009939629653642409419961505038137712300700129117083469594524556397840,2950407636516415538165250991853314420386310509138021589953564070441229454594,1489550443524192811138171476805791154125795599329617991581178990654466903112,3219715798225157358691220878922657382543413029105693496684205049536635705544,3027964753360808276009709928078462606470045734795168631804590319722713119682,782919675387233890508932976476622828332843200497421274226515530517491874743,1830661687792615475491342242755544146362941404170048738604979323064171813282,2976774625150480713475695821683378735523877050922630322479118521296707378831,773182723033847495889833759493633437870600420142355706985591298239316292141,1313341861477442372503943118978347584447050835834975571906967785446401693785,2341460629016542883308066926670827679771885596309513025078473094863197093510,2765824873817432023747885508720297910009991559936096642025427260739203031389,1620011013633452968850260294295372349798357615187429441139499687888323087125,2908415672043123523985418957773372414636945943519358274054159874128658949122,1537386038550490465068904595035226195169003744317851564924956803550130631119,904990731509352595651274807183720989794398678179013703726814535945581914826,2745301599549378027002750215773252946042615013521366806270757053328795014553,1774468901791937030506028364616425024390649825041810070704668036744469215381,3246493502304669907737402329371726171303497397181179981614255985370187492022,0,983467122028442785573407987896072865254762419252415684318711710392728194038,15,324629776,731278882,780503230,1016046858,1879443736,1759309314,872952332,1692354387,414255992,275825231,1865339428,626952884,1827660624,2025144858,272193215,1042473149,1732336615,575922741,2128948542,1082404769,1136324035,152117563,838190737,414538087,1058499450,1662408923,182978110,1955550283,432246110,1504850177,146375134,1496835485,719971256,305520460,600412102,221185443,1939547031,1898857731,502136204,664172001,472759084,230747232,78811514,1179457726,698184842,274006518,1990562032,1340373220,116699801,1664451815,1654010631,632729636,1228323140,1939098130,646522271,809765581,1091950048,1093847777,2140123677,1868623280,102,1639111384194821861124642435745192561970030295621809013311636894675234022037,3138222181218309168696504951986867654445996144569260010601364317193055587289,1379151566448722030821748763105248833783276154476058484418066941100301182591,3400620669630233269555292725020999391609871006949679578840720794029439202654,3329454704206588833301454615858265440604254839226677491466668139617059675616,971183916366849160185422911049586247687755229954856520137441759965166922941,2195776699660493372285390585531643966264237791001638519911878202265089990885,1804854988880268832020648976715601485588755992514648735188651198054483780408,3077260950884121426390287280279447640588857677792878196608126106077517500009,3217192834278711419424673539274622942691885616074167791211876486102066883820,1652089372680191190303593838534533500139371539021928751527071531592669815989,2190575676960067339222975337942350409295531745270618049830516520319679472201,2747380027119858271686529571755439606150044356283537026217259894663793517408,1174579806533486573168866047919171361243260650185187486237041243319075629529,2166261973452248840352113798481648865228687710288542578471833015859103161435,795247631396928034508177069448307868058997383585532310067767399260165156399,2258314767777520770026501591198883557133599610337599608426609103029988269390,276953540190684662516005764603205705624037733601492726583171515419864399844,1324196314392583146116927689472314414273058655692482825044552862752538266709,698305170171504886164166458893440186341550207645275894755788342286931633329,877457176881863798940079449022888721274919387861707453835310280963547465989,2874915171706216234334942940797456477289903368485801076133040435021556670513,43268449347016512705422875336283833602458621376735571734927678864285300707,778337569747077384507334415791085451615815120506234267234067282989007333635,1497072330966353421266554485128472498867612447202507549999637939029530852702,1979186479001107336787776968476673646995486964306137235490958564987402418425,320241843587896581027421184079751239962316226702680402108665858157661091683,257913744607621452081392321808609280320243812515459817165335228785607225693,1926419807972107260660890877341593049517819055148745073761609599452963849110,547903701012026861543357649748204388453750954147315368337128080599236453308,1929783896993260000183422325813702565040497954810234385541056760962746271748,2840128751465109768749689930105225897353317144695667904158761986428071147736,2078682277459559006795803972118953064260135786214631916806427477897462447035,2050451328482634731281133480224508371758219361234335090997649041950608825354,1850129966785862723338786650324497180356867665946808825849548311336199104995,2231914558125668467341689812819991093000204128780428539343346267382469602071,2873927612364311882796017272076409990813574367450671544868999943430710753886,2170445446712725198700725855547826335032274661112459736251630927124392512433,470408656271252362121588540670914769175201816576931472588568766543201545148,2006024644322343645788640970920918649554101659362199888199309995396445891569,3022902371640491284585140868047115747895380728726102096291792194043385209301,729564490409771601815835947894462253940581681075509561412591994464447923559,3531693001960830237916098552418755694115760633495251561194120928300907752147,579766708181196156424769375626134674246239605820574335050663775328871889851,3402670860502929621575841755095572975669126272799610483982207168103447909869,1549904384774542691968783919486169415278871256168776003214026131904759425642,1370619674970287271427254593767807388405618618632256473341510354855271480772,834403048103726602879719251037132280924283380479977555055959564084005759666,713848487222836864782290248649237534051567321942294675841747836966900534790,958471088466894119821446889888363175557806656703199866992560545118471102946,719526096120171862088605767183134103622325034491763984978949708967073085875,2598104679626524012537372629291522413163773631378203025867803410738049549602,984165571266667555146017190077589561958361412215194209469673852305255157635,2082594442680384759279859003412166683359226368620836438494583352548119412354,3495993444186213341632319786434930275053950898193378562299936326741374163178,1186574750142465285387975946724499328634067210168312689135928889774108539663,2938882968107842026221803197868652190015176316133341324463670265474199450074,1367764962124777262288001764796260019853206546302217701584940042431049811398,1226535749931693650723961108122752418200120116084233191331162324423781904143,3062245759761760342949894180459352218220298612367499914127511386225424329998,2963718070586313253064764590447451566031294463475979426778038504910664064695,198424961694574798897789467792961099400385458104355758987169564833207070876,2893550568478278158243107571007603902412516428725030895673686237370487339071,24584935305947558961561151152833067340695706982387915983420822186287452713,880046106828935459266820781375626500626294208268946818386475938580607600702,3016318817815772790413448204906146317961744418371949694190461616977479999282,1671365736604240261491652971566407339972582164845093073380128888483298084318,1978969593518151593862780332741249003815729395780080983541778369726159807004,1127474130942539046945667209768731280783731135544203681194441585574355674346,2662202987612541169721030913826247344365446939417190796159239182077745009707,1048883958391820886979998189242841855385252646945856734715286860906984615765,1920159299238646421879570604873286393133951506318833473442805818685174237989,380537856310395559000605557485549025515670649375056439156166335612385471203,521018117554423135143204428956308867591688759229796856896609419640079367735,104208058622242705720338067943643222461475576041704909658162057271733685128,3570295954100273348802666549102440498340497271590073689329165098158383670500,1010523735481741126013148920767396715163833824924163384495268051727017723158,2826415883868238637724211522431783605876934526524201621697454082080183330238,633468805405878663665701000124834810348968603090390382407149533277746245910,157260862016906994370676056847865832969457826601464208700925287433163239946,742182032751596998588183780898055204332828636624940642430997126564124564787,3082404170270785761985306002450689751800443547625957956346859103222532640918,2968633400023771593640538520734350607968934992227243211201665395075047315384,3366782318881142822669588797803112576463699794115367720065643471565684966927,3426578163624036899595761178990430524127797196552532171863762791934444534977,734039747662970948485394588696246828530736211222120348498022830808223069781,3003084413197071551085671785869180173463501866684898373099163699890370622348,1059364295131766936003318300915037653250456256673083626559193128751637897975,3519467349219175149134023822292512814032036818586085396583678383999024517611,2591295367655378647704886413195373802087563247987203642648414295032563755574,2594091878101540267683995773355597119870556601337180243349519715223339370666,2477381712417520367249963498979322955213704555127339894058817294165094639806,3538454489656577137290444809146153712247858966656777113185542125946727132971,3159286879676747225638626940963634787634707249014345065341483054423726646643,1608902021641597395788095047630825577930639806160963059820049969400137694189,1194166991858337979116759961050157689143414916582455336773472236596158300104,2173973290103559566272070279514476404844853121919818542839310323001413105593,1185897114195364138338995951876399287816433503683225002190918129173655801281,1748456854692394461266577424512566315309065558985674686829645420574940262916,3411495778226878906930453639962586398606733407614842541771888889849622925753,2128928387835258842744640515866605559195432370391987374041122852158806337943,1537042030206627231809572953950760208689811719600958937457567978116163808277,0,1737067939916299013142790071355145267878989124585774605780752705494846885592,15,1089268281,535530404,1843631871,1103910503,552519922,1372715985,1945074666,1034762360,841872884,84092548,1729556164,1919977789,1919093231,2020781346,1993310163,135210482,275244850,1434476863,1445034671,1659648511,633166837,1847320374,1657156155,1579166026,1202095716,815858749,1837891060,197476618,2077365653,1869125387,123201503,1399744619,854742603,1868771471,148871,2002076524,1207469021,1096960295,271617373,564440649,153625331,817195918,1285073852,260374818,1248426643,436024105,264273648,447745555,2077230057,1279926481,472176153,95728571,515231551,2108667491,1672045147,730490570,1657575682,1595675253,1707098730,1423261778,87,88869776230102521659724117621465496912641371384708848549473816983066312301,1799049275487371840246423978663231640022032959166764876838185021693877588832,1877262026503564620448748644415656090502664016807802772456561275863552446236,2103345124577723548983830112048479578068001778077708597838559986897633114544,2398584964730999214119984461045753275202557594846391935537043821116855915598,3054453385740361619914686269896852221370028284668995421966975586829569636371,1003667096968942942642482497584580744573237923656544106378809637772075788053,2639652812235281197210395217454650703137894366728335257856775935954963315840,2078599479665945957942764951610363625391097818593476281294070813684090491039,469734296937095095887073938645383940964048323192395536821473480267380598457,1984482249375213634924652374936595411349722716025353131819699411300260311317,2742142286480667930266943028588994653312344495400887343450545524901236672288,2812200491430876221273750791857719431383850259226082101747943030501776167253,3466176027606826585328216539632932442722799787477369992374610093862328809006,1017029559437887521645479130939828477573921626567620828320448899147551582810,2215594726661142723618730300256511253881022760404104345482698995276657487213,2638269205828714521228051507829892769471297696111736686439381376630203836588,3442751723895451281627026230653531676585827729824361073958315701882259402283,3358247469989311008415770167653661245331819196970733207076645976042367710198,2309965663575131879572123454616220166745197108980544025524051270076219900498,1057054605923572714686123765386662860360576362555273393397311252787270688127,839772799976115509066004568870872150704374046252458024037215293727831579164,3458526820742165173629840858526589214405106045637173305509974164666901872431,3454483276236036859061752432511217270067913544863421860919381211308286617545,955658847329332810866436683712250829390752590589704332738895574097953704998,3015790695470973972026494406613703287156727082126604166831253215444430751506,864658359619007311124295819379959878798835334827787582580102182201679513094,1777457907313773388040441655896249594004539542815797961814930280132711815141,1635463389177509220655819307362111638750341637908641234323367498251711776890,1376754563733652513323328532130026956742710517318687048056378799126304317717,1039303101738063680770305118653691878196795041838630456713388455952636184035,2524273956741691205773533415175378517005873119151695969737153800471517335536,3606725328972481639574806853806881137679260834747518906515243267126527684038,2414115134404042175220295972563046184620501949357228869596140260240703006764,3563992284998760655660245348934979872481227962600879494296497049209892440943,1757159655122822730584217383322052690546474715656782167077683603855551173204,453721118147283558995086262642973156095404229558146307435848786139625897514,6735306062299496332224045111312368077731740153881584700206401414299915252,654862187883078195734784826389967179004695176256112792557912942218543976960,3538357646739165052383747509514104277645848491109054689656296039580377327860,3281452210870255622928830679473751027454664507622888917025697786092453936825,2824632908021010526894069717074025940758601932011184281815709082182443165774,228089395958754992201390323286620092164891806435347567271598075431203302078,21131386808670977984471963036278848036813785883121186391554402188384011634,2803203330856967054383704799615016301558379274221597496219348445196672887012,2786487194670716030670085195339346624293812320287181787742665343945129203702,2274380860090875580682385172033740689070570695083790590116530272399837744586,3045795540029790912703491676449003551929733989340481626270118729674237887444,1643847130647273027380020767754880294995104878604686535437312129214254875542,402831560686568244141787567161981915071437455057769024048767638169381072269,1608862613448612025913965193352804723442597904434266794044907733394866129431,1575452448869496501616896548732840036346328879053276461324035196077098996410,2403140304134466175001686808694777413256020468211880688034363919724084778479,848422176170686722008088147241194260232524241196358339646124691262453771643,44445808347002475724217400507941103843114125847930858660089201271357742151,2293363175541646227889340542847773787966888111929472140128024051486097935162,3584818179476432668833139913214445494578497593866660133459181997846724065366,2043540261269889092835349242180372690580012391843619553604456574149090259850,522765565722013001228054981725671604427543210831177414537662771251399890080,3297319061280946745132553886065410928805357874895819899533947824039263839669,2416352411945824648422349216535262530135057271846006675550341664809963583788,308829796962216388502196062852290822413998958121463316842213774365223319868,1612799120755439339890764236666095592347354465542958835813932311319458058121,1367681730927612543103623031438281187422766454301311170568666295840876867129,1952251760958514514407829702719870831704989914480025109481094801981586178760,3308779009119056712306346114931670840825564109496231124419569353403365626091,3162005753844506626946237157726464512556241474891302472900274033443272477231,1855542976424445752089872613147502984878986005845834539586928742576559381788,3340004361496609525586281640326319009122663778701191525144929016598242758578,428330478809741130730764689141369948913203138802195266741002978525593182432,3164824436130233962424740147725466206485475508784625795093720271177742045215,1585483557654061009542934742981624727762574606913946551562077455714122538940,1752393158665687599241321089798252961121969147412718007804272415303250091388,1822578697965736562481933106366885671870542747875665199642600400517413617812,769336513662553002189721570273781117934260262350702087411298335350908164853,208419027964086120562344382561610132272105380477055146814317594945318576572,2437069856610011992204796400396557358656380903163274879178141252114976620959,2845960035127907845990850088326417504732661606714630848938668199038683427153,2889047831075084732811822213629919780364508106425982624887271010500298903751,133935283580217007216784092598867849731051196834836145032734426568808839608,1432074259447813857599101416077900873052353990908109148793927451826374056995,1574711706581039664712345733227855713868662872357061242404304740528002221834,2326677079946753278409251080120038593125730053779277220617244617161294794693,1484590169769490586786731249071698921563189878216190376940675430222275583302,3150677075190205300147184252548660481883488966999951197653316898665277058434,273481980995123632525795783166369134369337829187575491857996233510834416564,3418934831768499150336538800748199173294135958130954693123046003657988739966,0,691589705246755180242463481976761857651410554659990422172004349630009676773,15,148729562,1896431853,37222687,2131093129,2082689754,1824525970,1810758660,601666607,796640430,1689050955,167581164,1536528425,1943838632,1525051222,42145945,1355827812,632734228,302382540,881948350,917471553,1697584549,1954509262,1033155382,16279245,736047230,1482256877,2023181446,791680824,1741328611,1951395569,845860816,1240440047,1960636691,319759497,529279700,1527033152,1731485913,1644190022,655191508,1827457744,1344812396,1869483694,890966556,2032854561,883139345,730331609,1204516917,1354401365,1588220649,1681951534,1492038861,1143216977,690210172,1008027619,1813298092,1438498578,1285175439,1760604413,392312660,1808896214,72,411464970589270592117749123529168851638465603847202876438806535516832086900,967966681159099330796705942957817465160510797728590690125974860850844500897,978896038677539843364812978829748879568263634231685006109201784414489839189,397765465267403152409871885516885260083867760062274010667596479302318165043,2780115080391524350453121870279134486944537327337829954693028920293236992424,1925793101737321785073185044023541038213376561700164500152441460277259009013,437222082553305554951356677097669396468302584415746809196921215480502534795,3500939533443499168395725098881120268566407401808474714940849876544134361578,1792638219676356851964440252926395206173482800291755279806283702273795575938,1760587515658065261833378622345161212618808759263525410898187925400203218549,2276909335655757353674640905419448010166474461117891537582265074866985741815,438658440855443248383259893295367835530825255051535666518675576185468545723,2411332446033439817804635205001964927470672250720238638080179916254881693168,1875980994404109405442847724405987003908345606601043655532641091952006565396,2045584980405903454697756519063778769082390546834773827809286084215604229425,2709152811802273399577302410453994998933078940229608638299218532020685622915,3317795246905725756545837883155320910605012594736876014715885762070222563202,314060352466958826281203400339766481562395289113792953307488679564021855459,1378160217381426609717191361951713863092084707854559474741082346681889781592,73107990353826679357545475553521139380192327889867832732730471426347977111,671351333996818648946685457378060755964259213986269325090029605344618033876,1900247382027007378226249471153427011915700322986892817809033861259512341262,1924283113322939413176563766150103024121596528559481565054480612339098961498,1980698903139983111571258066154672059862583078889351392206824668124988377936,3429002119567416988588739255015633339484333765007017742673302041704283199089,2635956508283481710295730409030919514475449361518147193204933540079272483379,1775788626116418880601757765886676441608589044993739511306595061424006170663,538376970844630412354740693389065332372372320235815816824066362020635969318,1322846576758855244139475996392538765258959112886668207234461768066280937951,1934508048595344802859152532445477165289356923697501103744201202208276234646,1378785406782869332102900023811033712546867909969672936910901643555571651885,2212286359217491680405289866697896543674774731216972920332288859365523190546,2662622359300062898852834973149609183936770798599883073386471264390419723588,2611888552400229819394939811795917542896954783733415156264919076199889733484,2469032267597076328742165199139570299575714510260421916865793782259715337581,1365342022060267715573139545562228699554111407890854196401197641683666532158,1553727633519924112036353527649607730356378158906398226889320372467072938874,1878501539098366736925964433412793159994458462151816158583360046897505025258,2398094244947602011849481902505942393023176849695126384587335191405284732549,956328649083572502221533572377215649543774602928331402011584176938589641665,812532876927399216347859009196700827342885115379425357325160551980865013807,2211815285619027364368093136835081223755920721048296415259133718551520494531,167387166602076800973006523887285672984587433479050351473528664894477068160,2300340129270072862210860455128026511096651978423751637725904930814341181508,861646098030244441813011702949129673233187733700840845946148726266211713432,850969591433884917863749730661584768670015270153131824362540066873284408073,2891524091617263678405828598157133942877093390874346457733525872036782076877,1021373601092871334178394515726984330082938489068596230873780631845752063307,1611684670024514863623012400636364340087809212455263562912492459364026475593,3435773415239763379300321825214917773167454521419690613181559231631790352841,1189427714043917748124610172251954088889048127955326958107500210151317328589,2309378683352049961491443564634234163754481116212630799958903060946437039829,1897658981893386035600521201061946338559244011316152214901024105280715177228,2908896374012230583496832564644123390397445319664717655536293411188531088458,3381204501795039763692179553043538179255732880428849240990560037318956866663,544811052363556019921343079696195612578561066629545136496279740943532467490,8367049417064235027637034243627216442552227895085756055398911926152742961,586449887162584694219485861246202264836720657307749141299424140983279751968,3430888264419507094154196991204443211799767232471003004806466960212698302324,2779886430712809573655472825081451434741510247180224128886503318144533608299,1234359529611786543747052579845214016360265976558262408048240475196991693002,2595635522040025939371709072734654826223698907349333863572403472026604242133,2751515049370396090667033313277822325079201376668350054844099285888880581676,2386290464562473565314934970046973421294966720817071188549026059433649773095,1246807993232483362286075123901707072995264659253234083853833481125950010205,1490582762681800198362757549578797601763390976384879553862630038319794361457,2487674786080331191372357980203233917780244545835854121101805943455681364323,3229992618472398380198375051388533715703072597421401499009370624448455278373,482788809370081237469904908815275044701288781790674506621908894726698925342,1496928427600454712271262632200590936606346024509633087505289353234687917642,2277629767013109506805626466226053744570703034733725228954487953621196867507,3035264726099317763539045558526096989927057359515831314119135077520857359200,0,1723011098830819693170590264281219073769493966191893330496017110164919949967,15,1443260473,1382129586,1046335722,1925188926,516697560,656743994,1341301574,1363621302,1509353460,445910627,203544668,1614600037,1874963841,2076005402,1197543166,216007179,90111757,188036670,861904499,1365388926,903085201,1498328973,1495804,1110172011,620959778,869307676,1650017907,1810837458,662084655,570063428,474600260,1817866829,631828988,1006770652,985139342,289530459,105219285,1240817136,947825943,1347241598,939884544,632727114,703223557,761899687,546334632,591517161,565463747,1825537291,996731389,1216636163,1922071438,2146157994,377323742,30784181,445083801,161147176,132215865,2017059495,529504465,632413339,57,2872029368543056754809833848934023471331729879301922595890447896681005177367,3320938505042560585702149933997340007770341559813457886503714095129218190578,1173700577686935505758203743998231998266293066210905201925783824866808402820,2556744416518796187285583299094686647798049933770754780851111074835207937736,2494757634491110949330025640619502944539596259084153746363030572455836375023,2123048767466010155738662687650918486760681220675770663824188927830348026873,761813027064002612204157205758654393342393002988844348581955451297625642544,188571111913852767269415989791776791711231554472691740436000938295509799849,237602419195097233700607205644539016097599011479247060438641449085757382016,3392814438533307306891668567375201318650568065909801995755794494972811262036,2395180045111258673648468759133659873122389595845013309366888532668101614843,2647929021914323131112640837462056284471433426402952575019203585841160251155,2143685450711674627480533373297421433843493357952323744841061953133289415064,3400572707455476286685302846437577188428032601913668248871015444692720171592,3148810898188960572667477087658620949296189768999574606821362020992378308397,2786767265657237293599502296057759010441990970462878677687629830168467376319,2684501057517003201541097201885830409196734146964977246186059270193340818211,763261120046495807586941345548184513331804316375774757016192182976468688620,1475692218106272575724500713925457425055544760619900547309152594477549843483,2641645450051665163647806093489360466343765151392148427074199396555110787220,3337838486427801555702670962588115066256757324867491382462017574191456716733,1981204339034094603401407258434878579941320001362423757720624218545582193436,2236152791242103872172393874750142261282636211084579232127096130713267450507,195858203363587123382088472030599907085454473939842341555419599640907723424,590626224136245789757865937578097799864259962928817575889260884986588708615,556316483931022816515163225190650837414289035911644807045545808634538310869,629238788199681439344110926439601796064179705506735915053279723406573876506,1116540511330707114435151703137547153528195055930125235331549770646547266976,339619788091096497867037937910073554419895227695532741673298505760644333956,3324844836330025714420173751431794900064144861616771667756842310453350147516,3323174335406026841501311425333738207301951363932236686878874280261951261,3467391610679097894672383287073377591242468172614206362262181476619914942334,679667865104893804073840127228860549199188336304906508061229040558595113685,3322361493825423717972082284092964863286944299266987840841084227033433433412,2738506047390005220211917248727257816088434856659857877235120623687037390651,848498007557378519926582790437482103614681092811450525118457883114215753492,784261950784119388369599218998242501010660506951035906759602400369730280905,588017583106914610824770793247460640250703491317402360667015644551919139898,249555784337004329995088658696072418175726765476135287966576267809191403702,26123090281254171262167817800684412235973910949969081195730506540340497738,638819670494034942016970028795240831273991642759791761209109920732689957995,2480642677634567681980558173625245913821377025187478154031337102048918799006,767698313290128369142018894591006341780746413787829340335532271584448015480,2700478994354322604592285588884263746761456683956373786735731045928058659265,1421300152064463617850020641428263182380873567547931339119635682654535109698,3021139430107123861204762648250155815481320753326235553863726568683225739964,2463051211815359518037963338455393049273889688731519997496087932191341914487,3536608717913417312242971262897276930620545558752602219653685806551695615780,169921295549291940002432793416022663883415593092213756457219045595029262384,3489525991924537731140158742152258440023840963985825581448864825372737921510,1036819571570605416146246983737396485986330760971083285129713695981671453375,2301008227636563033491502333714445003176618500369468184082564765948285577350,216653136088206418070799498870655321990413281077283300942984746315251501138,42826865102482394618768798458682849543649618466511523231959573851809002354,1591308683934067569252870913484880391269141050433309610511545754211909168699,2936154592827104088658752579517396876905157598446891893339579125711824324661,2203817022579129473937126334792477459197602479409443182239314038195771702158,0,2882270356332772176006363072816413294048841039037030335451882261893723850362,13,1331259654,1642697902,569297783,1369155800,1654271938,1217760805,1019847823,164583841,992394760,1216441664,27834397,167697417,1743705680,1323864626,1568268794,332454148,400721695,784020859,1330695001,1428768167,1591486389,1021537319,2069969018,1574396947,733902003,64479722,1268615708,996518242,1501293227,1989083271,958495642,1369101527,1975953625,1674062005,2088898926,1187991138,1366710805,1248143726,1632301310,1708257077,1783641359,644520943,1073171543,862875927,1192948003,1552486265,1398296663,66841477,1109237966,1623754756,1410975031,56999212,44,2364836124443673769566172104866814481291663233751013803677830655061989638025,235641033325303474278616149705927507201924901558046016943774860592483461804,194554977974715158015667550191144043066532108044757922183854122953405848368,3178275155193459113742270569327629470595399246864312897339147347360787702642,1715558971195029260893198503275619429556560906082882289738260010282191182228,2691309711297476462762536281199063719381522656746016447960758629222083957444,895505955147149193525378374514033425826615682299129570607144592649621822706,265656101827866526732846997577823602790854018767767212082889847109152111137,1074402522076711196950582927213035959107482206507417905797415146676099238401,3618258642795311690456795509142169443629213038517365070491404192555216130244,2910228712547521327448634991643999066389440963195316394181105056250921511064,3381555655392425414188915432130254549272104212155999475530509587053758511157,1117749323000976368080497810677006562959955817040433073787851295929738120768,269612371747878042322385449180915814806903899719850497997677694846820321492,2666767943600905633062780584250735675410155299681259423935760051347320689337,607929930638179534035194192677222880752856599530372832627447119358678741889,460807617952877606721273509286046467846159657657050659525163100732276981471,3478435081148840360842652090574601311340696477351011835253327013432803163936,3405137842667300666183044369186272393751675050547974406977908750903434556979,2153602217212136352502877246921474854327160141008077224568474053808855474111,3019266768764811113421133707291912858012940392643182950552203394791079914236,2214777516319366712332448960001060243652769578269488037403493181267917888936,2280311724030563611728615739815448537809836562197721098061961954702539605344,1330438743426377683011117413972326679613588042105219429131549455365492080240,699154908783461393613156374553118289765129634053934639210734914943660766475,2658472161499568554897377392049372121552708132221813123805357318612033899242,369041307162622580132231743358194614360785770186304464184124350588500100057,3241368601389162179373796770228879505146926682924705350732220578695471632797,1990043918616859503586870309092120035402957004908105544930282244948756470855,710337282771619927694823778973689462862677633405610616124647748069441240554,3279162897378377229764302049486901820031099455554483521068756373094419228026,1860737674662866299097166281889521612906139581695756166996620034511823533799,2283635002380158758368930618251974132432010627052067229186761450413077269872,581304982473971824164068344429585742943333666725309482044091486014662824675,1940477806492779079322725405575492356583270156109386947556688236748721295104,2321086951541208962204590747048327034807816721631858470085835424678161045615,847880401818540149081331729637906129652077150440267268031434206139230399345,3343671606905952006920565275986945425137434821174414412969238406773252778500,619183781686264187258172031985762042652437769781719324843469207115126516342,2917038000184645608425307155807734345331929710927966517272819282875717135022,1313371072810162270115046227646082011999923003701342248302466813458454854444,563185739469675881020673633710920590502783687428683522273611081705626490243,1409167947274144026539615774681215459996065631142804211851472969551425564920,3215409313177848414173847504273471544240486337398723961181227393525783088505,0,1556285275536220162611460149146259541612849936698239353140929932749802637262,16,517524919,1939802019,1299020153,636715062,177246700,756612641,990485592,270904959,659827875,235093474,688647161,1602969085,419389342,1006509229,10999412,482564373,1499254114,1812012707,87835836,970908907,1289942017,1316407757,1533637491,70575176,958047800,1833867841,954191393,598360016,1399510844,1745396855,135745562,2108489256,1535939018,1166076000,2003735918,1797883060,688087630,187860822,1608972012,129057407,227107651,1639421023,496924930,510390035,1601773547,1356422213,1762945185,2132507371,342697576,1572262076,876061763,1255436369,1451197447,2056628716,1769722280,117227106,2099152397,311977032,1106054752,1279434744,398335005,1292288235,442096752,1626199427,4].span(); + Serde::deserialize(ref proof_data).unwrap() + } \ No newline at end of file diff --git a/crates/prover/src/core/backend/cpu/quotients.rs b/crates/prover/src/core/backend/cpu/quotients.rs index 17cc007e1..4a8c1f2d5 100644 --- a/crates/prover/src/core/backend/cpu/quotients.rs +++ b/crates/prover/src/core/backend/cpu/quotients.rs @@ -1,18 +1,18 @@ -use itertools::{izip, zip_eq}; +use itertools::{izip, zip_eq, Itertools}; use num_traits::{One, Zero}; use super::CpuBackend; use crate::core::circle::CirclePoint; use crate::core::constraints::complex_conjugate_line_coeffs; use crate::core::fields::cm31::CM31; -use crate::core::fields::m31::BaseField; +use crate::core::fields::m31::{BaseField, M31}; use crate::core::fields::qm31::SecureField; use crate::core::fields::secure_column::SecureColumnByCoords; use crate::core::fields::FieldExpOps; use crate::core::pcs::quotients::{ColumnSampleBatch, PointSample, QuotientOps}; use crate::core::poly::circle::{CircleDomain, CircleEvaluation, SecureEvaluation}; use crate::core::poly::BitReversedOrder; -use crate::core::utils::{bit_reverse, bit_reverse_index}; +use crate::core::utils::bit_reverse_index; impl QuotientOps for CpuBackend { fn accumulate_quotients( @@ -23,15 +23,15 @@ impl QuotientOps for CpuBackend { _log_blowup_factor: u32, ) -> SecureEvaluation { let mut values = unsafe { SecureColumnByCoords::uninitialized(domain.size()) }; - let quotient_constants = quotient_constants(sample_batches, random_coeff, domain); + let quotient_constants = quotient_constants(sample_batches, random_coeff); for row in 0..domain.size() { let domain_point = domain.at(bit_reverse_index(row, domain.log_size())); + let query_values_at_row = columns.iter().map(|col| col[row]).collect_vec(); let row_value = accumulate_row_quotients( sample_batches, - columns, + &query_values_at_row, "ient_constants, - row, domain_point, ); values.set(row, row_value); @@ -42,23 +42,22 @@ impl QuotientOps for CpuBackend { pub fn accumulate_row_quotients( sample_batches: &[ColumnSampleBatch], - columns: &[&CircleEvaluation], + queried_values_at_row: &[BaseField], quotient_constants: &QuotientConstants, - row: usize, domain_point: CirclePoint, ) -> SecureField { + let denominator_inverses = denominator_inverses(sample_batches, domain_point); let mut row_accumulator = SecureField::zero(); - for (sample_batch, line_coeffs, batch_coeff, denominator_inverses) in izip!( + for (sample_batch, line_coeffs, batch_coeff, denominator_inverse) in izip!( sample_batches, "ient_constants.line_coeffs, "ient_constants.batch_random_coeffs, - "ient_constants.denominator_inverses + denominator_inverses ) { let mut numerator = SecureField::zero(); for ((column_index, _), (a, b, c)) in zip_eq(&sample_batch.columns_and_values, line_coeffs) { - let column = &columns[*column_index]; - let value = column[row] * *c; + let value = queried_values_at_row[*column_index] * *c; // The numerator is a line equation passing through // (sample_point.y, sample_value), (conj(sample_point), conj(sample_value)) // evaluated at (domain_point.y, value). @@ -69,8 +68,7 @@ pub fn accumulate_row_quotients( numerator += value - linear_term; } - row_accumulator = - row_accumulator * *batch_coeff + numerator.mul_cm31(denominator_inverses[row]); + row_accumulator = row_accumulator * *batch_coeff + numerator.mul_cm31(denominator_inverse); } row_accumulator } @@ -118,9 +116,9 @@ pub fn batch_random_coeffs( fn denominator_inverses( sample_batches: &[ColumnSampleBatch], - domain: CircleDomain, -) -> Vec> { - let mut flat_denominators = Vec::with_capacity(sample_batches.len() * domain.size()); + domain_point: CirclePoint, +) -> Vec { + let mut denominators = Vec::new(); // We want a P to be on a line that passes through a point Pr + uPi in QM31^2, and its conjugate // Pr - uPi. Thus, Pr - P is parallel to Pi. Or, (Pr - P).x * Pi.y - (Pr - P).y * Pi.x = 0. for sample_batch in sample_batches { @@ -129,36 +127,22 @@ fn denominator_inverses( let pry = sample_batch.point.y.0; let pix = sample_batch.point.x.1; let piy = sample_batch.point.y.1; - for row in 0..domain.size() { - let domain_point = domain.at(row); - flat_denominators.push((prx - domain_point.x) * piy - (pry - domain_point.y) * pix); - } + denominators.push((prx - domain_point.x) * piy - (pry - domain_point.y) * pix); } - let mut flat_denominator_inverses = vec![CM31::zero(); flat_denominators.len()]; - CM31::batch_inverse(&flat_denominators, &mut flat_denominator_inverses); + let mut denominator_inverses = vec![CM31::zero(); denominators.len()]; + CM31::batch_inverse(&denominators, &mut denominator_inverses); - flat_denominator_inverses - .chunks_mut(domain.size()) - .map(|denominator_inverses| { - bit_reverse(denominator_inverses); - denominator_inverses.to_vec() - }) - .collect() + denominator_inverses } pub fn quotient_constants( sample_batches: &[ColumnSampleBatch], random_coeff: SecureField, - domain: CircleDomain, ) -> QuotientConstants { - let line_coeffs = column_line_coeffs(sample_batches, random_coeff); - let batch_random_coeffs = batch_random_coeffs(sample_batches, random_coeff); - let denominator_inverses = denominator_inverses(sample_batches, domain); QuotientConstants { - line_coeffs, - batch_random_coeffs, - denominator_inverses, + line_coeffs: column_line_coeffs(sample_batches, random_coeff), + batch_random_coeffs: batch_random_coeffs(sample_batches, random_coeff), } } @@ -170,8 +154,6 @@ pub struct QuotientConstants { /// The random coefficients used to linearly combine the batched quotients For more details see /// [self::batch_random_coeffs]. pub batch_random_coeffs: Vec, - /// The inverses of the denominators of the quotients. - pub denominator_inverses: Vec>, } #[cfg(test)] diff --git a/crates/prover/src/core/backend/simd/poseidon252.rs b/crates/prover/src/core/backend/simd/poseidon252.rs index b001481b4..12acc1a19 100644 --- a/crates/prover/src/core/backend/simd/poseidon252.rs +++ b/crates/prover/src/core/backend/simd/poseidon252.rs @@ -1,4 +1,6 @@ use itertools::Itertools; +#[cfg(feature = "parallel")] +use rayon::prelude::*; use starknet_ff::FieldElement as FieldElement252; use super::SimdBackend; @@ -8,6 +10,7 @@ use crate::core::fields::m31::BaseField; use crate::core::vcs::ops::MerkleHasher; use crate::core::vcs::ops::MerkleOps; use crate::core::vcs::poseidon252_merkle::Poseidon252MerkleHasher; +use crate::parallel_iter; impl ColumnOps for SimdBackend { type Column = Vec; @@ -24,7 +27,7 @@ impl MerkleOps for SimdBackend { prev_layer: Option<&Vec>, columns: &[&Col], ) -> Vec { - (0..(1 << log_size)) + parallel_iter!(0..(1 << log_size)) .map(|i| { Poseidon252MerkleHasher::hash_node( prev_layer.map(|prev_layer| (prev_layer[2 * i], prev_layer[2 * i + 1])), diff --git a/crates/prover/src/core/fri.rs b/crates/prover/src/core/fri.rs index 83625794d..e772fdbc4 100644 --- a/crates/prover/src/core/fri.rs +++ b/crates/prover/src/core/fri.rs @@ -1,30 +1,31 @@ use std::cmp::Reverse; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use std::fmt::Debug; use std::iter::zip; use std::ops::RangeInclusive; -use itertools::Itertools; +use itertools::{zip_eq, Itertools}; use num_traits::Zero; use serde::{Deserialize, Serialize}; use thiserror::Error; -use tracing::{span, Level}; +use tracing::instrument; -use super::backend::CpuBackend; +use super::backend::{Col, CpuBackend}; use super::channel::{Channel, MerkleChannel}; use super::fields::m31::BaseField; -use super::fields::qm31::SecureField; +use super::fields::qm31::{SecureField, QM31}; use super::fields::secure_column::{SecureColumnByCoords, SECURE_EXTENSION_DEGREE}; use super::fields::FieldOps; -use super::poly::circle::{CircleEvaluation, PolyOps, SecureEvaluation}; +use super::poly::circle::{CircleDomain, PolyOps, SecureEvaluation}; use super::poly::line::{LineEvaluation, LinePoly}; use super::poly::twiddles::TwiddleTree; use super::poly::BitReversedOrder; -// TODO(andrew): Create fri/ directory, move queries.rs there and split this file up. -use super::queries::{Queries, SparseSubCircleDomain}; +use super::queries::Queries; +use super::ColumnVec; use crate::core::circle::Coset; use crate::core::fft::ibutterfly; use crate::core::fields::FieldExpOps; +use crate::core::poly::circle::CanonicCoset; use crate::core::poly::line::LineDomain; use crate::core::utils::bit_reverse_index; use crate::core::vcs::ops::{MerkleHasher, MerkleOps}; @@ -123,16 +124,16 @@ pub trait FriOps: FieldOps + PolyOps + Sized + FieldOps eval: &SecureEvaluation, ) -> (SecureEvaluation, SecureField); } + /// A FRI prover that applies the FRI protocol to prove a set of polynomials are of low degree. -pub struct FriProver, MC: MerkleChannel> { +pub struct FriProver<'columns, B: FriOps + MerkleOps, MC: MerkleChannel> { config: FriConfig, - inner_layers: Vec>, + first_layer: FriFirstLayerProver<'columns, B, MC::H>, + inner_layers: Vec>, last_layer_poly: LinePoly, - /// Unique sizes of committed columns sorted in descending order. - column_log_sizes: Vec, } -impl, MC: MerkleChannel> FriProver { +impl<'columns, B: FriOps + MerkleOps, MC: MerkleChannel> FriProver<'columns, B, MC> { /// Commits to multiple [CircleEvaluation]s. /// /// `columns` must be provided in descending order by size. @@ -153,34 +154,43 @@ impl, MC: MerkleChannel> FriProver { /// /// [`CircleDomain`]: super::poly::circle::CircleDomain // TODO(andrew): Add docs for all evaluations needing to be from canonic domains. + #[instrument(skip_all)] pub fn commit( channel: &mut MC::C, config: FriConfig, - columns: &[SecureEvaluation], + columns: &'columns [SecureEvaluation], twiddles: &TwiddleTree, ) -> Self { - let _span = span!(Level::INFO, "FRI commitment").entered(); assert!(!columns.is_empty(), "no columns"); assert!(columns.is_sorted_by_key(|e| Reverse(e.len())), "not sorted"); assert!(columns.iter().all(|e| e.domain.is_canonic()), "not canonic"); + + let first_layer = Self::commit_first_layer(channel, columns); let (inner_layers, last_layer_evaluation) = Self::commit_inner_layers(channel, config, columns, twiddles); let last_layer_poly = Self::commit_last_layer(channel, config, last_layer_evaluation); - let column_log_sizes = columns - .iter() - .map(|e| e.domain.log_size()) - .dedup() - .collect(); Self { config, + first_layer, inner_layers, last_layer_poly, - column_log_sizes, } } - /// Builds and commits to the inner FRI layers (all layers except the last layer). + /// Commits to the first FRI layer. + /// + /// All `columns` must be provided in descending order by size. + fn commit_first_layer( + channel: &mut MC::C, + columns: &'columns [SecureEvaluation], + ) -> FriFirstLayerProver<'columns, B, MC::H> { + let layer = FriFirstLayerProver::new(columns); + MC::mix_root(channel, layer.merkle_tree.root()); + layer + } + + /// Builds and commits to the inner FRI layers (all layers except the first and last). /// /// All `columns` must be provided in descending order by size. /// @@ -190,34 +200,34 @@ impl, MC: MerkleChannel> FriProver { config: FriConfig, columns: &[SecureEvaluation], twiddles: &TwiddleTree, - ) -> (Vec>, LineEvaluation) { - // Returns the length of the [LineEvaluation] a [CircleEvaluation] gets folded into. - let folded_len = - |e: &SecureEvaluation| e.len() >> CIRCLE_TO_LINE_FOLD_STEP; + ) -> (Vec>, LineEvaluation) { + /// Returns the length of the [`LineEvaluation`] a [`CircleEvaluation`] gets folded into. + /// + /// [`CircleEvaluation`]: crate::core::poly::circle::CircleEvaluation + fn folded_len(v: &SecureEvaluation) -> usize { + v.len() >> CIRCLE_TO_LINE_FOLD_STEP + } - let first_layer_size = folded_len(&columns[0]); - let first_layer_domain = LineDomain::new(Coset::half_odds(first_layer_size.ilog2())); - let mut layer_evaluation = LineEvaluation::new_zero(first_layer_domain); + let circle_poly_folding_alpha = channel.draw_felt(); + let first_inner_layer_domain = + LineDomain::new(Coset::half_odds(folded_len(&columns[0]).ilog2())); + let mut layer_evaluation = LineEvaluation::new_zero(first_inner_layer_domain); let mut columns = columns.iter().peekable(); - let mut layers = Vec::new(); - // Circle polynomials can all be folded with the same alpha. - let circle_poly_alpha = channel.draw_felt(); - while layer_evaluation.len() > config.last_layer_domain_size() { - // Check for any columns (circle poly evaluations) that should be combined. + // Check for circle polynomials in the first layer should be combined in this layer. while let Some(column) = columns.next_if(|c| folded_len(c) == layer_evaluation.len()) { B::fold_circle_into_line( &mut layer_evaluation, column, - circle_poly_alpha, + circle_poly_folding_alpha, twiddles, ); } - let layer = FriLayerProver::new(layer_evaluation); + let layer = FriInnerLayerProver::new(layer_evaluation); MC::mix_root(channel, layer.merkle_tree.root()); let folding_alpha = channel.draw_felt(); let folded_layer_evaluation = B::fold_line(&layer.evaluation, folding_alpha, twiddles); @@ -262,45 +272,47 @@ impl, MC: MerkleChannel> FriProver { last_layer_poly } - /// Generates a FRI proof and returns it with the opening positions for the committed columns. + /// Generates and returns a FRI proof with the query positions for the committed columns. /// - /// Returned column opening positions are mapped by their log size. - pub fn decommit(self, channel: &mut MC::C) -> (FriProof, ColumnQueries) { - let max_column_log_size = self.column_log_sizes[0]; + /// Returned query positions are mapped by column commitment domain log size. + pub fn decommit(self, channel: &mut MC::C) -> (FriProof, BTreeMap>) { + let max_column_log_size = self.first_layer.max_column_log_size(); let queries = Queries::generate(channel, max_column_log_size, self.config.n_queries); - let opening_positions = get_opening_positions(&queries, &self.column_log_sizes); - let query_positions = get_query_positions(&queries, &self.column_log_sizes); + let column_log_sizes = self.first_layer.column_log_sizes(); + let query_positions_per_log_size = + get_query_positions_per_log_size(&queries, column_log_sizes); let proof = self.decommit_on_queries(&queries); - ( - proof, - ColumnQueries { - query_positions, - opening_positions, - }, - ) + (proof, query_positions_per_log_size) } /// # Panics /// /// Panics if the queries were sampled on the wrong domain size. fn decommit_on_queries(self, queries: &Queries) -> FriProof { - let max_column_log_size = self.column_log_sizes[0]; - assert_eq!(queries.log_domain_size, max_column_log_size); - let first_layer_queries = queries.fold(CIRCLE_TO_LINE_FOLD_STEP); - let inner_layers = self - .inner_layers + let Self { + config: _, + first_layer, + inner_layers, + last_layer_poly, + } = self; + + let first_layer_proof = first_layer.decommit(queries); + + let inner_layer_proofs = inner_layers .into_iter() - .scan(first_layer_queries, |layer_queries, layer| { - let layer_proof = layer.decommit(layer_queries); - *layer_queries = layer_queries.fold(FOLD_STEP); - Some(layer_proof) - }) + .scan( + queries.fold(CIRCLE_TO_LINE_FOLD_STEP), + |layer_queries, layer| { + let layer_proof = layer.decommit(layer_queries); + *layer_queries = layer_queries.fold(FOLD_STEP); + Some(layer_proof) + }, + ) .collect(); - let last_layer_poly = self.last_layer_poly; - FriProof { - inner_layers, + first_layer: first_layer_proof, + inner_layers: inner_layer_proofs, last_layer_poly, } } @@ -308,13 +320,8 @@ impl, MC: MerkleChannel> FriProver { pub struct FriVerifier { config: FriConfig, - /// Alpha used to fold all circle polynomials to univariate polynomials. - circle_poly_alpha: SecureField, - /// Domain size queries should be sampled from. - expected_query_log_domain_size: u32, - /// The list of degree bounds of all committed circle polynomials. - column_bounds: Vec, - inner_layers: Vec>, + first_layer: FriFirstLayerVerifier, + inner_layers: Vec>, last_layer_domain: LineDomain, last_layer_poly: LinePoly, /// The queries used for decommitment. Initialized when calling @@ -347,15 +354,25 @@ impl FriVerifier { ) -> Result { assert!(column_bounds.is_sorted_by_key(|b| Reverse(*b))); + MC::mix_root(channel, proof.first_layer.commitment); + let max_column_bound = column_bounds[0]; - let expected_query_log_domain_size = - max_column_bound.log_degree_bound + config.log_blowup_factor; + let column_commitment_domains = column_bounds + .iter() + .map(|bound| { + CanonicCoset::new(bound.log_degree_bound + config.log_blowup_factor).circle_domain() + }) + .collect(); - // Circle polynomials can all be folded with the same alpha. - let circle_poly_alpha = channel.draw_felt(); + let first_layer = FriFirstLayerVerifier { + column_bounds, + column_commitment_domains, + proof: proof.first_layer, + folding_alpha: channel.draw_felt(), + }; - let mut inner_layers = Vec::new(); let mut layer_bound = max_column_bound.fold_to_line(); + let mut inner_layers = Vec::new(); let mut layer_domain = LineDomain::new(Coset::half_odds( layer_bound.log_degree_bound + config.log_blowup_factor, )); @@ -363,12 +380,10 @@ impl FriVerifier { for (layer_index, proof) in proof.inner_layers.into_iter().enumerate() { MC::mix_root(channel, proof.commitment); - let folding_alpha = channel.draw_felt(); - - inner_layers.push(FriLayerVerifier { + inner_layers.push(FriInnerLayerVerifier { degree_bound: layer_bound, domain: layer_domain, - folding_alpha, + folding_alpha: channel.draw_felt(), layer_index, proof, }); @@ -394,9 +409,7 @@ impl FriVerifier { Ok(Self { config, - circle_poly_alpha, - column_bounds, - expected_query_log_domain_size, + first_layer, inner_layers, last_layer_domain, last_layer_poly, @@ -417,54 +430,68 @@ impl FriVerifier { // TODO(andrew): Finish docs. pub fn decommit( mut self, - decommitted_values: Vec, + first_layer_query_evals: ColumnVec>, ) -> Result<(), FriVerificationError> { let queries = self.queries.take().expect("queries not sampled"); - self.decommit_on_queries(&queries, decommitted_values) + self.decommit_on_queries(&queries, first_layer_query_evals) } fn decommit_on_queries( self, queries: &Queries, - decommitted_values: Vec, + first_layer_query_evals: ColumnVec>, ) -> Result<(), FriVerificationError> { - assert_eq!(queries.log_domain_size, self.expected_query_log_domain_size); - assert_eq!(decommitted_values.len(), self.column_bounds.len()); - + let (inner_layer_queries, first_layer_folded_evals) = + self.decommit_first_layer(queries, first_layer_query_evals)?; let (last_layer_queries, last_layer_query_evals) = - self.decommit_inner_layers(queries, decommitted_values)?; - + self.decommit_inner_layers(&inner_layer_queries, first_layer_folded_evals)?; self.decommit_last_layer(last_layer_queries, last_layer_query_evals) } + /// Verifies the first layer decommitments. + /// + /// Returns the queries and first layer folded column evaluations needed for verifying + /// the inner FRI layers. + fn decommit_first_layer( + &self, + queries: &Queries, + first_layer_query_evals: ColumnVec>, + ) -> Result<(Queries, ColumnVec>), FriVerificationError> { + self.first_layer + .verify_and_fold(queries, first_layer_query_evals) + } + /// Verifies all inner layer decommitments. /// /// Returns the queries and query evaluations needed for verifying the last FRI layer. fn decommit_inner_layers( &self, queries: &Queries, - decommitted_values: Vec, + first_layer_folded_evals: ColumnVec>, ) -> Result<(Queries, Vec), FriVerificationError> { - let circle_poly_alpha = self.circle_poly_alpha; - let circle_poly_alpha_sq = circle_poly_alpha * circle_poly_alpha; + let first_layer_fold_alpha = self.first_layer.folding_alpha; + let first_layer_fold_alpha_pow_fold_factor = first_layer_fold_alpha.square(); - let mut decommitted_values = decommitted_values.into_iter(); - let mut column_bounds = self.column_bounds.iter().copied().peekable(); - let mut layer_queries = queries.fold(CIRCLE_TO_LINE_FOLD_STEP); + let mut layer_queries = queries.clone(); let mut layer_query_evals = vec![SecureField::zero(); layer_queries.len()]; + let mut first_layer_folded_evals = first_layer_folded_evals.into_iter(); + let mut first_layer_column_bounds = self.first_layer.column_bounds.iter().peekable(); for layer in self.inner_layers.iter() { - // Check for column evals that need to folded into this layer. - while column_bounds + // Check for evals committed in the first layer that need to be folded into this layer. + while first_layer_column_bounds .next_if(|b| b.fold_to_line() == layer.degree_bound) .is_some() { - let sparse_evaluation = decommitted_values.next().unwrap(); - let folded_evals = sparse_evaluation.fold(circle_poly_alpha); - assert_eq!(folded_evals.len(), layer_query_evals.len()); - - for (layer_eval, folded_eval) in zip(&mut layer_query_evals, folded_evals) { - *layer_eval = *layer_eval * circle_poly_alpha_sq + folded_eval; + let folded_column_evals = first_layer_folded_evals.next().unwrap(); + + for (curr_layer_eval, folded_column_eval) in + zip_eq(&mut layer_query_evals, folded_column_evals) + { + // TODO(andrew): As Ilya pointed out using the first layer's folding + // alpha here might not be sound. Investigate. + *curr_layer_eval *= first_layer_fold_alpha_pow_fold_factor; + *curr_layer_eval += folded_column_eval; } } @@ -473,8 +500,8 @@ impl FriVerifier { } // Check all values have been consumed. - assert!(column_bounds.is_empty()); - assert!(decommitted_values.is_empty()); + assert!(first_layer_column_bounds.is_empty()); + assert!(first_layer_folded_evals.is_empty()); Ok((layer_queries, layer_query_evals)) } @@ -502,80 +529,57 @@ impl FriVerifier { Ok(()) } - /// Samples queries and returns the opening positions for each unique column size. - /// - /// The order of the opening positions corresponds to the order of the column commitment. - pub fn column_queries(&mut self, channel: &mut MC::C) -> ColumnQueries { + /// Samples and returns query positions mapped by column log size. + pub fn query_positions_per_column_log_size( + &mut self, + channel: &mut MC::C, + ) -> BTreeMap> { let column_log_sizes = self - .column_bounds + .first_layer + .column_commitment_domains .iter() - .dedup() - .map(|b| b.log_degree_bound + self.config.log_blowup_factor) - .collect_vec(); - let queries = Queries::generate(channel, column_log_sizes[0], self.config.n_queries); - let query_positions = get_query_positions(&queries, &column_log_sizes); - let opening_positions = get_opening_positions(&queries, &column_log_sizes); + .map(|domain| domain.log_size()) + .collect::>(); + let max_column_log_size = *column_log_sizes.iter().max().unwrap(); + let queries = Queries::generate(channel, max_column_log_size, self.config.n_queries); + let query_positions_per_log_size = + get_query_positions_per_log_size(&queries, column_log_sizes); self.queries = Some(queries); - ColumnQueries { - query_positions, - opening_positions, - } + query_positions_per_log_size } } -/// Returns the column opening positions needed for verification. -/// -/// The column log sizes must be unique and in descending order. Returned -/// column opening positions are mapped by their log size. -fn get_opening_positions( - queries: &Queries, - column_log_sizes: &[u32], -) -> BTreeMap { - let mut prev_log_size = column_log_sizes[0]; - assert!(prev_log_size == queries.log_domain_size); - let mut prev_queries = queries.clone(); - let mut positions = BTreeMap::new(); - positions.insert(prev_log_size, prev_queries.opening_positions(FOLD_STEP)); - for log_size in column_log_sizes.iter().skip(1) { - let n_folds = prev_log_size - log_size; - let queries = prev_queries.fold(n_folds); - positions.insert(*log_size, queries.opening_positions(FOLD_STEP)); - prev_log_size = *log_size; - prev_queries = queries; - } - positions -} - /// Returns the column query positions needed for verification. /// /// The column log sizes must be unique and in descending order. /// Returned column query positions are mapped by their log size. -fn get_query_positions(queries: &Queries, column_log_sizes: &[u32]) -> BTreeMap> { - let mut prev_log_size = column_log_sizes[0]; - assert!(prev_log_size == queries.log_domain_size); - let mut prev_queries = queries.clone(); - let mut positions = BTreeMap::new(); - positions.insert(prev_log_size, prev_queries.positions.clone()); - for &log_size in column_log_sizes.iter().skip(1) { - let n_folds = prev_log_size - log_size; - let queries = prev_queries.fold(n_folds); - positions.insert(log_size, queries.positions.clone()); - prev_log_size = log_size; - prev_queries = queries; - } - positions +fn get_query_positions_per_log_size( + queries: &Queries, + column_log_sizes: BTreeSet, +) -> BTreeMap> { + column_log_sizes + .into_iter() + .map(|column_log_size| { + let column_queries = queries.fold(queries.log_domain_size - column_log_size); + (column_log_size, column_queries.positions) + }) + .collect() } #[derive(Clone, Copy, Debug, Error)] pub enum FriVerificationError { #[error("proof contains an invalid number of FRI layers")] InvalidNumFriLayers, - #[error("queries do not resolve to their commitment in layer {layer}")] + #[error("evaluations are invalid in the first layer")] + FirstLayerEvaluationsInvalid, + #[error("queries do not resolve to their commitment in the first layer")] + FirstLayerCommitmentInvalid { error: MerkleVerificationError }, + #[error("queries do not resolve to their commitment in inner layer {layer}")] InnerLayerCommitmentInvalid { layer: usize, error: MerkleVerificationError, }, - #[error("evaluations are invalid in layer {layer}")] + #[error("evaluations are invalid in inner layer {layer}")] InnerLayerEvaluationsInvalid { layer: usize }, #[error("degree of last layer is invalid")] LastLayerDegreeInvalid, @@ -585,7 +589,7 @@ pub enum FriVerificationError { #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct CirclePolyDegreeBound { - log_degree_bound: u32, + pub log_degree_bound: u32, } impl CirclePolyDegreeBound { @@ -634,19 +638,11 @@ impl LinePolyDegreeBound { /// A FRI proof. #[derive(Debug, Serialize, Deserialize)] pub struct FriProof { + pub first_layer: FriLayerProof, pub inner_layers: Vec>, pub last_layer_poly: LinePoly, } -/// Values of interest obtained from the execution of the FRI protocol. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct ColumnQueries { - /// Query positions mapped by log size. - pub query_positions: BTreeMap>, - /// Opening positions mapped by log size. - pub opening_positions: BTreeMap, -} - /// Number of folds for univariate polynomials. // TODO(andrew): Support different step sizes. pub const FOLD_STEP: u32 = 1; @@ -661,12 +657,111 @@ pub const CIRCLE_TO_LINE_FOLD_STEP: u32 = 1; pub struct FriLayerProof { /// The subset stored corresponds to the set of evaluations the verifier doesn't have but needs /// to fold and verify the merkle decommitment. - pub evals_subset: Vec, + pub missing_evals: Vec, pub decommitment: MerkleDecommitment, pub commitment: H::Hash, } -struct FriLayerVerifier { +struct FriFirstLayerVerifier { + /// The list of degree bounds of all circle polynomials commited in the first layer. + column_bounds: Vec, + /// The commitment domain all the circle polynomials in the first layer. + column_commitment_domains: Vec, + folding_alpha: SecureField, + proof: FriLayerProof, +} + +impl FriFirstLayerVerifier { + /// Verifies the layer's merkle decommitment and returns the the folded queries and query evals. + /// + /// # Errors + /// + /// An `Err` will be returned if: + /// * The proof doesn't store enough evaluations. + /// * The merkle decommitment is invalid. + /// + /// # Panics + /// + /// Panics if: + /// * The queries are sampled on the wrong domain. + /// * There are an invalid number of provided column evals. + fn verify_and_fold( + &self, + queries: &Queries, + evals_at_queries_by_column: ColumnVec>, + ) -> Result<(Queries, ColumnVec>), FriVerificationError> { + // Columns are provided in descending order by size. + let max_column_log_size = self.column_commitment_domains[0].log_size(); + assert_eq!(queries.log_domain_size, max_column_log_size); + + let mut missing_evals = self.proof.missing_evals.iter().copied(); + let mut decommitment_positions_by_log_size = BTreeMap::new(); + let mut all_column_decommitment_values = Vec::new(); + let mut folded_evals_by_column = Vec::new(); + + for (&column_domain, column_evals_at_queries) in + zip_eq(&self.column_commitment_domains, evals_at_queries_by_column) + { + let column_queries = queries.fold(queries.log_domain_size - column_domain.log_size()); + + let (column_decommitment_positions, sparse_evaluation) = + compute_openings_and_rebuild_evals( + &column_queries.positions, + &column_evals_at_queries, + &mut missing_evals, + CIRCLE_TO_LINE_FOLD_STEP, + column_domain.log_size(), + ) + .map_err(|InsufficientMissingEvalsError| { + FriVerificationError::FirstLayerEvaluationsInvalid + })?; + + // Columns of the same size have the same decommitment positions. + decommitment_positions_by_log_size + .insert(column_domain.log_size(), column_decommitment_positions); + + // Prepare values in the structure needed for merkle decommitment. + let column_decommitment_values: SecureColumnByCoords = sparse_evaluation + .subset_evals + .iter() + .flatten() + .copied() + .collect(); + + all_column_decommitment_values.extend(column_decommitment_values.columns); + + let folded_evals = sparse_evaluation.fold_circle(self.folding_alpha, column_domain); + folded_evals_by_column.push(folded_evals); + } + + // Check all proof evals have been consumed. + if !missing_evals.is_empty() { + return Err(FriVerificationError::FirstLayerEvaluationsInvalid); + } + + let merkle_verifier = MerkleVerifier::new( + self.proof.commitment, + self.column_commitment_domains + .iter() + .flat_map(|column_domain| [column_domain.log_size(); SECURE_EXTENSION_DEGREE]) + .collect(), + ); + + merkle_verifier + .verify( + &decommitment_positions_by_log_size, + all_column_decommitment_values, + self.proof.decommitment.clone(), + ) + .map_err(|error| FriVerificationError::FirstLayerCommitmentInvalid { error })?; + + let folded_queries = queries.fold(CIRCLE_TO_LINE_FOLD_STEP); + + Ok((folded_queries, folded_evals_by_column)) + } +} + +struct FriInnerLayerVerifier { degree_bound: LinePolyDegreeBound, domain: LineDomain, folding_alpha: SecureField, @@ -674,152 +769,178 @@ struct FriLayerVerifier { proof: FriLayerProof, } -impl FriLayerVerifier { +impl FriInnerLayerVerifier { /// Verifies the layer's merkle decommitment and returns the the folded queries and query evals. /// /// # Errors /// /// An `Err` will be returned if: - /// * The proof doesn't store enough evaluations. + /// * The proof doesn't store the correct number of evaluations. /// * The merkle decommitment is invalid. /// /// # Panics /// - /// Panics if the number of queries doesn't match the number of evals. + /// Panics if: + /// * The number of queries doesn't match the number of evals. + /// * The queries are sampled on the wrong domain. fn verify_and_fold( &self, queries: Queries, evals_at_queries: Vec, ) -> Result<(Queries, Vec), FriVerificationError> { - let decommitment = self.proof.decommitment.clone(); - let commitment = self.proof.commitment; + assert_eq!(queries.log_domain_size, self.domain.log_size()); - // Extract the evals needed for decommitment and folding. - let sparse_evaluation = self.extract_evaluation(&queries, &evals_at_queries)?; + let mut missing_evals = self.proof.missing_evals.iter().copied(); - // TODO: When leaf values are removed from the decommitment, also remove this block. - let actual_decommitment_evals: SecureColumnByCoords = sparse_evaluation - .subline_evals - .iter() - .flat_map(|e| e.values.into_iter()) - .collect(); + let (decommitment_positions, sparse_evaluation) = compute_openings_and_rebuild_evals( + &queries.positions, + &evals_at_queries, + &mut missing_evals, + FOLD_STEP, + self.domain.log_size(), + ) + .map_err(|InsufficientMissingEvalsError| { + FriVerificationError::InnerLayerEvaluationsInvalid { + layer: self.layer_index, + } + })?; - let folded_queries = queries.fold(FOLD_STEP); + // Check all proof evals have been consumed. + if !missing_evals.is_empty() { + return Err(FriVerificationError::InnerLayerEvaluationsInvalid { + layer: self.layer_index, + }); + } - // Positions of all the decommitment evals. - let decommitment_positions = folded_queries + let decommitment_values: SecureColumnByCoords = sparse_evaluation + .subset_evals .iter() - .flat_map(|folded_query| { - let start = folded_query << FOLD_STEP; - let end = start + (1 << FOLD_STEP); - start..end - }) - .collect::>(); + .flatten() + .copied() + .collect(); let merkle_verifier = MerkleVerifier::new( - commitment, + self.proof.commitment, vec![self.domain.log_size(); SECURE_EXTENSION_DEGREE], ); + merkle_verifier .verify( - [(self.domain.log_size(), decommitment_positions)] - .into_iter() - .collect(), - actual_decommitment_evals.columns.to_vec(), - decommitment, + &BTreeMap::from_iter([(self.domain.log_size(), decommitment_positions)]), + decommitment_values.columns.to_vec(), + self.proof.decommitment.clone(), ) .map_err(|e| FriVerificationError::InnerLayerCommitmentInvalid { layer: self.layer_index, error: e, })?; - let evals_at_folded_queries = sparse_evaluation.fold(self.folding_alpha); + let folded_queries = queries.fold(FOLD_STEP); + let folded_evals = sparse_evaluation.fold_line(self.folding_alpha, self.domain); - Ok((folded_queries, evals_at_folded_queries)) + Ok((folded_queries, folded_evals)) } +} - /// Returns the evaluations needed for decommitment. - /// - /// # Errors - /// - /// Returns an `Err` if the proof doesn't store enough evaluations. - /// - /// # Panics - /// - /// Panics if the number of queries doesn't match the number of evals. - fn extract_evaluation( - &self, - queries: &Queries, - evals_at_queries: &[SecureField], - ) -> Result { - // Evals provided by the verifier. - let mut evals_at_queries = evals_at_queries.iter().copied(); - - // Evals stored in the proof. - let mut proof_evals = self.proof.evals_subset.iter().copied(); - - let mut all_subline_evals = Vec::new(); - - // Group queries by the subline they reside in. - for subline_queries in queries.group_by(|a, b| a >> FOLD_STEP == b >> FOLD_STEP) { - let subline_start = (subline_queries[0] >> FOLD_STEP) << FOLD_STEP; - let subline_end = subline_start + (1 << FOLD_STEP); - - let mut subline_evals = Vec::new(); - let mut subline_queries = subline_queries.iter().peekable(); - - // Insert the evals. - for eval_position in subline_start..subline_end { - let eval = match subline_queries.next_if_eq(&&eval_position) { - Some(_) => evals_at_queries.next().unwrap(), - None => proof_evals.next().ok_or( - FriVerificationError::InnerLayerEvaluationsInvalid { - layer: self.layer_index, - }, - )?, - }; - - subline_evals.push(eval); - } +/// Commitment to the first FRI layer. +/// +/// The first layer commits to all circle polynomials (possibly of mixed degree) involved in FRI. +struct FriFirstLayerProver<'a, B: FriOps + MerkleOps, H: MerkleHasher> { + columns: &'a [SecureEvaluation], + merkle_tree: MerkleProver, +} - // Construct the domain. - // TODO(andrew): Create a constructor for LineDomain. - let subline_initial_index = bit_reverse_index(subline_start, self.domain.log_size()); - let subline_initial = self.domain.coset().index_at(subline_initial_index); - let subline_domain = LineDomain::new(Coset::new(subline_initial, FOLD_STEP)); +impl<'a, B: FriOps + MerkleOps, H: MerkleHasher> FriFirstLayerProver<'a, B, H> { + fn new(columns: &'a [SecureEvaluation]) -> Self { + let coordinate_columns = extract_coordinate_columns(columns); + let merkle_tree = MerkleProver::commit(coordinate_columns); - all_subline_evals.push(LineEvaluation::new( - subline_domain, - subline_evals.into_iter().collect(), - )); + FriFirstLayerProver { + columns, + merkle_tree, } + } - // Check all proof evals have been consumed. - if !proof_evals.is_empty() { - return Err(FriVerificationError::InnerLayerEvaluationsInvalid { - layer: self.layer_index, - }); + /// Returns the sizes of all circle polynomial commitment domains. + fn column_log_sizes(&self) -> BTreeSet { + self.columns + .iter() + .map(|e| e.domain.log_size()) + .dedup() + .collect() + } + + fn max_column_log_size(&self) -> u32 { + *self.column_log_sizes().iter().max().unwrap() + } + + /// Generates a decommitment at the specified query positions. + fn decommit(self, queries: &Queries) -> FriLayerProof { + let max_column_log_size = *self.column_log_sizes().iter().max().unwrap(); + assert_eq!(queries.log_domain_size, max_column_log_size); + + let mut missing_evals = Vec::new(); + let mut decommit_positions = BTreeMap::new(); + + for column in self.columns { + let column_log_size = column.domain.log_size(); + let column_queries = queries.fold(queries.log_domain_size - column_log_size); + + let (column_decommit_positions, column_missing_evals) = + compute_openings_and_missing_evals( + column, + &column_queries.positions, + CIRCLE_TO_LINE_FOLD_STEP, + ); + + decommit_positions.insert(column_log_size, column_decommit_positions); + missing_evals.extend(column_missing_evals); } - Ok(SparseLineEvaluation::new(all_subline_evals)) + let (_evals, decommitment) = self.merkle_tree.decommit( + &decommit_positions, + extract_coordinate_columns(self.columns), + ); + + let commitment = self.merkle_tree.root(); + + FriLayerProof { + missing_evals, + decommitment, + commitment, + } } } +/// Extracts all base field coordinate columns from each secure column. +fn extract_coordinate_columns( + columns: &[SecureEvaluation], +) -> Vec<&Col> { + let mut coordinate_columns = Vec::new(); + + for secure_column in columns { + for coordinate_column in secure_column.columns.iter() { + coordinate_columns.push(coordinate_column); + } + } + + coordinate_columns +} + /// A FRI layer comprises of a merkle tree that commits to evaluations of a polynomial. /// /// The polynomial evaluations are viewed as evaluation of a polynomial on multiple distinct cosets -/// of size two. Each leaf of the merkle tree commits to a single coset evaluation. -// TODO(andrew): Support different step sizes. -struct FriLayerProver, H: MerkleHasher> { +/// of size `two`. Each leaf of the merkle tree commits to a single coset evaluation. +// TODO(andrew): Support different step sizes and update docs. +struct FriInnerLayerProver, H: MerkleHasher> { evaluation: LineEvaluation, merkle_tree: MerkleProver, } -impl, H: MerkleHasher> FriLayerProver { +impl, H: MerkleHasher> FriInnerLayerProver { fn new(evaluation: LineEvaluation) -> Self { let merkle_tree = MerkleProver::commit(evaluation.values.columns.iter().collect_vec()); - #[allow(unreachable_code)] - FriLayerProver { + FriInnerLayerProver { evaluation, merkle_tree, } @@ -827,114 +948,155 @@ impl, H: MerkleHasher> FriLayerProver { /// Generates a decommitment of the subline evaluations at the specified positions. fn decommit(self, queries: &Queries) -> FriLayerProof { - let mut decommit_positions = Vec::new(); - let mut evals_subset = Vec::new(); - - // Group queries by the subline they reside in. - // TODO(andrew): Explain what a "subline" is at the top of the module. - for query_group in queries.group_by(|a, b| a >> FOLD_STEP == b >> FOLD_STEP) { - let subline_start = (query_group[0] >> FOLD_STEP) << FOLD_STEP; - let subline_end = subline_start + (1 << FOLD_STEP); - - let mut subline_queries = query_group.iter().peekable(); + let (decommit_positions, missing_evals) = + compute_openings_and_missing_evals(&self.evaluation.values, queries, FOLD_STEP); - for eval_position in subline_start..subline_end { - // Add decommitment position. - decommit_positions.push(eval_position); - - // Skip evals the verifier can calculate. - if subline_queries.next_if_eq(&&eval_position).is_some() { - continue; - } - - let eval = self.evaluation.values.at(eval_position); - evals_subset.push(eval); - } - } - - let commitment = self.merkle_tree.root(); - // TODO(andrew): Use _evals. + let layer_log_size = self.evaluation.domain().log_size(); let (_evals, decommitment) = self.merkle_tree.decommit( - &[(self.evaluation.len().ilog2(), decommit_positions)] - .into_iter() - .collect(), + &BTreeMap::from_iter([(layer_log_size, decommit_positions)]), self.evaluation.values.columns.iter().collect_vec(), ); + let commitment = self.merkle_tree.root(); + FriLayerProof { - evals_subset, + missing_evals, decommitment, commitment, } } } -/// Holds a foldable subset of circle polynomial evaluations. -#[derive(Debug, Clone)] -pub struct SparseCircleEvaluation { - subcircle_evals: Vec>, -} +/// Returns a column's merkle tree opening positions and missing evals the verifier can't compute +/// but requires for decommitment and folding. +/// +/// Output of the form: `(opening_positions, missing_evals)` +fn compute_openings_and_missing_evals( + column: &SecureColumnByCoords, + query_positions: &[usize], + fold_step: u32, +) -> (Vec, Vec) { + let mut decommit_positions = Vec::new(); + let mut missing_evals = Vec::new(); + + // Group queries by the folding coset they reside in. + for query_group in query_positions.group_by(|a, b| a >> fold_step == b >> fold_step) { + let opening_start = (query_group[0] >> fold_step) << fold_step; + let mut query_group = query_group.iter().peekable(); + let opening_positions = opening_start..opening_start + (1 << fold_step); + + for position in opening_positions { + // Add decommitment position. + decommit_positions.push(position); + + // Skip evals the verifier can calculate. + if query_group.next_if_eq(&&position).is_some() { + continue; + } -impl SparseCircleEvaluation { - /// # Panics - /// - /// Panics if the evaluation domain sizes don't equal the folding factor. - pub fn new( - subcircle_evals: Vec>, - ) -> Self { - let folding_factor = 1 << CIRCLE_TO_LINE_FOLD_STEP; - assert!(subcircle_evals.iter().all(|e| e.len() == folding_factor)); - Self { subcircle_evals } + let eval = column.at(position); + missing_evals.push(eval); + } } - fn fold(self, alpha: SecureField) -> Vec { - self.subcircle_evals - .into_iter() - .map(|e| { - let buffer_domain = LineDomain::new(e.domain.half_coset); - let mut buffer = LineEvaluation::new_zero(buffer_domain); - fold_circle_into_line( - &mut buffer, - &SecureEvaluation::new(e.domain, e.values.into_iter().collect()), - alpha, - ); - buffer.values.at(0) - }) - .collect() - } + (decommit_positions, missing_evals) } -impl<'a> IntoIterator for &'a mut SparseCircleEvaluation { - type Item = &'a mut CircleEvaluation; - type IntoIter = - std::slice::IterMut<'a, CircleEvaluation>; +/// Returns a column's merkle tree opening positions and re-builds the evaluations needed by +/// the verifier for folding and decommitment. +/// +/// # Panics +/// +/// Panics if the number of queries doesn't match the number of query evals. +fn compute_openings_and_rebuild_evals( + queries: &[usize], + query_evals: &[QM31], + mut missing_evals: impl Iterator, + fold_step: u32, + column_log_size: u32, +) -> Result<(Vec, SparseEvaluation), InsufficientMissingEvalsError> { + let mut query_evals = query_evals.iter().copied(); + + let mut opening_positions = Vec::new(); + let mut subset_evals = Vec::new(); + let mut subset_domain_index_initials = Vec::new(); + + // Group queries by the subset they reside in. + for subset_queries in queries.group_by(|a, b| a >> fold_step == b >> fold_step) { + let subset_start = (subset_queries[0] >> fold_step) << fold_step; + let subset_opening_positions = subset_start..subset_start + (1 << fold_step); + opening_positions.extend(subset_opening_positions.clone()); + + let mut subset_queries_iter = subset_queries.iter().copied().peekable(); + + let subset_eval = subset_opening_positions + .map(|position| match subset_queries_iter.next_if_eq(&position) { + Some(_) => Ok(query_evals.next().unwrap()), + None => missing_evals.next().ok_or(InsufficientMissingEvalsError), + }) + .collect::>()?; - fn into_iter(self) -> Self::IntoIter { - self.subcircle_evals.iter_mut() + subset_evals.push(subset_eval); + subset_domain_index_initials.push(bit_reverse_index(subset_start, column_log_size)); } + + let sparse_evaluation = SparseEvaluation::new(subset_evals, subset_domain_index_initials); + + Ok((opening_positions, sparse_evaluation)) } -/// Holds a small foldable subset of univariate SecureField polynomial evaluations. -/// Evaluation is held at the CPU backend. -#[derive(Debug, Clone)] -struct SparseLineEvaluation { - subline_evals: Vec>, +#[derive(Debug)] +struct InsufficientMissingEvalsError; + +/// Foldable subsets of evaluations on a [`CirclePoly`] or [`LinePoly`]. +/// +/// [`CirclePoly`]: crate::core::poly::circle::CirclePoly +struct SparseEvaluation { + // TODO(andrew): Perhaps subset isn't the right word. Coset, Subgroup? + subset_evals: Vec>, + subset_domain_initial_indexes: Vec, } -impl SparseLineEvaluation { +impl SparseEvaluation { /// # Panics /// - /// Panics if the evaluation domain sizes don't equal the folding factor. - fn new(subline_evals: Vec>) -> Self { - let folding_factor = 1 << FOLD_STEP; - assert!(subline_evals.iter().all(|e| e.len() == folding_factor)); - Self { subline_evals } + /// Panics if a subset size doesn't equal the folding factor or there arent the same number of + /// domain indexes as subsets. + // TODO(andrew): Find better name than `domain_initial_index_by_subset`. + fn new(subset_evals: Vec>, subset_domain_initial_indexes: Vec) -> Self { + let fold_factor = 1 << FOLD_STEP; + assert!(subset_evals.iter().all(|e| e.len() == fold_factor)); + assert_eq!(subset_evals.len(), subset_domain_initial_indexes.len()); + Self { + subset_evals, + subset_domain_initial_indexes, + } } - fn fold(self, alpha: SecureField) -> Vec { - self.subline_evals - .into_iter() - .map(|e| fold_line(&e, alpha).values.at(0)) + fn fold_line(self, fold_alpha: SecureField, source_domain: LineDomain) -> Vec { + zip(self.subset_evals, self.subset_domain_initial_indexes) + .map(|(eval, domain_initial_index)| { + let fold_domain_initial = source_domain.coset().index_at(domain_initial_index); + let fold_domain = LineDomain::new(Coset::new(fold_domain_initial, FOLD_STEP)); + let eval = LineEvaluation::new(fold_domain, eval.into_iter().collect()); + fold_line(&eval, fold_alpha).values.at(0) + }) + .collect() + } + + fn fold_circle(self, fold_alpha: SecureField, source_domain: CircleDomain) -> Vec { + zip(self.subset_evals, self.subset_domain_initial_indexes) + .map(|(eval, domain_initial_index)| { + let fold_domain_initial = source_domain.index_at(domain_initial_index); + let fold_domain = CircleDomain::new(Coset::new( + fold_domain_initial, + CIRCLE_TO_LINE_FOLD_STEP - 1, + )); + let eval = SecureEvaluation::new(fold_domain, eval.into_iter().collect()); + let mut buffer = LineEvaluation::new_zero(LineDomain::new(fold_domain.half_coset)); + fold_circle_into_line(&mut buffer, &eval, fold_alpha); + buffer.values.at(0) + }) .collect() } } @@ -1002,13 +1164,14 @@ pub fn fold_circle_into_line( #[cfg(test)] mod tests { + use std::assert_matches::assert_matches; use std::iter::zip; use itertools::Itertools; use num_traits::{One, Zero}; - use super::{get_opening_positions, FriVerificationError, SparseCircleEvaluation}; - use crate::core::backend::cpu::{CpuCircleEvaluation, CpuCirclePoly}; + use super::FriVerificationError; + use crate::core::backend::cpu::CpuCirclePoly; use crate::core::backend::{ColumnOps, CpuBackend}; use crate::core::circle::{CirclePointIndex, Coset}; use crate::core::fields::m31::BaseField; @@ -1020,28 +1183,23 @@ mod tests { }; use crate::core::poly::circle::{CircleDomain, PolyOps, SecureEvaluation}; use crate::core::poly::line::{LineDomain, LineEvaluation, LinePoly}; - use crate::core::poly::{BitReversedOrder, NaturalOrder}; - use crate::core::queries::{Queries, SparseSubCircleDomain}; + use crate::core::poly::BitReversedOrder; + use crate::core::queries::Queries; use crate::core::test_utils::test_channel; - use crate::core::utils::bit_reverse_index; use crate::core::vcs::blake2_merkle::Blake2sMerkleChannel; /// Default blowup factor used for tests. const LOG_BLOWUP_FACTOR: u32 = 2; - type FriProver = super::FriProver; + type FriProver<'a> = super::FriProver<'a, CpuBackend, Blake2sMerkleChannel>; type FriVerifier = super::FriVerifier; #[test] fn fold_line_works() { const DEGREE: usize = 8; // Coefficients are bit-reversed. - let even_coeffs: [SecureField; DEGREE / 2] = [1, 2, 1, 3] - .map(BaseField::from_u32_unchecked) - .map(SecureField::from); - let odd_coeffs: [SecureField; DEGREE / 2] = [3, 5, 4, 1] - .map(BaseField::from_u32_unchecked) - .map(SecureField::from); + let even_coeffs: [SecureField; DEGREE / 2] = [1, 2, 1, 3].map(SecureField::from); + let odd_coeffs: [SecureField; DEGREE / 2] = [3, 5, 4, 1].map(SecureField::from); let poly = LinePoly::new([even_coeffs, odd_coeffs].concat()); let even_poly = LinePoly::new(even_coeffs.to_vec()); let odd_poly = LinePoly::new(odd_coeffs.to_vec()); @@ -1089,48 +1247,38 @@ mod tests { const LOG_EXPECTED_BLOWUP_FACTOR: u32 = LOG_BLOWUP_FACTOR; const LOG_INVALID_BLOWUP_FACTOR: u32 = LOG_BLOWUP_FACTOR - 1; let config = FriConfig::new(2, LOG_EXPECTED_BLOWUP_FACTOR, 3); - let evaluation = polynomial_evaluation(6, LOG_INVALID_BLOWUP_FACTOR); + let column = &[polynomial_evaluation(6, LOG_INVALID_BLOWUP_FACTOR)]; + let twiddles = CpuBackend::precompute_twiddles(column[0].domain.half_coset); - FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + FriProver::commit(&mut test_channel(), config, column, &twiddles); } #[test] #[should_panic = "not canonic"] - fn committing_evaluation_from_invalid_domain_fails() { + fn committing_column_from_invalid_domain_fails() { let invalid_domain = CircleDomain::new(Coset::new(CirclePointIndex::generator(), 3)); assert!(!invalid_domain.is_canonic(), "must be an invalid domain"); - let evaluation = SecureEvaluation::new( + let config = FriConfig::new(2, 2, 3); + let column = SecureEvaluation::new( invalid_domain, - vec![SecureField::one(); 1 << 4].into_iter().collect(), + [SecureField::one(); 1 << 4].into_iter().collect(), ); + let twiddles = CpuBackend::precompute_twiddles(column.domain.half_coset); + let columns = &[column]; - FriProver::commit( - &mut test_channel(), - FriConfig::new(2, 2, 3), - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + FriProver::commit(&mut test_channel(), config, columns, &twiddles); } #[test] fn valid_proof_passes_verification() -> Result<(), FriVerificationError> { - const LOG_DEGREE: u32 = 3; - let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); - let log_domain_size = evaluation.domain.log_size(); - let queries = Queries::from_positions(vec![5], log_domain_size); + const LOG_DEGREE: u32 = 4; + let column = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(column.domain.half_coset); + let queries = Queries::from_positions(vec![5], column.domain.log_size()); let config = FriConfig::new(1, LOG_BLOWUP_FACTOR, queries.len()); - let decommitment_value = query_polynomial(&evaluation, &queries); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let decommitment_value = query_polynomial(&column, &queries); + let columns = &[column]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let proof = prover.decommit_on_queries(&queries); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let verifier = FriVerifier::commit(&mut test_channel(), config, proof, bound).unwrap(); @@ -1143,17 +1291,13 @@ mod tests { { const LOG_DEGREE: u32 = 3; const LAST_LAYER_LOG_BOUND: u32 = 0; - let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); - let log_domain_size = evaluation.domain.log_size(); - let queries = Queries::from_positions(vec![5], log_domain_size); + let column = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(column.domain.half_coset); + let queries = Queries::from_positions(vec![5], column.domain.log_size()); let config = FriConfig::new(LAST_LAYER_LOG_BOUND, LOG_BLOWUP_FACTOR, queries.len()); - let decommitment_value = query_polynomial(&evaluation, &queries); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let decommitment_value = query_polynomial(&column, &queries); + let columns = &[column]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let proof = prover.decommit_on_queries(&queries); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let verifier = FriVerifier::commit(&mut test_channel(), config, proof, bound).unwrap(); @@ -1164,65 +1308,56 @@ mod tests { #[test] fn valid_mixed_degree_proof_passes_verification() -> Result<(), FriVerificationError> { const LOG_DEGREES: [u32; 3] = [6, 5, 4]; - let evaluations = LOG_DEGREES.map(|log_d| polynomial_evaluation(log_d, LOG_BLOWUP_FACTOR)); - let log_domain_size = evaluations[0].domain.log_size(); + let columns = LOG_DEGREES.map(|log_d| polynomial_evaluation(log_d, LOG_BLOWUP_FACTOR)); + let twiddles = CpuBackend::precompute_twiddles(columns[0].domain.half_coset); + let log_domain_size = columns[0].domain.log_size(); let queries = Queries::from_positions(vec![7, 70], log_domain_size); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, queries.len()); - let prover = FriProver::commit( - &mut test_channel(), - config, - &evaluations, - &CpuBackend::precompute_twiddles(evaluations[0].domain.half_coset), - ); - let decommitment_values = evaluations.map(|p| query_polynomial(&p, &queries)).to_vec(); + let prover = FriProver::commit(&mut test_channel(), config, &columns, &twiddles); let proof = prover.decommit_on_queries(&queries); + let query_evals = columns.map(|p| query_polynomial(&p, &queries)).to_vec(); let bounds = LOG_DEGREES.map(CirclePolyDegreeBound::new).to_vec(); let verifier = FriVerifier::commit(&mut test_channel(), config, proof, bounds).unwrap(); - verifier.decommit_on_queries(&queries, decommitment_values) + verifier.decommit_on_queries(&queries, query_evals) } #[test] - fn valid_mixed_degree_end_to_end_proof_passes_verification() -> Result<(), FriVerificationError> - { + fn mixed_degree_proof_with_queries_sampled_from_channel_passes_verification( + ) -> Result<(), FriVerificationError> { const LOG_DEGREES: [u32; 3] = [6, 5, 4]; - let evaluations = LOG_DEGREES.map(|log_d| polynomial_evaluation(log_d, LOG_BLOWUP_FACTOR)); + let columns = LOG_DEGREES.map(|log_d| polynomial_evaluation(log_d, LOG_BLOWUP_FACTOR)); + let twiddles = CpuBackend::precompute_twiddles(columns[0].domain.half_coset); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, 3); - let prover = FriProver::commit( - &mut test_channel(), - config, - &evaluations, - &CpuBackend::precompute_twiddles(evaluations[0].domain.half_coset), - ); - let (proof, prover_col_queries) = prover.decommit(&mut test_channel()); - let decommitment_values = zip( - &evaluations, - prover_col_queries.opening_positions.values().rev(), - ) - .map(|(poly, positions)| open_polynomial(poly, positions)) - .collect(); + let prover = FriProver::commit(&mut test_channel(), config, &columns, &twiddles); + let (proof, prover_query_positions_per_log_size) = prover.decommit(&mut test_channel()); + let query_evals_per_column = columns.map(|eval| { + let query_positions = &prover_query_positions_per_log_size[&eval.domain.log_size()]; + query_polynomial_at_positions(&eval, query_positions) + }); let bounds = LOG_DEGREES.map(CirclePolyDegreeBound::new).to_vec(); let mut verifier = FriVerifier::commit(&mut test_channel(), config, proof, bounds).unwrap(); - let verifier_col_queries = verifier.column_queries(&mut test_channel()); + let verifier_query_positions_per_log_size = + verifier.query_positions_per_column_log_size(&mut test_channel()); - assert_eq!(prover_col_queries, verifier_col_queries); - verifier.decommit(decommitment_values) + assert_eq!( + prover_query_positions_per_log_size, + verifier_query_positions_per_log_size + ); + verifier.decommit(query_evals_per_column.to_vec()) } #[test] fn proof_with_removed_layer_fails_verification() { const LOG_DEGREE: u32 = 6; let evaluation = polynomial_evaluation(6, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![1], log_domain_size); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, queries.len()); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let proof = prover.decommit_on_queries(&queries); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; // Set verifier's config to expect one extra layer than prover config. @@ -1241,15 +1376,12 @@ mod tests { fn proof_with_added_layer_fails_verification() { const LOG_DEGREE: u32 = 6; let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![1], log_domain_size); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, queries.len()); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let proof = prover.decommit_on_queries(&queries); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; // Set verifier's config to expect one less layer than prover config. @@ -1268,56 +1400,50 @@ mod tests { fn proof_with_invalid_inner_layer_evaluation_fails_verification() { const LOG_DEGREE: u32 = 6; let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![5], log_domain_size); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, queries.len()); let decommitment_value = query_polynomial(&evaluation, &queries); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let mut proof = prover.decommit_on_queries(&queries); // Remove an evaluation from the second layer's proof. - proof.inner_layers[1].evals_subset.pop(); + proof.inner_layers[1].missing_evals.pop(); let verifier = FriVerifier::commit(&mut test_channel(), config, proof, bound).unwrap(); let verification_result = verifier.decommit_on_queries(&queries, vec![decommitment_value]); - assert!(matches!( + assert_matches!( verification_result, Err(FriVerificationError::InnerLayerEvaluationsInvalid { layer: 1 }) - )); + ); } #[test] fn proof_with_invalid_inner_layer_decommitment_fails_verification() { const LOG_DEGREE: u32 = 6; let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![5], log_domain_size); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, queries.len()); let decommitment_value = query_polynomial(&evaluation, &queries); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let mut proof = prover.decommit_on_queries(&queries); // Modify the committed values in the second layer. - proof.inner_layers[1].evals_subset[0] += BaseField::one(); + proof.inner_layers[1].missing_evals[0] += BaseField::one(); let verifier = FriVerifier::commit(&mut test_channel(), config, proof, bound).unwrap(); let verification_result = verifier.decommit_on_queries(&queries, vec![decommitment_value]); - assert!(matches!( + assert_matches!( verification_result, Err(FriVerificationError::InnerLayerCommitmentInvalid { layer: 1, .. }) - )); + ); } #[test] @@ -1325,15 +1451,12 @@ mod tests { const LOG_DEGREE: u32 = 6; const LOG_MAX_LAST_LAYER_DEGREE: u32 = 2; let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![1, 7, 8], log_domain_size); let config = FriConfig::new(LOG_MAX_LAST_LAYER_DEGREE, LOG_BLOWUP_FACTOR, queries.len()); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let mut proof = prover.decommit_on_queries(&queries); let bad_last_layer_coeffs = vec![One::one(); 1 << (LOG_MAX_LAST_LAYER_DEGREE + 1)]; @@ -1351,16 +1474,13 @@ mod tests { fn proof_with_invalid_last_layer_fails_verification() { const LOG_DEGREE: u32 = 6; let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![1, 7, 8], log_domain_size); let config = FriConfig::new(2, LOG_BLOWUP_FACTOR, queries.len()); let decommitment_value = query_polynomial(&evaluation, &queries); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let mut proof = prover.decommit_on_queries(&queries); // Compromise the last layer polynomial's first coefficient. @@ -1369,10 +1489,10 @@ mod tests { let verification_result = verifier.decommit_on_queries(&queries, vec![decommitment_value]); - assert!(matches!( + assert_matches!( verification_result, Err(FriVerificationError::LastLayerEvaluationsInvalid) - )); + ); } #[test] @@ -1380,16 +1500,13 @@ mod tests { fn decommit_queries_on_invalid_domain_fails_verification() { const LOG_DEGREE: u32 = 3; let evaluation = polynomial_evaluation(LOG_DEGREE, LOG_BLOWUP_FACTOR); + let twiddles = CpuBackend::precompute_twiddles(evaluation.domain.half_coset); let log_domain_size = evaluation.domain.log_size(); let queries = Queries::from_positions(vec![5], log_domain_size); let config = FriConfig::new(1, LOG_BLOWUP_FACTOR, queries.len()); let decommitment_value = query_polynomial(&evaluation, &queries); - let prover = FriProver::commit( - &mut test_channel(), - config, - &[evaluation.clone()], - &CpuBackend::precompute_twiddles(evaluation.domain.half_coset), - ); + let columns = &[evaluation]; + let prover = FriProver::commit(&mut test_channel(), config, columns, &twiddles); let proof = prover.decommit_on_queries(&queries); let bound = vec![CirclePolyDegreeBound::new(LOG_DEGREE)]; let verifier = FriVerifier::commit(&mut test_channel(), config, proof, bound).unwrap(); @@ -1421,40 +1538,18 @@ mod tests { (degree + 1).ilog2() } - // TODO: Remove after SubcircleDomain integration. fn query_polynomial( polynomial: &SecureEvaluation, queries: &Queries, - ) -> SparseCircleEvaluation { - let polynomial_log_size = polynomial.domain.log_size(); - let positions = - get_opening_positions(queries, &[queries.log_domain_size, polynomial_log_size]); - open_polynomial(polynomial, &positions[&polynomial_log_size]) + ) -> Vec { + let queries = queries.fold(queries.log_domain_size - polynomial.domain.log_size()); + query_polynomial_at_positions(polynomial, &queries.positions) } - fn open_polynomial( + fn query_polynomial_at_positions( polynomial: &SecureEvaluation, - positions: &SparseSubCircleDomain, - ) -> SparseCircleEvaluation { - let coset_evals = positions - .iter() - .map(|position| { - let coset_domain = position.to_circle_domain(&polynomial.domain); - let evals = coset_domain - .iter_indices() - .map(|p| { - polynomial.at(bit_reverse_index( - polynomial.domain.find(p).unwrap(), - polynomial.domain.log_size(), - )) - }) - .collect(); - let coset_eval = - CpuCircleEvaluation::::new(coset_domain, evals); - coset_eval.bit_reverse() - }) - .collect(); - - SparseCircleEvaluation::new(coset_evals) + query_positions: &[usize], + ) -> Vec { + query_positions.iter().map(|i| polynomial.at(*i)).collect() } } diff --git a/crates/prover/src/core/pcs/prover.rs b/crates/prover/src/core/pcs/prover.rs index 0a1c9617f..83f1ce70f 100644 --- a/crates/prover/src/core/pcs/prover.rs +++ b/crates/prover/src/core/pcs/prover.rs @@ -115,7 +115,7 @@ impl<'a, B: BackendForChannel, MC: MerkleChannel> CommitmentSchemeProver<'a, self.config.fri_config.log_blowup_factor, ); - // Run FRI commitment phase on the oods quotients. + // Run FRI commitment phase on the OODs quotients. let fri_prover = FriProver::::commit(channel, self.config.fri_config, "ients, self.twiddles); @@ -126,18 +126,13 @@ impl<'a, B: BackendForChannel, MC: MerkleChannel> CommitmentSchemeProver<'a, channel.mix_u64(proof_of_work); // FRI decommitment phase. - let (fri_proof, col_queries) = fri_prover.decommit(channel); + let (fri_proof, query_positions_per_log_size) = fri_prover.decommit(channel); // Decommit the FRI queries on the merkle trees. - let opening_positions = col_queries - .opening_positions - .iter() - .map(|(&log_size, domain)| (log_size, domain.flatten())) - .collect(); let decommitment_results = self .trees .as_ref() - .map(|tree| tree.decommit(&opening_positions)); + .map(|tree| tree.decommit(&query_positions_per_log_size)); let queried_values = decommitment_results.as_ref().map(|(v, _)| v.clone()); let decommitments = decommitment_results.map(|(_, d)| d); diff --git a/crates/prover/src/core/pcs/quotients.rs b/crates/prover/src/core/pcs/quotients.rs index 1a41e8303..b4575adeb 100644 --- a/crates/prover/src/core/pcs/quotients.rs +++ b/crates/prover/src/core/pcs/quotients.rs @@ -9,14 +9,13 @@ use crate::core::backend::cpu::quotients::{accumulate_row_quotients, quotient_co use crate::core::circle::CirclePoint; use crate::core::fields::m31::BaseField; use crate::core::fields::qm31::SecureField; -use crate::core::fri::SparseCircleEvaluation; use crate::core::poly::circle::{ CanonicCoset, CircleDomain, CircleEvaluation, PolyOps, SecureEvaluation, }; use crate::core::poly::BitReversedOrder; use crate::core::prover::VerificationError; -use crate::core::queries::SparseSubCircleDomain; use crate::core::utils::bit_reverse_index; +use crate::core::ColumnVec; pub trait QuotientOps: PolyOps { /// Accumulates the quotients of the columns at the given domain. @@ -104,22 +103,22 @@ pub fn fri_answers( column_log_sizes: Vec, samples: &[Vec], random_coeff: SecureField, - query_domain_per_log_size: BTreeMap, + query_positions_per_log_size: &BTreeMap>, queried_values_per_column: &[Vec], -) -> Result, VerificationError> { +) -> Result>, VerificationError> { izip!(column_log_sizes, samples, queried_values_per_column) .sorted_by_key(|(log_size, ..)| Reverse(*log_size)) .group_by(|(log_size, ..)| *log_size) .into_iter() .map(|(log_size, tuples)| { - let (_, samples, queried_valued_per_column): (Vec<_>, Vec<_>, Vec<_>) = + let (_, samples, queried_values_per_column): (Vec<_>, Vec<_>, Vec<_>) = multiunzip(tuples); fri_answers_for_log_size( log_size, &samples, random_coeff, - &query_domain_per_log_size[&log_size], - &queried_valued_per_column, + &query_positions_per_log_size[&log_size], + &queried_values_per_column, ) }) .collect() @@ -129,59 +128,41 @@ pub fn fri_answers_for_log_size( log_size: u32, samples: &[&Vec], random_coeff: SecureField, - query_domain: &SparseSubCircleDomain, + query_positions: &[usize], queried_values_per_column: &[&Vec], -) -> Result { - let commitment_domain = CanonicCoset::new(log_size).circle_domain(); +) -> Result, VerificationError> { let sample_batches = ColumnSampleBatch::new_vec(samples); for queried_values in queried_values_per_column { - if queried_values.len() != query_domain.flatten().len() { + if queried_values.len() != query_positions.len() { return Err(VerificationError::InvalidStructure( "Insufficient number of queried values".to_string(), )); } } - let mut queried_values_per_column = queried_values_per_column - .iter() - .map(|q| q.iter()) - .collect_vec(); - let mut evals = Vec::new(); - for subdomain in query_domain.iter() { - let domain = subdomain.to_circle_domain(&commitment_domain); - let quotient_constants = quotient_constants(&sample_batches, random_coeff, domain); - let mut column_evals = Vec::new(); - for queried_values in queried_values_per_column.iter_mut() { - let eval = CircleEvaluation::new( - domain, - queried_values.take(domain.size()).copied().collect_vec(), - ); - column_evals.push(eval); - } - - let mut values = Vec::new(); - for row in 0..domain.size() { - let domain_point = domain.at(bit_reverse_index(row, log_size)); - let value = accumulate_row_quotients( - &sample_batches, - &column_evals.iter().collect_vec(), - "ient_constants, - row, - domain_point, - ); - values.push(value); - } - let eval = CircleEvaluation::new(domain, values); - evals.push(eval); - } + let quotient_constants = quotient_constants(&sample_batches, random_coeff); + let commitment_domain = CanonicCoset::new(log_size).circle_domain(); + let mut row_index_iter = 0..query_positions.len(); + let mut quotient_evals_at_queries = Vec::new(); - let res = SparseCircleEvaluation::new(evals); - if !queried_values_per_column.iter().all(|x| x.is_empty()) { - return Err(VerificationError::InvalidStructure( - "Too many queried values".to_string(), + // TODO(andrew): This code is very similar to FriLayerVerifier::extract_evaluation. Consider + // breaking out the shared functionality. The different domains make it a little fiddly. + for &query_position in query_positions { + let domain_point = commitment_domain.at(bit_reverse_index(query_position, log_size)); + let row = row_index_iter.next().unwrap(); + let queried_values_at_row = queried_values_per_column + .iter() + .map(|col| col[row]) + .collect_vec(); + quotient_evals_at_queries.push(accumulate_row_quotients( + &sample_batches, + &queried_values_at_row, + "ient_constants, + domain_point, )); } - Ok(res) + + Ok(quotient_evals_at_queries) } #[cfg(test)] diff --git a/crates/prover/src/core/pcs/verifier.rs b/crates/prover/src/core/pcs/verifier.rs index e21b789f9..f718e8465 100644 --- a/crates/prover/src/core/pcs/verifier.rs +++ b/crates/prover/src/core/pcs/verifier.rs @@ -88,7 +88,8 @@ impl CommitmentSchemeVerifier { } // Get FRI query domains. - let column_queries = fri_verifier.column_queries(channel); + let query_positions_per_log_size = + fri_verifier.query_positions_per_column_log_size(channel); // Verify merkle decommitments. self.trees @@ -96,12 +97,7 @@ impl CommitmentSchemeVerifier { .zip_eq(proof.decommitments) .zip_eq(proof.queried_values.clone()) .map(|((tree, decommitment), queried_values)| { - let queries = column_queries - .opening_positions - .iter() - .map(|(&log_size, domain)| (log_size, domain.flatten())) - .collect(); - tree.verify(queries, queried_values, decommitment) + tree.verify(&query_positions_per_log_size, queried_values, decommitment) }) .0 .into_iter() @@ -121,11 +117,12 @@ impl CommitmentSchemeVerifier { self.column_log_sizes().flatten().into_iter().collect(), &samples, random_coeff, - column_queries.opening_positions, + &query_positions_per_log_size, &proof.queried_values.flatten(), )?; fri_verifier.decommit(fri_answers)?; + Ok(()) } } diff --git a/crates/prover/src/core/poly/line.rs b/crates/prover/src/core/poly/line.rs index 62b24ac97..295f279ef 100644 --- a/crates/prover/src/core/poly/line.rs +++ b/crates/prover/src/core/poly/line.rs @@ -113,9 +113,9 @@ pub struct LinePoly { /// Coefficients of the polynomial in [line_ifft] algorithm's basis. /// /// The coefficients are stored in bit-reversed order. - coeffs: Vec, + pub coeffs: Vec, /// The number of coefficients stored as `log2(len(coeffs))`. - log_size: u32, + pub log_size: u32, } impl LinePoly { diff --git a/crates/prover/src/core/prover/mod.rs b/crates/prover/src/core/prover/mod.rs index 53b2265f3..6b2502c7a 100644 --- a/crates/prover/src/core/prover/mod.rs +++ b/crates/prover/src/core/prover/mod.rs @@ -57,6 +57,8 @@ pub fn prove, MC: MerkleChannel>( let proof = StarkProof(commitment_scheme_proof); info!(proof_size_estimate = proof.size_estimate()); + println!("breakdown: {:?}", proof.size_breakdown_estimate()); + // Evaluate composition polynomial at OODS point and check that it matches the trace OODS // values. This is a sanity check. if proof.extract_composition_oods_eval().unwrap() @@ -186,6 +188,7 @@ impl StarkProof { } = commitment_scheme_proof; let FriProof { + first_layer, inner_layers, last_layer_poly, } = fri_proof; @@ -194,20 +197,24 @@ impl StarkProof { let mut inner_layers_hashes_size = 0; for FriLayerProof { - evals_subset, + missing_evals, decommitment, commitment, } in inner_layers { - inner_layers_samples_size += evals_subset.size_estimate(); + inner_layers_samples_size += missing_evals.size_estimate(); inner_layers_hashes_size += decommitment.size_estimate() + commitment.size_estimate(); } StarkProofSizeBreakdown { oods_samples: sampled_values.size_estimate(), queries_values: queried_values.size_estimate(), - fri_samples: last_layer_poly.size_estimate() + inner_layers_samples_size, - fri_decommitments: inner_layers_hashes_size, + fri_samples: last_layer_poly.size_estimate() + + inner_layers_samples_size + + first_layer.missing_evals.size_estimate(), + fri_decommitments: inner_layers_hashes_size + + first_layer.decommitment.size_estimate() + + first_layer.commitment.size_estimate(), trace_decommitments: commitments.size_estimate() + decommitments.size_estimate(), } } @@ -222,6 +229,7 @@ impl Deref for StarkProof { } /// Size estimate (in bytes) for different parts of the proof. +#[derive(Debug)] pub struct StarkProofSizeBreakdown { pub oods_samples: usize, pub queries_values: usize, @@ -277,7 +285,7 @@ impl SizeEstimate for MerkleDecommitment { impl SizeEstimate for FriLayerProof { fn size_estimate(&self) -> usize { let Self { - evals_subset, + missing_evals: evals_subset, decommitment, commitment, } = self; @@ -288,10 +296,11 @@ impl SizeEstimate for FriLayerProof { impl SizeEstimate for FriProof { fn size_estimate(&self) -> usize { let Self { + first_layer, inner_layers, last_layer_poly, } = self; - inner_layers.size_estimate() + last_layer_poly.size_estimate() + first_layer.size_estimate() + inner_layers.size_estimate() + last_layer_poly.size_estimate() } } diff --git a/crates/prover/src/core/queries.rs b/crates/prover/src/core/queries.rs index ff17a9640..91319d20e 100644 --- a/crates/prover/src/core/queries.rs +++ b/crates/prover/src/core/queries.rs @@ -4,9 +4,6 @@ use std::ops::Deref; use itertools::Itertools; use super::channel::Channel; -use super::circle::Coset; -use super::poly::circle::CircleDomain; -use super::utils::bit_reverse_index; pub const UPPER_BOUND_QUERY_BYTES: usize = 4; @@ -60,21 +57,6 @@ impl Queries { log_domain_size: self.log_domain_size - n_folds, } } - - pub fn opening_positions(&self, fri_step_size: u32) -> SparseSubCircleDomain { - assert!(fri_step_size > 0); - SparseSubCircleDomain { - domains: self - .iter() - .map(|q| SubCircleDomain { - coset_index: q >> fri_step_size, - log_size: fri_step_size, - }) - .dedup() - .collect(), - large_domain_log_size: self.log_domain_size, - } - } } impl Deref for Queries { @@ -85,51 +67,6 @@ impl Deref for Queries { } } -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct SparseSubCircleDomain { - pub domains: Vec, - pub large_domain_log_size: u32, -} - -impl SparseSubCircleDomain { - pub fn flatten(&self) -> Vec { - self.iter() - .flat_map(|sub_circle_domain| sub_circle_domain.to_decommitment_positions()) - .collect() - } -} - -impl Deref for SparseSubCircleDomain { - type Target = Vec; - - fn deref(&self) -> &Self::Target { - &self.domains - } -} - -/// Represents a circle domain relative to a larger circle domain. The `initial_index` is the bit -/// reversed query index in the larger domain. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct SubCircleDomain { - pub coset_index: usize, - pub log_size: u32, -} - -impl SubCircleDomain { - /// Calculates the decommitment positions needed for each query given the fri step size. - pub fn to_decommitment_positions(&self) -> Vec { - (self.coset_index << self.log_size..(self.coset_index + 1) << self.log_size).collect() - } - - /// Returns the represented [CircleDomain]. - pub fn to_circle_domain(&self, query_domain: &CircleDomain) -> CircleDomain { - let query = bit_reverse_index(self.coset_index << self.log_size, query_domain.log_size()); - let initial_index = query_domain.index_at(query); - let half_coset = Coset::new(initial_index, self.log_size - 1); - CircleDomain::new(half_coset) - } -} - #[cfg(test)] mod tests { use crate::core::channel::Blake2sChannel; @@ -183,55 +120,4 @@ mod tests { ); } } - - #[test] - pub fn test_conjugate_queries() { - let channel = &mut Blake2sChannel::default(); - let log_domain_size = 7; - let domain = CanonicCoset::new(log_domain_size).circle_domain(); - let mut values = domain.iter().collect::>(); - bit_reverse(&mut values); - - // Test random queries one by one because the conjugate queries are sorted. - for _ in 0..100 { - let query = Queries::generate(channel, log_domain_size, 1); - let conjugate_query = query[0] ^ 1; - let query_and_conjugate = query.opening_positions(1).flatten(); - let mut expected_query_and_conjugate = vec![query[0], conjugate_query]; - expected_query_and_conjugate.sort(); - assert_eq!(query_and_conjugate, expected_query_and_conjugate); - assert_eq!(values[query[0]], values[conjugate_query].conjugate()); - } - } - - #[test] - pub fn test_decommitment_positions() { - let channel = &mut Blake2sChannel::default(); - let log_domain_size = 31; - let n_queries = 100; - let fri_step_size = 3; - - let queries = Queries::generate(channel, log_domain_size, n_queries); - let queries_with_added_positions = queries.opening_positions(fri_step_size).flatten(); - - assert!(queries_with_added_positions.is_sorted()); - assert_eq!( - queries_with_added_positions.len(), - n_queries * (1 << fri_step_size) - ); - } - - #[test] - pub fn test_dedup_decommitment_positions() { - let log_domain_size = 7; - - // Generate all possible queries. - let queries = Queries { - positions: (0..1 << log_domain_size).collect(), - log_domain_size, - }; - let queries_with_conjugates = queries.opening_positions(log_domain_size - 2).flatten(); - - assert_eq!(*queries, *queries_with_conjugates); - } } diff --git a/crates/prover/src/core/vcs/blake2_merkle.rs b/crates/prover/src/core/vcs/blake2_merkle.rs index 293ed4ab3..8401716fa 100644 --- a/crates/prover/src/core/vcs/blake2_merkle.rs +++ b/crates/prover/src/core/vcs/blake2_merkle.rs @@ -69,7 +69,7 @@ mod tests { fn test_merkle_success() { let (queries, decommitment, values, verifier) = prepare_merkle::(); - verifier.verify(queries, values, decommitment).unwrap(); + verifier.verify(&queries, values, decommitment).unwrap(); } #[test] @@ -78,7 +78,7 @@ mod tests { decommitment.hash_witness[4] = Blake2sHash::default(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::RootMismatch ); } @@ -89,7 +89,7 @@ mod tests { values[3][2] = BaseField::zero(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::RootMismatch ); } @@ -100,7 +100,7 @@ mod tests { decommitment.hash_witness.pop(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::WitnessTooShort ); } @@ -111,7 +111,7 @@ mod tests { decommitment.hash_witness.push(Blake2sHash::default()); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::WitnessTooLong ); } @@ -122,7 +122,7 @@ mod tests { values[3].push(BaseField::zero()); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::ColumnValuesTooLong ); } @@ -133,7 +133,7 @@ mod tests { values[3].pop(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::ColumnValuesTooShort ); } diff --git a/crates/prover/src/core/vcs/poseidon252_merkle.rs b/crates/prover/src/core/vcs/poseidon252_merkle.rs index 75632876a..5ffba1ea6 100644 --- a/crates/prover/src/core/vcs/poseidon252_merkle.rs +++ b/crates/prover/src/core/vcs/poseidon252_merkle.rs @@ -95,7 +95,7 @@ mod tests { #[test] fn test_merkle_success() { let (queries, decommitment, values, verifier) = prepare_merkle::(); - verifier.verify(queries, values, decommitment).unwrap(); + verifier.verify(&queries, values, decommitment).unwrap(); } #[test] @@ -105,7 +105,7 @@ mod tests { decommitment.hash_witness[4] = FieldElement252::default(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::RootMismatch ); } @@ -117,7 +117,7 @@ mod tests { values[3][2] = BaseField::zero(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::RootMismatch ); } @@ -129,7 +129,7 @@ mod tests { decommitment.hash_witness.pop(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::WitnessTooShort ); } @@ -141,7 +141,7 @@ mod tests { decommitment.hash_witness.push(FieldElement252::default()); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::WitnessTooLong ); } @@ -153,7 +153,7 @@ mod tests { values[3].push(BaseField::zero()); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::ColumnValuesTooLong ); } @@ -165,7 +165,7 @@ mod tests { values[3].pop(); assert_eq!( - verifier.verify(queries, values, decommitment).unwrap_err(), + verifier.verify(&queries, values, decommitment).unwrap_err(), MerkleVerificationError::ColumnValuesTooShort ); } diff --git a/crates/prover/src/core/vcs/prover.rs b/crates/prover/src/core/vcs/prover.rs index 136821079..344e279af 100644 --- a/crates/prover/src/core/vcs/prover.rs +++ b/crates/prover/src/core/vcs/prover.rs @@ -5,7 +5,7 @@ use itertools::Itertools; use serde::{Deserialize, Serialize}; use super::ops::{MerkleHasher, MerkleOps}; -use super::utils::{next_decommitment_node, option_flatten_peekable}; +use super::utils::next_decommitment_node; use crate::core::backend::{Col, Column}; use crate::core::fields::m31::BaseField; use crate::core::utils::PeekableExt; @@ -107,8 +107,12 @@ impl, H: MerkleHasher> MerkleProver { // Queries to this layer come from queried node in the previous layer and queried // columns in this one. let mut prev_layer_queries = last_layer_queries.into_iter().peekable(); - let mut layer_column_queries = - option_flatten_peekable(queries_per_log_size.get(&layer_log_size)); + let mut layer_column_queries = queries_per_log_size + .get(&layer_log_size) + .into_iter() + .flatten() + .copied() + .peekable(); // Merge previous layer queries and column queries. while let Some(node_index) = diff --git a/crates/prover/src/core/vcs/verifier.rs b/crates/prover/src/core/vcs/verifier.rs index 0a907f58e..15926fa8d 100644 --- a/crates/prover/src/core/vcs/verifier.rs +++ b/crates/prover/src/core/vcs/verifier.rs @@ -52,7 +52,7 @@ impl MerkleVerifier { /// Returns `Ok(())` if the decommitment is successfully verified. pub fn verify( &self, - queries_per_log_size: BTreeMap>, + queries_per_log_size: &BTreeMap>, queried_values: ColumnVec>, decommitment: MerkleDecommitment, ) -> Result<(), MerkleVerificationError> { diff --git a/crates/prover/src/examples/blake/air.rs b/crates/prover/src/examples/blake/air.rs index fa918b8b4..17352cb1f 100644 --- a/crates/prover/src/examples/blake/air.rs +++ b/crates/prover/src/examples/blake/air.rs @@ -458,6 +458,7 @@ pub fn verify_blake( mod tests { use std::env; + use crate::core::fri::FriConfig; use crate::core::pcs::PcsConfig; use crate::core::vcs::blake2_merkle::Blake2sMerkleChannel; use crate::examples::blake::air::{prove_blake, verify_blake}; @@ -476,7 +477,15 @@ mod tests { .unwrap_or_else(|_| "6".to_string()) .parse::() .unwrap(); - let config = PcsConfig::default(); + // let config = PcsConfig::default(); + let config = PcsConfig { + pow_bits: 10, + fri_config: FriConfig { + log_blowup_factor: 1, + log_last_layer_degree_bound: 6, + n_queries: 50, + }, + }; // Prove. let proof = prove_blake::(log_n_instances, config); diff --git a/crates/prover/src/examples/mod.rs b/crates/prover/src/examples/mod.rs index 4a3511b51..b35a5be8e 100644 --- a/crates/prover/src/examples/mod.rs +++ b/crates/prover/src/examples/mod.rs @@ -3,4 +3,4 @@ pub mod plonk; pub mod poseidon; pub mod state_machine; pub mod wide_fibonacci; -pub mod xor; +// pub mod xor; diff --git a/crates/prover/src/examples/state_machine/mod.rs b/crates/prover/src/examples/state_machine/mod.rs index 268d37c30..1affc1abb 100644 --- a/crates/prover/src/examples/state_machine/mod.rs +++ b/crates/prover/src/examples/state_machine/mod.rs @@ -48,8 +48,8 @@ pub fn prove_state_machine( ); // Setup protocol. - let commitment_scheme = - &mut CommitmentSchemeProver::<_, Blake2sMerkleChannel>::new(config, &twiddles); + let mut commitment_scheme = + CommitmentSchemeProver::<_, Blake2sMerkleChannel>::new(config, &twiddles); // Trace. let trace_op0 = gen_trace(x_axis_log_rows, initial_state, 0); diff --git a/crates/prover/src/examples/wide_fibonacci/mod.rs b/crates/prover/src/examples/wide_fibonacci/mod.rs index 23d9c7e20..316f7123c 100644 --- a/crates/prover/src/examples/wide_fibonacci/mod.rs +++ b/crates/prover/src/examples/wide_fibonacci/mod.rs @@ -69,8 +69,12 @@ pub fn generate_trace( #[cfg(test)] mod tests { + use std::fs::File; + use std::io::Write; + use itertools::Itertools; use num_traits::{One, Zero}; + use starknet_ff::FieldElement; use super::WideFibonacciEval; use crate::constraint_framework::{ @@ -84,17 +88,24 @@ mod tests { #[cfg(not(target_arch = "wasm32"))] use crate::core::channel::Poseidon252Channel; use crate::core::fields::m31::BaseField; - use crate::core::pcs::{CommitmentSchemeProver, CommitmentSchemeVerifier, PcsConfig, TreeVec}; + use crate::core::fields::qm31::SecureField; + use crate::core::fri::{FriLayerProof, FriProof}; + use crate::core::pcs::{ + CommitmentSchemeProof, CommitmentSchemeProver, CommitmentSchemeVerifier, PcsConfig, TreeVec, + }; use crate::core::poly::circle::{CanonicCoset, CircleEvaluation, PolyOps}; + use crate::core::poly::line::LinePoly; use crate::core::poly::BitReversedOrder; - use crate::core::prover::{prove, verify}; + use crate::core::prover::{prove, verify, StarkProof}; use crate::core::vcs::blake2_merkle::Blake2sMerkleChannel; #[cfg(not(target_arch = "wasm32"))] use crate::core::vcs::poseidon252_merkle::Poseidon252MerkleChannel; + use crate::core::vcs::poseidon252_merkle::Poseidon252MerkleHasher; + use crate::core::vcs::prover::MerkleDecommitment; use crate::core::ColumnVec; use crate::examples::wide_fibonacci::{generate_trace, FibInput, WideFibonacciComponent}; - const FIB_SEQUENCE_LENGTH: usize = 100; + const FIB_SEQUENCE_LENGTH: usize = 512; fn generate_test_trace( log_n_instances: u32, @@ -151,7 +162,7 @@ mod tests { #[test] #[should_panic] fn test_wide_fibonacci_constraints_fails() { - const LOG_N_INSTANCES: u32 = 6; + const LOG_N_INSTANCES: u32 = 125; let mut trace = generate_test_trace(LOG_N_INSTANCES); // Modify the trace such that a constraint fail. @@ -219,8 +230,16 @@ mod tests { #[test] #[cfg(not(target_arch = "wasm32"))] fn test_wide_fib_prove_with_poseidon() { - const LOG_N_INSTANCES: u32 = 6; - let config = PcsConfig::default(); + use std::time::Instant; + + use crate::core::fri::FriConfig; + + let now = Instant::now(); + const LOG_N_INSTANCES: u32 = 20; + let config = PcsConfig { + pow_bits: 10, + fri_config: FriConfig::new(4, 4, 15), + }; // Precompute twiddles. let twiddles = SimdBackend::precompute_twiddles( CanonicCoset::new(LOG_N_INSTANCES + 1 + config.fri_config.log_blowup_factor) @@ -233,11 +252,20 @@ mod tests { let mut commitment_scheme = CommitmentSchemeProver::::new(config, &twiddles); + println!("Setup took: {:?}", now.elapsed()); + + let now = Instant::now(); // Trace. let trace = generate_test_trace(LOG_N_INSTANCES); + + println!("test trace took: {:?}", now.elapsed()); + + let now = Instant::now(); + let mut tree_builder = commitment_scheme.tree_builder(); tree_builder.extend_evals(trace); tree_builder.commit(prover_channel); + println!("extend took: {:?}", now.elapsed()); // Prove constraints. let component = WideFibonacciComponent::new( @@ -246,6 +274,7 @@ mod tests { log_n_rows: LOG_N_INSTANCES, }, ); + let now = Instant::now(); let proof = prove::( &[&component], prover_channel, @@ -253,6 +282,11 @@ mod tests { ) .unwrap(); + println!("proving took: {:?}", now.elapsed()); + + // _serialize_proof_cairo1(&proof); + _serialize_proof_cairo1_array(&proof); + // Verify. let verifier_channel = &mut Poseidon252Channel::default(); let commitment_scheme = @@ -261,6 +295,128 @@ mod tests { // Retrieve the expected column sizes in each commitment interaction, from the AIR. let sizes = component.trace_log_degree_bounds(); commitment_scheme.commit(proof.commitments[0], &sizes[0], verifier_channel); + println!("digest after commit: {}", verifier_channel.digest()); verify(&[&component], verifier_channel, commitment_scheme, proof).unwrap(); } + + fn _serialize_proof_cairo1_array(proof: &StarkProof) { + trait CairoSerialize { + fn serialize(&self, buffer: &mut Vec); + } + + impl CairoSerialize for BaseField { + fn serialize(&self, buffer: &mut Vec) { + buffer.push(self.0.into()); + } + } + + impl CairoSerialize for SecureField { + fn serialize(&self, buffer: &mut Vec) { + buffer.extend(self.to_m31_array().map(|c| FieldElement::from(c.0))); + } + } + + impl CairoSerialize for MerkleDecommitment { + fn serialize(&self, buffer: &mut Vec) { + let Self { + hash_witness, + column_witness, + } = self; + hash_witness.serialize(buffer); + column_witness.serialize(buffer); + } + } + + impl CairoSerialize for LinePoly { + fn serialize(&self, buffer: &mut Vec) { + let Self { coeffs, log_size } = self; + coeffs.serialize(buffer); + buffer.push((*log_size).into()); + } + } + + impl CairoSerialize for FriLayerProof { + fn serialize(&self, buffer: &mut Vec) { + let Self { + missing_evals: evals_subset, + decommitment, + commitment, + } = self; + evals_subset.serialize(buffer); + decommitment.serialize(buffer); + commitment.serialize(buffer); + } + } + + impl CairoSerialize for FriProof { + fn serialize(&self, buffer: &mut Vec) { + let Self { + first_layer, + inner_layers, + last_layer_poly, + } = self; + first_layer.serialize(buffer); + inner_layers.serialize(buffer); + last_layer_poly.serialize(buffer); + } + } + + impl CairoSerialize for FieldElement { + fn serialize(&self, buffer: &mut Vec) { + buffer.push(*self); + } + } + + impl CairoSerialize for CommitmentSchemeProof { + fn serialize(&self, buffer: &mut Vec) { + let Self { + commitments, + sampled_values, + decommitments, + queried_values, + proof_of_work, + fri_proof, + } = self; + commitments.serialize(buffer); + sampled_values.serialize(buffer); + decommitments.serialize(buffer); + queried_values.serialize(buffer); + buffer.push((*proof_of_work).into()); + fri_proof.serialize(buffer); + } + } + + impl CairoSerialize for StarkProof { + fn serialize(&self, buffer: &mut Vec) { + let Self(commitment_scheme_proof) = self; + commitment_scheme_proof.serialize(buffer); + } + } + + impl CairoSerialize for Vec { + fn serialize(&self, buffer: &mut Vec) { + buffer.push(self.len().into()); + self.iter().for_each(|v| v.serialize(buffer)); + } + } + + let mut values = Vec::new(); + proof.serialize(&mut values); + + println!("proof size: {} field elements", values.len()); + + let ser_proof = format!( + r#" + use stwo_cairo_verifier::verifier::StarkProof; + + pub fn proof() -> StarkProof {{ + let mut proof_data = array![{}].span(); + Serde::deserialize(ref proof_data).unwrap() + }}"#, + values.iter().map(|v| v.to_string()).join(",") + ); + + let mut file = File::create("proof.cairo").unwrap(); + file.write_all(ser_proof.as_bytes()).unwrap(); + } }