diff --git a/hydra/garaga/precompiled_circuits/poseidon_bn254.py b/hydra/garaga/precompiled_circuits/poseidon_bn254.py new file mode 100644 index 00000000..72576202 --- /dev/null +++ b/hydra/garaga/precompiled_circuits/poseidon_bn254.py @@ -0,0 +1,543 @@ +from garaga.definitions import CurveID, get_base_field +from garaga.modulo_circuit import ModuloCircuit +from garaga.modulo_circuit_structs import u384 + +# Global circuit definition +curve_id = CurveID.GRUMPKIN # BN254 +field = get_base_field(curve_id) +COMPILATION_MODE = 1 # 1 for Cairo, 0 for CairoZero. + +circuit = ModuloCircuit( + name=f"poseidon_{curve_id.name.lower()}", + curve_id=curve_id.value, + generic_circuit=False, + compilation_mode=COMPILATION_MODE, +) + +# Define inputs to the circuit +x = circuit.write_struct(u384("x", [field(1)])) # Input x = 1 +y = circuit.write_struct(u384("y", [field(2)])) # Input y = 2 + + +# Utility functions for Poseidon hash +def sigma(value): + """Applies the Poseidon sigma function.""" + x2 = circuit.mul(value, value) # (value * value) + x4 = circuit.mul(x2, x2) # (x2 * x2) + return circuit.mul(x4, value) # (x4 * value) + + +def ark(t, C, r, state): + """Applies the Ark step of the Poseidon hash.""" + return [circuit.add(state[i], C[i + r]) for i in range(t)] + + +def iterated_add(terms): + """Performs iterative addition since circuit.add can only take two parameters.""" + result = terms[0] + for term in terms[1:]: + result = circuit.add(result, term) + return result + + +def iterated_mul(terms): + """Performs iterative multiplication since circuit.mul can only take two parameters.""" + result = terms[0] + for term in terms[1:]: + result = circuit.mul(result, term) + return result + + +def mix(t, M, state): + """Applies the Mix step of the Poseidon hash.""" + return [ + iterated_add([circuit.mul(M[j][i], state[j]) for j in range(t)]) + for i in range(t) + ] + + +def mix_last(t, M, s, state): + """Applies the MixLast step of the Poseidon hash.""" + return iterated_add([circuit.mul(M[j][s], state[j]) for j in range(t)]) + + +def mix_s(t, S, r, state): + """Applies the MixS step of the Poseidon hash.""" + result = [ + iterated_add([circuit.mul(S[(t * 2 - 1) * r + i], state[i]) for i in range(t)]) + ] + result.extend( + circuit.add(state[i], circuit.mul(state[0], S[(t * 2 - 1) * r + t + i - 1])) + for i in range(1, t) + ) + return result + + +def poseidon_hash(x, y): + """Computes the Poseidon hash for two inputs x and y.""" + t = 3 # 2 inputs + 1 state + n_rounds_f = 8 # Full rounds + n_rounds_p = 57 # Partial rounds + + state = [circuit.set_or_get_constant(0), x, y] + + # Example constants (these should match the specific Poseidon implementation) + POSEIDON_C = [ + 0xEE9A592BA9A9518D05986D656F40C2114C4993C11BB29938D21D47304CD8E6E, + 0xF1445235F2148C5986587169FC1BCD887B08D4D00868DF5696FFF40956E864, + 0x8DFF3487E8AC99E1F29A058D0FA80B930C728730B7AB36CE879F3890ECF73F5, + 0x84D520E4E5BB469E1F9075CB7C490EFA59565EEDAE2D00CA8EF88CEEA2B0197, + 0x2D15D982D99577FA33DA56722416FD734B3E667A2F9F15D8EB3E767AE0FD811E, + 0xED2538844ABA161CF1578A43CF0364E91601F6536A5996D0EFBE65632C41B6D, + 0x2600C27D879FBCA186E739E6363C71CF804C877D829B735DCC3E3AF02955E60A, + 0x28F8BD44A583CBAA475BD15396430E7CCB99A5517440DFD970058558282BF2C5, + 0x9CD7D4C380DC5488781AAD012E7EAEF1ED314D7F697A5572D030C55DF153221, + 0x11BB6EE1291AABB206120ECAACE460D24B6713FEBE82234951E2BEE7D0F855F5, + 0x2D74E8FA0637D9853310F3C0E3FAE1D06F171580F5B8FD05349CADEECFCEB230, + 0x2735E4EC9D39BDFFAC9BEF31BACBA338B1A09559A511A18BE4B4D316ED889033, + 0xF03C1E9E0895DB1A5DA6312FAA78E971106C33F826E08DCF617E24213132DFD, + 0x17094CD297BF827CAF92920205B719C18741090B8F777811848A7E9EAD6778C4, + 0xDB8F419C21F92461FC2B3219465798348DF90D4178042C81BA7D4B4D559E2B8, + 0x243443613F64FFA417427ED5933FCFBC66809DB60B9CA1724A22709CECEEECE2, + 0x22AF49FBFD5D7E9FCD256C25C07D3DD8ECBBAE6DEECD03AA04BB191FADA75411, + 0x14FBD37FA8AD6E4E0C78A20D93C7230C4677F797B4327323F7F7C097C19420E0, + 0x15A9298BBB882534D4B2C9FBC6E4EF4189420C4EB3F3E1EA22FAA7E18B5AE625, + 0x2F7DE75F23DDAAA5221323EBCEB2F2AC83EEF92E854E75434C2F1D90562232BC, + 0x36A4432A868283B78A315E84C4AE5AECA216F2FF9E9B2E623584F7479CD5C27, + 0x2180D7786A8CF810E277218AB14A11E5E39F3C962F11E860AE1C5682C797DE5C, + 0xA268EF870736EEBD0CB55BE640D73EE3778990484CC03CE53572377EEFFF8E4, + 0x1EEFEFE11C0BE4664F2999031F15994829E982E8C90E09069DF9BAE16809A5B2, + 0x27E87F033BD1E0A89CA596E8CB77FE3A4B8FB93D9A1129946571A3C3CF244C52, + 0x1498A3E6599FE243321F57D6C5435889979C4F9D2A3E184D21451809178EE39, + 0x27C0A41F4CB9FE67E9DD4D7CE33707F74D5D6BCC235BEF108DEA1BBEBDE507AA, + 0x1F75230908B141B46637238B120FC770F4F4AE825D5004C16A7C91FE1DAE280F, + 0x25F99A9198E923167BBA831B15FFFD2D7B97B3A089808D4EB1F0A085BEE21656, + 0x101BC318E9EA5920D0F6ACDC2BB526593D3D56EC8ED14C67622974228BA900C6, + 0x1A175607067D517397C1334ECB019754EBC0C852A3CF091EC1CCC43207A83C76, + 0xF02F0E6D25F9EA3DEB245F3E8C381EE6B2EB380BA4AF5C1C4D89770155DF37B, + 0x151D757ACC8237AF08D8A6677203EC9692565DE456AE789FF358B3163B393BC9, + 0x256CD9577CEA143049E0A1FE0068DD20084980EE5B757890A79D13A3A624FAD4, + 0x513ABAFF6195EA48833B13DA50E0884476682C3FBDD195497B8AE86E1937C61, + 0x1D9570DC70A205F36F610251EE6E2E8039246E84E4AC448386D19DBAC4E4A655, + 0x18F1A5194755B8C5D5D7F1BF8AAA6F56EFFB012DD784CF5E044EEC50B29FC9D4, + 0x266B53B615EF73AC866512C091E4A4F2FA4BB0AF966EF420D88163238EEBBCA8, + 0x2D63234C9207438AA42B8DE27644C02268304DFEB8C89A1A3F4FD6E8344AE0F7, + 0x2AB30FBE51EE49BC7B3ADDE219A6F0B5FBB976205EF8DF7E0021DAEE6F55C693, + 0x1AEE6D4B3EBE9366DCB9CCE48969D4DF1DC42ABCD528B270068D9207FA6A45C9, + 0x1891AEAB71E34B895A79452E5864AE1D11F57646C60BB34AA211D123F6095219, + 0x24492B5F95C0B0876437E94B4101C69118E16B2657771BD3A7CAAB01C818AA4B, + 0x1752161B3350F7E1B3B2C8663A0D642964628213D66C10AB2FDDF71BCFDE68F, + 0xAB676935722E2F67CFB84938E614C6C2F445B8D148DE54368CFB8F90A00F3A7, + 0xB0F72472B9A2F5F45BC730117ED9AE5683FC2E6E227E3D4FE0DA1F7AA348189, + 0x16AA6F9273ACD5631C201D1A52FC4F8ACAF2B2152C3AE6DF13A78A513EDCD369, + 0x2F60B987E63614EB13C324C1D8716EB0BF62D9B155D23281A45C08D52435CD60, + 0x18D24AE01DDE92FD7606BB7884554E9DF1CB89B042F508FD9DB76B7CC1B21212, + 0x4FC3BF76FE31E2F8D776373130DF79D18C3185FDF1593960715D4724CFFA586, + 0xD18F6B53FC69546CFDD670B41732BDF6DEE9E06B21260C6B5D26270468DBF82, + 0xBA4231A918F13ACEC11FBAFA17C5223F1F70B4CDB045036FA5D7045BD10E24, + 0x7B458B2E00CD7C6100985301663E7EC33C826DA0635FF1EBEDD0DD86120B4C8, + 0x1C35C2D96DB90F4F6058E76F15A0C8286BBA24E2ED40B16CEC39E9FD7BAA5799, + 0x1D12BEA3D8C32A5D766568F03DD1ECDB0A4F589ABBEF96945E0DDE688E292050, + 0xD953E20022003270525F9A73526E9889C995BB62FDEA94313DB405A61300286, + 0x29F053EC388795D786A40BEC4C875047F06FF0B610B4040A760E33506D2671E1, + 0x4188E33735F46B14A4952A98463BC12E264D5F446E0C3F64B9679CAAAE44FC2, + 0x149EC28846D4F438A84F1D0529431BB9E996A408B7E97EB3BF1735CDBE96F68F, + 0xDE20FAE0AF5188BCA24B5F63630BAD47AEAFD98E651922D148CCE1C5FDDDEE8, + 0x12D650E8F790B1253EA94350E722AD2F7D836C234B8660EDF449FBA6984C6709, + 0x22AB53AA39F34AD30EA96717BA7446AAFDADBC1A8ABE28D78340DFC4BABB8F6C, + 0x26503E8D4849BDF5450DABEA7907BC3DE0DE109871DD776904A129DB9149166C, + 0x1D5E7A0E2965DFFA00F5454F5003C5C8EC34B23D897E7FC4C8064035B0D33850, + 0xEE3D8DAA098BEE012D96B7EC48448C6BC9A6AEFA544615B9CB3C7BBD07104CB, + 0x1BF282082A04979955D30754CD4D9056FA9EF7A7175703D91DC232B5F98EAD00, + 0x7AE1344ABFC6C2CE3E951BC316BEE49971645F16B693733A0272173EE9AD461, + 0x217E3A247827C376EC21B131D511D7DBDC98A36B7A47D97A5C8E89762EE80488, + 0x215FFE584B0EB067A003D438E2FBE28BABE1E50EFC2894117509B616ADDC30EE, + 0x1E770FC8ECBFDC8692DCEDC597C4CA0FBEC19B84E33DA57412A92D1D3CE3EC20, + 0x2F6243CDA919BF4C9F1E3A8A6D66A05742914FC19338B3C0E50E828F69FF6D1F, + 0x246EFDDC3117ECD39595D0046F44AB303A195D0E9CC89345D3C03FF87A11B693, + 0x53E8D9B3EA5B8ED4FE006F139CBC4E0168B1C89A918DFBE602BC62CEC6ADF1, + 0x1B894A2F45CB96647D910F6A710D38B7EB4F261BEEFFF135AEC04C1ABE59427B, + 0xAEB1554E266693D8212652479107D5FDC077ABF88651F5A42553D54EC242CC0, + 0x16A735F6F7209D24E6888680D1781C7F04BA7D71BD4B7D0E11FAF9DA8D9CA28E, + 0x487B8B7FAB5FC8FD7C13B4DF0543CD260E4BCBB615B19374FF549DCF073D41B, + 0x1E75B9D2C2006307124BEA26B0772493CFB5D512068C3AD677FDF51C92388793, + 0x5120E3D0E28003C253B46D5FF77D272AE46FA1E239D1C6C961DCB02DA3B388F, + 0xDA5FEB534576492B822E8763240119AC0900A053B171823F890F5FD55D78372, + 0x2E211B39A023031A22ACC1A1F5F3BB6D8C2666A6379D9D2C40CC8F78B7BD9ABE, + ] + POSEIDON_M = [ + [ + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2969F27EED31A480B9C36C764379DBCA2CC8FDD1415C3DDED62940BCDE0BD771, + 0x143021EC686A3F330D5F9E654638065CE6CD79E28C5B3753326244EE65A1B1A7, + ], + [ + 0x16ED41E13BB9C0C66AE119424FDDBCBC9314DC9FDBDEEA55D6C64543DC4903E0, + 0x2E2419F9EC02EC394C9871C832963DC1B89D743C8C7B964029B2311687B1FE23, + 0x176CC029695AD02582A70EFF08A6FD99D057E12E58E7D7B6B16CDFABC8EE2911, + ], + [ + 0x2B90BBA00FCA0589F617E7DCBFE82E0DF706AB640CEB247B791A93B74E36736D, + 0x101071F0032379B697315876690F053D148D4E109F5FB065C8AACC55A0F89BFA, + 0x19A3FC0A56702BF417BA7FEE3802593FA644470307043F7773279CD71D25D5E0, + ], + ] + POSEIDON_P = [ + [ + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1E6F20A11D1E31E43F83DCEDDDB9A0236203F5F24AE72C925A8A79A66831F51D, + 0x1BD8C528472E57BDC722A141F8785694484F426725403AE24084E3027E782467, + ], + [ + 0x16ED41E13BB9C0C66AE119424FDDBCBC9314DC9FDBDEEA55D6C64543DC4903E0, + 0x2D51BA82C8073C6D6BACF1AD5E56655B7143625B0A9E9C3190527A1A5F05079A, + 0x1B07D6D51E6F7E97E0AB10FC2E51EA83CE0611F940FF0731B5F927FE8D6A77C9, + ], + [ + 0x2B90BBA00FCA0589F617E7DCBFE82E0DF706AB640CEB247B791A93B74E36736D, + 0x11E12A40D262AE88E8376F62D19EDF43093CDEF1CCF34D985A3E53F0BC5765A0, + 0x221C170E4D02A2479C6F3E47B5FF55781574F980D89038308A3EF37CCE8463BD, + ], + ] + POSEIDON_S = [ + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x3F0815AB463F1B76EE25A9B8768B3231A89752F427F4F063AB718E707576B31, + 0x15648BF46F60D82954C7E33029B3617357012A3D3B1D34C8E008859F1DBFB317, + 0x127E00C2253DE07818CA7F2EAFDD7564D05EA850CF61F1DAA0CFEFBF7FBFBA85, + 0x66365AFD18A41EF9382FC0B1D265CB4D3CE470A8CBBB878F7D48051630747BD, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x219D14F823513140DC69A96F7FE7E086F4FA24C84E57DCF2B099715C4404AAE7, + 0x3A30BFBBF2CB86D4A6A63A8050D91F9F14F4D33696D37EBAEFA9AC2302132D5, + 0x2121BBCDEAA33A35B0270FB7D5C9F94EDAD5A84D74B06E3385104B0B41935BCC, + 0x196B544FBEB0A792CFBB82C289E579B7CD5580C2E338A389D053EF8B3D10E70E, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2809C3A1547C0CEE89C1DB270EF479C26973EC73EDB4BD4E7D907EA0202F560F, + 0x11C34446B083EF92CA157585A02B8B342A4C67175B31F4B5D40D4E96DFC5C8F1, + 0x253EA0B33A8BF3B2367C030E3289CBE0F6242AD7709D90B86D9D8026E2E39925, + 0x30467DC1930F6AFE90C89D4007AD29FC4F5A19C006D1030438C16DF85637BD5F, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2F9D4B55495F7E377E20E6F5A3A88AF7AA6A536458B38BBE13C8EBFBBBA54F44, + 0x1D9E9D5C736E3151F11D36D499E7E093D8EE2353BE18AAD54CFD03FF0FEAC4B8, + 0x124B617B43E598F9EBF622F7823A3DE7D1BFEDB87E097C315F343DE301E54841, + 0x198E7CFC66AE45774055CF073BEDC945A5F9C5B19CAE08D789CC5748FFE199B2, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2EAC25B3498DFADFFD124AB3AAD57789EB945BA57443099C5BB6C27ED977FE24, + 0x1EE02C175CDFE1871B378305C1BB9C904E8AF1D4454ED3550B3C6AB5F4F90126, + 0x616F8C34C607266B29EA8F9D2DFA47FF6FBB1D9745C48609FA98301D0F679D5, + 0x181D68B0A188504958B9F19CBBDB972A853E51ED385E4883A43A42832803370B, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2D5397CE863464A25D6B7F5B015D579181D1CE2F24CBABF6059E9327F5BA7004, + 0x15BF817491B94D71E8912940CC0B80277713E7D32DA2B6591724D8DBD4BC2618, + 0x2A7CBD11460B177AB76FEAB28B69485AC8CC687740BC910994A3827D29C08714, + 0xF7CD5FFA4661730AB56E447FAE5CC1763CB462DA80A85614C237B290DE9D502, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0xE0766004B4C4176EB13273508EB6575F768137D86D305BE644CE04531008100, + 0x625FA7145813481F6D148BE6B9C8BB7B54EE3C1AFAC00104E1F763000B9924C, + 0x7C5472508B459916EE0F5461AAD2E0B19CD9C7B184F515B65136318CE2C6A5, + 0x567375470D189B693AC77AB3FB7557231D53073951D43C54685879CB7A89FCB, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1D0406BCBEC83F8D5165F56C063E42108AD21F51EA4BFC71601174BA5C7B8BCC, + 0xC02B18EEF22332D280A8AA1F86405F3375F06342F8696EE7C73B46C63272CB7, + 0x17C1FC174CD9A6EBEAA7ADD2F801A664823509AD4FD1B15AAD053A55AD6DA4CF, + 0x5F843C23024EB1DAB7EBBC86709A021AAA6CAF433F7ED258A08638E9584B32D, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x22DF2420697CA28B5CC51C53165E002727B45CCD90A55C87589F792F0AD8CB37, + 0x2F1438303A7B49D473400AAEDF0F48009FD3AF804B76BE86417588EFC4D7302A, + 0x2323D5FCF2DA8965C6B2B7B4FBF9A24BBAA7F4DCCD35D5CA6155C5463093B23B, + 0x26C85B9DFBBE48FE83B753A5E7336B9F40F7B961E9C54F94E37700073D4D26E, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x31511000251EC86FEB38B5AB4E335F070B271DF4C20979528E41D65384C318F, + 0x18E588324A9BBAACB42FA69E5D90A0C0E27CD16B941E34A60FF5DF9A26C03AF1, + 0x2642B5D8E16B953B070635775C8D3C9498357D6AD9BEF2E7D99F03C10EA1F95F, + 0x21FC313BA11C60E8E84FF60DB906A0F031189B0B48335C4221F909AEF836C133, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2D3562E3D4B42BC6890B698CC6AB89F7311298BCBAC6E4E9F2F4D93D06DAE151, + 0xA74EF541D360E842E3E0B6FF7E5C7C77934A5F67616F01C189D886DFD2E0808, + 0x140564B53E0A812AC3983D6E3B433AFA43F434087D9E754967C2C9B1B02CAF8A, + 0x14709E32D98AE4CD18B400181E71AB9759C436C8E83FA6993ADB6F2DB6BBA9D0, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x734B2366C59E394423F179E1266DD392372DB4F2DBA651F4A619A4B52BDC010, + 0x11FB2D705C94B08D5AD3E3C5FB6629ABE963ED92913642C7D02D7E71088FD2D4, + 0x27D03ABF5C1F290E5D715EBA19371050EF6EB7F78FD84BE834E4CC3618059484, + 0x13ED9E9E6B452DF27FB3353CFC2CD63EBE817F212A39C6A8BB9B441AC1395861, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1319C51CF37AAA10246CDAAA04A12E88795DE4452604263A7C5B79AB99CBD23C, + 0xBCA25588D187B7F9DAD839F2C8CB526A4CF444EEBBD0E715B6CEA019AC3F2, + 0x1D837EA0341C5964181226874B923CD01A069B493F02F7A3C01BE23CF51D593F, + 0x1B41CE9ED3634CBD42C427CE4C5C83774149E2A6DBD25F24012090DB7DE4E7F9, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x671F0E3B674AE7CDDC790ECC4E946F4BCA74B98B78A127C7B56BD6673F1CE1F, + 0x19FC073797A39B272E40CD30615F55FEFEB682C1AC14143071D0449A5426E4E, + 0x17BEE47D262A497FD1F7C5C6D5A7C70FA4209480BF5D97311C5096619E9FD13, + 0x2073CFF92D3141B480763539CFF2978A4C7944721CC937BA00CC8527274471E3, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x3BD7B3E2C1885877F43182A55A91D48F9C58D152E730FE2C7AA46B1FA663BAA, + 0x226EBC9A538B5BBAFF128EDFB9BBF5FA0CEB100719A14C8DFED9FFBBBAD9B6B7, + 0xD395F0B08B9FEDE0373A06E1552C0E634A49572AF1D830DC6E394E8A5D3B21A, + 0x28242439B524540A30D49B68E19E31BA5284BD3BCF1E0F2F41F77D5331F99FFA, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x370D6FA19EAAC142D2DE034801AB85E0B457E129E91F929754B48C6154D4DF6, + 0x9A16F573B3280F390762ABF269579EAA37939BC0C753FEB0A2B2E0BCBDE1659, + 0x2228E360FB5B162B496AC443F98127EE3C0021A690B71B268D99981368231D97, + 0x7E42C2CA633D2C49FABF83991476D209431E34D8032B6A1B97675F3C567F944, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2CE12D7269663770C3CAB85A6215A32EED35FDA1D8E9D753A50FE96097724A9F, + 0x3D7427704C61E2009EEB9B1B45A0125084BC4DAF70973A7BA0B2231815B15DE, + 0x10F8ABF0764185861C1267FCF4B4B33CA096FB4DDC4626732D86921E553E69C6, + 0x17CCAF6F26F7267A025D7CB456E3AEB251A1A620AAF6568A5C95644C7C5914CC, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x63BB306B96310051385C3CE00CA820AD0E3651A6E55754D59DE6DF28CEA4D51, + 0x1F761EE5553C5E86F2C304A18095AB7403242E0B65E608BC920CF993A4169974, + 0xDC5F00BBFD7C1D9A23C0E666859BA6564BCDE8761B45717CD6BDFC09DE4E8F2, + 0x6DE511520E277B7DF07C3536381C13EB44CF790A230ABC391089760BFC40EF2, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2A134348C8660EFCF9EF54863E70528A1FD4481B50A1FE21F24A8C06E10CCA03, + 0xAEB5023BBB9A64C4BD80089E99EDF8ED5F6F1FFB63A7DBBA1B33520BCFCE37B, + 0x141A6D0810366AE225ECB5F0BFDC9995406C5960AB26155836FC51FB7CB933D1, + 0x9D2EA05EF54DADBBE776F404DCA6626CC0B2539990BC0B8BFE87497F1E2C5B7, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1E56D244A8E41BE5D104D5F8EF70891D22D4A5432441BFE8FF1A16E91719CDDE, + 0x1D4F020C57C4F14AEC908B2F99B5C4FD5E09447FA85C2FD68BA4D5C5F50C7B49, + 0x763911A3A92A4F0E09F4E14CD03398D8D82A1E09DB80FB0EE1E833764C18FD3, + 0x12857275BE2FE6B9BA2EC68F9061643F1FC5D9A2C5E47E55684366E54B302946, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2ED11CCD2E2E2376655FFE9A96C4B81ADC0A60353C5D83D4D0EBF50D1BBF87C0, + 0x3E31DE8958E82645B320D5E3E966EF4726D5B1C2CFBB4ACD288A21543C6D594, + 0x11E880DFEFDBD08858AE890046533D58DA28A608D7E905366EC2CA4A36E71963, + 0x1835B275DEAED2D00704A9C3CC21AB7A44A34662978D53C190DC25E969A507B2, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x68B75315E25ED4ACE5A4A9480E1D82CE5D44F76F1324240419F372FF8D3C3F5, + 0x1B7EF7D04AEC73D62B052D2AD12B92A4268FCCD795C839D698AD3B22823274D1, + 0x28C0C848022A90606F6193FF5501B57216B670727F4B8EFCC240D30BBAA9F03F, + 0x13BDA49296CBCC51686A7BFB1C39F3F254370985A16660EFD6E5D82D4F068E1B, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2E7987EA8204389D11EB10B34265E378A945729F86C3E0E2FD38490D3A594141, + 0x826D4A2324AD3AA4B2B45C10A190FEDEF702AEFFDA3226CE5415FFFD03935C8, + 0x2DBEEE85EAEAA9FA3675EF541C9DF7BB964A85435C3B59685F93B434036DED, + 0x227EE7A945EDAEE6919418ECB3279B11E6FA44F5F5C5ABFB966A4BE599CB86C7, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1D0A6D1A9519877805AC90D696FAF2A5FFADC23986DE8C698D541471C7244220, + 0x2208AABA508AE816DA4F333B7854FBBCD10EEA1DB284EC3E9F4DE02B25F6E9D4, + 0x28A58901035B2C99E36A7D29B587A215C9E59268E2F8E01A175720971CCF04EC, + 0x112F6D8D42B0A0D123A07865CA1376DF317A2A14FFC0191226F38A8ADFD6238, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x8C6EB19C016D1833174DDA182D266D5C727F97FB4D01F1DAF906B6D3C6E2308, + 0x1359D2D6C8B5A116D0B38B95F9C642DF75B1BE9A48C8698ECFEA9103F73F1879, + 0x10C5052EC67AB9B6A467C1CC1878D91AAA07AACF7725F8A5ED42B699C4AF3CA7, + 0x583C4D292D54F3CDB708803E6338FC6AFDB188D5D4E9F060193823684C96C75, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2D94A1C55BE382151A4054C5B96322E7BCD1FE2B3E076E16EE2C18BFC06F57B4, + 0x15E3402FDDE8770FB997369579C1B1703EF77C671927EAD80DBC64DD2211C3EC, + 0x185BE98784817F22F7B21E6B867D5A71B5000BEF8BB902EB302677E20A727BE3, + 0x18DB4321C721C03666ED8927C89890AA8AAD1B00C054547B5CA14CD94DE467B6, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2A852B6247F5D61F0C390B3F3D799188528849BCD2CD0AFF4EB2134A039B5126, + 0x2510AEED51B7F506E65FB9A18EE0124AA5276F6DE1CD771B165930204DA58F22, + 0xF2074A32EB8260FB5BD3A236F03A47B47B7FB54DCAD1D7977D6486513BAB5F2, + 0x2F4C69297866BD45A8270E19941926CEC3531C9E12C4C2C84971404BFA044090, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x154668727D2DBADF05D083A65093C0D0E92DF5FD5F3FD75E9B792C562A37473F, + 0x1E6FFC5D6A1FF5DC4FD77FC5AB5C8C4E8D3E2E375BCD1194A91E5B0F7B13CADF, + 0x2CF1A1D7C44309109D75ACBC9395CB8398C8B2D428538571FAFA389DA29990C6, + 0x140FB39A89F26F6D87CF76CD5CE8DA47AA5D8A023E24CF016ECF64CF793C9880, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1289D13D58A17B5BF0712B201FB3CDDFCE2C16DAC159990B8298A93A8589F9E8, + 0xF45CF974D2C9EDB5781E8D3D207ADC8370CF56BC5218749610920FE98B2DB2E, + 0x11909C81A16518046B79EDFD24F5ABCC585A81D1B333568B8687A1C9ECEB44D4, + 0x2990B23C81882F7709F3B891A0E3DA4D6917672F2D5A1041FD7BBD6792330D16, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x609551B14716CA3CD5560E0821E7285E0A083EA9A16DC102ECF461E4AEF7277, + 0xC8C1ABDFAB99D03FD93DCED2467354B6175DE1755F4F93DC0880EAA08D03F77, + 0x138BD098C4923B9FBD02F33F8BEC6C730DB3FED298EC09F78A7A55D08F2E0B10, + 0x2E61E4BC021630114673F0F77161AE55DCD0B45CE07D9AE3F21BB5A3190F14C0, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x124860913E3DF8F65A9C4060CE3297C626ABD1C22401C905DDB408260D8E910, + 0x13807F89C394A133EC104804D955CBE125F24C5701D98286C6AC8B7ED052EC8, + 0x2E88D1A6938F0788132AA9EEAEC08D2F59AA444050C8F4C4E85578ABB0FC2FE5, + 0x1F3D24F17CFC6050A0CBF64E1F1787E2257BE3C3BA607C2E8FCC1F26ABF3104, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1FE1CB0E2AE169F83B9D4F133D41FB5B3FE6C76A82A916BFD9B62F82F0F8D0BF, + 0xEF79351229409CD353329221229827E19946F3D8D1C48BF5E3377F9177071F3, + 0x18FB2E46FC1B90FE1C4893EF77A9D111507551883127860E89088608373BEDA9, + 0x77AFE2579F42EC14C32EF0761E23A3CC0AD6263A68C5CB61916BD57120D1868, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x79769092DAA5A752642C04CCF8A6EA54E2AC9836FDD65D248B186F1490B7B99, + 0x1D8BF229C19968F0254EB6E09C5C8BFD67EB9734606B676B663C76CF76BAB4A5, + 0x2A33B7D855E7FE55F93556E49E4B37737664F14236F17256428F29F6EC1BDDAD, + 0x25B0331D7E2B15AF4EC161C86E84BA6AB2056077E7AA7536340DC3187CCCA8B2, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x762098F5FE26598CCBF45E4810211B0FFCF8CCBB92C16E2F4F13F22342474E2, + 0xE234D720D70B2886D0DA4C007B1BDA42362E144185C70716DECE2B6172C2514, + 0x1D82BEDCCD2BC8A06E3742E720B7FEC2EA72182F11C0C60D135C811152AA4B60, + 0x480064D4B3EB0ADA5E9A3E7D05930B7C3397FD6B94D481314BD1C690A17C979, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x10A892763B3CCA9EF7593FBB1140EDC8C8E4580568560CF41867F7464FB0C11A, + 0xB5EC64548EA841AC921F9B2553680785978B315667AE4714DDE4CD7F4DE8B91, + 0x10554ACA4E348E5949761BD7131DFAEBD78010EDD030E1A9CE3C65C9DB931D46, + 0x15BE66F38D86B0998B93655462B1F475B9BE9DE306E150D4AC648FAB3DB0CFF6, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x176AD3600FD3491182D182957FFAD01BF6C26E9D4AB0C23CAAF308E427D3DBE8, + 0x2B6F355B3DBF65F09335001D705AC125E3BEB20F4FC11BD3CE82B5CF0AF2E6F2, + 0x1C85C06A6D5D40D81D7C89EDEFB32D1A8448C51288FA296B6DE9FF788C77451, + 0x20E1E876C4746A0CBD9A51D76B2E25F82361C389E43F7D1F51A70AAAC2460D79, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x20E46219F684186D2A024B637BC35A29EE3B08CE737701392D987DDA9217FA08, + 0x2EA7279DB9F2AA0F654E987907277C24480766367A8BD90E28BE0F2ED6091367, + 0x136BE2A7F18924C9362096D472BC75CA0969DC077C9171B1641BE95091780F74, + 0x1CA2033501BAA3F73067C4300FB0F51119ED5736FBC8F1F6C924BAF0DF5A0E9E, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0xA82F199C2505277ECAA75E495F34E3525824F7A4A9D9FA1DA810832B48A50C7, + 0xECF10485307B4BAE92FEFB0D7F7782A9F37A2722E7ED9EB7925A2DEA580B7D5, + 0x7B642138DFD6A6DD12AA22F08A8296D68615C8478F13AF16AEBBBB339A3936B, + 0x1D9DDA43A25593FFD2256D34921FB86ED70E760BA76D61E9CBC3B6DD0F1A2150, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2F1AF228520C8B751DC91136C91C6BCCD5367EB08213D392958CE2FD3D7D2FCE, + 0x1FECFE833AD540455C6D6C1AB3DE4ABAE61ADA625A1A2B6B18551A45A6CDE123, + 0x18FC8E608C735B2B3B0D7583460227575657FF8A77ABE637BDD3AD28E4A23C88, + 0x28F740BC1182E9706EBF03CB3F53ABA8A43CE0B618783A5586388A7547FAA815, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x47998CC0AF5A26B94AD301E4B998D29E960A4851CFD13822BED35B7146966A4, + 0x1B5F1525B31DB911DDA43E415E1B9A3A9725C7B52E880EE130A14A692B777B70, + 0x275A83FA5D19B4535F65E965A90EAC9BF770AE9BD1D7B1AF945FA57ED5C8DE6E, + 0x2E8789257ED2CBCCCB430568E49BC9DC2A563359808C9897CE3E40A6F6A27AA8, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x927F46CFE80FEEFEB2721A4C09E9D17F60C34500DCD6E41E2925A39C8E2C7C1, + 0x1F868AE04832A5DBC37619BFE6AB6A97FD8FB2CFBC1ECF9E0E484BBFE7698101, + 0x9D7A11E27D2F53109B73F745B2DEFED65D94BA80F308FB19CE6D56C9B45EFF4, + 0x282D857CFE8DA3B5104E1C2823FB7C5B9A7B25924FDA5995B0C351AA2B879DFF, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x20BA8A9FCEC815B13F349FF830AE663B27576E135C0744F6987FB0F6FF49C217, + 0x11B6AFC91E32F1CA4589FBA12E657D226D57B471DDD2AB1B66A8AE4DCBFB136E, + 0x2E666402AC9CC588316E335C7D93DB344788EEC2C72DDF3F908141736CEBC3BE, + 0x17522E0E9E64F795A202A110E283FAAD7057AEC5C9ED9A1A74920F2794F18595, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2D2ED17F7A1F3EE9E20B470CAD4CC7319E6ADB40E2FF24B7878CB9878EDBD3B9, + 0x1A81EFB19D7E1EDAA96FA276E89E85D08F75E54A8136F4D73C937DA16C7BF9F4, + 0x27FF57C1CA847E57210A7B44E52E5630F299C5F451C7A0D515A16BB3BD33E237, + 0x1C1A8E22230ABCD13C5BE96031BFA167840D117B3C6A5A0A11BE26A7F5FB1A94, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2A1C3F15D4927C843627A9CD533E4250D81E7774D2C32B59D5836F9C19A5657, + 0x2DDBB7239EB904D81C52499B37CB4BE1AF0373A10AC112E185ACB219899357E4, + 0xDFF198393085A754E0D6FAEC54BE81D8EDF8BC25EDADAB48A86FAD6DA0AFB60, + 0x10D50C2473146BBC76275FCC589D038DEC8DB28728789F28B6D5F504BD1645CA, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x61E8328FB5593F92A53DFD40E1022E6231BA45948506282536B08B4476C1538, + 0x1B589243847198DED90B644BEE31AC58067DEBF3F07D3C51CFA5A0DD9F6D9784, + 0x4B00C0DA1F851E59863B053BD4C6087190F0BDCCED99D5CE6F67A420A3BD1F7, + 0x239941A46C2B93D9126A70163009A7AC27F8A8D42E35018B3BEC8CDCB5DDFD67, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x204F26CA7993B03AC2C35377CB0A3712BFC9BC3EC0BFECB4E87EF6814ACF2EA2, + 0x85AFF9C7FDADBA039D832D8BE165A1E5747CF7308D515E348EF117E926D721C, + 0x249042A8DC111F27C4AE9DB044C0B0B3F10E57D05E093158EFD375DF00EA2068, + 0x6E799BCDF2B4A74542854F3029803E2F84550665203327B3E0825977413E96B, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x1CB3CAED4BFFB6ACA9F4D2C002921BC3FFFED333CAE12085C612496183B87996, + 0xB47E9755FAE480128A128BFD4FAA6A3DD6EA03CAB566889DCD99E84D310D51C, + 0xC7E4CEA365C2061920A0C9FD2C360A6506293BC024FD1CA3F0BB730DA886A4F, + 0x21DA1F701BAC77BCBBAA30D964D6F6F63DBE1B20D9D6988C8DCD7BA4187215DF, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x9AE612E8BA1CA1370905FB67899D10DB86B47BD19965B6EDD1A9486E3C6CC55, + 0x262E1E0B56CAC47FC150F284491190E6AAB75445B0C99373FE1F7A0E3B95CF3D, + 0x234BF4A7DCE7587C2C87C293E3BB7C9E2A7BFA5F29FD4DDEAA5D3F67491D34BD, + 0x2F6CBAC694C886B02D0A527CAC744FB658D2690E213D7432EEE67F6CB69F70C2, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x22ACCB18B7C49B4B7BB8C9FDF78B7ADED52AA1842FFF818D9A3300876DEC3AD9, + 0x81E2F0652F898C6D659F22D2C77BE302EABD9182A0B3D3CBF623A1DF7F8F2FC, + 0x12C0A25E70D006ECCEA3ADA75D669B8C534B962890F3FFC016B3186AD675B935, + 0x10EF9C23848128CC2FD6FC869DF24D7AB56EFD349EDD56F49F8D4F2381DF3259, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x2161CD280772819DD4A81262B71DF1BCC2C1D41B9491E0620BDA347962B240F0, + 0x2CEBB0AE5108318EB406590041B5248292533364F799BC41B7F4FDD12CB8D38A, + 0x2B2092F86B5979A7FE4F7C22D9561F3BF2852283A656880FB759E08709A0A62F, + 0x1566B3402D774B8C08146188425A442450CFC900CF643E7382B2D8507A065FED, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x11A316AA31607F268FB4C56D6C57BA01627C3635FCCF8D3D1A163E601D1A0173, + 0xDE7EE069C934256B782648B560E595408A5E8434644609152E353D9C2874E44, + 0x2D36F4029245704CC84DF0297708C5E5845C36AE706C72E67128B8949EAB1AF, + 0x1B8CC326B5EE160F53198C217FB34E899BDE46CD82DABDC284D7951D546F858, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x27625DA0F73EA07110689FB2187B71694CBF9203FD4DDF8A96ECE85407550EBB, + 0x1CD8338A3E5B1AD7CDC0DA581A6950F6DEA349C3EDDA06CB99BA025B94E4790D, + 0x5EA02D65B209F6DA763856C94B6438C78A8AED8D3E67E877A10A84072741A56, + 0x9F7CB68D4E388F85366CFCF284A895D8B6250CED627E810817743CE03330A55, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x18C6230DDC0F896827B043F5E58DBD1AEC13995A202E4EBCDFEB969E9D5C1212, + 0x73A6114B997285E1A91C0A0FDCCDAA8452E4F07BFD2E1A10578232096DB6DCD, + 0x2E78746340B2A6D222C6A1FC0838ADF5FE013F39B1660CE7A3E7742B2F37BE7F, + 0x7AA27E7150BADDD06303AD8E5E4BF4249B7EA846553DEF28E675259D3E5C851, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0xB66FDEC210EA4EABF623D2712CF4D9FA90273CCB4643F680CBC98345715EAD8, + 0x2FB6A29D9F394A589B633B8A4D6BE51C9C0601CE0B140BE641ACEA41C49AA5E3, + 0x29025CC66FD041C4FC845E9C1C2CD1288569FB243D049BD675A69DC889B2CE2A, + 0x150963F0ACA9BCBE4126214AB9C627A6F7ED731CFA695168B85D534B17BE3F48, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0xED59780302257663F72C1BFC6656EB7B5BCA2E47BEC0D5798A08A32A61A8A65, + 0x7E19CB8A893369B3D30AE188C767F391C11888A3000DEBFC8D30C06143CC084, + 0x600C7D2B6946345E5F1EEEAFB5EB8EC2B6ECFE528D2C052CD860AFB4A3AA272, + 0x596083B6C972BC13022A1F33D6523B4773F2CD0A480E19EA0125119F0385705, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0x210B5C36F27A07D97F98B9D8663D85DB2E64513099A8E1EF6DB21043631E24C4, + 0x13BB2764BF1475CFC7BB9F3D563C5CC201C2489874E9159326A8F4930B7883F9, + 0x202CF557D625C26080EB082862A76757287872B181E89997219E4B7576E24D30, + 0xE561C3F8BD4F76E76D49E97142D220601FBC5A03D905A4728EA1F95FD8824B2, + 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, + 0xDE20097480E7555471785DE07BD9809D57DD859BBE827307C33AE9ED7890597, + 0x72F2A6287FB984BB810DF8C5788EEBCFD2825613CB72BB80CDE8EDD76D2E97D, + 0x2969F27EED31A480B9C36C764379DBCA2CC8FDD1415C3DDED62940BCDE0BD771, + 0x143021EC686A3F330D5F9E654638065CE6CD79E28C5B3753326244EE65A1B1A7, + ] + + POSEIDON_C = [circuit.set_or_get_constant(x) for x in POSEIDON_C] + POSEIDON_M = [[circuit.set_or_get_constant(y) for y in x] for x in POSEIDON_M] + POSEIDON_P = [[circuit.set_or_get_constant(y) for y in x] for x in POSEIDON_P] + POSEIDON_S = [circuit.set_or_get_constant(x) for x in POSEIDON_S] + + # Initial Ark + state = ark(t, POSEIDON_C, 0, state) + + # # First half of full rounds + for r in range(n_rounds_f // 2 - 1): + state = [sigma(val) for val in state] + state = ark(t, POSEIDON_C, (r + 1) * t, state) + state = mix(t, POSEIDON_M, state) + + # # Middle round + state = [sigma(val) for val in state] + state = ark(t, POSEIDON_C, (n_rounds_f // 2) * t, state) + state = mix(t, POSEIDON_P, state) + + # # Partial rounds + for r in range(n_rounds_p): + state[0] = sigma(state[0]) + state = mix_s( + t, + POSEIDON_S, + r, + [circuit.add(state[0], POSEIDON_C[(n_rounds_f // 2 + 1) * t + r])] + + state[1:], + ) + + # # Second half of full rounds + for r in range(n_rounds_f // 2 - 1): + state = [sigma(val) for val in state] + state = ark( + t, POSEIDON_C, (n_rounds_f // 2 + 1) * t + n_rounds_p + r * t, state + ) + state = mix(t, POSEIDON_M, state) + + # # Final round + state = [sigma(val) for val in state] + + # Final MixLast + return mix_last(t, POSEIDON_M, 0, state) + + +# Compute the Poseidon hash +z = poseidon_hash(x, y) + +# Define the output of the circuit +circuit.extend_struct_output(u384("z", [z])) + +# Compile and print the compiled circuit +compiled_code, function_name = circuit.compile_circuit() +print(compiled_code) diff --git a/src/src/hashes.cairo b/src/src/hashes.cairo new file mode 100644 index 00000000..1eafb8fd --- /dev/null +++ b/src/src/hashes.cairo @@ -0,0 +1,3845 @@ +use core::circuit::{ + u384, circuit_add, circuit_mul, EvalCircuitTrait, CircuitOutputsTrait, CircuitInputs, + CircuitElement as CE, CircuitInput as CI, +}; +use garaga::{core::circuit::AddInputResultTrait2, definitions::get_GRUMPKIN_modulus}; + + +// Compute the poseidon hash of two elements for the BN254 scalar field (Fr). +// Comptaible with circomlib poseidon hash (2 inputs) and Noir's hash 2 poseidon::bn254::hash_2 +pub fn poseidon_hash_2_bn254(x: u384, y: u384) -> u384 { + // CONSTANT stack + let in0 = CE::> {}; // 0x0 + let in1 = CE::> {}; // 0xee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e + let in2 = CE::> {}; // 0xf1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864 + let in3 = CE::> {}; // 0x8dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5 + let in4 = CE::> {}; // 0x84d520e4e5bb469e1f9075cb7c490efa59565eedae2d00ca8ef88ceea2b0197 + let in5 = CE::> {}; // 0x2d15d982d99577fa33da56722416fd734b3e667a2f9f15d8eb3e767ae0fd811e + let in6 = CE::> {}; // 0xed2538844aba161cf1578a43cf0364e91601f6536a5996d0efbe65632c41b6d + let in7 = CE::> {}; // 0x2600c27d879fbca186e739e6363c71cf804c877d829b735dcc3e3af02955e60a + let in8 = CE::> {}; // 0x28f8bd44a583cbaa475bd15396430e7ccb99a5517440dfd970058558282bf2c5 + let in9 = CE::> {}; // 0x9cd7d4c380dc5488781aad012e7eaef1ed314d7f697a5572d030c55df153221 + let in10 = CE::< + CI<10>, + > {}; // 0x11bb6ee1291aabb206120ecaace460d24b6713febe82234951e2bee7d0f855f5 + let in11 = CE::< + CI<11>, + > {}; // 0x2d74e8fa0637d9853310f3c0e3fae1d06f171580f5b8fd05349cadeecfceb230 + let in12 = CE::< + CI<12>, + > {}; // 0x2735e4ec9d39bdffac9bef31bacba338b1a09559a511a18be4b4d316ed889033 + let in13 = CE::> {}; // 0xf03c1e9e0895db1a5da6312faa78e971106c33f826e08dcf617e24213132dfd + let in14 = CE::< + CI<14>, + > {}; // 0x17094cd297bf827caf92920205b719c18741090b8f777811848a7e9ead6778c4 + let in15 = CE::> {}; // 0xdb8f419c21f92461fc2b3219465798348df90d4178042c81ba7d4b4d559e2b8 + let in16 = CE::< + CI<16>, + > {}; // 0x243443613f64ffa417427ed5933fcfbc66809db60b9ca1724a22709ceceeece2 + let in17 = CE::< + CI<17>, + > {}; // 0x22af49fbfd5d7e9fcd256c25c07d3dd8ecbbae6deecd03aa04bb191fada75411 + let in18 = CE::< + CI<18>, + > {}; // 0x14fbd37fa8ad6e4e0c78a20d93c7230c4677f797b4327323f7f7c097c19420e0 + let in19 = CE::< + CI<19>, + > {}; // 0x15a9298bbb882534d4b2c9fbc6e4ef4189420c4eb3f3e1ea22faa7e18b5ae625 + let in20 = CE::< + CI<20>, + > {}; // 0x2f7de75f23ddaaa5221323ebceb2f2ac83eef92e854e75434c2f1d90562232bc + let in21 = CE::> {}; // 0x36a4432a868283b78a315e84c4ae5aeca216f2ff9e9b2e623584f7479cd5c27 + let in22 = CE::< + CI<22>, + > {}; // 0x2180d7786a8cf810e277218ab14a11e5e39f3c962f11e860ae1c5682c797de5c + let in23 = CE::> {}; // 0xa268ef870736eebd0cb55be640d73ee3778990484cc03ce53572377eefff8e4 + let in24 = CE::< + CI<24>, + > {}; // 0x1eefefe11c0be4664f2999031f15994829e982e8c90e09069df9bae16809a5b2 + let in25 = CE::< + CI<25>, + > {}; // 0x27e87f033bd1e0a89ca596e8cb77fe3a4b8fb93d9a1129946571a3c3cf244c52 + let in26 = CE::> {}; // 0x1498a3e6599fe243321f57d6c5435889979c4f9d2a3e184d21451809178ee39 + let in27 = CE::< + CI<27>, + > {}; // 0x27c0a41f4cb9fe67e9dd4d7ce33707f74d5d6bcc235bef108dea1bbebde507aa + let in28 = CE::< + CI<28>, + > {}; // 0x1f75230908b141b46637238b120fc770f4f4ae825d5004c16a7c91fe1dae280f + let in29 = CE::< + CI<29>, + > {}; // 0x25f99a9198e923167bba831b15fffd2d7b97b3a089808d4eb1f0a085bee21656 + let in30 = CE::< + CI<30>, + > {}; // 0x101bc318e9ea5920d0f6acdc2bb526593d3d56ec8ed14c67622974228ba900c6 + let in31 = CE::< + CI<31>, + > {}; // 0x1a175607067d517397c1334ecb019754ebc0c852a3cf091ec1ccc43207a83c76 + let in32 = CE::> {}; // 0xf02f0e6d25f9ea3deb245f3e8c381ee6b2eb380ba4af5c1c4d89770155df37b + let in33 = CE::< + CI<33>, + > {}; // 0x151d757acc8237af08d8a6677203ec9692565de456ae789ff358b3163b393bc9 + let in34 = CE::< + CI<34>, + > {}; // 0x256cd9577cea143049e0a1fe0068dd20084980ee5b757890a79d13a3a624fad4 + let in35 = CE::> {}; // 0x513abaff6195ea48833b13da50e0884476682c3fbdd195497b8ae86e1937c61 + let in36 = CE::< + CI<36>, + > {}; // 0x1d9570dc70a205f36f610251ee6e2e8039246e84e4ac448386d19dbac4e4a655 + let in37 = CE::< + CI<37>, + > {}; // 0x18f1a5194755b8c5d5d7f1bf8aaa6f56effb012dd784cf5e044eec50b29fc9d4 + let in38 = CE::< + CI<38>, + > {}; // 0x266b53b615ef73ac866512c091e4a4f2fa4bb0af966ef420d88163238eebbca8 + let in39 = CE::< + CI<39>, + > {}; // 0x2d63234c9207438aa42b8de27644c02268304dfeb8c89a1a3f4fd6e8344ae0f7 + let in40 = CE::< + CI<40>, + > {}; // 0x2ab30fbe51ee49bc7b3adde219a6f0b5fbb976205ef8df7e0021daee6f55c693 + let in41 = CE::< + CI<41>, + > {}; // 0x1aee6d4b3ebe9366dcb9cce48969d4df1dc42abcd528b270068d9207fa6a45c9 + let in42 = CE::< + CI<42>, + > {}; // 0x1891aeab71e34b895a79452e5864ae1d11f57646c60bb34aa211d123f6095219 + let in43 = CE::< + CI<43>, + > {}; // 0x24492b5f95c0b0876437e94b4101c69118e16b2657771bd3a7caab01c818aa4b + let in44 = CE::> {}; // 0x1752161b3350f7e1b3b2c8663a0d642964628213d66c10ab2fddf71bcfde68f + let in45 = CE::> {}; // 0xab676935722e2f67cfb84938e614c6c2f445b8d148de54368cfb8f90a00f3a7 + let in46 = CE::> {}; // 0xb0f72472b9a2f5f45bc730117ed9ae5683fc2e6e227e3d4fe0da1f7aa348189 + let in47 = CE::< + CI<47>, + > {}; // 0x16aa6f9273acd5631c201d1a52fc4f8acaf2b2152c3ae6df13a78a513edcd369 + let in48 = CE::< + CI<48>, + > {}; // 0x2f60b987e63614eb13c324c1d8716eb0bf62d9b155d23281a45c08d52435cd60 + let in49 = CE::< + CI<49>, + > {}; // 0x18d24ae01dde92fd7606bb7884554e9df1cb89b042f508fd9db76b7cc1b21212 + let in50 = CE::> {}; // 0x4fc3bf76fe31e2f8d776373130df79d18c3185fdf1593960715d4724cffa586 + let in51 = CE::> {}; // 0xd18f6b53fc69546cfdd670b41732bdf6dee9e06b21260c6b5d26270468dbf82 + let in52 = CE::> {}; // 0xba4231a918f13acec11fbafa17c5223f1f70b4cdb045036fa5d7045bd10e24 + let in53 = CE::> {}; // 0x7b458b2e00cd7c6100985301663e7ec33c826da0635ff1ebedd0dd86120b4c8 + let in54 = CE::< + CI<54>, + > {}; // 0x1c35c2d96db90f4f6058e76f15a0c8286bba24e2ed40b16cec39e9fd7baa5799 + let in55 = CE::< + CI<55>, + > {}; // 0x1d12bea3d8c32a5d766568f03dd1ecdb0a4f589abbef96945e0dde688e292050 + let in56 = CE::> {}; // 0xd953e20022003270525f9a73526e9889c995bb62fdea94313db405a61300286 + let in57 = CE::< + CI<57>, + > {}; // 0x29f053ec388795d786a40bec4c875047f06ff0b610b4040a760e33506d2671e1 + let in58 = CE::> {}; // 0x4188e33735f46b14a4952a98463bc12e264d5f446e0c3f64b9679caaae44fc2 + let in59 = CE::< + CI<59>, + > {}; // 0x149ec28846d4f438a84f1d0529431bb9e996a408b7e97eb3bf1735cdbe96f68f + let in60 = CE::> {}; // 0xde20fae0af5188bca24b5f63630bad47aeafd98e651922d148cce1c5fdddee8 + let in61 = CE::< + CI<61>, + > {}; // 0x12d650e8f790b1253ea94350e722ad2f7d836c234b8660edf449fba6984c6709 + let in62 = CE::< + CI<62>, + > {}; // 0x22ab53aa39f34ad30ea96717ba7446aafdadbc1a8abe28d78340dfc4babb8f6c + let in63 = CE::< + CI<63>, + > {}; // 0x26503e8d4849bdf5450dabea7907bc3de0de109871dd776904a129db9149166c + let in64 = CE::< + CI<64>, + > {}; // 0x1d5e7a0e2965dffa00f5454f5003c5c8ec34b23d897e7fc4c8064035b0d33850 + let in65 = CE::> {}; // 0xee3d8daa098bee012d96b7ec48448c6bc9a6aefa544615b9cb3c7bbd07104cb + let in66 = CE::< + CI<66>, + > {}; // 0x1bf282082a04979955d30754cd4d9056fa9ef7a7175703d91dc232b5f98ead00 + let in67 = CE::> {}; // 0x7ae1344abfc6c2ce3e951bc316bee49971645f16b693733a0272173ee9ad461 + let in68 = CE::< + CI<68>, + > {}; // 0x217e3a247827c376ec21b131d511d7dbdc98a36b7a47d97a5c8e89762ee80488 + let in69 = CE::< + CI<69>, + > {}; // 0x215ffe584b0eb067a003d438e2fbe28babe1e50efc2894117509b616addc30ee + let in70 = CE::< + CI<70>, + > {}; // 0x1e770fc8ecbfdc8692dcedc597c4ca0fbec19b84e33da57412a92d1d3ce3ec20 + let in71 = CE::< + CI<71>, + > {}; // 0x2f6243cda919bf4c9f1e3a8a6d66a05742914fc19338b3c0e50e828f69ff6d1f + let in72 = CE::< + CI<72>, + > {}; // 0x246efddc3117ecd39595d0046f44ab303a195d0e9cc89345d3c03ff87a11b693 + let in73 = CE::> {}; // 0x53e8d9b3ea5b8ed4fe006f139cbc4e0168b1c89a918dfbe602bc62cec6adf1 + let in74 = CE::< + CI<74>, + > {}; // 0x1b894a2f45cb96647d910f6a710d38b7eb4f261beefff135aec04c1abe59427b + let in75 = CE::> {}; // 0xaeb1554e266693d8212652479107d5fdc077abf88651f5a42553d54ec242cc0 + let in76 = CE::< + CI<76>, + > {}; // 0x16a735f6f7209d24e6888680d1781c7f04ba7d71bd4b7d0e11faf9da8d9ca28e + let in77 = CE::> {}; // 0x487b8b7fab5fc8fd7c13b4df0543cd260e4bcbb615b19374ff549dcf073d41b + let in78 = CE::< + CI<78>, + > {}; // 0x1e75b9d2c2006307124bea26b0772493cfb5d512068c3ad677fdf51c92388793 + let in79 = CE::> {}; // 0x5120e3d0e28003c253b46d5ff77d272ae46fa1e239d1c6c961dcb02da3b388f + let in80 = CE::> {}; // 0xda5feb534576492b822e8763240119ac0900a053b171823f890f5fd55d78372 + let in81 = CE::< + CI<81>, + > {}; // 0x2e211b39a023031a22acc1a1f5f3bb6d8c2666a6379d9d2c40cc8f78b7bd9abe + let in82 = CE::< + CI<82>, + > {}; // 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b + let in83 = CE::< + CI<83>, + > {}; // 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771 + let in84 = CE::< + CI<84>, + > {}; // 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7 + let in85 = CE::< + CI<85>, + > {}; // 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0 + let in86 = CE::< + CI<86>, + > {}; // 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23 + let in87 = CE::< + CI<87>, + > {}; // 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911 + let in88 = CE::< + CI<88>, + > {}; // 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d + let in89 = CE::< + CI<89>, + > {}; // 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa + let in90 = CE::< + CI<90>, + > {}; // 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0 + let in91 = CE::< + CI<91>, + > {}; // 0x1e6f20a11d1e31e43f83dcedddb9a0236203f5f24ae72c925a8a79a66831f51d + let in92 = CE::< + CI<92>, + > {}; // 0x1bd8c528472e57bdc722a141f8785694484f426725403ae24084e3027e782467 + let in93 = CE::< + CI<93>, + > {}; // 0x2d51ba82c8073c6d6bacf1ad5e56655b7143625b0a9e9c3190527a1a5f05079a + let in94 = CE::< + CI<94>, + > {}; // 0x1b07d6d51e6f7e97e0ab10fc2e51ea83ce0611f940ff0731b5f927fe8d6a77c9 + let in95 = CE::< + CI<95>, + > {}; // 0x11e12a40d262ae88e8376f62d19edf43093cdef1ccf34d985a3e53f0bc5765a0 + let in96 = CE::< + CI<96>, + > {}; // 0x221c170e4d02a2479c6f3e47b5ff55781574f980d89038308a3ef37cce8463bd + let in97 = CE::> {}; // 0x3f0815ab463f1b76ee25a9b8768b3231a89752f427f4f063ab718e707576b31 + let in98 = CE::< + CI<98>, + > {}; // 0x15648bf46f60d82954c7e33029b3617357012a3d3b1d34c8e008859f1dbfb317 + let in99 = CE::< + CI<99>, + > {}; // 0x127e00c2253de07818ca7f2eafdd7564d05ea850cf61f1daa0cfefbf7fbfba85 + let in100 = CE::< + CI<100>, + > {}; // 0x66365afd18a41ef9382fc0b1d265cb4d3ce470a8cbbb878f7d48051630747bd + let in101 = CE::< + CI<101>, + > {}; // 0x219d14f823513140dc69a96f7fe7e086f4fa24c84e57dcf2b099715c4404aae7 + let in102 = CE::< + CI<102>, + > {}; // 0x3a30bfbbf2cb86d4a6a63a8050d91f9f14f4d33696d37ebaefa9ac2302132d5 + let in103 = CE::< + CI<103>, + > {}; // 0x2121bbcdeaa33a35b0270fb7d5c9f94edad5a84d74b06e3385104b0b41935bcc + let in104 = CE::< + CI<104>, + > {}; // 0x196b544fbeb0a792cfbb82c289e579b7cd5580c2e338a389d053ef8b3d10e70e + let in105 = CE::< + CI<105>, + > {}; // 0x2809c3a1547c0cee89c1db270ef479c26973ec73edb4bd4e7d907ea0202f560f + let in106 = CE::< + CI<106>, + > {}; // 0x11c34446b083ef92ca157585a02b8b342a4c67175b31f4b5d40d4e96dfc5c8f1 + let in107 = CE::< + CI<107>, + > {}; // 0x253ea0b33a8bf3b2367c030e3289cbe0f6242ad7709d90b86d9d8026e2e39925 + let in108 = CE::< + CI<108>, + > {}; // 0x30467dc1930f6afe90c89d4007ad29fc4f5a19c006d1030438c16df85637bd5f + let in109 = CE::< + CI<109>, + > {}; // 0x2f9d4b55495f7e377e20e6f5a3a88af7aa6a536458b38bbe13c8ebfbbba54f44 + let in110 = CE::< + CI<110>, + > {}; // 0x1d9e9d5c736e3151f11d36d499e7e093d8ee2353be18aad54cfd03ff0feac4b8 + let in111 = CE::< + CI<111>, + > {}; // 0x124b617b43e598f9ebf622f7823a3de7d1bfedb87e097c315f343de301e54841 + let in112 = CE::< + CI<112>, + > {}; // 0x198e7cfc66ae45774055cf073bedc945a5f9c5b19cae08d789cc5748ffe199b2 + let in113 = CE::< + CI<113>, + > {}; // 0x2eac25b3498dfadffd124ab3aad57789eb945ba57443099c5bb6c27ed977fe24 + let in114 = CE::< + CI<114>, + > {}; // 0x1ee02c175cdfe1871b378305c1bb9c904e8af1d4454ed3550b3c6ab5f4f90126 + let in115 = CE::< + CI<115>, + > {}; // 0x616f8c34c607266b29ea8f9d2dfa47ff6fbb1d9745c48609fa98301d0f679d5 + let in116 = CE::< + CI<116>, + > {}; // 0x181d68b0a188504958b9f19cbbdb972a853e51ed385e4883a43a42832803370b + let in117 = CE::< + CI<117>, + > {}; // 0x2d5397ce863464a25d6b7f5b015d579181d1ce2f24cbabf6059e9327f5ba7004 + let in118 = CE::< + CI<118>, + > {}; // 0x15bf817491b94d71e8912940cc0b80277713e7d32da2b6591724d8dbd4bc2618 + let in119 = CE::< + CI<119>, + > {}; // 0x2a7cbd11460b177ab76feab28b69485ac8cc687740bc910994a3827d29c08714 + let in120 = CE::< + CI<120>, + > {}; // 0xf7cd5ffa4661730ab56e447fae5cc1763cb462da80a85614c237b290de9d502 + let in121 = CE::< + CI<121>, + > {}; // 0xe0766004b4c4176eb13273508eb6575f768137d86d305be644ce04531008100 + let in122 = CE::< + CI<122>, + > {}; // 0x625fa7145813481f6d148be6b9c8bb7b54ee3c1afac00104e1f763000b9924c + let in123 = CE::< + CI<123>, + > {}; // 0x7c5472508b459916ee0f5461aad2e0b19cd9c7b184f515b65136318ce2c6a5 + let in124 = CE::< + CI<124>, + > {}; // 0x567375470d189b693ac77ab3fb7557231d53073951d43c54685879cb7a89fcb + let in125 = CE::< + CI<125>, + > {}; // 0x1d0406bcbec83f8d5165f56c063e42108ad21f51ea4bfc71601174ba5c7b8bcc + let in126 = CE::< + CI<126>, + > {}; // 0xc02b18eef22332d280a8aa1f86405f3375f06342f8696ee7c73b46c63272cb7 + let in127 = CE::< + CI<127>, + > {}; // 0x17c1fc174cd9a6ebeaa7add2f801a664823509ad4fd1b15aad053a55ad6da4cf + let in128 = CE::< + CI<128>, + > {}; // 0x5f843c23024eb1dab7ebbc86709a021aaa6caf433f7ed258a08638e9584b32d + let in129 = CE::< + CI<129>, + > {}; // 0x22df2420697ca28b5cc51c53165e002727b45ccd90a55c87589f792f0ad8cb37 + let in130 = CE::< + CI<130>, + > {}; // 0x2f1438303a7b49d473400aaedf0f48009fd3af804b76be86417588efc4d7302a + let in131 = CE::< + CI<131>, + > {}; // 0x2323d5fcf2da8965c6b2b7b4fbf9a24bbaa7f4dccd35d5ca6155c5463093b23b + let in132 = CE::< + CI<132>, + > {}; // 0x26c85b9dfbbe48fe83b753a5e7336b9f40f7b961e9c54f94e37700073d4d26e + let in133 = CE::< + CI<133>, + > {}; // 0x31511000251ec86feb38b5ab4e335f070b271df4c20979528e41d65384c318f + let in134 = CE::< + CI<134>, + > {}; // 0x18e588324a9bbaacb42fa69e5d90a0c0e27cd16b941e34a60ff5df9a26c03af1 + let in135 = CE::< + CI<135>, + > {}; // 0x2642b5d8e16b953b070635775c8d3c9498357d6ad9bef2e7d99f03c10ea1f95f + let in136 = CE::< + CI<136>, + > {}; // 0x21fc313ba11c60e8e84ff60db906a0f031189b0b48335c4221f909aef836c133 + let in137 = CE::< + CI<137>, + > {}; // 0x2d3562e3d4b42bc6890b698cc6ab89f7311298bcbac6e4e9f2f4d93d06dae151 + let in138 = CE::< + CI<138>, + > {}; // 0xa74ef541d360e842e3e0b6ff7e5c7c77934a5f67616f01c189d886dfd2e0808 + let in139 = CE::< + CI<139>, + > {}; // 0x140564b53e0a812ac3983d6e3b433afa43f434087d9e754967c2c9b1b02caf8a + let in140 = CE::< + CI<140>, + > {}; // 0x14709e32d98ae4cd18b400181e71ab9759c436c8e83fa6993adb6f2db6bba9d0 + let in141 = CE::< + CI<141>, + > {}; // 0x734b2366c59e394423f179e1266dd392372db4f2dba651f4a619a4b52bdc010 + let in142 = CE::< + CI<142>, + > {}; // 0x11fb2d705c94b08d5ad3e3c5fb6629abe963ed92913642c7d02d7e71088fd2d4 + let in143 = CE::< + CI<143>, + > {}; // 0x27d03abf5c1f290e5d715eba19371050ef6eb7f78fd84be834e4cc3618059484 + let in144 = CE::< + CI<144>, + > {}; // 0x13ed9e9e6b452df27fb3353cfc2cd63ebe817f212a39c6a8bb9b441ac1395861 + let in145 = CE::< + CI<145>, + > {}; // 0x1319c51cf37aaa10246cdaaa04a12e88795de4452604263a7c5b79ab99cbd23c + let in146 = CE::> {}; // 0xbca25588d187b7f9dad839f2c8cb526a4cf444eebbd0e715b6cea019ac3f2 + let in147 = CE::< + CI<147>, + > {}; // 0x1d837ea0341c5964181226874b923cd01a069b493f02f7a3c01be23cf51d593f + let in148 = CE::< + CI<148>, + > {}; // 0x1b41ce9ed3634cbd42c427ce4c5c83774149e2a6dbd25f24012090db7de4e7f9 + let in149 = CE::< + CI<149>, + > {}; // 0x671f0e3b674ae7cddc790ecc4e946f4bca74b98b78a127c7b56bd6673f1ce1f + let in150 = CE::< + CI<150>, + > {}; // 0x19fc073797a39b272e40cd30615f55fefeb682c1ac14143071d0449a5426e4e + let in151 = CE::< + CI<151>, + > {}; // 0x17bee47d262a497fd1f7c5c6d5a7c70fa4209480bf5d97311c5096619e9fd13 + let in152 = CE::< + CI<152>, + > {}; // 0x2073cff92d3141b480763539cff2978a4c7944721cc937ba00cc8527274471e3 + let in153 = CE::< + CI<153>, + > {}; // 0x3bd7b3e2c1885877f43182a55a91d48f9c58d152e730fe2c7aa46b1fa663baa + let in154 = CE::< + CI<154>, + > {}; // 0x226ebc9a538b5bbaff128edfb9bbf5fa0ceb100719a14c8dfed9ffbbbad9b6b7 + let in155 = CE::< + CI<155>, + > {}; // 0xd395f0b08b9fede0373a06e1552c0e634a49572af1d830dc6e394e8a5d3b21a + let in156 = CE::< + CI<156>, + > {}; // 0x28242439b524540a30d49b68e19e31ba5284bd3bcf1e0f2f41f77d5331f99ffa + let in157 = CE::< + CI<157>, + > {}; // 0x370d6fa19eaac142d2de034801ab85e0b457e129e91f929754b48c6154d4df6 + let in158 = CE::< + CI<158>, + > {}; // 0x9a16f573b3280f390762abf269579eaa37939bc0c753feb0a2b2e0bcbde1659 + let in159 = CE::< + CI<159>, + > {}; // 0x2228e360fb5b162b496ac443f98127ee3c0021a690b71b268d99981368231d97 + let in160 = CE::< + CI<160>, + > {}; // 0x7e42c2ca633d2c49fabf83991476d209431e34d8032b6a1b97675f3c567f944 + let in161 = CE::< + CI<161>, + > {}; // 0x2ce12d7269663770c3cab85a6215a32eed35fda1d8e9d753a50fe96097724a9f + let in162 = CE::< + CI<162>, + > {}; // 0x3d7427704c61e2009eeb9b1b45a0125084bc4daf70973a7ba0b2231815b15de + let in163 = CE::< + CI<163>, + > {}; // 0x10f8abf0764185861c1267fcf4b4b33ca096fb4ddc4626732d86921e553e69c6 + let in164 = CE::< + CI<164>, + > {}; // 0x17ccaf6f26f7267a025d7cb456e3aeb251a1a620aaf6568a5c95644c7c5914cc + let in165 = CE::< + CI<165>, + > {}; // 0x63bb306b96310051385c3ce00ca820ad0e3651a6e55754d59de6df28cea4d51 + let in166 = CE::< + CI<166>, + > {}; // 0x1f761ee5553c5e86f2c304a18095ab7403242e0b65e608bc920cf993a4169974 + let in167 = CE::< + CI<167>, + > {}; // 0xdc5f00bbfd7c1d9a23c0e666859ba6564bcde8761b45717cd6bdfc09de4e8f2 + let in168 = CE::< + CI<168>, + > {}; // 0x6de511520e277b7df07c3536381c13eb44cf790a230abc391089760bfc40ef2 + let in169 = CE::< + CI<169>, + > {}; // 0x2a134348c8660efcf9ef54863e70528a1fd4481b50a1fe21f24a8c06e10cca03 + let in170 = CE::< + CI<170>, + > {}; // 0xaeb5023bbb9a64c4bd80089e99edf8ed5f6f1ffb63a7dbba1b33520bcfce37b + let in171 = CE::< + CI<171>, + > {}; // 0x141a6d0810366ae225ecb5f0bfdc9995406c5960ab26155836fc51fb7cb933d1 + let in172 = CE::< + CI<172>, + > {}; // 0x9d2ea05ef54dadbbe776f404dca6626cc0b2539990bc0b8bfe87497f1e2c5b7 + let in173 = CE::< + CI<173>, + > {}; // 0x1e56d244a8e41be5d104d5f8ef70891d22d4a5432441bfe8ff1a16e91719cdde + let in174 = CE::< + CI<174>, + > {}; // 0x1d4f020c57c4f14aec908b2f99b5c4fd5e09447fa85c2fd68ba4d5c5f50c7b49 + let in175 = CE::< + CI<175>, + > {}; // 0x763911a3a92a4f0e09f4e14cd03398d8d82a1e09db80fb0ee1e833764c18fd3 + let in176 = CE::< + CI<176>, + > {}; // 0x12857275be2fe6b9ba2ec68f9061643f1fc5d9a2c5e47e55684366e54b302946 + let in177 = CE::< + CI<177>, + > {}; // 0x2ed11ccd2e2e2376655ffe9a96c4b81adc0a60353c5d83d4d0ebf50d1bbf87c0 + let in178 = CE::< + CI<178>, + > {}; // 0x3e31de8958e82645b320d5e3e966ef4726d5b1c2cfbb4acd288a21543c6d594 + let in179 = CE::< + CI<179>, + > {}; // 0x11e880dfefdbd08858ae890046533d58da28a608d7e905366ec2ca4a36e71963 + let in180 = CE::< + CI<180>, + > {}; // 0x1835b275deaed2d00704a9c3cc21ab7a44a34662978d53c190dc25e969a507b2 + let in181 = CE::< + CI<181>, + > {}; // 0x68b75315e25ed4ace5a4a9480e1d82ce5d44f76f1324240419f372ff8d3c3f5 + let in182 = CE::< + CI<182>, + > {}; // 0x1b7ef7d04aec73d62b052d2ad12b92a4268fccd795c839d698ad3b22823274d1 + let in183 = CE::< + CI<183>, + > {}; // 0x28c0c848022a90606f6193ff5501b57216b670727f4b8efcc240d30bbaa9f03f + let in184 = CE::< + CI<184>, + > {}; // 0x13bda49296cbcc51686a7bfb1c39f3f254370985a16660efd6e5d82d4f068e1b + let in185 = CE::< + CI<185>, + > {}; // 0x2e7987ea8204389d11eb10b34265e378a945729f86c3e0e2fd38490d3a594141 + let in186 = CE::< + CI<186>, + > {}; // 0x826d4a2324ad3aa4b2b45c10a190fedef702aeffda3226ce5415fffd03935c8 + let in187 = CE::< + CI<187>, + > {}; // 0x2dbeee85eaeaa9fa3675ef541c9df7bb964a85435c3b59685f93b434036ded + let in188 = CE::< + CI<188>, + > {}; // 0x227ee7a945edaee6919418ecb3279b11e6fa44f5f5c5abfb966a4be599cb86c7 + let in189 = CE::< + CI<189>, + > {}; // 0x1d0a6d1a9519877805ac90d696faf2a5ffadc23986de8c698d541471c7244220 + let in190 = CE::< + CI<190>, + > {}; // 0x2208aaba508ae816da4f333b7854fbbcd10eea1db284ec3e9f4de02b25f6e9d4 + let in191 = CE::< + CI<191>, + > {}; // 0x28a58901035b2c99e36a7d29b587a215c9e59268e2f8e01a175720971ccf04ec + let in192 = CE::< + CI<192>, + > {}; // 0x112f6d8d42b0a0d123a07865ca1376df317a2a14ffc0191226f38a8adfd6238 + let in193 = CE::< + CI<193>, + > {}; // 0x8c6eb19c016d1833174dda182d266d5c727f97fb4d01f1daf906b6d3c6e2308 + let in194 = CE::< + CI<194>, + > {}; // 0x1359d2d6c8b5a116d0b38b95f9c642df75b1be9a48c8698ecfea9103f73f1879 + let in195 = CE::< + CI<195>, + > {}; // 0x10c5052ec67ab9b6a467c1cc1878d91aaa07aacf7725f8a5ed42b699c4af3ca7 + let in196 = CE::< + CI<196>, + > {}; // 0x583c4d292d54f3cdb708803e6338fc6afdb188d5d4e9f060193823684c96c75 + let in197 = CE::< + CI<197>, + > {}; // 0x2d94a1c55be382151a4054c5b96322e7bcd1fe2b3e076e16ee2c18bfc06f57b4 + let in198 = CE::< + CI<198>, + > {}; // 0x15e3402fdde8770fb997369579c1b1703ef77c671927ead80dbc64dd2211c3ec + let in199 = CE::< + CI<199>, + > {}; // 0x185be98784817f22f7b21e6b867d5a71b5000bef8bb902eb302677e20a727be3 + let in200 = CE::< + CI<200>, + > {}; // 0x18db4321c721c03666ed8927c89890aa8aad1b00c054547b5ca14cd94de467b6 + let in201 = CE::< + CI<201>, + > {}; // 0x2a852b6247f5d61f0c390b3f3d799188528849bcd2cd0aff4eb2134a039b5126 + let in202 = CE::< + CI<202>, + > {}; // 0x2510aeed51b7f506e65fb9a18ee0124aa5276f6de1cd771b165930204da58f22 + let in203 = CE::< + CI<203>, + > {}; // 0xf2074a32eb8260fb5bd3a236f03a47b47b7fb54dcad1d7977d6486513bab5f2 + let in204 = CE::< + CI<204>, + > {}; // 0x2f4c69297866bd45a8270e19941926cec3531c9e12c4c2c84971404bfa044090 + let in205 = CE::< + CI<205>, + > {}; // 0x154668727d2dbadf05d083a65093c0d0e92df5fd5f3fd75e9b792c562a37473f + let in206 = CE::< + CI<206>, + > {}; // 0x1e6ffc5d6a1ff5dc4fd77fc5ab5c8c4e8d3e2e375bcd1194a91e5b0f7b13cadf + let in207 = CE::< + CI<207>, + > {}; // 0x2cf1a1d7c44309109d75acbc9395cb8398c8b2d428538571fafa389da29990c6 + let in208 = CE::< + CI<208>, + > {}; // 0x140fb39a89f26f6d87cf76cd5ce8da47aa5d8a023e24cf016ecf64cf793c9880 + let in209 = CE::< + CI<209>, + > {}; // 0x1289d13d58a17b5bf0712b201fb3cddfce2c16dac159990b8298a93a8589f9e8 + let in210 = CE::< + CI<210>, + > {}; // 0xf45cf974d2c9edb5781e8d3d207adc8370cf56bc5218749610920fe98b2db2e + let in211 = CE::< + CI<211>, + > {}; // 0x11909c81a16518046b79edfd24f5abcc585a81d1b333568b8687a1c9eceb44d4 + let in212 = CE::< + CI<212>, + > {}; // 0x2990b23c81882f7709f3b891a0e3da4d6917672f2d5a1041fd7bbd6792330d16 + let in213 = CE::< + CI<213>, + > {}; // 0x609551b14716ca3cd5560e0821e7285e0a083ea9a16dc102ecf461e4aef7277 + let in214 = CE::< + CI<214>, + > {}; // 0xc8c1abdfab99d03fd93dced2467354b6175de1755f4f93dc0880eaa08d03f77 + let in215 = CE::< + CI<215>, + > {}; // 0x138bd098c4923b9fbd02f33f8bec6c730db3fed298ec09f78a7a55d08f2e0b10 + let in216 = CE::< + CI<216>, + > {}; // 0x2e61e4bc021630114673f0f77161ae55dcd0b45ce07d9ae3f21bb5a3190f14c0 + let in217 = CE::< + CI<217>, + > {}; // 0x124860913e3df8f65a9c4060ce3297c626abd1c22401c905ddb408260d8e910 + let in218 = CE::< + CI<218>, + > {}; // 0x13807f89c394a133ec104804d955cbe125f24c5701d98286c6ac8b7ed052ec8 + let in219 = CE::< + CI<219>, + > {}; // 0x2e88d1a6938f0788132aa9eeaec08d2f59aa444050c8f4c4e85578abb0fc2fe5 + let in220 = CE::< + CI<220>, + > {}; // 0x1f3d24f17cfc6050a0cbf64e1f1787e2257be3c3ba607c2e8fcc1f26abf3104 + let in221 = CE::< + CI<221>, + > {}; // 0x1fe1cb0e2ae169f83b9d4f133d41fb5b3fe6c76a82a916bfd9b62f82f0f8d0bf + let in222 = CE::< + CI<222>, + > {}; // 0xef79351229409cd353329221229827e19946f3d8d1c48bf5e3377f9177071f3 + let in223 = CE::< + CI<223>, + > {}; // 0x18fb2e46fc1b90fe1c4893ef77a9d111507551883127860e89088608373beda9 + let in224 = CE::< + CI<224>, + > {}; // 0x77afe2579f42ec14c32ef0761e23a3cc0ad6263a68c5cb61916bd57120d1868 + let in225 = CE::< + CI<225>, + > {}; // 0x79769092daa5a752642c04ccf8a6ea54e2ac9836fdd65d248b186f1490b7b99 + let in226 = CE::< + CI<226>, + > {}; // 0x1d8bf229c19968f0254eb6e09c5c8bfd67eb9734606b676b663c76cf76bab4a5 + let in227 = CE::< + CI<227>, + > {}; // 0x2a33b7d855e7fe55f93556e49e4b37737664f14236f17256428f29f6ec1bddad + let in228 = CE::< + CI<228>, + > {}; // 0x25b0331d7e2b15af4ec161c86e84ba6ab2056077e7aa7536340dc3187ccca8b2 + let in229 = CE::< + CI<229>, + > {}; // 0x762098f5fe26598ccbf45e4810211b0ffcf8ccbb92c16e2f4f13f22342474e2 + let in230 = CE::< + CI<230>, + > {}; // 0xe234d720d70b2886d0da4c007b1bda42362e144185c70716dece2b6172c2514 + let in231 = CE::< + CI<231>, + > {}; // 0x1d82bedccd2bc8a06e3742e720b7fec2ea72182f11c0c60d135c811152aa4b60 + let in232 = CE::< + CI<232>, + > {}; // 0x480064d4b3eb0ada5e9a3e7d05930b7c3397fd6b94d481314bd1c690a17c979 + let in233 = CE::< + CI<233>, + > {}; // 0x10a892763b3cca9ef7593fbb1140edc8c8e4580568560cf41867f7464fb0c11a + let in234 = CE::< + CI<234>, + > {}; // 0xb5ec64548ea841ac921f9b2553680785978b315667ae4714dde4cd7f4de8b91 + let in235 = CE::< + CI<235>, + > {}; // 0x10554aca4e348e5949761bd7131dfaebd78010edd030e1a9ce3c65c9db931d46 + let in236 = CE::< + CI<236>, + > {}; // 0x15be66f38d86b0998b93655462b1f475b9be9de306e150d4ac648fab3db0cff6 + let in237 = CE::< + CI<237>, + > {}; // 0x176ad3600fd3491182d182957ffad01bf6c26e9d4ab0c23caaf308e427d3dbe8 + let in238 = CE::< + CI<238>, + > {}; // 0x2b6f355b3dbf65f09335001d705ac125e3beb20f4fc11bd3ce82b5cf0af2e6f2 + let in239 = CE::< + CI<239>, + > {}; // 0x1c85c06a6d5d40d81d7c89edefb32d1a8448c51288fa296b6de9ff788c77451 + let in240 = CE::< + CI<240>, + > {}; // 0x20e1e876c4746a0cbd9a51d76b2e25f82361c389e43f7d1f51a70aaac2460d79 + let in241 = CE::< + CI<241>, + > {}; // 0x20e46219f684186d2a024b637bc35a29ee3b08ce737701392d987dda9217fa08 + let in242 = CE::< + CI<242>, + > {}; // 0x2ea7279db9f2aa0f654e987907277c24480766367a8bd90e28be0f2ed6091367 + let in243 = CE::< + CI<243>, + > {}; // 0x136be2a7f18924c9362096d472bc75ca0969dc077c9171b1641be95091780f74 + let in244 = CE::< + CI<244>, + > {}; // 0x1ca2033501baa3f73067c4300fb0f51119ed5736fbc8f1f6c924baf0df5a0e9e + let in245 = CE::< + CI<245>, + > {}; // 0xa82f199c2505277ecaa75e495f34e3525824f7a4a9d9fa1da810832b48a50c7 + let in246 = CE::< + CI<246>, + > {}; // 0xecf10485307b4bae92fefb0d7f7782a9f37a2722e7ed9eb7925a2dea580b7d5 + let in247 = CE::< + CI<247>, + > {}; // 0x7b642138dfd6a6dd12aa22f08a8296d68615c8478f13af16aebbbb339a3936b + let in248 = CE::< + CI<248>, + > {}; // 0x1d9dda43a25593ffd2256d34921fb86ed70e760ba76d61e9cbc3b6dd0f1a2150 + let in249 = CE::< + CI<249>, + > {}; // 0x2f1af228520c8b751dc91136c91c6bccd5367eb08213d392958ce2fd3d7d2fce + let in250 = CE::< + CI<250>, + > {}; // 0x1fecfe833ad540455c6d6c1ab3de4abae61ada625a1a2b6b18551a45a6cde123 + let in251 = CE::< + CI<251>, + > {}; // 0x18fc8e608c735b2b3b0d7583460227575657ff8a77abe637bdd3ad28e4a23c88 + let in252 = CE::< + CI<252>, + > {}; // 0x28f740bc1182e9706ebf03cb3f53aba8a43ce0b618783a5586388a7547faa815 + let in253 = CE::< + CI<253>, + > {}; // 0x47998cc0af5a26b94ad301e4b998d29e960a4851cfd13822bed35b7146966a4 + let in254 = CE::< + CI<254>, + > {}; // 0x1b5f1525b31db911dda43e415e1b9a3a9725c7b52e880ee130a14a692b777b70 + let in255 = CE::< + CI<255>, + > {}; // 0x275a83fa5d19b4535f65e965a90eac9bf770ae9bd1d7b1af945fa57ed5c8de6e + let in256 = CE::< + CI<256>, + > {}; // 0x2e8789257ed2cbcccb430568e49bc9dc2a563359808c9897ce3e40a6f6a27aa8 + let in257 = CE::< + CI<257>, + > {}; // 0x927f46cfe80feefeb2721a4c09e9d17f60c34500dcd6e41e2925a39c8e2c7c1 + let in258 = CE::< + CI<258>, + > {}; // 0x1f868ae04832a5dbc37619bfe6ab6a97fd8fb2cfbc1ecf9e0e484bbfe7698101 + let in259 = CE::< + CI<259>, + > {}; // 0x9d7a11e27d2f53109b73f745b2defed65d94ba80f308fb19ce6d56c9b45eff4 + let in260 = CE::< + CI<260>, + > {}; // 0x282d857cfe8da3b5104e1c2823fb7c5b9a7b25924fda5995b0c351aa2b879dff + let in261 = CE::< + CI<261>, + > {}; // 0x20ba8a9fcec815b13f349ff830ae663b27576e135c0744f6987fb0f6ff49c217 + let in262 = CE::< + CI<262>, + > {}; // 0x11b6afc91e32f1ca4589fba12e657d226d57b471ddd2ab1b66a8ae4dcbfb136e + let in263 = CE::< + CI<263>, + > {}; // 0x2e666402ac9cc588316e335c7d93db344788eec2c72ddf3f908141736cebc3be + let in264 = CE::< + CI<264>, + > {}; // 0x17522e0e9e64f795a202a110e283faad7057aec5c9ed9a1a74920f2794f18595 + let in265 = CE::< + CI<265>, + > {}; // 0x2d2ed17f7a1f3ee9e20b470cad4cc7319e6adb40e2ff24b7878cb9878edbd3b9 + let in266 = CE::< + CI<266>, + > {}; // 0x1a81efb19d7e1edaa96fa276e89e85d08f75e54a8136f4d73c937da16c7bf9f4 + let in267 = CE::< + CI<267>, + > {}; // 0x27ff57c1ca847e57210a7b44e52e5630f299c5f451c7a0d515a16bb3bd33e237 + let in268 = CE::< + CI<268>, + > {}; // 0x1c1a8e22230abcd13c5be96031bfa167840d117b3c6a5a0a11be26a7f5fb1a94 + let in269 = CE::< + CI<269>, + > {}; // 0x2a1c3f15d4927c843627a9cd533e4250d81e7774d2c32b59d5836f9c19a5657 + let in270 = CE::< + CI<270>, + > {}; // 0x2ddbb7239eb904d81c52499b37cb4be1af0373a10ac112e185acb219899357e4 + let in271 = CE::< + CI<271>, + > {}; // 0xdff198393085a754e0d6faec54be81d8edf8bc25edadab48a86fad6da0afb60 + let in272 = CE::< + CI<272>, + > {}; // 0x10d50c2473146bbc76275fcc589d038dec8db28728789f28b6d5f504bd1645ca + let in273 = CE::< + CI<273>, + > {}; // 0x61e8328fb5593f92a53dfd40e1022e6231ba45948506282536b08b4476c1538 + let in274 = CE::< + CI<274>, + > {}; // 0x1b589243847198ded90b644bee31ac58067debf3f07d3c51cfa5a0dd9f6d9784 + let in275 = CE::< + CI<275>, + > {}; // 0x4b00c0da1f851e59863b053bd4c6087190f0bdcced99d5ce6f67a420a3bd1f7 + let in276 = CE::< + CI<276>, + > {}; // 0x239941a46c2b93d9126a70163009a7ac27f8a8d42e35018b3bec8cdcb5ddfd67 + let in277 = CE::< + CI<277>, + > {}; // 0x204f26ca7993b03ac2c35377cb0a3712bfc9bc3ec0bfecb4e87ef6814acf2ea2 + let in278 = CE::< + CI<278>, + > {}; // 0x85aff9c7fdadba039d832d8be165a1e5747cf7308d515e348ef117e926d721c + let in279 = CE::< + CI<279>, + > {}; // 0x249042a8dc111f27c4ae9db044c0b0b3f10e57d05e093158efd375df00ea2068 + let in280 = CE::< + CI<280>, + > {}; // 0x6e799bcdf2b4a74542854f3029803e2f84550665203327b3e0825977413e96b + let in281 = CE::< + CI<281>, + > {}; // 0x1cb3caed4bffb6aca9f4d2c002921bc3fffed333cae12085c612496183b87996 + let in282 = CE::< + CI<282>, + > {}; // 0xb47e9755fae480128a128bfd4faa6a3dd6ea03cab566889dcd99e84d310d51c + let in283 = CE::< + CI<283>, + > {}; // 0xc7e4cea365c2061920a0c9fd2c360a6506293bc024fd1ca3f0bb730da886a4f + let in284 = CE::< + CI<284>, + > {}; // 0x21da1f701bac77bcbbaa30d964d6f6f63dbe1b20d9d6988c8dcd7ba4187215df + let in285 = CE::< + CI<285>, + > {}; // 0x9ae612e8ba1ca1370905fb67899d10db86b47bd19965b6edd1a9486e3c6cc55 + let in286 = CE::< + CI<286>, + > {}; // 0x262e1e0b56cac47fc150f284491190e6aab75445b0c99373fe1f7a0e3b95cf3d + let in287 = CE::< + CI<287>, + > {}; // 0x234bf4a7dce7587c2c87c293e3bb7c9e2a7bfa5f29fd4ddeaa5d3f67491d34bd + let in288 = CE::< + CI<288>, + > {}; // 0x2f6cbac694c886b02d0a527cac744fb658d2690e213d7432eee67f6cb69f70c2 + let in289 = CE::< + CI<289>, + > {}; // 0x22accb18b7c49b4b7bb8c9fdf78b7aded52aa1842fff818d9a3300876dec3ad9 + let in290 = CE::< + CI<290>, + > {}; // 0x81e2f0652f898c6d659f22d2c77be302eabd9182a0b3d3cbf623a1df7f8f2fc + let in291 = CE::< + CI<291>, + > {}; // 0x12c0a25e70d006eccea3ada75d669b8c534b962890f3ffc016b3186ad675b935 + let in292 = CE::< + CI<292>, + > {}; // 0x10ef9c23848128cc2fd6fc869df24d7ab56efd349edd56f49f8d4f2381df3259 + let in293 = CE::< + CI<293>, + > {}; // 0x2161cd280772819dd4a81262b71df1bcc2c1d41b9491e0620bda347962b240f0 + let in294 = CE::< + CI<294>, + > {}; // 0x2cebb0ae5108318eb406590041b5248292533364f799bc41b7f4fdd12cb8d38a + let in295 = CE::< + CI<295>, + > {}; // 0x2b2092f86b5979a7fe4f7c22d9561f3bf2852283a656880fb759e08709a0a62f + let in296 = CE::< + CI<296>, + > {}; // 0x1566b3402d774b8c08146188425a442450cfc900cf643e7382b2d8507a065fed + let in297 = CE::< + CI<297>, + > {}; // 0x11a316aa31607f268fb4c56d6c57ba01627c3635fccf8d3d1a163e601d1a0173 + let in298 = CE::< + CI<298>, + > {}; // 0xde7ee069c934256b782648b560e595408a5e8434644609152e353d9c2874e44 + let in299 = CE::< + CI<299>, + > {}; // 0x2d36f4029245704cc84df0297708c5e5845c36ae706c72e67128b8949eab1af + let in300 = CE::< + CI<300>, + > {}; // 0x1b8cc326b5ee160f53198c217fb34e899bde46cd82dabdc284d7951d546f858 + let in301 = CE::< + CI<301>, + > {}; // 0x27625da0f73ea07110689fb2187b71694cbf9203fd4ddf8a96ece85407550ebb + let in302 = CE::< + CI<302>, + > {}; // 0x1cd8338a3e5b1ad7cdc0da581a6950f6dea349c3edda06cb99ba025b94e4790d + let in303 = CE::< + CI<303>, + > {}; // 0x5ea02d65b209f6da763856c94b6438c78a8aed8d3e67e877a10a84072741a56 + let in304 = CE::< + CI<304>, + > {}; // 0x9f7cb68d4e388f85366cfcf284a895d8b6250ced627e810817743ce03330a55 + let in305 = CE::< + CI<305>, + > {}; // 0x18c6230ddc0f896827b043f5e58dbd1aec13995a202e4ebcdfeb969e9d5c1212 + let in306 = CE::< + CI<306>, + > {}; // 0x73a6114b997285e1a91c0a0fdccdaa8452e4f07bfd2e1a10578232096db6dcd + let in307 = CE::< + CI<307>, + > {}; // 0x2e78746340b2a6d222c6a1fc0838adf5fe013f39b1660ce7a3e7742b2f37be7f + let in308 = CE::< + CI<308>, + > {}; // 0x7aa27e7150baddd06303ad8e5e4bf4249b7ea846553def28e675259d3e5c851 + let in309 = CE::< + CI<309>, + > {}; // 0xb66fdec210ea4eabf623d2712cf4d9fa90273ccb4643f680cbc98345715ead8 + let in310 = CE::< + CI<310>, + > {}; // 0x2fb6a29d9f394a589b633b8a4d6be51c9c0601ce0b140be641acea41c49aa5e3 + let in311 = CE::< + CI<311>, + > {}; // 0x29025cc66fd041c4fc845e9c1c2cd1288569fb243d049bd675a69dc889b2ce2a + let in312 = CE::< + CI<312>, + > {}; // 0x150963f0aca9bcbe4126214ab9c627a6f7ed731cfa695168b85d534b17be3f48 + let in313 = CE::< + CI<313>, + > {}; // 0xed59780302257663f72c1bfc6656eb7b5bca2e47bec0d5798a08a32a61a8a65 + let in314 = CE::< + CI<314>, + > {}; // 0x7e19cb8a893369b3d30ae188c767f391c11888a3000debfc8d30c06143cc084 + let in315 = CE::< + CI<315>, + > {}; // 0x600c7d2b6946345e5f1eeeafb5eb8ec2b6ecfe528d2c052cd860afb4a3aa272 + let in316 = CE::< + CI<316>, + > {}; // 0x596083b6c972bc13022a1f33d6523b4773f2cd0a480e19ea0125119f0385705 + let in317 = CE::< + CI<317>, + > {}; // 0x210b5c36f27a07d97f98b9d8663d85db2e64513099a8e1ef6db21043631e24c4 + let in318 = CE::< + CI<318>, + > {}; // 0x13bb2764bf1475cfc7bb9f3d563c5cc201c2489874e9159326a8f4930b7883f9 + let in319 = CE::< + CI<319>, + > {}; // 0x202cf557d625c26080eb082862a76757287872b181e89997219e4b7576e24d30 + let in320 = CE::< + CI<320>, + > {}; // 0xe561c3f8bd4f76e76d49e97142d220601fbc5a03d905a4728ea1f95fd8824b2 + let in321 = CE::< + CI<321>, + > {}; // 0xde20097480e7555471785de07bd9809d57dd859bbe827307c33ae9ed7890597 + let in322 = CE::< + CI<322>, + > {}; // 0x72f2a6287fb984bb810df8c5788eebcfd2825613cb72bb80cde8edd76d2e97d + + // INPUT stack + let (in323, in324) = (CE::> {}, CE::> {}); + let t0 = circuit_add(in0, in1); + let t1 = circuit_add(in323, in2); + let t2 = circuit_add(in324, in3); + let t3 = circuit_mul(t0, t0); + let t4 = circuit_mul(t3, t3); + let t5 = circuit_mul(t4, t0); + let t6 = circuit_mul(t1, t1); + let t7 = circuit_mul(t6, t6); + let t8 = circuit_mul(t7, t1); + let t9 = circuit_mul(t2, t2); + let t10 = circuit_mul(t9, t9); + let t11 = circuit_mul(t10, t2); + let t12 = circuit_add(t5, in4); + let t13 = circuit_add(t8, in5); + let t14 = circuit_add(t11, in6); + let t15 = circuit_mul(in82, t12); + let t16 = circuit_mul(in85, t13); + let t17 = circuit_mul(in88, t14); + let t18 = circuit_add(t15, t16); + let t19 = circuit_add(t18, t17); + let t20 = circuit_mul(in83, t12); + let t21 = circuit_mul(in86, t13); + let t22 = circuit_mul(in89, t14); + let t23 = circuit_add(t20, t21); + let t24 = circuit_add(t23, t22); + let t25 = circuit_mul(in84, t12); + let t26 = circuit_mul(in87, t13); + let t27 = circuit_mul(in90, t14); + let t28 = circuit_add(t25, t26); + let t29 = circuit_add(t28, t27); + let t30 = circuit_mul(t19, t19); + let t31 = circuit_mul(t30, t30); + let t32 = circuit_mul(t31, t19); + let t33 = circuit_mul(t24, t24); + let t34 = circuit_mul(t33, t33); + let t35 = circuit_mul(t34, t24); + let t36 = circuit_mul(t29, t29); + let t37 = circuit_mul(t36, t36); + let t38 = circuit_mul(t37, t29); + let t39 = circuit_add(t32, in7); + let t40 = circuit_add(t35, in8); + let t41 = circuit_add(t38, in9); + let t42 = circuit_mul(in82, t39); + let t43 = circuit_mul(in85, t40); + let t44 = circuit_mul(in88, t41); + let t45 = circuit_add(t42, t43); + let t46 = circuit_add(t45, t44); + let t47 = circuit_mul(in83, t39); + let t48 = circuit_mul(in86, t40); + let t49 = circuit_mul(in89, t41); + let t50 = circuit_add(t47, t48); + let t51 = circuit_add(t50, t49); + let t52 = circuit_mul(in84, t39); + let t53 = circuit_mul(in87, t40); + let t54 = circuit_mul(in90, t41); + let t55 = circuit_add(t52, t53); + let t56 = circuit_add(t55, t54); + let t57 = circuit_mul(t46, t46); + let t58 = circuit_mul(t57, t57); + let t59 = circuit_mul(t58, t46); + let t60 = circuit_mul(t51, t51); + let t61 = circuit_mul(t60, t60); + let t62 = circuit_mul(t61, t51); + let t63 = circuit_mul(t56, t56); + let t64 = circuit_mul(t63, t63); + let t65 = circuit_mul(t64, t56); + let t66 = circuit_add(t59, in10); + let t67 = circuit_add(t62, in11); + let t68 = circuit_add(t65, in12); + let t69 = circuit_mul(in82, t66); + let t70 = circuit_mul(in85, t67); + let t71 = circuit_mul(in88, t68); + let t72 = circuit_add(t69, t70); + let t73 = circuit_add(t72, t71); + let t74 = circuit_mul(in83, t66); + let t75 = circuit_mul(in86, t67); + let t76 = circuit_mul(in89, t68); + let t77 = circuit_add(t74, t75); + let t78 = circuit_add(t77, t76); + let t79 = circuit_mul(in84, t66); + let t80 = circuit_mul(in87, t67); + let t81 = circuit_mul(in90, t68); + let t82 = circuit_add(t79, t80); + let t83 = circuit_add(t82, t81); + let t84 = circuit_mul(t73, t73); + let t85 = circuit_mul(t84, t84); + let t86 = circuit_mul(t85, t73); + let t87 = circuit_mul(t78, t78); + let t88 = circuit_mul(t87, t87); + let t89 = circuit_mul(t88, t78); + let t90 = circuit_mul(t83, t83); + let t91 = circuit_mul(t90, t90); + let t92 = circuit_mul(t91, t83); + let t93 = circuit_add(t86, in13); + let t94 = circuit_add(t89, in14); + let t95 = circuit_add(t92, in15); + let t96 = circuit_mul(in82, t93); + let t97 = circuit_mul(in85, t94); + let t98 = circuit_mul(in88, t95); + let t99 = circuit_add(t96, t97); + let t100 = circuit_add(t99, t98); + let t101 = circuit_mul(in91, t93); + let t102 = circuit_mul(in93, t94); + let t103 = circuit_mul(in95, t95); + let t104 = circuit_add(t101, t102); + let t105 = circuit_add(t104, t103); + let t106 = circuit_mul(in92, t93); + let t107 = circuit_mul(in94, t94); + let t108 = circuit_mul(in96, t95); + let t109 = circuit_add(t106, t107); + let t110 = circuit_add(t109, t108); + let t111 = circuit_mul(t100, t100); + let t112 = circuit_mul(t111, t111); + let t113 = circuit_mul(t112, t100); + let t114 = circuit_add(t113, in16); + let t115 = circuit_mul(in82, t114); + let t116 = circuit_mul(in97, t105); + let t117 = circuit_mul(in98, t110); + let t118 = circuit_add(t115, t116); + let t119 = circuit_add(t118, t117); + let t120 = circuit_mul(t114, in99); + let t121 = circuit_add(t105, t120); + let t122 = circuit_mul(t114, in100); + let t123 = circuit_add(t110, t122); + let t124 = circuit_mul(t119, t119); + let t125 = circuit_mul(t124, t124); + let t126 = circuit_mul(t125, t119); + let t127 = circuit_add(t126, in17); + let t128 = circuit_mul(in82, t127); + let t129 = circuit_mul(in101, t121); + let t130 = circuit_mul(in102, t123); + let t131 = circuit_add(t128, t129); + let t132 = circuit_add(t131, t130); + let t133 = circuit_mul(t127, in103); + let t134 = circuit_add(t121, t133); + let t135 = circuit_mul(t127, in104); + let t136 = circuit_add(t123, t135); + let t137 = circuit_mul(t132, t132); + let t138 = circuit_mul(t137, t137); + let t139 = circuit_mul(t138, t132); + let t140 = circuit_add(t139, in18); + let t141 = circuit_mul(in82, t140); + let t142 = circuit_mul(in105, t134); + let t143 = circuit_mul(in106, t136); + let t144 = circuit_add(t141, t142); + let t145 = circuit_add(t144, t143); + let t146 = circuit_mul(t140, in107); + let t147 = circuit_add(t134, t146); + let t148 = circuit_mul(t140, in108); + let t149 = circuit_add(t136, t148); + let t150 = circuit_mul(t145, t145); + let t151 = circuit_mul(t150, t150); + let t152 = circuit_mul(t151, t145); + let t153 = circuit_add(t152, in19); + let t154 = circuit_mul(in82, t153); + let t155 = circuit_mul(in109, t147); + let t156 = circuit_mul(in110, t149); + let t157 = circuit_add(t154, t155); + let t158 = circuit_add(t157, t156); + let t159 = circuit_mul(t153, in111); + let t160 = circuit_add(t147, t159); + let t161 = circuit_mul(t153, in112); + let t162 = circuit_add(t149, t161); + let t163 = circuit_mul(t158, t158); + let t164 = circuit_mul(t163, t163); + let t165 = circuit_mul(t164, t158); + let t166 = circuit_add(t165, in20); + let t167 = circuit_mul(in82, t166); + let t168 = circuit_mul(in113, t160); + let t169 = circuit_mul(in114, t162); + let t170 = circuit_add(t167, t168); + let t171 = circuit_add(t170, t169); + let t172 = circuit_mul(t166, in115); + let t173 = circuit_add(t160, t172); + let t174 = circuit_mul(t166, in116); + let t175 = circuit_add(t162, t174); + let t176 = circuit_mul(t171, t171); + let t177 = circuit_mul(t176, t176); + let t178 = circuit_mul(t177, t171); + let t179 = circuit_add(t178, in21); + let t180 = circuit_mul(in82, t179); + let t181 = circuit_mul(in117, t173); + let t182 = circuit_mul(in118, t175); + let t183 = circuit_add(t180, t181); + let t184 = circuit_add(t183, t182); + let t185 = circuit_mul(t179, in119); + let t186 = circuit_add(t173, t185); + let t187 = circuit_mul(t179, in120); + let t188 = circuit_add(t175, t187); + let t189 = circuit_mul(t184, t184); + let t190 = circuit_mul(t189, t189); + let t191 = circuit_mul(t190, t184); + let t192 = circuit_add(t191, in22); + let t193 = circuit_mul(in82, t192); + let t194 = circuit_mul(in121, t186); + let t195 = circuit_mul(in122, t188); + let t196 = circuit_add(t193, t194); + let t197 = circuit_add(t196, t195); + let t198 = circuit_mul(t192, in123); + let t199 = circuit_add(t186, t198); + let t200 = circuit_mul(t192, in124); + let t201 = circuit_add(t188, t200); + let t202 = circuit_mul(t197, t197); + let t203 = circuit_mul(t202, t202); + let t204 = circuit_mul(t203, t197); + let t205 = circuit_add(t204, in23); + let t206 = circuit_mul(in82, t205); + let t207 = circuit_mul(in125, t199); + let t208 = circuit_mul(in126, t201); + let t209 = circuit_add(t206, t207); + let t210 = circuit_add(t209, t208); + let t211 = circuit_mul(t205, in127); + let t212 = circuit_add(t199, t211); + let t213 = circuit_mul(t205, in128); + let t214 = circuit_add(t201, t213); + let t215 = circuit_mul(t210, t210); + let t216 = circuit_mul(t215, t215); + let t217 = circuit_mul(t216, t210); + let t218 = circuit_add(t217, in24); + let t219 = circuit_mul(in82, t218); + let t220 = circuit_mul(in129, t212); + let t221 = circuit_mul(in130, t214); + let t222 = circuit_add(t219, t220); + let t223 = circuit_add(t222, t221); + let t224 = circuit_mul(t218, in131); + let t225 = circuit_add(t212, t224); + let t226 = circuit_mul(t218, in132); + let t227 = circuit_add(t214, t226); + let t228 = circuit_mul(t223, t223); + let t229 = circuit_mul(t228, t228); + let t230 = circuit_mul(t229, t223); + let t231 = circuit_add(t230, in25); + let t232 = circuit_mul(in82, t231); + let t233 = circuit_mul(in133, t225); + let t234 = circuit_mul(in134, t227); + let t235 = circuit_add(t232, t233); + let t236 = circuit_add(t235, t234); + let t237 = circuit_mul(t231, in135); + let t238 = circuit_add(t225, t237); + let t239 = circuit_mul(t231, in136); + let t240 = circuit_add(t227, t239); + let t241 = circuit_mul(t236, t236); + let t242 = circuit_mul(t241, t241); + let t243 = circuit_mul(t242, t236); + let t244 = circuit_add(t243, in26); + let t245 = circuit_mul(in82, t244); + let t246 = circuit_mul(in137, t238); + let t247 = circuit_mul(in138, t240); + let t248 = circuit_add(t245, t246); + let t249 = circuit_add(t248, t247); + let t250 = circuit_mul(t244, in139); + let t251 = circuit_add(t238, t250); + let t252 = circuit_mul(t244, in140); + let t253 = circuit_add(t240, t252); + let t254 = circuit_mul(t249, t249); + let t255 = circuit_mul(t254, t254); + let t256 = circuit_mul(t255, t249); + let t257 = circuit_add(t256, in27); + let t258 = circuit_mul(in82, t257); + let t259 = circuit_mul(in141, t251); + let t260 = circuit_mul(in142, t253); + let t261 = circuit_add(t258, t259); + let t262 = circuit_add(t261, t260); + let t263 = circuit_mul(t257, in143); + let t264 = circuit_add(t251, t263); + let t265 = circuit_mul(t257, in144); + let t266 = circuit_add(t253, t265); + let t267 = circuit_mul(t262, t262); + let t268 = circuit_mul(t267, t267); + let t269 = circuit_mul(t268, t262); + let t270 = circuit_add(t269, in28); + let t271 = circuit_mul(in82, t270); + let t272 = circuit_mul(in145, t264); + let t273 = circuit_mul(in146, t266); + let t274 = circuit_add(t271, t272); + let t275 = circuit_add(t274, t273); + let t276 = circuit_mul(t270, in147); + let t277 = circuit_add(t264, t276); + let t278 = circuit_mul(t270, in148); + let t279 = circuit_add(t266, t278); + let t280 = circuit_mul(t275, t275); + let t281 = circuit_mul(t280, t280); + let t282 = circuit_mul(t281, t275); + let t283 = circuit_add(t282, in29); + let t284 = circuit_mul(in82, t283); + let t285 = circuit_mul(in149, t277); + let t286 = circuit_mul(in150, t279); + let t287 = circuit_add(t284, t285); + let t288 = circuit_add(t287, t286); + let t289 = circuit_mul(t283, in151); + let t290 = circuit_add(t277, t289); + let t291 = circuit_mul(t283, in152); + let t292 = circuit_add(t279, t291); + let t293 = circuit_mul(t288, t288); + let t294 = circuit_mul(t293, t293); + let t295 = circuit_mul(t294, t288); + let t296 = circuit_add(t295, in30); + let t297 = circuit_mul(in82, t296); + let t298 = circuit_mul(in153, t290); + let t299 = circuit_mul(in154, t292); + let t300 = circuit_add(t297, t298); + let t301 = circuit_add(t300, t299); + let t302 = circuit_mul(t296, in155); + let t303 = circuit_add(t290, t302); + let t304 = circuit_mul(t296, in156); + let t305 = circuit_add(t292, t304); + let t306 = circuit_mul(t301, t301); + let t307 = circuit_mul(t306, t306); + let t308 = circuit_mul(t307, t301); + let t309 = circuit_add(t308, in31); + let t310 = circuit_mul(in82, t309); + let t311 = circuit_mul(in157, t303); + let t312 = circuit_mul(in158, t305); + let t313 = circuit_add(t310, t311); + let t314 = circuit_add(t313, t312); + let t315 = circuit_mul(t309, in159); + let t316 = circuit_add(t303, t315); + let t317 = circuit_mul(t309, in160); + let t318 = circuit_add(t305, t317); + let t319 = circuit_mul(t314, t314); + let t320 = circuit_mul(t319, t319); + let t321 = circuit_mul(t320, t314); + let t322 = circuit_add(t321, in32); + let t323 = circuit_mul(in82, t322); + let t324 = circuit_mul(in161, t316); + let t325 = circuit_mul(in162, t318); + let t326 = circuit_add(t323, t324); + let t327 = circuit_add(t326, t325); + let t328 = circuit_mul(t322, in163); + let t329 = circuit_add(t316, t328); + let t330 = circuit_mul(t322, in164); + let t331 = circuit_add(t318, t330); + let t332 = circuit_mul(t327, t327); + let t333 = circuit_mul(t332, t332); + let t334 = circuit_mul(t333, t327); + let t335 = circuit_add(t334, in33); + let t336 = circuit_mul(in82, t335); + let t337 = circuit_mul(in165, t329); + let t338 = circuit_mul(in166, t331); + let t339 = circuit_add(t336, t337); + let t340 = circuit_add(t339, t338); + let t341 = circuit_mul(t335, in167); + let t342 = circuit_add(t329, t341); + let t343 = circuit_mul(t335, in168); + let t344 = circuit_add(t331, t343); + let t345 = circuit_mul(t340, t340); + let t346 = circuit_mul(t345, t345); + let t347 = circuit_mul(t346, t340); + let t348 = circuit_add(t347, in34); + let t349 = circuit_mul(in82, t348); + let t350 = circuit_mul(in169, t342); + let t351 = circuit_mul(in170, t344); + let t352 = circuit_add(t349, t350); + let t353 = circuit_add(t352, t351); + let t354 = circuit_mul(t348, in171); + let t355 = circuit_add(t342, t354); + let t356 = circuit_mul(t348, in172); + let t357 = circuit_add(t344, t356); + let t358 = circuit_mul(t353, t353); + let t359 = circuit_mul(t358, t358); + let t360 = circuit_mul(t359, t353); + let t361 = circuit_add(t360, in35); + let t362 = circuit_mul(in82, t361); + let t363 = circuit_mul(in173, t355); + let t364 = circuit_mul(in174, t357); + let t365 = circuit_add(t362, t363); + let t366 = circuit_add(t365, t364); + let t367 = circuit_mul(t361, in175); + let t368 = circuit_add(t355, t367); + let t369 = circuit_mul(t361, in176); + let t370 = circuit_add(t357, t369); + let t371 = circuit_mul(t366, t366); + let t372 = circuit_mul(t371, t371); + let t373 = circuit_mul(t372, t366); + let t374 = circuit_add(t373, in36); + let t375 = circuit_mul(in82, t374); + let t376 = circuit_mul(in177, t368); + let t377 = circuit_mul(in178, t370); + let t378 = circuit_add(t375, t376); + let t379 = circuit_add(t378, t377); + let t380 = circuit_mul(t374, in179); + let t381 = circuit_add(t368, t380); + let t382 = circuit_mul(t374, in180); + let t383 = circuit_add(t370, t382); + let t384 = circuit_mul(t379, t379); + let t385 = circuit_mul(t384, t384); + let t386 = circuit_mul(t385, t379); + let t387 = circuit_add(t386, in37); + let t388 = circuit_mul(in82, t387); + let t389 = circuit_mul(in181, t381); + let t390 = circuit_mul(in182, t383); + let t391 = circuit_add(t388, t389); + let t392 = circuit_add(t391, t390); + let t393 = circuit_mul(t387, in183); + let t394 = circuit_add(t381, t393); + let t395 = circuit_mul(t387, in184); + let t396 = circuit_add(t383, t395); + let t397 = circuit_mul(t392, t392); + let t398 = circuit_mul(t397, t397); + let t399 = circuit_mul(t398, t392); + let t400 = circuit_add(t399, in38); + let t401 = circuit_mul(in82, t400); + let t402 = circuit_mul(in185, t394); + let t403 = circuit_mul(in186, t396); + let t404 = circuit_add(t401, t402); + let t405 = circuit_add(t404, t403); + let t406 = circuit_mul(t400, in187); + let t407 = circuit_add(t394, t406); + let t408 = circuit_mul(t400, in188); + let t409 = circuit_add(t396, t408); + let t410 = circuit_mul(t405, t405); + let t411 = circuit_mul(t410, t410); + let t412 = circuit_mul(t411, t405); + let t413 = circuit_add(t412, in39); + let t414 = circuit_mul(in82, t413); + let t415 = circuit_mul(in189, t407); + let t416 = circuit_mul(in190, t409); + let t417 = circuit_add(t414, t415); + let t418 = circuit_add(t417, t416); + let t419 = circuit_mul(t413, in191); + let t420 = circuit_add(t407, t419); + let t421 = circuit_mul(t413, in192); + let t422 = circuit_add(t409, t421); + let t423 = circuit_mul(t418, t418); + let t424 = circuit_mul(t423, t423); + let t425 = circuit_mul(t424, t418); + let t426 = circuit_add(t425, in40); + let t427 = circuit_mul(in82, t426); + let t428 = circuit_mul(in193, t420); + let t429 = circuit_mul(in194, t422); + let t430 = circuit_add(t427, t428); + let t431 = circuit_add(t430, t429); + let t432 = circuit_mul(t426, in195); + let t433 = circuit_add(t420, t432); + let t434 = circuit_mul(t426, in196); + let t435 = circuit_add(t422, t434); + let t436 = circuit_mul(t431, t431); + let t437 = circuit_mul(t436, t436); + let t438 = circuit_mul(t437, t431); + let t439 = circuit_add(t438, in41); + let t440 = circuit_mul(in82, t439); + let t441 = circuit_mul(in197, t433); + let t442 = circuit_mul(in198, t435); + let t443 = circuit_add(t440, t441); + let t444 = circuit_add(t443, t442); + let t445 = circuit_mul(t439, in199); + let t446 = circuit_add(t433, t445); + let t447 = circuit_mul(t439, in200); + let t448 = circuit_add(t435, t447); + let t449 = circuit_mul(t444, t444); + let t450 = circuit_mul(t449, t449); + let t451 = circuit_mul(t450, t444); + let t452 = circuit_add(t451, in42); + let t453 = circuit_mul(in82, t452); + let t454 = circuit_mul(in201, t446); + let t455 = circuit_mul(in202, t448); + let t456 = circuit_add(t453, t454); + let t457 = circuit_add(t456, t455); + let t458 = circuit_mul(t452, in203); + let t459 = circuit_add(t446, t458); + let t460 = circuit_mul(t452, in204); + let t461 = circuit_add(t448, t460); + let t462 = circuit_mul(t457, t457); + let t463 = circuit_mul(t462, t462); + let t464 = circuit_mul(t463, t457); + let t465 = circuit_add(t464, in43); + let t466 = circuit_mul(in82, t465); + let t467 = circuit_mul(in205, t459); + let t468 = circuit_mul(in206, t461); + let t469 = circuit_add(t466, t467); + let t470 = circuit_add(t469, t468); + let t471 = circuit_mul(t465, in207); + let t472 = circuit_add(t459, t471); + let t473 = circuit_mul(t465, in208); + let t474 = circuit_add(t461, t473); + let t475 = circuit_mul(t470, t470); + let t476 = circuit_mul(t475, t475); + let t477 = circuit_mul(t476, t470); + let t478 = circuit_add(t477, in44); + let t479 = circuit_mul(in82, t478); + let t480 = circuit_mul(in209, t472); + let t481 = circuit_mul(in210, t474); + let t482 = circuit_add(t479, t480); + let t483 = circuit_add(t482, t481); + let t484 = circuit_mul(t478, in211); + let t485 = circuit_add(t472, t484); + let t486 = circuit_mul(t478, in212); + let t487 = circuit_add(t474, t486); + let t488 = circuit_mul(t483, t483); + let t489 = circuit_mul(t488, t488); + let t490 = circuit_mul(t489, t483); + let t491 = circuit_add(t490, in45); + let t492 = circuit_mul(in82, t491); + let t493 = circuit_mul(in213, t485); + let t494 = circuit_mul(in214, t487); + let t495 = circuit_add(t492, t493); + let t496 = circuit_add(t495, t494); + let t497 = circuit_mul(t491, in215); + let t498 = circuit_add(t485, t497); + let t499 = circuit_mul(t491, in216); + let t500 = circuit_add(t487, t499); + let t501 = circuit_mul(t496, t496); + let t502 = circuit_mul(t501, t501); + let t503 = circuit_mul(t502, t496); + let t504 = circuit_add(t503, in46); + let t505 = circuit_mul(in82, t504); + let t506 = circuit_mul(in217, t498); + let t507 = circuit_mul(in218, t500); + let t508 = circuit_add(t505, t506); + let t509 = circuit_add(t508, t507); + let t510 = circuit_mul(t504, in219); + let t511 = circuit_add(t498, t510); + let t512 = circuit_mul(t504, in220); + let t513 = circuit_add(t500, t512); + let t514 = circuit_mul(t509, t509); + let t515 = circuit_mul(t514, t514); + let t516 = circuit_mul(t515, t509); + let t517 = circuit_add(t516, in47); + let t518 = circuit_mul(in82, t517); + let t519 = circuit_mul(in221, t511); + let t520 = circuit_mul(in222, t513); + let t521 = circuit_add(t518, t519); + let t522 = circuit_add(t521, t520); + let t523 = circuit_mul(t517, in223); + let t524 = circuit_add(t511, t523); + let t525 = circuit_mul(t517, in224); + let t526 = circuit_add(t513, t525); + let t527 = circuit_mul(t522, t522); + let t528 = circuit_mul(t527, t527); + let t529 = circuit_mul(t528, t522); + let t530 = circuit_add(t529, in48); + let t531 = circuit_mul(in82, t530); + let t532 = circuit_mul(in225, t524); + let t533 = circuit_mul(in226, t526); + let t534 = circuit_add(t531, t532); + let t535 = circuit_add(t534, t533); + let t536 = circuit_mul(t530, in227); + let t537 = circuit_add(t524, t536); + let t538 = circuit_mul(t530, in228); + let t539 = circuit_add(t526, t538); + let t540 = circuit_mul(t535, t535); + let t541 = circuit_mul(t540, t540); + let t542 = circuit_mul(t541, t535); + let t543 = circuit_add(t542, in49); + let t544 = circuit_mul(in82, t543); + let t545 = circuit_mul(in229, t537); + let t546 = circuit_mul(in230, t539); + let t547 = circuit_add(t544, t545); + let t548 = circuit_add(t547, t546); + let t549 = circuit_mul(t543, in231); + let t550 = circuit_add(t537, t549); + let t551 = circuit_mul(t543, in232); + let t552 = circuit_add(t539, t551); + let t553 = circuit_mul(t548, t548); + let t554 = circuit_mul(t553, t553); + let t555 = circuit_mul(t554, t548); + let t556 = circuit_add(t555, in50); + let t557 = circuit_mul(in82, t556); + let t558 = circuit_mul(in233, t550); + let t559 = circuit_mul(in234, t552); + let t560 = circuit_add(t557, t558); + let t561 = circuit_add(t560, t559); + let t562 = circuit_mul(t556, in235); + let t563 = circuit_add(t550, t562); + let t564 = circuit_mul(t556, in236); + let t565 = circuit_add(t552, t564); + let t566 = circuit_mul(t561, t561); + let t567 = circuit_mul(t566, t566); + let t568 = circuit_mul(t567, t561); + let t569 = circuit_add(t568, in51); + let t570 = circuit_mul(in82, t569); + let t571 = circuit_mul(in237, t563); + let t572 = circuit_mul(in238, t565); + let t573 = circuit_add(t570, t571); + let t574 = circuit_add(t573, t572); + let t575 = circuit_mul(t569, in239); + let t576 = circuit_add(t563, t575); + let t577 = circuit_mul(t569, in240); + let t578 = circuit_add(t565, t577); + let t579 = circuit_mul(t574, t574); + let t580 = circuit_mul(t579, t579); + let t581 = circuit_mul(t580, t574); + let t582 = circuit_add(t581, in52); + let t583 = circuit_mul(in82, t582); + let t584 = circuit_mul(in241, t576); + let t585 = circuit_mul(in242, t578); + let t586 = circuit_add(t583, t584); + let t587 = circuit_add(t586, t585); + let t588 = circuit_mul(t582, in243); + let t589 = circuit_add(t576, t588); + let t590 = circuit_mul(t582, in244); + let t591 = circuit_add(t578, t590); + let t592 = circuit_mul(t587, t587); + let t593 = circuit_mul(t592, t592); + let t594 = circuit_mul(t593, t587); + let t595 = circuit_add(t594, in53); + let t596 = circuit_mul(in82, t595); + let t597 = circuit_mul(in245, t589); + let t598 = circuit_mul(in246, t591); + let t599 = circuit_add(t596, t597); + let t600 = circuit_add(t599, t598); + let t601 = circuit_mul(t595, in247); + let t602 = circuit_add(t589, t601); + let t603 = circuit_mul(t595, in248); + let t604 = circuit_add(t591, t603); + let t605 = circuit_mul(t600, t600); + let t606 = circuit_mul(t605, t605); + let t607 = circuit_mul(t606, t600); + let t608 = circuit_add(t607, in54); + let t609 = circuit_mul(in82, t608); + let t610 = circuit_mul(in249, t602); + let t611 = circuit_mul(in250, t604); + let t612 = circuit_add(t609, t610); + let t613 = circuit_add(t612, t611); + let t614 = circuit_mul(t608, in251); + let t615 = circuit_add(t602, t614); + let t616 = circuit_mul(t608, in252); + let t617 = circuit_add(t604, t616); + let t618 = circuit_mul(t613, t613); + let t619 = circuit_mul(t618, t618); + let t620 = circuit_mul(t619, t613); + let t621 = circuit_add(t620, in55); + let t622 = circuit_mul(in82, t621); + let t623 = circuit_mul(in253, t615); + let t624 = circuit_mul(in254, t617); + let t625 = circuit_add(t622, t623); + let t626 = circuit_add(t625, t624); + let t627 = circuit_mul(t621, in255); + let t628 = circuit_add(t615, t627); + let t629 = circuit_mul(t621, in256); + let t630 = circuit_add(t617, t629); + let t631 = circuit_mul(t626, t626); + let t632 = circuit_mul(t631, t631); + let t633 = circuit_mul(t632, t626); + let t634 = circuit_add(t633, in56); + let t635 = circuit_mul(in82, t634); + let t636 = circuit_mul(in257, t628); + let t637 = circuit_mul(in258, t630); + let t638 = circuit_add(t635, t636); + let t639 = circuit_add(t638, t637); + let t640 = circuit_mul(t634, in259); + let t641 = circuit_add(t628, t640); + let t642 = circuit_mul(t634, in260); + let t643 = circuit_add(t630, t642); + let t644 = circuit_mul(t639, t639); + let t645 = circuit_mul(t644, t644); + let t646 = circuit_mul(t645, t639); + let t647 = circuit_add(t646, in57); + let t648 = circuit_mul(in82, t647); + let t649 = circuit_mul(in261, t641); + let t650 = circuit_mul(in262, t643); + let t651 = circuit_add(t648, t649); + let t652 = circuit_add(t651, t650); + let t653 = circuit_mul(t647, in263); + let t654 = circuit_add(t641, t653); + let t655 = circuit_mul(t647, in264); + let t656 = circuit_add(t643, t655); + let t657 = circuit_mul(t652, t652); + let t658 = circuit_mul(t657, t657); + let t659 = circuit_mul(t658, t652); + let t660 = circuit_add(t659, in58); + let t661 = circuit_mul(in82, t660); + let t662 = circuit_mul(in265, t654); + let t663 = circuit_mul(in266, t656); + let t664 = circuit_add(t661, t662); + let t665 = circuit_add(t664, t663); + let t666 = circuit_mul(t660, in267); + let t667 = circuit_add(t654, t666); + let t668 = circuit_mul(t660, in268); + let t669 = circuit_add(t656, t668); + let t670 = circuit_mul(t665, t665); + let t671 = circuit_mul(t670, t670); + let t672 = circuit_mul(t671, t665); + let t673 = circuit_add(t672, in59); + let t674 = circuit_mul(in82, t673); + let t675 = circuit_mul(in269, t667); + let t676 = circuit_mul(in270, t669); + let t677 = circuit_add(t674, t675); + let t678 = circuit_add(t677, t676); + let t679 = circuit_mul(t673, in271); + let t680 = circuit_add(t667, t679); + let t681 = circuit_mul(t673, in272); + let t682 = circuit_add(t669, t681); + let t683 = circuit_mul(t678, t678); + let t684 = circuit_mul(t683, t683); + let t685 = circuit_mul(t684, t678); + let t686 = circuit_add(t685, in60); + let t687 = circuit_mul(in82, t686); + let t688 = circuit_mul(in273, t680); + let t689 = circuit_mul(in274, t682); + let t690 = circuit_add(t687, t688); + let t691 = circuit_add(t690, t689); + let t692 = circuit_mul(t686, in275); + let t693 = circuit_add(t680, t692); + let t694 = circuit_mul(t686, in276); + let t695 = circuit_add(t682, t694); + let t696 = circuit_mul(t691, t691); + let t697 = circuit_mul(t696, t696); + let t698 = circuit_mul(t697, t691); + let t699 = circuit_add(t698, in61); + let t700 = circuit_mul(in82, t699); + let t701 = circuit_mul(in277, t693); + let t702 = circuit_mul(in278, t695); + let t703 = circuit_add(t700, t701); + let t704 = circuit_add(t703, t702); + let t705 = circuit_mul(t699, in279); + let t706 = circuit_add(t693, t705); + let t707 = circuit_mul(t699, in280); + let t708 = circuit_add(t695, t707); + let t709 = circuit_mul(t704, t704); + let t710 = circuit_mul(t709, t709); + let t711 = circuit_mul(t710, t704); + let t712 = circuit_add(t711, in62); + let t713 = circuit_mul(in82, t712); + let t714 = circuit_mul(in281, t706); + let t715 = circuit_mul(in282, t708); + let t716 = circuit_add(t713, t714); + let t717 = circuit_add(t716, t715); + let t718 = circuit_mul(t712, in283); + let t719 = circuit_add(t706, t718); + let t720 = circuit_mul(t712, in284); + let t721 = circuit_add(t708, t720); + let t722 = circuit_mul(t717, t717); + let t723 = circuit_mul(t722, t722); + let t724 = circuit_mul(t723, t717); + let t725 = circuit_add(t724, in63); + let t726 = circuit_mul(in82, t725); + let t727 = circuit_mul(in285, t719); + let t728 = circuit_mul(in286, t721); + let t729 = circuit_add(t726, t727); + let t730 = circuit_add(t729, t728); + let t731 = circuit_mul(t725, in287); + let t732 = circuit_add(t719, t731); + let t733 = circuit_mul(t725, in288); + let t734 = circuit_add(t721, t733); + let t735 = circuit_mul(t730, t730); + let t736 = circuit_mul(t735, t735); + let t737 = circuit_mul(t736, t730); + let t738 = circuit_add(t737, in64); + let t739 = circuit_mul(in82, t738); + let t740 = circuit_mul(in289, t732); + let t741 = circuit_mul(in290, t734); + let t742 = circuit_add(t739, t740); + let t743 = circuit_add(t742, t741); + let t744 = circuit_mul(t738, in291); + let t745 = circuit_add(t732, t744); + let t746 = circuit_mul(t738, in292); + let t747 = circuit_add(t734, t746); + let t748 = circuit_mul(t743, t743); + let t749 = circuit_mul(t748, t748); + let t750 = circuit_mul(t749, t743); + let t751 = circuit_add(t750, in65); + let t752 = circuit_mul(in82, t751); + let t753 = circuit_mul(in293, t745); + let t754 = circuit_mul(in294, t747); + let t755 = circuit_add(t752, t753); + let t756 = circuit_add(t755, t754); + let t757 = circuit_mul(t751, in295); + let t758 = circuit_add(t745, t757); + let t759 = circuit_mul(t751, in296); + let t760 = circuit_add(t747, t759); + let t761 = circuit_mul(t756, t756); + let t762 = circuit_mul(t761, t761); + let t763 = circuit_mul(t762, t756); + let t764 = circuit_add(t763, in66); + let t765 = circuit_mul(in82, t764); + let t766 = circuit_mul(in297, t758); + let t767 = circuit_mul(in298, t760); + let t768 = circuit_add(t765, t766); + let t769 = circuit_add(t768, t767); + let t770 = circuit_mul(t764, in299); + let t771 = circuit_add(t758, t770); + let t772 = circuit_mul(t764, in300); + let t773 = circuit_add(t760, t772); + let t774 = circuit_mul(t769, t769); + let t775 = circuit_mul(t774, t774); + let t776 = circuit_mul(t775, t769); + let t777 = circuit_add(t776, in67); + let t778 = circuit_mul(in82, t777); + let t779 = circuit_mul(in301, t771); + let t780 = circuit_mul(in302, t773); + let t781 = circuit_add(t778, t779); + let t782 = circuit_add(t781, t780); + let t783 = circuit_mul(t777, in303); + let t784 = circuit_add(t771, t783); + let t785 = circuit_mul(t777, in304); + let t786 = circuit_add(t773, t785); + let t787 = circuit_mul(t782, t782); + let t788 = circuit_mul(t787, t787); + let t789 = circuit_mul(t788, t782); + let t790 = circuit_add(t789, in68); + let t791 = circuit_mul(in82, t790); + let t792 = circuit_mul(in305, t784); + let t793 = circuit_mul(in306, t786); + let t794 = circuit_add(t791, t792); + let t795 = circuit_add(t794, t793); + let t796 = circuit_mul(t790, in307); + let t797 = circuit_add(t784, t796); + let t798 = circuit_mul(t790, in308); + let t799 = circuit_add(t786, t798); + let t800 = circuit_mul(t795, t795); + let t801 = circuit_mul(t800, t800); + let t802 = circuit_mul(t801, t795); + let t803 = circuit_add(t802, in69); + let t804 = circuit_mul(in82, t803); + let t805 = circuit_mul(in309, t797); + let t806 = circuit_mul(in310, t799); + let t807 = circuit_add(t804, t805); + let t808 = circuit_add(t807, t806); + let t809 = circuit_mul(t803, in311); + let t810 = circuit_add(t797, t809); + let t811 = circuit_mul(t803, in312); + let t812 = circuit_add(t799, t811); + let t813 = circuit_mul(t808, t808); + let t814 = circuit_mul(t813, t813); + let t815 = circuit_mul(t814, t808); + let t816 = circuit_add(t815, in70); + let t817 = circuit_mul(in82, t816); + let t818 = circuit_mul(in313, t810); + let t819 = circuit_mul(in314, t812); + let t820 = circuit_add(t817, t818); + let t821 = circuit_add(t820, t819); + let t822 = circuit_mul(t816, in315); + let t823 = circuit_add(t810, t822); + let t824 = circuit_mul(t816, in316); + let t825 = circuit_add(t812, t824); + let t826 = circuit_mul(t821, t821); + let t827 = circuit_mul(t826, t826); + let t828 = circuit_mul(t827, t821); + let t829 = circuit_add(t828, in71); + let t830 = circuit_mul(in82, t829); + let t831 = circuit_mul(in317, t823); + let t832 = circuit_mul(in318, t825); + let t833 = circuit_add(t830, t831); + let t834 = circuit_add(t833, t832); + let t835 = circuit_mul(t829, in319); + let t836 = circuit_add(t823, t835); + let t837 = circuit_mul(t829, in320); + let t838 = circuit_add(t825, t837); + let t839 = circuit_mul(t834, t834); + let t840 = circuit_mul(t839, t839); + let t841 = circuit_mul(t840, t834); + let t842 = circuit_add(t841, in72); + let t843 = circuit_mul(in82, t842); + let t844 = circuit_mul(in321, t836); + let t845 = circuit_mul(in322, t838); + let t846 = circuit_add(t843, t844); + let t847 = circuit_add(t846, t845); + let t848 = circuit_mul(t842, in83); + let t849 = circuit_add(t836, t848); + let t850 = circuit_mul(t842, in84); + let t851 = circuit_add(t838, t850); + let t852 = circuit_mul(t847, t847); + let t853 = circuit_mul(t852, t852); + let t854 = circuit_mul(t853, t847); + let t855 = circuit_mul(t849, t849); + let t856 = circuit_mul(t855, t855); + let t857 = circuit_mul(t856, t849); + let t858 = circuit_mul(t851, t851); + let t859 = circuit_mul(t858, t858); + let t860 = circuit_mul(t859, t851); + let t861 = circuit_add(t854, in73); + let t862 = circuit_add(t857, in74); + let t863 = circuit_add(t860, in75); + let t864 = circuit_mul(in82, t861); + let t865 = circuit_mul(in85, t862); + let t866 = circuit_mul(in88, t863); + let t867 = circuit_add(t864, t865); + let t868 = circuit_add(t867, t866); + let t869 = circuit_mul(in83, t861); + let t870 = circuit_mul(in86, t862); + let t871 = circuit_mul(in89, t863); + let t872 = circuit_add(t869, t870); + let t873 = circuit_add(t872, t871); + let t874 = circuit_mul(in84, t861); + let t875 = circuit_mul(in87, t862); + let t876 = circuit_mul(in90, t863); + let t877 = circuit_add(t874, t875); + let t878 = circuit_add(t877, t876); + let t879 = circuit_mul(t868, t868); + let t880 = circuit_mul(t879, t879); + let t881 = circuit_mul(t880, t868); + let t882 = circuit_mul(t873, t873); + let t883 = circuit_mul(t882, t882); + let t884 = circuit_mul(t883, t873); + let t885 = circuit_mul(t878, t878); + let t886 = circuit_mul(t885, t885); + let t887 = circuit_mul(t886, t878); + let t888 = circuit_add(t881, in76); + let t889 = circuit_add(t884, in77); + let t890 = circuit_add(t887, in78); + let t891 = circuit_mul(in82, t888); + let t892 = circuit_mul(in85, t889); + let t893 = circuit_mul(in88, t890); + let t894 = circuit_add(t891, t892); + let t895 = circuit_add(t894, t893); + let t896 = circuit_mul(in83, t888); + let t897 = circuit_mul(in86, t889); + let t898 = circuit_mul(in89, t890); + let t899 = circuit_add(t896, t897); + let t900 = circuit_add(t899, t898); + let t901 = circuit_mul(in84, t888); + let t902 = circuit_mul(in87, t889); + let t903 = circuit_mul(in90, t890); + let t904 = circuit_add(t901, t902); + let t905 = circuit_add(t904, t903); + let t906 = circuit_mul(t895, t895); + let t907 = circuit_mul(t906, t906); + let t908 = circuit_mul(t907, t895); + let t909 = circuit_mul(t900, t900); + let t910 = circuit_mul(t909, t909); + let t911 = circuit_mul(t910, t900); + let t912 = circuit_mul(t905, t905); + let t913 = circuit_mul(t912, t912); + let t914 = circuit_mul(t913, t905); + let t915 = circuit_add(t908, in79); + let t916 = circuit_add(t911, in80); + let t917 = circuit_add(t914, in81); + let t918 = circuit_mul(in82, t915); + let t919 = circuit_mul(in85, t916); + let t920 = circuit_mul(in88, t917); + let t921 = circuit_add(t918, t919); + let t922 = circuit_add(t921, t920); + let t923 = circuit_mul(in83, t915); + let t924 = circuit_mul(in86, t916); + let t925 = circuit_mul(in89, t917); + let t926 = circuit_add(t923, t924); + let t927 = circuit_add(t926, t925); + let t928 = circuit_mul(in84, t915); + let t929 = circuit_mul(in87, t916); + let t930 = circuit_mul(in90, t917); + let t931 = circuit_add(t928, t929); + let t932 = circuit_add(t931, t930); + let t933 = circuit_mul(t922, t922); + let t934 = circuit_mul(t933, t933); + let t935 = circuit_mul(t934, t922); + let t936 = circuit_mul(t927, t927); + let t937 = circuit_mul(t936, t936); + let t938 = circuit_mul(t937, t927); + let t939 = circuit_mul(t932, t932); + let t940 = circuit_mul(t939, t939); + let t941 = circuit_mul(t940, t932); + let t942 = circuit_mul(in82, t935); + let t943 = circuit_mul(in85, t938); + let t944 = circuit_mul(in88, t941); + let t945 = circuit_add(t942, t943); + let t946 = circuit_add(t945, t944); + + let modulus = get_GRUMPKIN_modulus(); // GRUMPKIN prime field modulus + + let mut circuit_inputs = (t946,).new_inputs(); + // Prefill constants: + + circuit_inputs = circuit_inputs + .next_span(POSEIDON_GRUMPKIN_GRUMPKIN_CONSTANTS.span()); // in0 - in322 + + // Fill inputs: + circuit_inputs = circuit_inputs.next_2(x); // in323 + circuit_inputs = circuit_inputs.next_2(y); // in324 + + let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); + let z: u384 = outputs.get_output(t946); + return z; +} + + +const POSEIDON_GRUMPKIN_GRUMPKIN_CONSTANTS: [u384; 323] = [ + u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, + u384 { + limb0: 0x11bb29938d21d47304cd8e6e, + limb1: 0xd05986d656f40c2114c4993c, + limb2: 0xee9a592ba9a9518, + limb3: 0x0, + }, + u384 { + limb0: 0xd00868df5696fff40956e864, + limb1: 0x5986587169fc1bcd887b08d4, + limb2: 0xf1445235f2148c, + limb3: 0x0, + }, + u384 { + limb0: 0xb7ab36ce879f3890ecf73f5, + limb1: 0x1f29a058d0fa80b930c72873, + limb2: 0x8dff3487e8ac99e, + limb3: 0x0, + }, + u384 { + limb0: 0xdae2d00ca8ef88ceea2b0197, + limb1: 0xe1f9075cb7c490efa59565ee, + limb2: 0x84d520e4e5bb469, + limb3: 0x0, + }, + u384 { + limb0: 0x2f9f15d8eb3e767ae0fd811e, + limb1: 0x33da56722416fd734b3e667a, + limb2: 0x2d15d982d99577fa, + limb3: 0x0, + }, + u384 { + limb0: 0x36a5996d0efbe65632c41b6d, + limb1: 0xcf1578a43cf0364e91601f65, + limb2: 0xed2538844aba161, + limb3: 0x0, + }, + u384 { + limb0: 0x829b735dcc3e3af02955e60a, + limb1: 0x86e739e6363c71cf804c877d, + limb2: 0x2600c27d879fbca1, + limb3: 0x0, + }, + u384 { + limb0: 0x7440dfd970058558282bf2c5, + limb1: 0x475bd15396430e7ccb99a551, + limb2: 0x28f8bd44a583cbaa, + limb3: 0x0, + }, + u384 { + limb0: 0xf697a5572d030c55df153221, + limb1: 0x8781aad012e7eaef1ed314d7, + limb2: 0x9cd7d4c380dc548, + limb3: 0x0, + }, + u384 { + limb0: 0xbe82234951e2bee7d0f855f5, + limb1: 0x6120ecaace460d24b6713fe, + limb2: 0x11bb6ee1291aabb2, + limb3: 0x0, + }, + u384 { + limb0: 0xf5b8fd05349cadeecfceb230, + limb1: 0x3310f3c0e3fae1d06f171580, + limb2: 0x2d74e8fa0637d985, + limb3: 0x0, + }, + u384 { + limb0: 0xa511a18be4b4d316ed889033, + limb1: 0xac9bef31bacba338b1a09559, + limb2: 0x2735e4ec9d39bdff, + limb3: 0x0, + }, + u384 { + limb0: 0x826e08dcf617e24213132dfd, + limb1: 0xa5da6312faa78e971106c33f, + limb2: 0xf03c1e9e0895db1, + limb3: 0x0, + }, + u384 { + limb0: 0x8f777811848a7e9ead6778c4, + limb1: 0xaf92920205b719c18741090b, + limb2: 0x17094cd297bf827c, + limb3: 0x0, + }, + u384 { + limb0: 0x178042c81ba7d4b4d559e2b8, + limb1: 0x1fc2b3219465798348df90d4, + limb2: 0xdb8f419c21f9246, + limb3: 0x0, + }, + u384 { + limb0: 0xb9ca1724a22709ceceeece2, + limb1: 0x17427ed5933fcfbc66809db6, + limb2: 0x243443613f64ffa4, + limb3: 0x0, + }, + u384 { + limb0: 0xeecd03aa04bb191fada75411, + limb1: 0xcd256c25c07d3dd8ecbbae6d, + limb2: 0x22af49fbfd5d7e9f, + limb3: 0x0, + }, + u384 { + limb0: 0xb4327323f7f7c097c19420e0, + limb1: 0xc78a20d93c7230c4677f797, + limb2: 0x14fbd37fa8ad6e4e, + limb3: 0x0, + }, + u384 { + limb0: 0xb3f3e1ea22faa7e18b5ae625, + limb1: 0xd4b2c9fbc6e4ef4189420c4e, + limb2: 0x15a9298bbb882534, + limb3: 0x0, + }, + u384 { + limb0: 0x854e75434c2f1d90562232bc, + limb1: 0x221323ebceb2f2ac83eef92e, + limb2: 0x2f7de75f23ddaaa5, + limb3: 0x0, + }, + u384 { + limb0: 0xf9e9b2e623584f7479cd5c27, + limb1: 0x78a315e84c4ae5aeca216f2f, + limb2: 0x36a4432a868283b, + limb3: 0x0, + }, + u384 { + limb0: 0x2f11e860ae1c5682c797de5c, + limb1: 0xe277218ab14a11e5e39f3c96, + limb2: 0x2180d7786a8cf810, + limb3: 0x0, + }, + u384 { + limb0: 0x84cc03ce53572377eefff8e4, + limb1: 0xd0cb55be640d73ee37789904, + limb2: 0xa268ef870736eeb, + limb3: 0x0, + }, + u384 { + limb0: 0xc90e09069df9bae16809a5b2, + limb1: 0x4f2999031f15994829e982e8, + limb2: 0x1eefefe11c0be466, + limb3: 0x0, + }, + u384 { + limb0: 0x9a1129946571a3c3cf244c52, + limb1: 0x9ca596e8cb77fe3a4b8fb93d, + limb2: 0x27e87f033bd1e0a8, + limb3: 0x0, + }, + u384 { + limb0: 0xd2a3e184d21451809178ee39, + limb1: 0x3321f57d6c5435889979c4f9, + limb2: 0x1498a3e6599fe24, + limb3: 0x0, + }, + u384 { + limb0: 0x235bef108dea1bbebde507aa, + limb1: 0xe9dd4d7ce33707f74d5d6bcc, + limb2: 0x27c0a41f4cb9fe67, + limb3: 0x0, + }, + u384 { + limb0: 0x5d5004c16a7c91fe1dae280f, + limb1: 0x6637238b120fc770f4f4ae82, + limb2: 0x1f75230908b141b4, + limb3: 0x0, + }, + u384 { + limb0: 0x89808d4eb1f0a085bee21656, + limb1: 0x7bba831b15fffd2d7b97b3a0, + limb2: 0x25f99a9198e92316, + limb3: 0x0, + }, + u384 { + limb0: 0x8ed14c67622974228ba900c6, + limb1: 0xd0f6acdc2bb526593d3d56ec, + limb2: 0x101bc318e9ea5920, + limb3: 0x0, + }, + u384 { + limb0: 0xa3cf091ec1ccc43207a83c76, + limb1: 0x97c1334ecb019754ebc0c852, + limb2: 0x1a175607067d5173, + limb3: 0x0, + }, + u384 { + limb0: 0xba4af5c1c4d89770155df37b, + limb1: 0xdeb245f3e8c381ee6b2eb380, + limb2: 0xf02f0e6d25f9ea3, + limb3: 0x0, + }, + u384 { + limb0: 0x56ae789ff358b3163b393bc9, + limb1: 0x8d8a6677203ec9692565de4, + limb2: 0x151d757acc8237af, + limb3: 0x0, + }, + u384 { + limb0: 0x5b757890a79d13a3a624fad4, + limb1: 0x49e0a1fe0068dd20084980ee, + limb2: 0x256cd9577cea1430, + limb3: 0x0, + }, + u384 { + limb0: 0xfbdd195497b8ae86e1937c61, + limb1: 0x8833b13da50e0884476682c3, + limb2: 0x513abaff6195ea4, + limb3: 0x0, + }, + u384 { + limb0: 0xe4ac448386d19dbac4e4a655, + limb1: 0x6f610251ee6e2e8039246e84, + limb2: 0x1d9570dc70a205f3, + limb3: 0x0, + }, + u384 { + limb0: 0xd784cf5e044eec50b29fc9d4, + limb1: 0xd5d7f1bf8aaa6f56effb012d, + limb2: 0x18f1a5194755b8c5, + limb3: 0x0, + }, + u384 { + limb0: 0x966ef420d88163238eebbca8, + limb1: 0x866512c091e4a4f2fa4bb0af, + limb2: 0x266b53b615ef73ac, + limb3: 0x0, + }, + u384 { + limb0: 0xb8c89a1a3f4fd6e8344ae0f7, + limb1: 0xa42b8de27644c02268304dfe, + limb2: 0x2d63234c9207438a, + limb3: 0x0, + }, + u384 { + limb0: 0x5ef8df7e0021daee6f55c693, + limb1: 0x7b3adde219a6f0b5fbb97620, + limb2: 0x2ab30fbe51ee49bc, + limb3: 0x0, + }, + u384 { + limb0: 0xd528b270068d9207fa6a45c9, + limb1: 0xdcb9cce48969d4df1dc42abc, + limb2: 0x1aee6d4b3ebe9366, + limb3: 0x0, + }, + u384 { + limb0: 0xc60bb34aa211d123f6095219, + limb1: 0x5a79452e5864ae1d11f57646, + limb2: 0x1891aeab71e34b89, + limb3: 0x0, + }, + u384 { + limb0: 0x57771bd3a7caab01c818aa4b, + limb1: 0x6437e94b4101c69118e16b26, + limb2: 0x24492b5f95c0b087, + limb3: 0x0, + }, + u384 { + limb0: 0x3d66c10ab2fddf71bcfde68f, + limb1: 0x1b3b2c8663a0d64296462821, + limb2: 0x1752161b3350f7e, + limb3: 0x0, + }, + u384 { + limb0: 0x148de54368cfb8f90a00f3a7, + limb1: 0x7cfb84938e614c6c2f445b8d, + limb2: 0xab676935722e2f6, + limb3: 0x0, + }, + u384 { + limb0: 0xe227e3d4fe0da1f7aa348189, + limb1: 0x45bc730117ed9ae5683fc2e6, + limb2: 0xb0f72472b9a2f5f, + limb3: 0x0, + }, + u384 { + limb0: 0x2c3ae6df13a78a513edcd369, + limb1: 0x1c201d1a52fc4f8acaf2b215, + limb2: 0x16aa6f9273acd563, + limb3: 0x0, + }, + u384 { + limb0: 0x55d23281a45c08d52435cd60, + limb1: 0x13c324c1d8716eb0bf62d9b1, + limb2: 0x2f60b987e63614eb, + limb3: 0x0, + }, + u384 { + limb0: 0x42f508fd9db76b7cc1b21212, + limb1: 0x7606bb7884554e9df1cb89b0, + limb2: 0x18d24ae01dde92fd, + limb3: 0x0, + }, + u384 { + limb0: 0xdf1593960715d4724cffa586, + limb1: 0x8d776373130df79d18c3185f, + limb2: 0x4fc3bf76fe31e2f, + limb3: 0x0, + }, + u384 { + limb0: 0xb21260c6b5d26270468dbf82, + limb1: 0xcfdd670b41732bdf6dee9e06, + limb2: 0xd18f6b53fc69546, + limb3: 0x0, + }, + u384 { + limb0: 0xcdb045036fa5d7045bd10e24, + limb1: 0xcec11fbafa17c5223f1f70b4, + limb2: 0xba4231a918f13a, + limb3: 0x0, + }, + u384 { + limb0: 0x635ff1ebedd0dd86120b4c8, + limb1: 0x100985301663e7ec33c826da, + limb2: 0x7b458b2e00cd7c6, + limb3: 0x0, + }, + u384 { + limb0: 0xed40b16cec39e9fd7baa5799, + limb1: 0x6058e76f15a0c8286bba24e2, + limb2: 0x1c35c2d96db90f4f, + limb3: 0x0, + }, + u384 { + limb0: 0xbbef96945e0dde688e292050, + limb1: 0x766568f03dd1ecdb0a4f589a, + limb2: 0x1d12bea3d8c32a5d, + limb3: 0x0, + }, + u384 { + limb0: 0x2fdea94313db405a61300286, + limb1: 0x525f9a73526e9889c995bb6, + limb2: 0xd953e2002200327, + limb3: 0x0, + }, + u384 { + limb0: 0x10b4040a760e33506d2671e1, + limb1: 0x86a40bec4c875047f06ff0b6, + limb2: 0x29f053ec388795d7, + limb3: 0x0, + }, + u384 { + limb0: 0x46e0c3f64b9679caaae44fc2, + limb1: 0x4a4952a98463bc12e264d5f4, + limb2: 0x4188e33735f46b1, + limb3: 0x0, + }, + u384 { + limb0: 0xb7e97eb3bf1735cdbe96f68f, + limb1: 0xa84f1d0529431bb9e996a408, + limb2: 0x149ec28846d4f438, + limb3: 0x0, + }, + u384 { + limb0: 0xe651922d148cce1c5fdddee8, + limb1: 0xca24b5f63630bad47aeafd98, + limb2: 0xde20fae0af5188b, + limb3: 0x0, + }, + u384 { + limb0: 0x4b8660edf449fba6984c6709, + limb1: 0x3ea94350e722ad2f7d836c23, + limb2: 0x12d650e8f790b125, + limb3: 0x0, + }, + u384 { + limb0: 0x8abe28d78340dfc4babb8f6c, + limb1: 0xea96717ba7446aafdadbc1a, + limb2: 0x22ab53aa39f34ad3, + limb3: 0x0, + }, + u384 { + limb0: 0x71dd776904a129db9149166c, + limb1: 0x450dabea7907bc3de0de1098, + limb2: 0x26503e8d4849bdf5, + limb3: 0x0, + }, + u384 { + limb0: 0x897e7fc4c8064035b0d33850, + limb1: 0xf5454f5003c5c8ec34b23d, + limb2: 0x1d5e7a0e2965dffa, + limb3: 0x0, + }, + u384 { + limb0: 0xa544615b9cb3c7bbd07104cb, + limb1: 0x12d96b7ec48448c6bc9a6aef, + limb2: 0xee3d8daa098bee0, + limb3: 0x0, + }, + u384 { + limb0: 0x175703d91dc232b5f98ead00, + limb1: 0x55d30754cd4d9056fa9ef7a7, + limb2: 0x1bf282082a049799, + limb3: 0x0, + }, + u384 { + limb0: 0x6b693733a0272173ee9ad461, + limb1: 0xe3e951bc316bee49971645f1, + limb2: 0x7ae1344abfc6c2c, + limb3: 0x0, + }, + u384 { + limb0: 0x7a47d97a5c8e89762ee80488, + limb1: 0xec21b131d511d7dbdc98a36b, + limb2: 0x217e3a247827c376, + limb3: 0x0, + }, + u384 { + limb0: 0xfc2894117509b616addc30ee, + limb1: 0xa003d438e2fbe28babe1e50e, + limb2: 0x215ffe584b0eb067, + limb3: 0x0, + }, + u384 { + limb0: 0xe33da57412a92d1d3ce3ec20, + limb1: 0x92dcedc597c4ca0fbec19b84, + limb2: 0x1e770fc8ecbfdc86, + limb3: 0x0, + }, + u384 { + limb0: 0x9338b3c0e50e828f69ff6d1f, + limb1: 0x9f1e3a8a6d66a05742914fc1, + limb2: 0x2f6243cda919bf4c, + limb3: 0x0, + }, + u384 { + limb0: 0x9cc89345d3c03ff87a11b693, + limb1: 0x9595d0046f44ab303a195d0e, + limb2: 0x246efddc3117ecd3, + limb3: 0x0, + }, + u384 { + limb0: 0x9a918dfbe602bc62cec6adf1, + limb1: 0xd4fe006f139cbc4e0168b1c8, + limb2: 0x53e8d9b3ea5b8e, + limb3: 0x0, + }, + u384 { + limb0: 0xeefff135aec04c1abe59427b, + limb1: 0x7d910f6a710d38b7eb4f261b, + limb2: 0x1b894a2f45cb9664, + limb3: 0x0, + }, + u384 { + limb0: 0x88651f5a42553d54ec242cc0, + limb1: 0x8212652479107d5fdc077abf, + limb2: 0xaeb1554e266693d, + limb3: 0x0, + }, + u384 { + limb0: 0xbd4b7d0e11faf9da8d9ca28e, + limb1: 0xe6888680d1781c7f04ba7d71, + limb2: 0x16a735f6f7209d24, + limb3: 0x0, + }, + u384 { + limb0: 0x615b19374ff549dcf073d41b, + limb1: 0xd7c13b4df0543cd260e4bcbb, + limb2: 0x487b8b7fab5fc8f, + limb3: 0x0, + }, + u384 { + limb0: 0x68c3ad677fdf51c92388793, + limb1: 0x124bea26b0772493cfb5d512, + limb2: 0x1e75b9d2c2006307, + limb3: 0x0, + }, + u384 { + limb0: 0x239d1c6c961dcb02da3b388f, + limb1: 0x253b46d5ff77d272ae46fa1e, + limb2: 0x5120e3d0e28003c, + limb3: 0x0, + }, + u384 { + limb0: 0x3b171823f890f5fd55d78372, + limb1: 0xb822e8763240119ac0900a05, + limb2: 0xda5feb534576492, + limb3: 0x0, + }, + u384 { + limb0: 0x379d9d2c40cc8f78b7bd9abe, + limb1: 0x22acc1a1f5f3bb6d8c2666a6, + limb2: 0x2e211b39a023031a, + limb3: 0x0, + }, + u384 { + limb0: 0xad24378bfedb68592ba8118b, + limb1: 0xb2b70caf5c36a7b194be7c11, + limb2: 0x109b7f411ba0e4c9, + limb3: 0x0, + }, + u384 { + limb0: 0x415c3dded62940bcde0bd771, + limb1: 0xb9c36c764379dbca2cc8fdd1, + limb2: 0x2969f27eed31a480, + limb3: 0x0, + }, + u384 { + limb0: 0x8c5b3753326244ee65a1b1a7, + limb1: 0xd5f9e654638065ce6cd79e2, + limb2: 0x143021ec686a3f33, + limb3: 0x0, + }, + u384 { + limb0: 0xdbdeea55d6c64543dc4903e0, + limb1: 0x6ae119424fddbcbc9314dc9f, + limb2: 0x16ed41e13bb9c0c6, + limb3: 0x0, + }, + u384 { + limb0: 0x8c7b964029b2311687b1fe23, + limb1: 0x4c9871c832963dc1b89d743c, + limb2: 0x2e2419f9ec02ec39, + limb3: 0x0, + }, + u384 { + limb0: 0x58e7d7b6b16cdfabc8ee2911, + limb1: 0x82a70eff08a6fd99d057e12e, + limb2: 0x176cc029695ad025, + limb3: 0x0, + }, + u384 { + limb0: 0xceb247b791a93b74e36736d, + limb1: 0xf617e7dcbfe82e0df706ab64, + limb2: 0x2b90bba00fca0589, + limb3: 0x0, + }, + u384 { + limb0: 0x9f5fb065c8aacc55a0f89bfa, + limb1: 0x97315876690f053d148d4e10, + limb2: 0x101071f0032379b6, + limb3: 0x0, + }, + u384 { + limb0: 0x7043f7773279cd71d25d5e0, + limb1: 0x17ba7fee3802593fa6444703, + limb2: 0x19a3fc0a56702bf4, + limb3: 0x0, + }, + u384 { + limb0: 0x4ae72c925a8a79a66831f51d, + limb1: 0x3f83dcedddb9a0236203f5f2, + limb2: 0x1e6f20a11d1e31e4, + limb3: 0x0, + }, + u384 { + limb0: 0x25403ae24084e3027e782467, + limb1: 0xc722a141f8785694484f4267, + limb2: 0x1bd8c528472e57bd, + limb3: 0x0, + }, + u384 { + limb0: 0xa9e9c3190527a1a5f05079a, + limb1: 0x6bacf1ad5e56655b7143625b, + limb2: 0x2d51ba82c8073c6d, + limb3: 0x0, + }, + u384 { + limb0: 0x40ff0731b5f927fe8d6a77c9, + limb1: 0xe0ab10fc2e51ea83ce0611f9, + limb2: 0x1b07d6d51e6f7e97, + limb3: 0x0, + }, + u384 { + limb0: 0xccf34d985a3e53f0bc5765a0, + limb1: 0xe8376f62d19edf43093cdef1, + limb2: 0x11e12a40d262ae88, + limb3: 0x0, + }, + u384 { + limb0: 0xd89038308a3ef37cce8463bd, + limb1: 0x9c6f3e47b5ff55781574f980, + limb2: 0x221c170e4d02a247, + limb3: 0x0, + }, + u384 { + limb0: 0x427f4f063ab718e707576b31, + limb1: 0x6ee25a9b8768b3231a89752f, + limb2: 0x3f0815ab463f1b7, + limb3: 0x0, + }, + u384 { + limb0: 0x3b1d34c8e008859f1dbfb317, + limb1: 0x54c7e33029b3617357012a3d, + limb2: 0x15648bf46f60d829, + limb3: 0x0, + }, + u384 { + limb0: 0xcf61f1daa0cfefbf7fbfba85, + limb1: 0x18ca7f2eafdd7564d05ea850, + limb2: 0x127e00c2253de078, + limb3: 0x0, + }, + u384 { + limb0: 0x8cbbb878f7d48051630747bd, + limb1: 0x9382fc0b1d265cb4d3ce470a, + limb2: 0x66365afd18a41ef, + limb3: 0x0, + }, + u384 { + limb0: 0x4e57dcf2b099715c4404aae7, + limb1: 0xdc69a96f7fe7e086f4fa24c8, + limb2: 0x219d14f823513140, + limb3: 0x0, + }, + u384 { + limb0: 0x696d37ebaefa9ac2302132d5, + limb1: 0x4a6a63a8050d91f9f14f4d33, + limb2: 0x3a30bfbbf2cb86d, + limb3: 0x0, + }, + u384 { + limb0: 0x74b06e3385104b0b41935bcc, + limb1: 0xb0270fb7d5c9f94edad5a84d, + limb2: 0x2121bbcdeaa33a35, + limb3: 0x0, + }, + u384 { + limb0: 0xe338a389d053ef8b3d10e70e, + limb1: 0xcfbb82c289e579b7cd5580c2, + limb2: 0x196b544fbeb0a792, + limb3: 0x0, + }, + u384 { + limb0: 0xedb4bd4e7d907ea0202f560f, + limb1: 0x89c1db270ef479c26973ec73, + limb2: 0x2809c3a1547c0cee, + limb3: 0x0, + }, + u384 { + limb0: 0x5b31f4b5d40d4e96dfc5c8f1, + limb1: 0xca157585a02b8b342a4c6717, + limb2: 0x11c34446b083ef92, + limb3: 0x0, + }, + u384 { + limb0: 0x709d90b86d9d8026e2e39925, + limb1: 0x367c030e3289cbe0f6242ad7, + limb2: 0x253ea0b33a8bf3b2, + limb3: 0x0, + }, + u384 { + limb0: 0x6d1030438c16df85637bd5f, + limb1: 0x90c89d4007ad29fc4f5a19c0, + limb2: 0x30467dc1930f6afe, + limb3: 0x0, + }, + u384 { + limb0: 0x58b38bbe13c8ebfbbba54f44, + limb1: 0x7e20e6f5a3a88af7aa6a5364, + limb2: 0x2f9d4b55495f7e37, + limb3: 0x0, + }, + u384 { + limb0: 0xbe18aad54cfd03ff0feac4b8, + limb1: 0xf11d36d499e7e093d8ee2353, + limb2: 0x1d9e9d5c736e3151, + limb3: 0x0, + }, + u384 { + limb0: 0x7e097c315f343de301e54841, + limb1: 0xebf622f7823a3de7d1bfedb8, + limb2: 0x124b617b43e598f9, + limb3: 0x0, + }, + u384 { + limb0: 0x9cae08d789cc5748ffe199b2, + limb1: 0x4055cf073bedc945a5f9c5b1, + limb2: 0x198e7cfc66ae4577, + limb3: 0x0, + }, + u384 { + limb0: 0x7443099c5bb6c27ed977fe24, + limb1: 0xfd124ab3aad57789eb945ba5, + limb2: 0x2eac25b3498dfadf, + limb3: 0x0, + }, + u384 { + limb0: 0x454ed3550b3c6ab5f4f90126, + limb1: 0x1b378305c1bb9c904e8af1d4, + limb2: 0x1ee02c175cdfe187, + limb3: 0x0, + }, + u384 { + limb0: 0x745c48609fa98301d0f679d5, + limb1: 0xb29ea8f9d2dfa47ff6fbb1d9, + limb2: 0x616f8c34c607266, + limb3: 0x0, + }, + u384 { + limb0: 0x385e4883a43a42832803370b, + limb1: 0x58b9f19cbbdb972a853e51ed, + limb2: 0x181d68b0a1885049, + limb3: 0x0, + }, + u384 { + limb0: 0x24cbabf6059e9327f5ba7004, + limb1: 0x5d6b7f5b015d579181d1ce2f, + limb2: 0x2d5397ce863464a2, + limb3: 0x0, + }, + u384 { + limb0: 0x2da2b6591724d8dbd4bc2618, + limb1: 0xe8912940cc0b80277713e7d3, + limb2: 0x15bf817491b94d71, + limb3: 0x0, + }, + u384 { + limb0: 0x40bc910994a3827d29c08714, + limb1: 0xb76feab28b69485ac8cc6877, + limb2: 0x2a7cbd11460b177a, + limb3: 0x0, + }, + u384 { + limb0: 0xa80a85614c237b290de9d502, + limb1: 0xab56e447fae5cc1763cb462d, + limb2: 0xf7cd5ffa4661730, + limb3: 0x0, + }, + u384 { + limb0: 0x86d305be644ce04531008100, + limb1: 0xeb13273508eb6575f768137d, + limb2: 0xe0766004b4c4176, + limb3: 0x0, + }, + u384 { + limb0: 0xafac00104e1f763000b9924c, + limb1: 0xf6d148be6b9c8bb7b54ee3c1, + limb2: 0x625fa7145813481, + limb3: 0x0, + }, + u384 { + limb0: 0xb184f515b65136318ce2c6a5, + limb1: 0x16ee0f5461aad2e0b19cd9c7, + limb2: 0x7c5472508b4599, + limb3: 0x0, + }, + u384 { + limb0: 0x951d43c54685879cb7a89fcb, + limb1: 0x93ac77ab3fb7557231d53073, + limb2: 0x567375470d189b6, + limb3: 0x0, + }, + u384 { + limb0: 0xea4bfc71601174ba5c7b8bcc, + limb1: 0x5165f56c063e42108ad21f51, + limb2: 0x1d0406bcbec83f8d, + limb3: 0x0, + }, + u384 { + limb0: 0x2f8696ee7c73b46c63272cb7, + limb1: 0x280a8aa1f86405f3375f0634, + limb2: 0xc02b18eef22332d, + limb3: 0x0, + }, + u384 { + limb0: 0x4fd1b15aad053a55ad6da4cf, + limb1: 0xeaa7add2f801a664823509ad, + limb2: 0x17c1fc174cd9a6eb, + limb3: 0x0, + }, + u384 { + limb0: 0x33f7ed258a08638e9584b32d, + limb1: 0xab7ebbc86709a021aaa6caf4, + limb2: 0x5f843c23024eb1d, + limb3: 0x0, + }, + u384 { + limb0: 0x90a55c87589f792f0ad8cb37, + limb1: 0x5cc51c53165e002727b45ccd, + limb2: 0x22df2420697ca28b, + limb3: 0x0, + }, + u384 { + limb0: 0x4b76be86417588efc4d7302a, + limb1: 0x73400aaedf0f48009fd3af80, + limb2: 0x2f1438303a7b49d4, + limb3: 0x0, + }, + u384 { + limb0: 0xcd35d5ca6155c5463093b23b, + limb1: 0xc6b2b7b4fbf9a24bbaa7f4dc, + limb2: 0x2323d5fcf2da8965, + limb3: 0x0, + }, + u384 { + limb0: 0x1e9c54f94e37700073d4d26e, + limb1: 0xe83b753a5e7336b9f40f7b96, + limb2: 0x26c85b9dfbbe48f, + limb3: 0x0, + }, + u384 { + limb0: 0x4c20979528e41d65384c318f, + limb1: 0xfeb38b5ab4e335f070b271df, + limb2: 0x31511000251ec86, + limb3: 0x0, + }, + u384 { + limb0: 0x941e34a60ff5df9a26c03af1, + limb1: 0xb42fa69e5d90a0c0e27cd16b, + limb2: 0x18e588324a9bbaac, + limb3: 0x0, + }, + u384 { + limb0: 0xd9bef2e7d99f03c10ea1f95f, + limb1: 0x70635775c8d3c9498357d6a, + limb2: 0x2642b5d8e16b953b, + limb3: 0x0, + }, + u384 { + limb0: 0x48335c4221f909aef836c133, + limb1: 0xe84ff60db906a0f031189b0b, + limb2: 0x21fc313ba11c60e8, + limb3: 0x0, + }, + u384 { + limb0: 0xbac6e4e9f2f4d93d06dae151, + limb1: 0x890b698cc6ab89f7311298bc, + limb2: 0x2d3562e3d4b42bc6, + limb3: 0x0, + }, + u384 { + limb0: 0x7616f01c189d886dfd2e0808, + limb1: 0x2e3e0b6ff7e5c7c77934a5f6, + limb2: 0xa74ef541d360e84, + limb3: 0x0, + }, + u384 { + limb0: 0x7d9e754967c2c9b1b02caf8a, + limb1: 0xc3983d6e3b433afa43f43408, + limb2: 0x140564b53e0a812a, + limb3: 0x0, + }, + u384 { + limb0: 0xe83fa6993adb6f2db6bba9d0, + limb1: 0x18b400181e71ab9759c436c8, + limb2: 0x14709e32d98ae4cd, + limb3: 0x0, + }, + u384 { + limb0: 0x2dba651f4a619a4b52bdc010, + limb1: 0x423f179e1266dd392372db4f, + limb2: 0x734b2366c59e394, + limb3: 0x0, + }, + u384 { + limb0: 0x913642c7d02d7e71088fd2d4, + limb1: 0x5ad3e3c5fb6629abe963ed92, + limb2: 0x11fb2d705c94b08d, + limb3: 0x0, + }, + u384 { + limb0: 0x8fd84be834e4cc3618059484, + limb1: 0x5d715eba19371050ef6eb7f7, + limb2: 0x27d03abf5c1f290e, + limb3: 0x0, + }, + u384 { + limb0: 0x2a39c6a8bb9b441ac1395861, + limb1: 0x7fb3353cfc2cd63ebe817f21, + limb2: 0x13ed9e9e6b452df2, + limb3: 0x0, + }, + u384 { + limb0: 0x2604263a7c5b79ab99cbd23c, + limb1: 0x246cdaaa04a12e88795de445, + limb2: 0x1319c51cf37aaa10, + limb3: 0x0, + }, + u384 { + limb0: 0x4eebbd0e715b6cea019ac3f2, + limb1: 0x7f9dad839f2c8cb526a4cf44, + limb2: 0xbca25588d187b, + limb3: 0x0, + }, + u384 { + limb0: 0x3f02f7a3c01be23cf51d593f, + limb1: 0x181226874b923cd01a069b49, + limb2: 0x1d837ea0341c5964, + limb3: 0x0, + }, + u384 { + limb0: 0xdbd25f24012090db7de4e7f9, + limb1: 0x42c427ce4c5c83774149e2a6, + limb2: 0x1b41ce9ed3634cbd, + limb3: 0x0, + }, + u384 { + limb0: 0xb78a127c7b56bd6673f1ce1f, + limb1: 0xddc790ecc4e946f4bca74b98, + limb2: 0x671f0e3b674ae7c, + limb3: 0x0, + }, + u384 { + limb0: 0x1ac14143071d0449a5426e4e, + limb1: 0x72e40cd30615f55fefeb682c, + limb2: 0x19fc073797a39b2, + limb3: 0x0, + }, + u384 { + limb0: 0xbf5d97311c5096619e9fd13, + limb1: 0xfd1f7c5c6d5a7c70fa420948, + limb2: 0x17bee47d262a497, + limb3: 0x0, + }, + u384 { + limb0: 0x1cc937ba00cc8527274471e3, + limb1: 0x80763539cff2978a4c794472, + limb2: 0x2073cff92d3141b4, + limb3: 0x0, + }, + u384 { + limb0: 0x2e730fe2c7aa46b1fa663baa, + limb1: 0x7f43182a55a91d48f9c58d15, + limb2: 0x3bd7b3e2c188587, + limb3: 0x0, + }, + u384 { + limb0: 0x19a14c8dfed9ffbbbad9b6b7, + limb1: 0xff128edfb9bbf5fa0ceb1007, + limb2: 0x226ebc9a538b5bba, + limb3: 0x0, + }, + u384 { + limb0: 0xaf1d830dc6e394e8a5d3b21a, + limb1: 0x373a06e1552c0e634a49572, + limb2: 0xd395f0b08b9fede, + limb3: 0x0, + }, + u384 { + limb0: 0xcf1e0f2f41f77d5331f99ffa, + limb1: 0x30d49b68e19e31ba5284bd3b, + limb2: 0x28242439b524540a, + limb3: 0x0, + }, + u384 { + limb0: 0x9e91f929754b48c6154d4df6, + limb1: 0x2d2de034801ab85e0b457e12, + limb2: 0x370d6fa19eaac14, + limb3: 0x0, + }, + u384 { + limb0: 0xc753feb0a2b2e0bcbde1659, + limb1: 0x90762abf269579eaa37939bc, + limb2: 0x9a16f573b3280f3, + limb3: 0x0, + }, + u384 { + limb0: 0x90b71b268d99981368231d97, + limb1: 0x496ac443f98127ee3c0021a6, + limb2: 0x2228e360fb5b162b, + limb3: 0x0, + }, + u384 { + limb0: 0x8032b6a1b97675f3c567f944, + limb1: 0x9fabf83991476d209431e34d, + limb2: 0x7e42c2ca633d2c4, + limb3: 0x0, + }, + u384 { + limb0: 0xd8e9d753a50fe96097724a9f, + limb1: 0xc3cab85a6215a32eed35fda1, + limb2: 0x2ce12d7269663770, + limb3: 0x0, + }, + u384 { + limb0: 0xf70973a7ba0b2231815b15de, + limb1: 0x9eeb9b1b45a0125084bc4da, + limb2: 0x3d7427704c61e20, + limb3: 0x0, + }, + u384 { + limb0: 0xdc4626732d86921e553e69c6, + limb1: 0x1c1267fcf4b4b33ca096fb4d, + limb2: 0x10f8abf076418586, + limb3: 0x0, + }, + u384 { + limb0: 0xaaf6568a5c95644c7c5914cc, + limb1: 0x25d7cb456e3aeb251a1a620, + limb2: 0x17ccaf6f26f7267a, + limb3: 0x0, + }, + u384 { + limb0: 0x6e55754d59de6df28cea4d51, + limb1: 0x1385c3ce00ca820ad0e3651a, + limb2: 0x63bb306b9631005, + limb3: 0x0, + }, + u384 { + limb0: 0x65e608bc920cf993a4169974, + limb1: 0xf2c304a18095ab7403242e0b, + limb2: 0x1f761ee5553c5e86, + limb3: 0x0, + }, + u384 { + limb0: 0x61b45717cd6bdfc09de4e8f2, + limb1: 0xa23c0e666859ba6564bcde87, + limb2: 0xdc5f00bbfd7c1d9, + limb3: 0x0, + }, + u384 { + limb0: 0xa230abc391089760bfc40ef2, + limb1: 0xdf07c3536381c13eb44cf790, + limb2: 0x6de511520e277b7, + limb3: 0x0, + }, + u384 { + limb0: 0x50a1fe21f24a8c06e10cca03, + limb1: 0xf9ef54863e70528a1fd4481b, + limb2: 0x2a134348c8660efc, + limb3: 0x0, + }, + u384 { + limb0: 0xb63a7dbba1b33520bcfce37b, + limb1: 0x4bd80089e99edf8ed5f6f1ff, + limb2: 0xaeb5023bbb9a64c, + limb3: 0x0, + }, + u384 { + limb0: 0xab26155836fc51fb7cb933d1, + limb1: 0x25ecb5f0bfdc9995406c5960, + limb2: 0x141a6d0810366ae2, + limb3: 0x0, + }, + u384 { + limb0: 0x990bc0b8bfe87497f1e2c5b7, + limb1: 0xbe776f404dca6626cc0b2539, + limb2: 0x9d2ea05ef54dadb, + limb3: 0x0, + }, + u384 { + limb0: 0x2441bfe8ff1a16e91719cdde, + limb1: 0xd104d5f8ef70891d22d4a543, + limb2: 0x1e56d244a8e41be5, + limb3: 0x0, + }, + u384 { + limb0: 0xa85c2fd68ba4d5c5f50c7b49, + limb1: 0xec908b2f99b5c4fd5e09447f, + limb2: 0x1d4f020c57c4f14a, + limb3: 0x0, + }, + u384 { + limb0: 0x9db80fb0ee1e833764c18fd3, + limb1: 0xe09f4e14cd03398d8d82a1e0, + limb2: 0x763911a3a92a4f0, + limb3: 0x0, + }, + u384 { + limb0: 0xc5e47e55684366e54b302946, + limb1: 0xba2ec68f9061643f1fc5d9a2, + limb2: 0x12857275be2fe6b9, + limb3: 0x0, + }, + u384 { + limb0: 0x3c5d83d4d0ebf50d1bbf87c0, + limb1: 0x655ffe9a96c4b81adc0a6035, + limb2: 0x2ed11ccd2e2e2376, + limb3: 0x0, + }, + u384 { + limb0: 0x2cfbb4acd288a21543c6d594, + limb1: 0x5b320d5e3e966ef4726d5b1c, + limb2: 0x3e31de8958e8264, + limb3: 0x0, + }, + u384 { + limb0: 0xd7e905366ec2ca4a36e71963, + limb1: 0x58ae890046533d58da28a608, + limb2: 0x11e880dfefdbd088, + limb3: 0x0, + }, + u384 { + limb0: 0x978d53c190dc25e969a507b2, + limb1: 0x704a9c3cc21ab7a44a34662, + limb2: 0x1835b275deaed2d0, + limb3: 0x0, + }, + u384 { + limb0: 0xf1324240419f372ff8d3c3f5, + limb1: 0xce5a4a9480e1d82ce5d44f76, + limb2: 0x68b75315e25ed4a, + limb3: 0x0, + }, + u384 { + limb0: 0x95c839d698ad3b22823274d1, + limb1: 0x2b052d2ad12b92a4268fccd7, + limb2: 0x1b7ef7d04aec73d6, + limb3: 0x0, + }, + u384 { + limb0: 0x7f4b8efcc240d30bbaa9f03f, + limb1: 0x6f6193ff5501b57216b67072, + limb2: 0x28c0c848022a9060, + limb3: 0x0, + }, + u384 { + limb0: 0xa16660efd6e5d82d4f068e1b, + limb1: 0x686a7bfb1c39f3f254370985, + limb2: 0x13bda49296cbcc51, + limb3: 0x0, + }, + u384 { + limb0: 0x86c3e0e2fd38490d3a594141, + limb1: 0x11eb10b34265e378a945729f, + limb2: 0x2e7987ea8204389d, + limb3: 0x0, + }, + u384 { + limb0: 0xfda3226ce5415fffd03935c8, + limb1: 0x4b2b45c10a190fedef702aef, + limb2: 0x826d4a2324ad3aa, + limb3: 0x0, + }, + u384 { + limb0: 0x435c3b59685f93b434036ded, + limb1: 0xfa3675ef541c9df7bb964a85, + limb2: 0x2dbeee85eaeaa9, + limb3: 0x0, + }, + u384 { + limb0: 0xf5c5abfb966a4be599cb86c7, + limb1: 0x919418ecb3279b11e6fa44f5, + limb2: 0x227ee7a945edaee6, + limb3: 0x0, + }, + u384 { + limb0: 0x86de8c698d541471c7244220, + limb1: 0x5ac90d696faf2a5ffadc239, + limb2: 0x1d0a6d1a95198778, + limb3: 0x0, + }, + u384 { + limb0: 0xb284ec3e9f4de02b25f6e9d4, + limb1: 0xda4f333b7854fbbcd10eea1d, + limb2: 0x2208aaba508ae816, + limb3: 0x0, + }, + u384 { + limb0: 0xe2f8e01a175720971ccf04ec, + limb1: 0xe36a7d29b587a215c9e59268, + limb2: 0x28a58901035b2c99, + limb3: 0x0, + }, + u384 { + limb0: 0x4ffc0191226f38a8adfd6238, + limb1: 0x123a07865ca1376df317a2a1, + limb2: 0x112f6d8d42b0a0d, + limb3: 0x0, + }, + u384 { + limb0: 0xb4d01f1daf906b6d3c6e2308, + limb1: 0x3174dda182d266d5c727f97f, + limb2: 0x8c6eb19c016d183, + limb3: 0x0, + }, + u384 { + limb0: 0x48c8698ecfea9103f73f1879, + limb1: 0xd0b38b95f9c642df75b1be9a, + limb2: 0x1359d2d6c8b5a116, + limb3: 0x0, + }, + u384 { + limb0: 0x7725f8a5ed42b699c4af3ca7, + limb1: 0xa467c1cc1878d91aaa07aacf, + limb2: 0x10c5052ec67ab9b6, + limb3: 0x0, + }, + u384 { + limb0: 0x5d4e9f060193823684c96c75, + limb1: 0xdb708803e6338fc6afdb188d, + limb2: 0x583c4d292d54f3c, + limb3: 0x0, + }, + u384 { + limb0: 0x3e076e16ee2c18bfc06f57b4, + limb1: 0x1a4054c5b96322e7bcd1fe2b, + limb2: 0x2d94a1c55be38215, + limb3: 0x0, + }, + u384 { + limb0: 0x1927ead80dbc64dd2211c3ec, + limb1: 0xb997369579c1b1703ef77c67, + limb2: 0x15e3402fdde8770f, + limb3: 0x0, + }, + u384 { + limb0: 0x8bb902eb302677e20a727be3, + limb1: 0xf7b21e6b867d5a71b5000bef, + limb2: 0x185be98784817f22, + limb3: 0x0, + }, + u384 { + limb0: 0xc054547b5ca14cd94de467b6, + limb1: 0x66ed8927c89890aa8aad1b00, + limb2: 0x18db4321c721c036, + limb3: 0x0, + }, + u384 { + limb0: 0xd2cd0aff4eb2134a039b5126, + limb1: 0xc390b3f3d799188528849bc, + limb2: 0x2a852b6247f5d61f, + limb3: 0x0, + }, + u384 { + limb0: 0xe1cd771b165930204da58f22, + limb1: 0xe65fb9a18ee0124aa5276f6d, + limb2: 0x2510aeed51b7f506, + limb3: 0x0, + }, + u384 { + limb0: 0xdcad1d7977d6486513bab5f2, + limb1: 0xb5bd3a236f03a47b47b7fb54, + limb2: 0xf2074a32eb8260f, + limb3: 0x0, + }, + u384 { + limb0: 0x12c4c2c84971404bfa044090, + limb1: 0xa8270e19941926cec3531c9e, + limb2: 0x2f4c69297866bd45, + limb3: 0x0, + }, + u384 { + limb0: 0x5f3fd75e9b792c562a37473f, + limb1: 0x5d083a65093c0d0e92df5fd, + limb2: 0x154668727d2dbadf, + limb3: 0x0, + }, + u384 { + limb0: 0x5bcd1194a91e5b0f7b13cadf, + limb1: 0x4fd77fc5ab5c8c4e8d3e2e37, + limb2: 0x1e6ffc5d6a1ff5dc, + limb3: 0x0, + }, + u384 { + limb0: 0x28538571fafa389da29990c6, + limb1: 0x9d75acbc9395cb8398c8b2d4, + limb2: 0x2cf1a1d7c4430910, + limb3: 0x0, + }, + u384 { + limb0: 0x3e24cf016ecf64cf793c9880, + limb1: 0x87cf76cd5ce8da47aa5d8a02, + limb2: 0x140fb39a89f26f6d, + limb3: 0x0, + }, + u384 { + limb0: 0xc159990b8298a93a8589f9e8, + limb1: 0xf0712b201fb3cddfce2c16da, + limb2: 0x1289d13d58a17b5b, + limb3: 0x0, + }, + u384 { + limb0: 0xc5218749610920fe98b2db2e, + limb1: 0x5781e8d3d207adc8370cf56b, + limb2: 0xf45cf974d2c9edb, + limb3: 0x0, + }, + u384 { + limb0: 0xb333568b8687a1c9eceb44d4, + limb1: 0x6b79edfd24f5abcc585a81d1, + limb2: 0x11909c81a1651804, + limb3: 0x0, + }, + u384 { + limb0: 0x2d5a1041fd7bbd6792330d16, + limb1: 0x9f3b891a0e3da4d6917672f, + limb2: 0x2990b23c81882f77, + limb3: 0x0, + }, + u384 { + limb0: 0x9a16dc102ecf461e4aef7277, + limb1: 0xcd5560e0821e7285e0a083ea, + limb2: 0x609551b14716ca3, + limb3: 0x0, + }, + u384 { + limb0: 0x55f4f93dc0880eaa08d03f77, + limb1: 0xfd93dced2467354b6175de17, + limb2: 0xc8c1abdfab99d03, + limb3: 0x0, + }, + u384 { + limb0: 0x98ec09f78a7a55d08f2e0b10, + limb1: 0xbd02f33f8bec6c730db3fed2, + limb2: 0x138bd098c4923b9f, + limb3: 0x0, + }, + u384 { + limb0: 0xe07d9ae3f21bb5a3190f14c0, + limb1: 0x4673f0f77161ae55dcd0b45c, + limb2: 0x2e61e4bc02163011, + limb3: 0x0, + }, + u384 { + limb0: 0x22401c905ddb408260d8e910, + limb1: 0x65a9c4060ce3297c626abd1c, + limb2: 0x124860913e3df8f, + limb3: 0x0, + }, + u384 { + limb0: 0x701d98286c6ac8b7ed052ec8, + limb1: 0x3ec104804d955cbe125f24c5, + limb2: 0x13807f89c394a13, + limb3: 0x0, + }, + u384 { + limb0: 0x50c8f4c4e85578abb0fc2fe5, + limb1: 0x132aa9eeaec08d2f59aa4440, + limb2: 0x2e88d1a6938f0788, + limb3: 0x0, + }, + u384 { + limb0: 0x3ba607c2e8fcc1f26abf3104, + limb1: 0xa0cbf64e1f1787e2257be3c, + limb2: 0x1f3d24f17cfc605, + limb3: 0x0, + }, + u384 { + limb0: 0x82a916bfd9b62f82f0f8d0bf, + limb1: 0x3b9d4f133d41fb5b3fe6c76a, + limb2: 0x1fe1cb0e2ae169f8, + limb3: 0x0, + }, + u384 { + limb0: 0x8d1c48bf5e3377f9177071f3, + limb1: 0x353329221229827e19946f3d, + limb2: 0xef79351229409cd, + limb3: 0x0, + }, + u384 { + limb0: 0x3127860e89088608373beda9, + limb1: 0x1c4893ef77a9d11150755188, + limb2: 0x18fb2e46fc1b90fe, + limb3: 0x0, + }, + u384 { + limb0: 0xa68c5cb61916bd57120d1868, + limb1: 0x4c32ef0761e23a3cc0ad6263, + limb2: 0x77afe2579f42ec1, + limb3: 0x0, + }, + u384 { + limb0: 0x6fdd65d248b186f1490b7b99, + limb1: 0x2642c04ccf8a6ea54e2ac983, + limb2: 0x79769092daa5a75, + limb3: 0x0, + }, + u384 { + limb0: 0x606b676b663c76cf76bab4a5, + limb1: 0x254eb6e09c5c8bfd67eb9734, + limb2: 0x1d8bf229c19968f0, + limb3: 0x0, + }, + u384 { + limb0: 0x36f17256428f29f6ec1bddad, + limb1: 0xf93556e49e4b37737664f142, + limb2: 0x2a33b7d855e7fe55, + limb3: 0x0, + }, + u384 { + limb0: 0xe7aa7536340dc3187ccca8b2, + limb1: 0x4ec161c86e84ba6ab2056077, + limb2: 0x25b0331d7e2b15af, + limb3: 0x0, + }, + u384 { + limb0: 0xb92c16e2f4f13f22342474e2, + limb1: 0xccbf45e4810211b0ffcf8ccb, + limb2: 0x762098f5fe26598, + limb3: 0x0, + }, + u384 { + limb0: 0x185c70716dece2b6172c2514, + limb1: 0x6d0da4c007b1bda42362e144, + limb2: 0xe234d720d70b288, + limb3: 0x0, + }, + u384 { + limb0: 0x11c0c60d135c811152aa4b60, + limb1: 0x6e3742e720b7fec2ea72182f, + limb2: 0x1d82bedccd2bc8a0, + limb3: 0x0, + }, + u384 { + limb0: 0xb94d481314bd1c690a17c979, + limb1: 0xa5e9a3e7d05930b7c3397fd6, + limb2: 0x480064d4b3eb0ad, + limb3: 0x0, + }, + u384 { + limb0: 0x68560cf41867f7464fb0c11a, + limb1: 0xf7593fbb1140edc8c8e45805, + limb2: 0x10a892763b3cca9e, + limb3: 0x0, + }, + u384 { + limb0: 0x667ae4714dde4cd7f4de8b91, + limb1: 0xc921f9b2553680785978b315, + limb2: 0xb5ec64548ea841a, + limb3: 0x0, + }, + u384 { + limb0: 0xd030e1a9ce3c65c9db931d46, + limb1: 0x49761bd7131dfaebd78010ed, + limb2: 0x10554aca4e348e59, + limb3: 0x0, + }, + u384 { + limb0: 0x6e150d4ac648fab3db0cff6, + limb1: 0x8b93655462b1f475b9be9de3, + limb2: 0x15be66f38d86b099, + limb3: 0x0, + }, + u384 { + limb0: 0x4ab0c23caaf308e427d3dbe8, + limb1: 0x82d182957ffad01bf6c26e9d, + limb2: 0x176ad3600fd34911, + limb3: 0x0, + }, + u384 { + limb0: 0x4fc11bd3ce82b5cf0af2e6f2, + limb1: 0x9335001d705ac125e3beb20f, + limb2: 0x2b6f355b3dbf65f0, + limb3: 0x0, + }, + u384 { + limb0: 0x288fa296b6de9ff788c77451, + limb1: 0x81d7c89edefb32d1a8448c51, + limb2: 0x1c85c06a6d5d40d, + limb3: 0x0, + }, + u384 { + limb0: 0xe43f7d1f51a70aaac2460d79, + limb1: 0xbd9a51d76b2e25f82361c389, + limb2: 0x20e1e876c4746a0c, + limb3: 0x0, + }, + u384 { + limb0: 0x737701392d987dda9217fa08, + limb1: 0x2a024b637bc35a29ee3b08ce, + limb2: 0x20e46219f684186d, + limb3: 0x0, + }, + u384 { + limb0: 0x7a8bd90e28be0f2ed6091367, + limb1: 0x654e987907277c2448076636, + limb2: 0x2ea7279db9f2aa0f, + limb3: 0x0, + }, + u384 { + limb0: 0x7c9171b1641be95091780f74, + limb1: 0x362096d472bc75ca0969dc07, + limb2: 0x136be2a7f18924c9, + limb3: 0x0, + }, + u384 { + limb0: 0xfbc8f1f6c924baf0df5a0e9e, + limb1: 0x3067c4300fb0f51119ed5736, + limb2: 0x1ca2033501baa3f7, + limb3: 0x0, + }, + u384 { + limb0: 0x4a9d9fa1da810832b48a50c7, + limb1: 0xecaa75e495f34e3525824f7a, + limb2: 0xa82f199c2505277, + limb3: 0x0, + }, + u384 { + limb0: 0x2e7ed9eb7925a2dea580b7d5, + limb1: 0xe92fefb0d7f7782a9f37a272, + limb2: 0xecf10485307b4ba, + limb3: 0x0, + }, + u384 { + limb0: 0x78f13af16aebbbb339a3936b, + limb1: 0xd12aa22f08a8296d68615c84, + limb2: 0x7b642138dfd6a6d, + limb3: 0x0, + }, + u384 { + limb0: 0xa76d61e9cbc3b6dd0f1a2150, + limb1: 0xd2256d34921fb86ed70e760b, + limb2: 0x1d9dda43a25593ff, + limb3: 0x0, + }, + u384 { + limb0: 0x8213d392958ce2fd3d7d2fce, + limb1: 0x1dc91136c91c6bccd5367eb0, + limb2: 0x2f1af228520c8b75, + limb3: 0x0, + }, + u384 { + limb0: 0x5a1a2b6b18551a45a6cde123, + limb1: 0x5c6d6c1ab3de4abae61ada62, + limb2: 0x1fecfe833ad54045, + limb3: 0x0, + }, + u384 { + limb0: 0x77abe637bdd3ad28e4a23c88, + limb1: 0x3b0d7583460227575657ff8a, + limb2: 0x18fc8e608c735b2b, + limb3: 0x0, + }, + u384 { + limb0: 0x18783a5586388a7547faa815, + limb1: 0x6ebf03cb3f53aba8a43ce0b6, + limb2: 0x28f740bc1182e970, + limb3: 0x0, + }, + u384 { + limb0: 0x1cfd13822bed35b7146966a4, + limb1: 0x94ad301e4b998d29e960a485, + limb2: 0x47998cc0af5a26b, + limb3: 0x0, + }, + u384 { + limb0: 0x2e880ee130a14a692b777b70, + limb1: 0xdda43e415e1b9a3a9725c7b5, + limb2: 0x1b5f1525b31db911, + limb3: 0x0, + }, + u384 { + limb0: 0xd1d7b1af945fa57ed5c8de6e, + limb1: 0x5f65e965a90eac9bf770ae9b, + limb2: 0x275a83fa5d19b453, + limb3: 0x0, + }, + u384 { + limb0: 0x808c9897ce3e40a6f6a27aa8, + limb1: 0xcb430568e49bc9dc2a563359, + limb2: 0x2e8789257ed2cbcc, + limb3: 0x0, + }, + u384 { + limb0: 0xdcd6e41e2925a39c8e2c7c1, + limb1: 0xeb2721a4c09e9d17f60c3450, + limb2: 0x927f46cfe80feef, + limb3: 0x0, + }, + u384 { + limb0: 0xbc1ecf9e0e484bbfe7698101, + limb1: 0xc37619bfe6ab6a97fd8fb2cf, + limb2: 0x1f868ae04832a5db, + limb3: 0x0, + }, + u384 { + limb0: 0xf308fb19ce6d56c9b45eff4, + limb1: 0x9b73f745b2defed65d94ba8, + limb2: 0x9d7a11e27d2f531, + limb3: 0x0, + }, + u384 { + limb0: 0x4fda5995b0c351aa2b879dff, + limb1: 0x104e1c2823fb7c5b9a7b2592, + limb2: 0x282d857cfe8da3b5, + limb3: 0x0, + }, + u384 { + limb0: 0x5c0744f6987fb0f6ff49c217, + limb1: 0x3f349ff830ae663b27576e13, + limb2: 0x20ba8a9fcec815b1, + limb3: 0x0, + }, + u384 { + limb0: 0xddd2ab1b66a8ae4dcbfb136e, + limb1: 0x4589fba12e657d226d57b471, + limb2: 0x11b6afc91e32f1ca, + limb3: 0x0, + }, + u384 { + limb0: 0xc72ddf3f908141736cebc3be, + limb1: 0x316e335c7d93db344788eec2, + limb2: 0x2e666402ac9cc588, + limb3: 0x0, + }, + u384 { + limb0: 0xc9ed9a1a74920f2794f18595, + limb1: 0xa202a110e283faad7057aec5, + limb2: 0x17522e0e9e64f795, + limb3: 0x0, + }, + u384 { + limb0: 0xe2ff24b7878cb9878edbd3b9, + limb1: 0xe20b470cad4cc7319e6adb40, + limb2: 0x2d2ed17f7a1f3ee9, + limb3: 0x0, + }, + u384 { + limb0: 0x8136f4d73c937da16c7bf9f4, + limb1: 0xa96fa276e89e85d08f75e54a, + limb2: 0x1a81efb19d7e1eda, + limb3: 0x0, + }, + u384 { + limb0: 0x51c7a0d515a16bb3bd33e237, + limb1: 0x210a7b44e52e5630f299c5f4, + limb2: 0x27ff57c1ca847e57, + limb3: 0x0, + }, + u384 { + limb0: 0x3c6a5a0a11be26a7f5fb1a94, + limb1: 0x3c5be96031bfa167840d117b, + limb2: 0x1c1a8e22230abcd1, + limb3: 0x0, + }, + u384 { + limb0: 0x4d2c32b59d5836f9c19a5657, + limb1: 0x43627a9cd533e4250d81e777, + limb2: 0x2a1c3f15d4927c8, + limb3: 0x0, + }, + u384 { + limb0: 0xac112e185acb219899357e4, + limb1: 0x1c52499b37cb4be1af0373a1, + limb2: 0x2ddbb7239eb904d8, + limb3: 0x0, + }, + u384 { + limb0: 0x5edadab48a86fad6da0afb60, + limb1: 0x4e0d6faec54be81d8edf8bc2, + limb2: 0xdff198393085a75, + limb3: 0x0, + }, + u384 { + limb0: 0x28789f28b6d5f504bd1645ca, + limb1: 0x76275fcc589d038dec8db287, + limb2: 0x10d50c2473146bbc, + limb3: 0x0, + }, + u384 { + limb0: 0x48506282536b08b4476c1538, + limb1: 0x2a53dfd40e1022e6231ba459, + limb2: 0x61e8328fb5593f9, + limb3: 0x0, + }, + u384 { + limb0: 0xf07d3c51cfa5a0dd9f6d9784, + limb1: 0xd90b644bee31ac58067debf3, + limb2: 0x1b589243847198de, + limb3: 0x0, + }, + u384 { + limb0: 0xced99d5ce6f67a420a3bd1f7, + limb1: 0x9863b053bd4c6087190f0bdc, + limb2: 0x4b00c0da1f851e5, + limb3: 0x0, + }, + u384 { + limb0: 0x2e35018b3bec8cdcb5ddfd67, + limb1: 0x126a70163009a7ac27f8a8d4, + limb2: 0x239941a46c2b93d9, + limb3: 0x0, + }, + u384 { + limb0: 0xc0bfecb4e87ef6814acf2ea2, + limb1: 0xc2c35377cb0a3712bfc9bc3e, + limb2: 0x204f26ca7993b03a, + limb3: 0x0, + }, + u384 { + limb0: 0x8d515e348ef117e926d721c, + limb1: 0x39d832d8be165a1e5747cf73, + limb2: 0x85aff9c7fdadba0, + limb3: 0x0, + }, + u384 { + limb0: 0x5e093158efd375df00ea2068, + limb1: 0xc4ae9db044c0b0b3f10e57d0, + limb2: 0x249042a8dc111f27, + limb3: 0x0, + }, + u384 { + limb0: 0x5203327b3e0825977413e96b, + limb1: 0x542854f3029803e2f8455066, + limb2: 0x6e799bcdf2b4a74, + limb3: 0x0, + }, + u384 { + limb0: 0xcae12085c612496183b87996, + limb1: 0xa9f4d2c002921bc3fffed333, + limb2: 0x1cb3caed4bffb6ac, + limb3: 0x0, + }, + u384 { + limb0: 0xab566889dcd99e84d310d51c, + limb1: 0x28a128bfd4faa6a3dd6ea03c, + limb2: 0xb47e9755fae4801, + limb3: 0x0, + }, + u384 { + limb0: 0x24fd1ca3f0bb730da886a4f, + limb1: 0x920a0c9fd2c360a6506293bc, + limb2: 0xc7e4cea365c2061, + limb3: 0x0, + }, + u384 { + limb0: 0xd9d6988c8dcd7ba4187215df, + limb1: 0xbbaa30d964d6f6f63dbe1b20, + limb2: 0x21da1f701bac77bc, + limb3: 0x0, + }, + u384 { + limb0: 0x19965b6edd1a9486e3c6cc55, + limb1: 0x70905fb67899d10db86b47bd, + limb2: 0x9ae612e8ba1ca13, + limb3: 0x0, + }, + u384 { + limb0: 0xb0c99373fe1f7a0e3b95cf3d, + limb1: 0xc150f284491190e6aab75445, + limb2: 0x262e1e0b56cac47f, + limb3: 0x0, + }, + u384 { + limb0: 0x29fd4ddeaa5d3f67491d34bd, + limb1: 0x2c87c293e3bb7c9e2a7bfa5f, + limb2: 0x234bf4a7dce7587c, + limb3: 0x0, + }, + u384 { + limb0: 0x213d7432eee67f6cb69f70c2, + limb1: 0x2d0a527cac744fb658d2690e, + limb2: 0x2f6cbac694c886b0, + limb3: 0x0, + }, + u384 { + limb0: 0x2fff818d9a3300876dec3ad9, + limb1: 0x7bb8c9fdf78b7aded52aa184, + limb2: 0x22accb18b7c49b4b, + limb3: 0x0, + }, + u384 { + limb0: 0x2a0b3d3cbf623a1df7f8f2fc, + limb1: 0xd659f22d2c77be302eabd918, + limb2: 0x81e2f0652f898c6, + limb3: 0x0, + }, + u384 { + limb0: 0x90f3ffc016b3186ad675b935, + limb1: 0xcea3ada75d669b8c534b9628, + limb2: 0x12c0a25e70d006ec, + limb3: 0x0, + }, + u384 { + limb0: 0x9edd56f49f8d4f2381df3259, + limb1: 0x2fd6fc869df24d7ab56efd34, + limb2: 0x10ef9c23848128cc, + limb3: 0x0, + }, + u384 { + limb0: 0x9491e0620bda347962b240f0, + limb1: 0xd4a81262b71df1bcc2c1d41b, + limb2: 0x2161cd280772819d, + limb3: 0x0, + }, + u384 { + limb0: 0xf799bc41b7f4fdd12cb8d38a, + limb1: 0xb406590041b5248292533364, + limb2: 0x2cebb0ae5108318e, + limb3: 0x0, + }, + u384 { + limb0: 0xa656880fb759e08709a0a62f, + limb1: 0xfe4f7c22d9561f3bf2852283, + limb2: 0x2b2092f86b5979a7, + limb3: 0x0, + }, + u384 { + limb0: 0xcf643e7382b2d8507a065fed, + limb1: 0x8146188425a442450cfc900, + limb2: 0x1566b3402d774b8c, + limb3: 0x0, + }, + u384 { + limb0: 0xfccf8d3d1a163e601d1a0173, + limb1: 0x8fb4c56d6c57ba01627c3635, + limb2: 0x11a316aa31607f26, + limb3: 0x0, + }, + u384 { + limb0: 0x4644609152e353d9c2874e44, + limb1: 0xb782648b560e595408a5e843, + limb2: 0xde7ee069c934256, + limb3: 0x0, + }, + u384 { + limb0: 0xe706c72e67128b8949eab1af, + limb1: 0xcc84df0297708c5e5845c36a, + limb2: 0x2d36f4029245704, + limb3: 0x0, + }, + u384 { + limb0: 0xd82dabdc284d7951d546f858, + limb1: 0xf53198c217fb34e899bde46c, + limb2: 0x1b8cc326b5ee160, + limb3: 0x0, + }, + u384 { + limb0: 0xfd4ddf8a96ece85407550ebb, + limb1: 0x10689fb2187b71694cbf9203, + limb2: 0x27625da0f73ea071, + limb3: 0x0, + }, + u384 { + limb0: 0xedda06cb99ba025b94e4790d, + limb1: 0xcdc0da581a6950f6dea349c3, + limb2: 0x1cd8338a3e5b1ad7, + limb3: 0x0, + }, + u384 { + limb0: 0xd3e67e877a10a84072741a56, + limb1: 0xa763856c94b6438c78a8aed8, + limb2: 0x5ea02d65b209f6d, + limb3: 0x0, + }, + u384 { + limb0: 0xd627e810817743ce03330a55, + limb1: 0x5366cfcf284a895d8b6250ce, + limb2: 0x9f7cb68d4e388f8, + limb3: 0x0, + }, + u384 { + limb0: 0x202e4ebcdfeb969e9d5c1212, + limb1: 0x27b043f5e58dbd1aec13995a, + limb2: 0x18c6230ddc0f8968, + limb3: 0x0, + }, + u384 { + limb0: 0xbfd2e1a10578232096db6dcd, + limb1: 0x1a91c0a0fdccdaa8452e4f07, + limb2: 0x73a6114b997285e, + limb3: 0x0, + }, + u384 { + limb0: 0xb1660ce7a3e7742b2f37be7f, + limb1: 0x22c6a1fc0838adf5fe013f39, + limb2: 0x2e78746340b2a6d2, + limb3: 0x0, + }, + u384 { + limb0: 0x6553def28e675259d3e5c851, + limb1: 0x6303ad8e5e4bf4249b7ea84, + limb2: 0x7aa27e7150baddd, + limb3: 0x0, + }, + u384 { + limb0: 0xb4643f680cbc98345715ead8, + limb1: 0xbf623d2712cf4d9fa90273cc, + limb2: 0xb66fdec210ea4ea, + limb3: 0x0, + }, + u384 { + limb0: 0xb140be641acea41c49aa5e3, + limb1: 0x9b633b8a4d6be51c9c0601ce, + limb2: 0x2fb6a29d9f394a58, + limb3: 0x0, + }, + u384 { + limb0: 0x3d049bd675a69dc889b2ce2a, + limb1: 0xfc845e9c1c2cd1288569fb24, + limb2: 0x29025cc66fd041c4, + limb3: 0x0, + }, + u384 { + limb0: 0xfa695168b85d534b17be3f48, + limb1: 0x4126214ab9c627a6f7ed731c, + limb2: 0x150963f0aca9bcbe, + limb3: 0x0, + }, + u384 { + limb0: 0x7bec0d5798a08a32a61a8a65, + limb1: 0x3f72c1bfc6656eb7b5bca2e4, + limb2: 0xed5978030225766, + limb3: 0x0, + }, + u384 { + limb0: 0x3000debfc8d30c06143cc084, + limb1: 0x3d30ae188c767f391c11888a, + limb2: 0x7e19cb8a893369b, + limb3: 0x0, + }, + u384 { + limb0: 0x28d2c052cd860afb4a3aa272, + limb1: 0xe5f1eeeafb5eb8ec2b6ecfe5, + limb2: 0x600c7d2b6946345, + limb3: 0x0, + }, + u384 { + limb0: 0xa480e19ea0125119f0385705, + limb1: 0x3022a1f33d6523b4773f2cd0, + limb2: 0x596083b6c972bc1, + limb3: 0x0, + }, + u384 { + limb0: 0x99a8e1ef6db21043631e24c4, + limb1: 0x7f98b9d8663d85db2e645130, + limb2: 0x210b5c36f27a07d9, + limb3: 0x0, + }, + u384 { + limb0: 0x74e9159326a8f4930b7883f9, + limb1: 0xc7bb9f3d563c5cc201c24898, + limb2: 0x13bb2764bf1475cf, + limb3: 0x0, + }, + u384 { + limb0: 0x81e89997219e4b7576e24d30, + limb1: 0x80eb082862a76757287872b1, + limb2: 0x202cf557d625c260, + limb3: 0x0, + }, + u384 { + limb0: 0x3d905a4728ea1f95fd8824b2, + limb1: 0x76d49e97142d220601fbc5a0, + limb2: 0xe561c3f8bd4f76e, + limb3: 0x0, + }, + u384 { + limb0: 0xbbe827307c33ae9ed7890597, + limb1: 0x471785de07bd9809d57dd859, + limb2: 0xde20097480e7555, + limb3: 0x0, + }, + u384 { + limb0: 0x3cb72bb80cde8edd76d2e97d, + limb1: 0xb810df8c5788eebcfd282561, + limb2: 0x72f2a6287fb984b, + limb3: 0x0, + }, +]; + +#[cfg(test)] +mod tests { + use core::circuit::u384; + use super::poseidon_hash_2_bn254; + + #[test] + fn test_run_poseidon_grumpkin_circuit_1() { + let x: u384 = u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }; + let y: u384 = u384 { limb0: 2, limb1: 0, limb2: 0, limb3: 0 }; + let z: u384 = u384 { + limb0: 35961034779122590217458358426, + limb1: 19176342235218042678530152434, + limb2: 1251086958891274305, + limb3: 0, + }; + assert_eq!(poseidon_hash_2_bn254(x, y), z); + } + + #[test] + fn test_run_poseidon_grumpkin_circuit_2() { + let x: u384 = u384 { limb0: 1234556789, limb1: 0, limb2: 0, limb3: 0 }; + let y: u384 = u384 { limb0: 987654321, limb1: 0, limb2: 0, limb3: 0 }; + let z: u384 = u384 { + limb0: 8305167385555799669027062613, + limb1: 57704763612671584465832054609, + limb2: 430243426511221670, + limb3: 0, + }; + assert_eq!(poseidon_hash_2_bn254(x, y), z); + } +} + diff --git a/src/src/lib.cairo b/src/src/lib.cairo index cff6cda8..f69aac4b 100644 --- a/src/src/lib.cairo +++ b/src/src/lib.cairo @@ -5,6 +5,7 @@ pub mod ec_ops_g2; pub mod pairing_check; pub mod circuits; pub mod groth16; +pub mod hashes; pub mod basic_field_ops; pub mod single_pairing_tower; mod tests;