#! python3 # -*- coding: utf-8 -*- """Some tests for ``crsyspqc.py`` the Python interface to CryptoSys PQC.""" # test_crsyspqc.py: version 1.0.0 # $Date: 2024-05-21 09:05:00 $ # ************************** LICENSE ***************************************** # Copyright (C) 2024-25 David Ireland, DI Management Services Pty Limited # t/a CryptoSys <www.di-mgt.com.au> <www.cryptosys.net>. ALl rights reserved. # The code in this module is licensed under the terms of the MIT license. # For a copy, see <http://opensource.org/licenses/MIT> # **************************************************************************** import crsyspqc import os import sys import pytest ''' Test vectors from Ref: https://github.com/usnistgov/ACVP-Server/tree/master/gen-val/json-files NOTE: The keys, signatures and ciphertexts used in these examples are, in general, huge! That's just how things are with PQC cryptography. ''' _MIN_VERSION = 10000 # Minimum version required for core (native) diCrPQC.dll print("crsyspqc version =", crsyspqc.__version__) # Show some info about the core native DLL print("PQC core version =", crsyspqc.General.version()) print("module_name =", crsyspqc.General.module_name()) print(crsyspqc.General.dll_info()) # Show some system values print("cwd =", os.getcwd()) if crsyspqc.General.version() < _MIN_VERSION: raise Exception('Require PQC version ' + str(_MIN_VERSION) + ' or greater') # UTILITIES def read_binary_file(fname): """Read in a binary file to a byte array.""" with open(fname, "rb") as f: return bytearray(f.read()) def headtail(s, headlen, sep="\n..."): """Display a long string split between head and tail""" if len(s) <= 2 * headlen: return s outstr = s[:headlen] + sep + s[-headlen:] return outstr def textwrap(text, width=64): """Simple textwrap to display string.""" return "\n".join([text[i:i + width] for i in range(0, len(text) - 1, width)]) ############### # THE TESTS ### ############### def test_Dsa_sizes(): """Get key and signature sizes for various DSA algorithms.""" print("\n" + test_Dsa_sizes.__doc__) alg = crsyspqc.Dsa.Alg.SLH_DSA_SHA2_128F print(crsyspqc.Dsa.alg_name(alg) + ":") print(' pksize=', crsyspqc.Dsa.publickey_size(alg)) print(' sksize=', crsyspqc.Dsa.privatekey_size(alg)) print(' sigsize=', crsyspqc.Dsa.signature_size(alg)) alg = crsyspqc.Dsa.Alg.SLH_DSA_SHAKE_256F print(crsyspqc.Dsa.alg_name(alg) + ":") print(' pksize=', crsyspqc.Dsa.publickey_size(alg)) print(' sksize=', crsyspqc.Dsa.privatekey_size(alg)) print(' sigsize=', crsyspqc.Dsa.signature_size(alg)) alg = crsyspqc.Dsa.Alg.ML_DSA_65 print(crsyspqc.Dsa.alg_name(alg) + ":") print(' pksize=', crsyspqc.Dsa.publickey_size(alg)) print(' sksize=', crsyspqc.Dsa.privatekey_size(alg)) print(' sigsize=', crsyspqc.Dsa.signature_size(alg)) alg = crsyspqc.Dsa.Alg.ML_DSA_87 print(crsyspqc.Dsa.alg_name(alg) + ":") print(' pksize=', crsyspqc.Dsa.publickey_size(alg)) print(' sksize=', crsyspqc.Dsa.privatekey_size(alg)) print(' sigsize=', crsyspqc.Dsa.signature_size(alg)) def do_dsa_keygen_sign_verify_hedged(alg): """Generate a random keypair (pk, sk), compute a (hedged) signature over a message using sk with fresh randomness, then verify it using pk """ print(f"\nTesting KeyGen-Sign-Verify for {crsyspqc.Dsa.alg_name(alg)} with fresh randomness ...") # Different keys each time (default use fresh randomness) pk, sk = crsyspqc.Dsa.keygen(alg) print("pk =", headtail(pk.hex(), 96)) print("sk =", headtail(sk.hex(), 96)) msg = b'abc' # 0x616263 print("msg =", msg.hex()) # Sign the message (default "hedged" use fresh randomness) sig = crsyspqc.Dsa.sign(alg, msg, sk) print("sig =", headtail(sig.hex(), 96)) # Verify the signature using the public key isok = crsyspqc.Dsa.verify(alg, sig, msg, pk) print("crsyspqc.Dsa.verify returns", isok) assert(isok) def do_dsa_keygen_sign_verify_deterministic(alg): """Generate a random keypair (pk, sk), compute a (deterministic) signature over a message using sk, then verify it using pk """ print(f"Testing KeyGen-Sign-Verify(deterministic) for {crsyspqc.Dsa.alg_name(alg)} ...") # Different keys each time (default use fresh randomness) pk, sk = crsyspqc.Dsa.keygen(alg) print("pk =", headtail(pk.hex(), 96)) print("sk =", headtail(sk.hex(), 96)) msg = b'abc' # 0x616263 print("msg =", msg.hex()) # Sign the message using deterministic variant sig = crsyspqc.Dsa.sign(alg, msg, sk, crsyspqc.Dsa.SigOpts.DETERMINISTIC) print("sig =", headtail(sig.hex(), 96)) # Verify the signature using the public key isok = crsyspqc.Dsa.verify(alg, sig, msg, pk) print("crsyspqc.Dsa.verify returns", isok) assert(isok) def test_Dsa_keygen_random_sign_verify(): """Generate a random keypair (pk, sk), compute a signature over a message using sk, then verify it using pk""" print('\n'+test_Dsa_keygen_random_sign_verify.__doc__.strip()) do_dsa_keygen_sign_verify_hedged(crsyspqc.Dsa.Alg.ML_DSA_44) do_dsa_keygen_sign_verify_hedged(crsyspqc.Dsa.Alg.SLH_DSA_SHAKE_128F) do_dsa_keygen_sign_verify_deterministic(crsyspqc.Dsa.Alg.ML_DSA_65) def do_dsa_keygen_known(alg, tcid, seed, pkok, skok): print(f"Testing DSA.keygen for {crsyspqc.Dsa.alg_name(alg)}: {tcid}...") print(f"seed={seed}") # Generate key pair with known seed pk, sk = crsyspqc.Dsa.keygen(alg, seed) print("pk =", headtail(pk.hex(), 96)) print("sk =", headtail(sk.hex(), 96)) # Check against known correct values assert pk.hex() == pkok.lower() assert sk.hex() == skok.lower() # Derive public key from private pk1 = crsyspqc.Dsa.publickey_from_private(alg, sk) print("pk from sk =", headtail(pk1.hex(), 32, "...")) assert pk.hex() == pk1.hex() if "ML-" in crsyspqc.Dsa.alg_name(alg): # For ML-DSA, check we can also recover the public key from the seed key # NB seed has been passed as a hex string - we need bytes pk1 = crsyspqc.Dsa.publickey_from_private(alg, bytes.fromhex(seed)) print("pk from seed =", headtail(pk1.hex(), 32, "...")) assert pk.hex() == pk1.hex() def test_Dsa_keygen_known(): """Use known NIST ACVP test vectors to generate DSA keys (pk, sk).""" print("\n" + test_Dsa_keygen_known.__doc__) # ML-DSA-keyGen-FIPS204-1_1_0_39.json do_dsa_keygen_known(crsyspqc.Dsa.Alg.ML_DSA_44, "tcId: 1", seed="079EAB79AB14747CA01582B59F2624191B0C59FA219CDEB79F66669DAF0E695E", pkok="65406F1F72E6D3485C8F8AAEA6F44E59123D4FA8FE7122DB24558D2803CD3488562DBB70D635855595EFBDEE015419A0F727AF55CE5AAD68B4CF637EA3B336FA1F2771A47D7AF3967190BB7BB3F6E4CBC0765DA6188EC38674D6839DE9099EFF09DB1992375C68A5807127685373DE558EF2148CA557B9103BB68A3442A0EE485DD9CEFD1DB6DB73938E66F33EFEAF1F50F517058C85A26A5166C58AB7F03561E4331B1EC15AD6B562EE6222F1E77105AA24AF85561CDFAF4D7A23E56F80B401437EC8DF8BD038388FCC808FC7B5F04DD5C9E725AA7B33C2F0F58F09CEADC462972D15D92996826A9C92A70F7733F86A437FD1AB8A44228516B3067209CDF947A0F8CA4A2FB6DFE531852270C461A7809F08F67C79E01E1343567EA1B6E8F33F4C871AB0885D7F7A74763051D17D3B0024CABBD2202A10E92DB95A36B0067F737BD110A20301CFEC9673D311658CBFD8C4A5DA8633B236E5AFFD1B1175A6E80F2F2ECE869032306E90B3866509DBCACEE4C02206BC9F51572BD89AD918E4E5467519F3D7F288700B66C4EA0DDCF8C5477D4B015282C2AF7648E234E139298DC25840C946E33A5F4B9B22124F7D44D7E613742EAD04124A5C79579FC166BEE615867DA5AE691F819A723D55D66136869EF9D360E65BC1EE53653BB9C86F675D40F0E5D613DB96F1B4898FC5079EFF0A12AFAAF73BC9C3B8A325C6B0636098180977452024724EC26247E2FDCA9F3E040DFD5690E1190E6BDF15001A85159918201EDCB4D246076FD9B3729C2D0324851BB59AD7FB232C01FAD2CF0F2E42F28B39104077E46183C9198714483F840058E21C9FFE6B1B269C0F6F50AEF13F0B0B14C7B8031E37E7B3909A73DA0550B7503F78ED74FF78F697FA9985AAE13F7195A89F85B1D6682B58318D363C051396E2FF4098E04CFB1921A62727EFD27E205ECAB25A89D9ECD79EEC9D248294DCCC24855D6E4C7F55232994208BED3410BC5BFE0EE0DA6B6B5ED2DEAE992A73AA0BE5AA4D9227B8FA8A9AB436C92F9144FF84048EB3113A0532EF95384DAB3E49397CABF9A7E8F4CF3D031AF6B290358BF9C0D73D475CCEF219416D26BB7ED450D88D2332F031B25313A922E41A23139E0E1530DFA2DF4CE40D0F8EE9EAFEDFF307F9E49EF660D08F038CAB61074325E55D445106C14AB26B1B488D456BEF526354EECB75D70501D7BE54C3AC5E55B1114C22379E91C7BCE36F8F243CCF6078046CBDDC51B2E7B5142702834A156B7D85E206BA90DD3579653656FDF5CC98DC3DDC82A5E07D6535DE56C52A9AADB2BDC0B63B4833EEF75CB92C491D167AE3E2A33828B22CAB98C61701127332590D2285224623F603068B3E7A746D6817A48B681AA52237CAAA803E2C7155C67820AD3B4E3B88DAB30352DA6C5D2F40FDBFC3A74685DDB755417EC8414DC8D61C19BCF8EA39BAE9F8BFE88021457778B56A639C317A321385FC3567EB0741883BEE08F75AAAC4C10581D905383B03F4F27431591DD648045FD82DAB4223958A726DA9DE58B30DC9E163E4531B768EDF447BB4557E5E4E09C2DAE5A826F43F1C5732A2EE4632BFBF765ACBB75C98390A876B7C83AA040EB86B1220FF41AA3556CE5CCFBA0D8A4728F8DA735772658C9A49EF9774EC60312122FE1B8CAE1AD8ED88F47866F74FD4917F011077C2837447F4F4365739043074350E489378BD7340DE9D9802D17554C2161AF23FAC8E50BA22B664C716A46010B1A1BF2C69B6BB0C262DCD8D11DC455695ED3FBF9EFDDA12AE93CB6C3B6E0B727B65606682914EDFEDACA8EBC7954F2D6168C2AD8CAF49D956D41B1289C02BF90CA2E1B2CBAA965823CEDBB6B42827", skok="65406F1F72E6D3485C8F8AAEA6F44E59123D4FA8FE7122DB24558D2803CD348837D32DC65CA73C587F803E9B53F140D6CAE9CBFFE502668F2E1D78DD902EBF35FF1A249BB30421EC242466166DB44F09734545111BD77975788D35AD244A1A70ED800F1BA9303493B4170F36510FF6245801C17DEA830B9B87B4122A7C22C17E909868D38270C24882201365104689A120281C3388913061891891A4026D01897121286E0490609806701409720C06684AC09100878421386922096AC1C48862828C6442510094314A382210198010148EC8B80840802C58862D120350D14271124929D01240A42471992671531060C9384E53284E100992A2C865099630533090C3122861982541A28DE138120885290C4100488090CB164E19190D11B4515C046ECB404C21B750602660D9184A1A280844026014060ECC122613040C48466809212A134584080181E484818BB08120184D5300265406490B2711E4844421360E9BA005893401CA0850C320885B060E20A5401233421A20860AC2484C086D53869154046E50162C04092948C6709BC0890B139053A611CB28818140681136041A15421124410C07621C4888E0B424D9A010C0A28D21008CE1B80581C8206190500C173144221148C445C128421B986901153291348D5AC08CD9266288A6251336296034455A0608C222688308521B228A42C84CD834129C484A19C9481823088C046E0A296D1B4601DBA84013435243240641B26040120661405020844CDCC849C3249012B528D0182A9A2030022391E1C89100A98C24C37198048101396D1C0151CB426949C271201606C1284CDBC84D42420AA3427219176C24250C09398C49882CD4B60DA2964123018E03220511104518220508286E18B070A2247109992C5C088E0BC14DE08601A3941144344C832009022805C838621CC069E09660A38240E4A090DB486811A02589368100234A10991019046911A12C1A419043382D48346D24C15193900C20C16801244819199000836C80224100984C24232D12C86408C27188A061A4363202114A64466812372821C911220104A3A44D2418698242089828518980299238440BA62DC42429821609DA4805A3C0691443708AB6910446890C154DA1C625191471CAC06461440592C82D83B42D0B43668948321B182E11C724D09244E3186D63846002316EA2221082B47104C451E0122C50B64022852D90203199962DE4B850010349E28244CA248540386500408800C0291441496AD64D46CB269DCF0B473D67C86B46F72EB97AEF1509120C8C986BE704CCB20CD9B91190D8D77E4131B29E714F42906F6044CAD43E095877DEAAD80DDCF36D14C4CE4A13BD691B165A7EC05554E31B62BC8B11E3C6A9F1FB1C6FD4B83D72FED1F35433959B2956467BAE93102778BF3AC688E5317AFC982256F75A00A90128B9E15E6D82C7CF2C056E1B6F03CE4721CAAC73F02E784913EE4BBA1534E879B549591FC6F5E3FF6FD63FF77443C0C924649226C72BC886811FF2F344E0FA9809DEF8B66DA512ED2DA2BF3F4A7F77BCFF948CE615F3CEEF127AA7A14B99E36DFBAC9986DE34E5508F509EEE917720E8A8CD36490B6027A877372266F77DE65A184A2C479DF7B2C140D972BEEDDBF2922E0302DABE44DF18204CA2C1313BB242D095884D79B3E34B0E301C6C63B816B84896214040A1DAC9F618EC30064FE93FA91225D4A0F58B939F9415A81F72EFD52CCA545B549BBD0BE2FC4561AD59056C069283EC81D1EB00D7E8F2EE415E240060B140145D6F1BD14EAE7314DD09EC38D46836B91B13F3E0F879D5086CDE1626F290DB404E5755CEC6E38CE2E488654A214907AF4B3CE8E5DE2F2CB234D95021F00DCD6633C97FD906A862432F6F722E2F5B71096AE8D0E2663C68F9490791AB9A4F468FCDF7CF42DE43CFF199BF7331ECF2F3FCB4AC9EA08633595E2488A89E46B121986BC7A0AF4730CA326D2D4A0E26ABFBA6613BD415EECC13A7B3D9FA4CF194C40389CCE7F3CFDA82CD8422B66BE29C7A8974ECED7E855309A016E428002869CF0CAAEE4439EE1B9F12281DA82396BFDE326DE439AD9A2768A50B268FAED78BFAD456AE079D9BCCB08BC40FCC6E202515FA5B0672A18CFAAAEACFB39D3BBD1B492AD8740B1FEC1FF95A680474DFF69BD42F435702FA3FFEE490FAF12A33DA6C365522BAEE47C79A1DE1D7A431AFDE00AA77E5348067E27459869CC748E87B34B029FFBE085394C1258E9512883B30AEBA032877E8C9F5F9F57AE9442CCA6F5782A03F3171BF27CF747E3F1B35C64BE5AE8A726C4EB02CF1168151DDC3703E8BF7A9A92D5E255EE143D07EBCE5B4EC9A1C467684993EE10907B33E77E5146ABA29B6FF91A28181B5CCD6EA918FAC5E69E67DCCF0CF75F2BDDD58D19CE2E36791C5CFEE515421651FD603913422A38B29C2B5E98EDA1E993280070DD6D229FB50807F99EF702880C7591149BFDD762A47BC14386D05519EB4F4C5DF4A1B50A38F3AA220139880BEFA8CB8FF1A56FEA6773F832AE30959C09B8EEF7DE21B9D28A2CE8649F82C27BA6BB880D884EDADAB2B10D72E191A8EFA8000A2A2FCC323783CC250D029E307ADFE081B6F4F7965F5587D97EED44C100867517E3642137A94ED5CA6110DE4A415B2A48DDE6AA452EAB9C63E194F66C7C32257862901943149EF61FC605AF0CF661E65D00F101FD3EB628D9969E3EA8C1A897950DC1FDE732D0FF1E1678EB22367B0D924BD497961075933F1761B29A5057B4F3E38AD48778314708CCDDC5A39D0267DA06EF0343A6F637143D71DD0FBD5D25A74B68523A150291486E210D2EA4D4D125A2417CC3FB24D30072AAF6AA43DEE0D13DCF3D781202790EBE6E790C193E05DD0F4ED7C4F498B12B922C208DA62FE02CD267CFC6F0EDC4A7F077A5CACAB14C21568F6ADCE9062AADD8324A7744A034F146CD3F40EF29D2ACB063575712FC6B7EA0F68DB44D7B06DBE60155BBE61AD00BCD53B8DC2E5475F5806B3AF9E2B2BD810996B61757C0A7820994FEBD094BD8802CD2279233D8026F1B4554E50DD92BFAE1DD8D7020D1A6DAAF88C4205E513610415155F20538D6B1826FACD113CCD5D04DBC1FD292B064EF42D474B609D6CF8A9C90163442BC9966D4F057DBFD807BDE44D15D8990C2C74E16C65FEE59B4AA15188F72B80503A0DF7EF3E734FB7AE1CDC528130B903CF9CFA79F5349853F2DFAFA4D9704821201469C77A53AAD1B9A146D34C9C5851DFE020FE0932C6D02176FAE126310EAAF6B0B8AE4C42D5738113A69A763B009CB12CBC4557A36E251266E5181E773E1AE2EDC6961E23BF3F4407593A62276B8DBBE966675FBE3163FF015EE6A67369F9A72B75114998384FB1DA04D3ED76282DE041613B19CEEF6D4599820C09232AFB588A2C811EE0592FD51B8E2335AC54484471ECD55821E72B5531BCA02578BC06E77C644CF25395B28E9A170209980B3DD84149D4EEE28B912698E36028EA657058EBA41E633B0896649AE03B61CFFEE41904D119620C8C69C6C6F0B7C3BA808E8FC41F4DD56DEBD7AEEB2C1485EE30CA5C4C89F1E35DF11B782EF72EE81198B382B6DD65D9AEA64DA1A61C13B73A32C5D5" ) do_dsa_keygen_known(crsyspqc.Dsa.Alg.ML_DSA_87, "tcId: 51", seed="631AFC2A36A57E1D090DADC2791D486D72C69A9AABF97990C573214846FE5B64", pkok="573449AE1772430DB958DD78747F0AEFC03F6DDEDCE592D5F4B517B38BCFCB90E6C1DF44CE2CE4D3C6A5682D057DBDCFCED3EA58EA125437F6B896A473CE4880FFBB97C2C0750D41D1B7C00E2106137DAE49609DD630A23D5D498D546625F80E29A6B18B01DE399FAFC911EEAC4A97761EC0197359A1E4B3930DB17A6144BD7B2B3C93DD1F21A0562CE6C6D1128F6589498E6133F98164D544C888A1DA5A5E266E7D1864FAB25708CE6B607C11D52B0F582F6368BFD733259275B099BCB500FA62B5E366CE2093E89CD3EFFE8DD3CF2CD01AC8176BA2352333FBE044CF5FE09553A318F05F055B83C7239DAF268C27FC85F6A41EB580570BA6C598A64C3F0956AC91EE58814E3EE09F69718CAECFE8C0BFA6CDECE733B656D5EED9F39FD7AB9F0790964D7FC0E6FBF2A9781539875179ADA3A8771288C957D478AA47E800768743B2CEE8BD228DAB02E049EC6432B9A2D21AB77FA313213EBD9C59E8591A480E7EB51B2237EB717F7B1DE684E6FBB8AD78AF5F032D752CC28B4B03A537156CAD9D073B4F50AD8C869DB0BADC7DBAFDEC5D92EBFB00E2BA9C85327988D09CA90C2FDBB219E5A75F8578D7D4A2AD53A0E04B7D904F4C6939AA16435D14D61396D47CDB5F278FB87839B1EC857C9D818B917ACE3D3450BEE9D0E51DEBDC64DE38DE70429BF7DFC0880817BA202840A3CB838D45373F553C5CD30CD136C2D3F3837FF9114022A2DA73048CA53799594F353CE5320F2E921B927627D7F6741BC95B03657753B64A9513328FE949CF19A0986A89BBEEF409E9ACDB73DE81FEA6482D31C05EEDE5011463F48B177534E035089FC98AFB928989250C5521BD9BD877EE80F1E8A70776F951DDD29ED96851F14F873A54619958DCC35742F8BC27DA8FCE7F2BA4FCF2C1B7BDE01DAAFDE20B91C9C255D2AFDC5D4E692CA92549C597E76D4407B2A02BCC9683F7E0A3EDECBDFE4AA400CDAA92FCB10937AC4441116E67D0C7D734BACCED4DF8F499935D84BD57F940FBE69229B0E169B50E30B40792645AD9A1A7B0E32AE4D295C7C6037E9ABCD0D34942EE116BE75ACA4D1E34AC92896F3F34BD9E7400787EAE0DA690B670E05AA33568CD9C348083FFFEBA872D855028E20E2B0877DF4C8311B1667F340E67580A680489D4A064D818D386F113BF515F0A9C953D3708D90BD35930FC6D869FFBC43CC0F2EF8ED4EFFBA778DB0E926060CBB23ED4A37A1A253065A2DC3D06EA53AE2AB42288C272ABED849419CF1845DC3A5410DA5F624E722976610E3F8F483920C46A41F1FE6483A6EA280C7CFBE41ACF1612039CF148EFC821C43D0D34753B8B5EC50FDD184B07C4BC9F49D1FAC197855558D345172AF54C382D219F368E46EBFA8E3AB18162E708F186635EC445BBCF1F4F6C83EF6511F940BC2150651C5FA95AC1F5DA4AB96D331001BD9E0A1F41D47916A7E206AE8C140650DA2A91BB7043EDF2942923946352AF35DD7267550F4CC78EB6EBFD79DA1426326ABC102557DBC40C004BD8EEDEB543FA9783E0204868166331859AA9508C1F4E83FAE9D7E02B305AC9C529217DE124E59CF9D007E5A459A17A6F1E19B215560D49B26A171A2EC082C220BF407BDB75CA962321B7865D73E8EA7070B73F93ED69A14D3CF35B111510EF6098A08A9745EA7980D99A44B4CBE10B126CA5C61F1CD0B4DD2CD3D51CB72A9CC34BC61D318E3CCC7D1C04511DFE865C590CD952E07D26BD9162795AB5D5D44F59A388F9CF71ABA85AC24CB6EBE570BD7DEE2F1621DC509C4A269E6B4A9E66068D45E95A7EF9A394CCEE13ACF893A5ADCF8112DA077E3DEADABC6B8ACFBF598DB0496D2A3D6C58723AEA49B8267D1656D94437A0830E22E509B8159B1116C5ADE2D1EB2601CB1399B3C6AE97A15F932F7538A74E0050ECC615B0F4BABB82F5834AE643A5F4834679C65E0C9674EE568553625EC79BCED33065C11D33D34928A604C061677D07BBF68457D07892C46C885AB7CCD2E52B8C5189C73F5567D2126A1B910EC93B4F1599CA1A4ADAE3C7846738106E2BBEE5FA94FF46DE342F8F029B4EFFD4065D522DCC2CF6205C053B33BD6F4F9A7864FB7FDF5284335F5E4299DFB181F9E572575F459BD1B28FE4E355580DD8D555A4511C5C35F96025BC935195EC7F6A5E0339F82B325098A244B93FDE10CCC78A6DD1023416715081941999D613A5C9F9297CE8CC9ABBFA2DF69F353AD3E43BA5241877BE25CD32824A121C504E8607C7897E5CCCA0D9AEFE682729CF4CAA7907869CBAF240CBE28B3895608AF01776B6DF1C3FA28FDC54F8E0E631766F6A13274FCF167EA1A50811BB1485D8D0FD7316EC2A02D525CA6CB93889439B9A19B977B310054A872E0AE6ED0C4557A4BA2DAFB6D68CC8057A447C38F88ECCC53B81DAE5E3D916242336AF7BD3FF7450CA3D1937E1E7D2247467EBD530CC424FFDBA445693781495BCD8994750542B940E3F2BFEFBD3E5FD634BE14F9017861384BD96B9D0F9BAAC99F6A611FB35167AE4F64B4E4C133F02AF3A121023D6305A95475A04F102B057EBD7ADDCF8D06D0AFC452AF20D808533F41AE4BB0F05FF7D7132972238F071BB69F6E6AF2C9935B88FEDDE5D53D7C74D7BC17B756F65964F647ECB4A3BC7E8BBDB60B12789E93847E54D433170E2CCA3251946A570A62CD0358E53EF51DB256E1E2C997E0CD67B5EB68A1B6285CC1E23388D62C67D4149B5C1AD485F4CB0DF4704A65A04E2B2F6CD494013CD27F0AAD410A0211D465C22392F39C4FD38B620B4B40FF23234084AFB9A54F85097A51E447336A57A29F216D15D61F34B7EC14108949CDE4249E3C0C39DE8A2C64841F8C450A9133A7AC73FC72C7863D25186699C1AB63103848722C258200398EAE468522C3BA2E4B23B0326094A0977633A8709DB1C572A041D1EBA987C8422B0E2BB96A51E4DBFFF7C308E4A4AAC65B871FCCA6CD7A4FBD273ABF1312CD6C2A8C17579C2286C89ABA36A0A7CA9FCA60E8687ECB1A4B82EC41E35F7F55C5897E2381D73E5D501F9C0DBA77EA1C5D0B4CEEFCDCC321EE2A3DACC0198E1FC32887DF2EE117DB6A45AF2C4D265EF05F90BDB4F83FC797018D8B76B21C7A7FBAF33EA0D5D9CA046EB8DCF9C0B7090C9CFBF53B938DA83318F8D73EAE8323ADD404B0BB51907E1FAB61ADC7E330717F483B833DB6932AFBB1EE49C333B69499FAA6FE38051CEF145514C5BFEBD79A397F0781746ACF120DAACE3714DCF67B09783E70347A22302953B77ADBA1CB64E06E640EDB3243BF6D2B9787B5F9D2658F63F3681EA9876658EEE107FBFBD2D70A70F3C9A597E95900D0DCB89F9F7596D0E523F0D904BD27A727561E4E899441DAA86A723BF403FD15E87337D0D032D20D5B49AB96A39D5EEC75CF45AF7D396F09F5CD25186259BFF1B67DCC33D8E056C95957B33CB033188750E28312B6041AD1743EAF823DE565743197132AB925987FD4DB14225537FEF2D39EFBBA9D8AB6B5289CAC6BC2A906C2FCF66F7BF3C71BEAE2BDCEEBB2791FD4302FAC56630A235243DA8F88CE77B88BEC1AC37B93A71623D58DF8C2074D7B2F68789DAFAA714F5F8968642A1B58FB02C99B01F11650D807C1A6E39BBE7CF22B7640505A9B97A253C7A32FBFD2C1A6A600068CFA2B3AB7E9F3120D6533344C19CAD82", skok="573449AE1772430DB958DD78747F0AEFC03F6DDEDCE592D5F4B517B38BCFCB90DDFA07172427FFD257AD7EB9DB575368266E6E511EF45AFC232549F76D699E8CDA8503613B6F964F264E5F27BFC0ECDE340E0910D4F9130E4A86E7D1E0C5EE04141781DD4E030B91A9775DB1007EC1DC68A1DD7F57DF26D14D2A22FD17F8E182D0402618C0314820411C05265914248C422AC8182C1BA1315B144E082042182850A3045250C811122591C10402132810D2422E244065E13684844064D4082AC03665881008CB444603244DC4A20DA21250A4C6919C446292C684844085594049E3960809106023B98D92A400634205993210998248821024CC3001DA242E1B40099C3402C3804014871162C04C20B589D8B684DA002601277203B20D23C361CA281223B84C18918D23B24463C22418498521B985513821238905C2186501490E04C10024028A2496309CC0209A326043286961146CC016669C1000E014420BA5695BB62C18264442284DC04424DA22114B245009C86983484002B67110838408B36841866523438C484280033750DB364189960892B86C1A138A09383019324A4B084920C70C0B4384008465E30849519011039140DC4611D434411A164613436260944DD4866D52888C231664DC82450C488893B620C31204CA3684593626612229E1028EC8B02D51144C1CA609413829D4068983C8809C82844AA04D0CB288A2B245000405C2324689C84510107010360CD4868D0102308B220C90822110C2501C112EC31611821649431291D08241604260189971224325A1948118C101A2800D5208915132640886110B02925B14884380806124525204000A2185D444060C90480B132614B16813998C02C40110C1684A02910A036C00458914C74D80A82008802922282A0480049AB00181124020296E93B0291B916023C4849A8064C01462D4046020472D98C240DBB808A324110A16500B90518498852118081C1349E3982940286CDA102808957011C124001231A4B885C1480E02B36852064151346E149890820429001505DAB470A428284934708A2201A3922501253000070582366E814260224512C02809DA1008D0408164B690D312100004014CC848DB8400621001DCC850D424691AC2290C473144180EE2B620A2920D10A501000644C302484CA851C302421CA78903488ADB2642583425C3460AC8084CC9804D9192800425851228024C4420D0224424824CC0C4901C246141A64089944549020E64284E20B044DB2232D31211CAA450833488A4407251A88C5886110C484AA38404A21862E3369299124680249144C24501426D64220284186A231826E2024913001183324D2447422489008B42605A082E02B0291C490248C28D524851183221CA926190A66D09096148B42C01406E84089188024019830904158EDA346262A84802469010480401A365C94288221010D0422E84C868643429DAC68160B24588928D2443004C108DD1229249426010A58942046C91A2811A8110DA464E2208450C8144D84469C8A831C88265641832C3C64CE1C208208465DA006504B50C02952C5026891B4151229825E3384AA002261A3651A0443043922051A62404115002B984C8126A1C35481B308003B085E4B4245326300C14809392481AC7098198114936041BA321C8A89008122189C8702380210C132849006182B02CC8129263A07021154E942244E41066044132202602C1A24812991060A444A148310A358E510291584648492685E31811844606643042624225202444C9042011910DDB164A014520230500C2C26D54444000222422404843387260186862B23112882C80B48D214344913692519824C496681012519C484ED3822810386A19A10181C2859CA2515B202008306A0B009293028601308C092846DBB88000212CC9B2291CC2480C26919B0066E22422029925232606E1B00D50200511074218B06154C04880C44090386C94C4300490095438822222864B323083A069DC924D124744CC444662924DA2B64092208C08C8090A060DC3B0701C032903972921076553924C12368481B80D19288204330CCC282D081260013628DA246AE4426914011101419041440C62062C244301D406461835201C00898C3808C2280D08330D09326254486580C0894B488C02B17102924DE42210C9B25119130CC0A48D01A445A1C8089A468A08156EE6F449D96577799FC7D8640359E8D7547D5A3B37DA3D4E9463C0C223B6976DDA071949DBE51DB7FCD7BB6EC01A6527B8BE1BC183DB42207990A0BA34363D2BD6AEFB461628799FA8BFB6DE0D69E47FD3F66D6FC32EEF091BC8655C788D0BBCD73EA7E71E86C2F15C00A97BC3457276B28A838470C6774993C83F431261778FFBA1247630C41F6AB91D6D14A76389E585E1740C59236D6143419E39232837F0D6ED87E6240B5860022925EE5CFE3EB492510F9350141062033AE96976B0A56ED11DC9822D57ED974D568C30320A5E87BAA6B18990B352E0E5821F71D9B8F9490A607D23E6AA5A3657E84679F13615A66A7E90B93DE823B59457E78880EDAB66267771334CCF1E7E3EA4560E59C0E8A4CA2C02EA35347FE60A7F33BA343CEDB2126C4948CC28DEAE5D76F5B83E5E662D32E8D112A0C5518D91A7CD99463F6B6CC334DF61E2A8436624EB5E41750D7CA3A494C303D50BAD156542BC726628982A98FC9112D7D3804889A1EC596E273BD0892307B601E1DD08EFE80446FA6DA1D50D730B1BAA83639CC6AC824C497EABEB528AAB329C1439EDF90F24D66C6D38FBB16A4C5FDAF767E68D7A823F82BBBC85356F2D1B26D4C80F738AB8620D5DDA3333A09E018143475549E2C05D96B535591F9B2ECB41E33EEDF3FE74AFCA455B79555ED2066DF5CC8776574A7D772D8C70A77E887280EF17D4799C8C2A1F950CC1A3DCD1D6733BA0DEEBE6FC975F121C28766F50EACFA4E4B1A388A6E6DA4933AC97C6712E3F14DD90794E7BB36C7C74E0B5A1E301A8BA90814DA233A055927818A1421DFEDF59DCE65B4B33E0925388FEC03431BE3C4AB4D347CF52DD6D9630467CC5A7E76B2CB81D5BDD515AEE674F1931D146F62104770919AD82C9D09719B8CFE435E42552306E3BDEC84A6075D710EAAE19EC1100BA8920549F2008DB74CB9AD75E6B776BD36D8D5D83DC0D483D1E3A2D4D45866E6F6833D67DD8147CA18785376A2D138A153EBB9E38EAADB3750CFBE5F91A9C405F327CDC472FBE27B6D862A62A9E10EBB720A99E53D4A37F83E5D039DDECBB77C8862DFBF9A645009235328D7C4CE36424836731B763122A9CC3CE341B72A4E590FAA0B2EF163DAFFDD6196BAD58EFACC78D8E7629CF379C6417F71F2A0FD2EA2A4D68A723BB3724758E2B32FE8298AA5C2922D5DF0BD1D62519D4E0783E07F1616F45C9E77EF6DF9808B38D0FB057FA4A87D74519F30D8C8C261EB174B32AEC5BE41B025E0A907E54C3F8A2981A88D9A4EC6A2CE4AA5B59F0028B689DA910D6C0414EE778250E484A4290F5654F435CF194FF463E122EF1E17E5A510E2E556630E8CE6D3AEA34A607C20C4C6473ECBE9FD83FB3EAC9085D9E3D41C984FF96B46D3F9BEE7F4C8E13DDDFE6908360248593AA04D2478E214DCBED0B43474DEBBDAA1322C4EEEB7FCAE42EBFFD533BB847C32C1789CC28D412F4589E5C8DCE7D15A3F886E31615E6B231892D7BA789DDE2D51DA4CD442F63C40326344E47B015BF84ED98ECB806499FB5640D83A57A68FE3F5ABEC50BC124DA29E20BBB5CC45AD9EE7639007A132CBEE814454C8BEBAF2DB0E4986682B391C1452FA05774F659013B4C9E6C0B90DFF2CA8149A7C609DFC7DE3D29F36A90012B2F17D050D38D4B1EC03B92A4965823C2FB716C8583A09C54412604CF629DDAEC4F56EFFC00CCF06232584B6131BC9EBA626ABB934284FE688F8D87192ECBC933157BD5B4F39C4651434F64D9B4BE5E5011C322045106C7C9DA1B56089EFF239C94C7E42CBB56068CB71A067ECFA0A14703C22B2015BEB057C1B4934E05C7A73B3E2ABE8F170010DCD4A7A8F0B88E9C0492E9F85209A73DC1587FA1C518D3DB7C67E4398E90A42E579AE19F41505143D778842D095D09445BABDBC78292865D059E72AF458BC7BB8B2945017C18D1EF74255F3D7122BBD77B42C0BB4503B3BE05A8E210D269C53DCA629EDDEEA33EF28B78B3039E645B5F8106DDBA21655388CBB86000CECEE265B989F3CDE09A9C4F6960BA8C051149CC296DDAD10F4C8D4F8F8836A80126CF331D8F7FC94C6D9EDD8AED1E0D5F16E69352B5FED97A8BF27BB9134F2D6FC486AB49D81C8A6975513F4774992DA6701F5DC9227CA5B258BDD5AA69E65517BC323052A13BE689117EFC50310AF2384DB16884F1046A16D70351C07CC383E01A1F27E6EA9ECD877E50C4FA3ECE6F9A62BC18BA5466180C37265992AEDFA130A30D2ACE3C4D0D60D18D872F23F04404BB3B5F5A55659860F57498AABE866AB528E04DF18440F59D04EACDFEBD8853DD62EBF56535FCE3EA8D3C8FE8475EBB3103F8CC1D5447495F94BA93E438B92EFC62EAE24081DCCF18A73F761E2E33C5269D80A8295E5C61C2106E635E7A0B0EA36115A38292D7BE9A1B24451B78E0EEB36F51FFCD5CBE5FFEF585A945DA5F2DDB2F20E89905AC86FCCB8393C85D6A44DD6E8E4596CEA5763C10FF6A0A7521A2BDC5D4954EC894154972A7BF13FC188AB355A1D1032DB05388FFF1D45FD0312DD55D1C484927356DFAEFC81585634CBBA53F5C179AEE1F4DB63017D8C0A334AAF7D55E0435DDD3024AD2C14D5DE130883735BF060C1EEFE95CCDA3F3CC2334EAF03426B2BCF97D5DDB097C1C1E926723EB53528437019C0C8BA32706EBD907A9C56E94889F37EB39C87C3767C0E816F0231C12D22F37B9D451D4E92E8BDBFB93B1107647409DFE8156E763AF54CE5CD55186B6F44C6170C1AD8912F624948227C8F816B7088A8810387935EEC53DFEA3DE762B6FED2166C0213A3C0955456E14A259CD7F62C1D4ED3A94DCD607B331C9962DD639B5A0D0130042A1981C6D1E03D347B30F2851933505A2E28A46874B9E6AC33752B04E26A888EE6952F573CC29A73142EBCCEE57F8BF9CEA31EBF00BEABBDD4EDB3CCCDD2E63378CFD8C4165861BAF1F35710B201733CCF30B92BDB799B6A9E1BF1B533767A5CE6386471FC427993DCE2254C76B2A868C97FEB3ABCBC5FE07D2CA40BE64791304FDC24AF76D4F4EA2F38F92D151249AA5F9AD80B4674242F6DFDE5716DAD56266860F410EDF203B94F3D26F93683A7CAE0090DAE1391A006092C6F4D6467E332EBB5066AD35DED45F5F72B082037A313C70B261F616F4726ADE29C5762DD5B9A19960A7C2588159DA5D24BC4F7D1596DCE0540544F5F81A67BF52A954C70DB1D15353C6FBBC3ECE115B0CC3641D2A3F33E7C01ACD395C8D20240B0D01F44E2E8EB25F2D130BD1033FB86779C7803448F3493683A6107CC79F7D99DA2723A8110419727E128A47EA98DEFFE4B97B4387F73A5A8F9D840F54E49CD18A9CFA4A1883FB6B023A7F9C5EF31870BA7376DEE06312D2F25FE8733622F18BFB1DECC280837FEA9F8BE53E8B3F069964D8D6A2E362C3CB0612DFB7D51418255562213D0E61BAA37A2DC86577C7139BCBF81D2A3A688947935EFE7956120302E9DDBFCE3B9FBCE8A9391538627BA92150256A4AAA92635A294B9898143ED3D57231569FB9B1DC5F6FDD982594FC3A575EF005658E6775041479107DF46A3B0B892BC648E7E5CB72E45EB2F4E32D188A23F524E8A4337911706EC489175744B54DC3DD0E189E8C00A5A6391850BFD482594AB72558B1D6B8154A7EAFB4D41045C534C9A4D42E128E554519876E08712F6D3944822CAA05781E2919941312F34BF6121971A3EA7362DD2E057D4902300029D0CED942BA527CF78CEA76222E1915626CA6CDAED1D5B3741E692820AF6E56B9EF4A7F30488139B54B6859F4F452B5BE960D259DB74D6BC1D10A8F4C22A297A6108F461DC68A24B95CC339E928D8799E70C5B161879132940FD7B5269B36C77DAAAFC79D001C1AD5EFBEFE2397856AB304CA70412C5B2DB30702B12788F7E59A063250AFE964006FCEE7C6724B744FB56F73637D6F4F0CFF58D626CF852E76842FB5C21A7E538FEE62F0EF56623E2E02F42AE9B2ACC31FC5B383C331D3EE4EDD5788D2E3DA4632FBAE0FF4A55FA8A57A274B7ACAC98883D55087A65BC123643161DA05A2AB76D01C120E188F60C4115AFD7BAFE3119EC7EF7D254542458C67A25C8C7487FDEB5ECFF8562DE1C4C80CDCAB96AB08F642D77E888CAAC1031F581BBB2261229E65832B6591BE49DB1428D22A08EAFB828996472AF3C74ABD2721FC31B7181427EB81894E04D72BEC3A34C347FF5119C49042572F14056D63AD7B8CFC5319A84ED122775690F79FDC91785EF8D68F7E9A367634FB71317A8209457735022DA168B5B4CE8DFAD8021435FEEDB91C93A7E5FD78FADD72F0310E752149EA50C6D207DADA8C268E4956C22A713A98690F32BE0324BBA116303718D380913ABD07A1C42E6B1A833D3B73D9B627BE9EBEF1072E83BA1E15C37558F3A41B6A0309EAAE299A22B9B73CBF7C200FDFF10AE0EEA71D5FF2CCE37F712AEA212BD39A4141A8AFB96808FD6032FF740066BE5661DC929E7A35C30E4973958123FFD8210CE3747A58BAFAB2DC0E1E67CFCDDC2D5C2731859DDCDC915763AD3B01012ACF1AE82C830216FC0F979484450B81CC5329D5642118E35764073F11C9D6E7C6944261A63B340885B12329566AECBAC845A27DCA70BD79BC1D195B43D83974F3F97861594B502D75C830B68F0792B6BD66FB8A44DA6EE38ECF9167A7143ACA3CC20494D737274A10689F297721D7C0A8DEF1A806639DC4C78BB77D" ) # SLH-DSA-keyGen-FIPS205-1_1_0_38.json do_dsa_keygen_known(crsyspqc.Dsa.Alg.SLH_DSA_SHA2_128F, "tcId: 21", seed="AED6F6F5C5408BBFFA1136BC9049A7014D4CE0711E176A0C8A023508A692C20774D98D5000AF53B98F36389A1292BED3", pkok="74D98D5000AF53B98F36389A1292BED3F4A650C56C426FCFDB88E3355459440C", skok="AED6F6F5C5408BBFFA1136BC9049A7014D4CE0711E176A0C8A023508A692C20774D98D5000AF53B98F36389A1292BED3F4A650C56C426FCFDB88E3355459440C" ) do_dsa_keygen_known(crsyspqc.Dsa.Alg.SLH_DSA_SHAKE_256S, "tcId: 91", seed="7D88445A7B0022F12E9E2D74755431505FF6DB1C38A8CE44864D34CFF1A12CE0FF2CD133AD00728EB29DD0CE881C41C640F2E28861555B59D4E0BAA0447BB54287A133B92EB6C81771AE002819B4C0300FA63CD7181C805096BFB16067F52A45", pkok="87A133B92EB6C81771AE002819B4C0300FA63CD7181C805096BFB16067F52A45CC785237C24D9235B6BC3194B79E5A9F953388EA745D7CFB87826A94E5B271D5", skok="7D88445A7B0022F12E9E2D74755431505FF6DB1C38A8CE44864D34CFF1A12CE0FF2CD133AD00728EB29DD0CE881C41C640F2E28861555B59D4E0BAA0447BB54287A133B92EB6C81771AE002819B4C0300FA63CD7181C805096BFB16067F52A45CC785237C24D9235B6BC3194B79E5A9F953388EA745D7CFB87826A94E5B271D5" ) def test_Dsa_sigGen_known(): """Test ``Dsa.sign`` for known NIST ACVP sigGen test vectors""" print("\n" + test_Dsa_sigGen_known.__doc__) # ML-DSA-sigGen-FIPS204-1_1_0_39.json test_mldsa_1 = { "tcId": 103, "alg": crsyspqc.Dsa.Alg.ML_DSA_44, "sk": "D6F07134CAA5447B068E580565959544A17B1BBE8AF3AFEF55EB28DF1197EA845C7C5582805D42C51AB4B6DBDE9268971190171AAEF623008BB0BE21B64AD4BF3C3EE7C37503043AD444A4C1EDC8D56AB5B41319F7C0FFA8170DB4EB409D7579C6D83EEFA36C52F8327D2057F2417BE2447521D21B16B95A9B068F70E6E28BEE6420511C32900294089932248A36051A3900E0162100174E90308DD1040DE0A26901477161C26D08026A53C841E4A85100116D2495500C903091062CE2A42D80461049006E8092702039250C3770DA241089088AC0963121306864180AD146281C32099C0465E29880A18604DB226D9A3412D4B048C9A62913411014B7104A12410A4264103344E134056312311C2805C82271038209A21209028244021825D3162D21224A18C46902A7010C1681DA86698A06441B9251CBC464D342264C2800E1264982A089D804080AC110090164CCC84D02802DD01491A0B8848B80880A1341DC062183806914404AA49428D830320A903194964D119885D98228D1A01012222A0CC08802914504A9681C282CE0922524482D09322C20814812996DD0A4051AC02DC1B8719422611C49115B180E00102E0B08660A1185DA065283C268D2B6858BA22052364912114119C62910208AA404081234211CA58C0CC449104108128824DC9244E2B4609B324CE400645840505A82419A92642206494A904C93268A9AA208C1264A5B1869199168A3462E48C44C03342608480CDA384C98880D13216AC9B44011436052B08CD3C0650AB7840C99718136925C164882328100146400112523452E63A289830805D4166A54004C01990D1BA3258BA88410464DD8C0291C350E01112488204A58B6511C078484444512442084966D88824952B80893C0245B269213142D59042D24A164C4029158940981A00144C6495A04669C4040C11402128370640011D2128113039289A09019264C928028CC820523297119174E22024D14C608D8B260D9228E0C348949228D0147661395201A9485CA064ED3C64080088C1B478423043163B0841B9104511226122129020808210091019471C4484563226948124180A62100042A01015202146C631861140721644288098510CBA2094198604C446983A60120060A04440210414D14B301A2A2515A424242B4611BC0890B4110CB3066214990A4445211A245C980451A273158067004954112C28C994840C3426A1A478DE1A67020286509860C23292954240A13204241B46DB078BD26FAEABA17B44DBBB5C8E3AC960EF9AC0ABC08780C4B6DEBCB53C40717A16A4876F3290ABD049D39014B3EB650C437510A789755B9EB2C6897C5EB5AB086FFA6F38772882463C9230BF6B686039E5CF731FC40E9F88F2A6F8EF539A753A6A9A893FD967790EC95D6B7FDFA494B12B63F41F4F553BA6E4F255D416E7A27E0E437E1A7D66EF2D59D08480662A74C7B51D664C21756A1C768D706983B609FC83748EBA7B600EDDD9F349615912CB851E0B4D0EFA8DCD12A343FC9815403CE38B0519A3D29EF789DA0D198B5C6CD4CEB9480A9890C7E4C33B532E344B3FEBDB24AF2DB06AE701D3FBAC96DDC3131E37B8EAE93F0BFBF5CAE5D07BBB5445DEA32989F55E78B49F6BF68977B7DC002A6D0C3E3BEA2C08FC581EA091AB9DAB8B114669F680E332D3D3C93A3A6AA29B5E52FCD1105CDA4B71286EF6716E92BECE665DDE65FB8A86CAB974CC29C6B2E6A62B078AA5F6C13C2A89675FECEC13E2BCDD83C66936FB2F1DA06665E7CB52CE10E20CD9A2C0689344A289FE1D6715AF8CEED99CCD7718D1DF32F303307FFC91BEFF2EA7310F8E42EFBCF1B86CCDD5393B7B7227432B93C7B780D45A74B80136BC8F7E5790315C995C94804B65B18F9C4FC6CC05C0349578F69C0710F58E3D8119ABDE7F30F67883219119ED9B3AF88CAB02F4BCF6FE076813F89BB77C58EFB54111E98CEC7E7154404C7942FEBED8ECC8CDE2A85C025CEA5B4AB4D1781F17B414C2887708842F82924C89EA9E94E9F6652D6CD249E6D04B38C13BAB2AAA9740C84503C539A764AB98EDEF0B76B98234E16B550B552C7EF52B836F125E820A25661ED199EC4331BD7E3C8C6B4F4EDD1FE6FEB333F0B85092CFADF9BA6ABD167068B292D10444EC1E508AFC24E34A20AA4F77EAEB15514CDF5B94DE62EA1B91971ACB1A0EFF3BB17C1D5543C1579C1BBE52F4D633C40FDA8B20BF0C372D30FB5F1C27A26E837EB868DDDAFCD06142BA8477A1D6061CDE2DC41842B9EEEC14958FD8DE959B40EE94ED73EFFDD19D9DFD2C8F8FEA140CEB3E59264913EBCB8B9F11311EBD57519B1DDCF020D0B6AFA541FEEF48FEF2FFA146E810191D68C3CDB5230A04C06742D41E0277C091804F9D8AF5A3EECF11DCDFA8AA7E2B22F89CB62BBD483FE652E5A20466E3854515FCF8CEC0238ECD39537535949F8BD5F7C8126175F87808E73DCF4FF06226CBD834C80CFB68AEF8FDD8CF4FE372619E26F547701D6B1B7B3D5919BD7CCEE2E303C4597DF0CC6AFE50288E38D2A89CA1BDD57831AB96866300F519F5966AB9B8FB655ADC544A1E9537D9D8B7790DB5D9BA67D8EA4CAC1185AD6CB234C79AE9DA796022E74AC350C49B14A54E3D7EE239412DC78AA9DB710B2F425931FFEAE9022D0FB44AB51835E80BFA1826544EDA8EFBDD61A3761D39E63721158B035F1FC30384ABE8612D5F1C723732950CC3AA6B1D28B60C7689E237B150F73E938AD1F5C56220054AF5C146901FEEEDFE700C49DF5E383B58467B368E91722AB5B0A43C451502EF3804B2057731D9E0DC980DE3589955719FCCDF480496506B8CEDF920B83B911A418F51D47A73D10D4FDF4BC0723BFE5094A5D1B980AA75717D1A2FAB40D149CE8AB005CC11E5867A44ACE09719AABAAA14F3A0E3E5ED7C7118DBD9EFF053C26ACC006FD6B66DA8BD7A817F0316570A23F401549CE7A592E4FCA13F0E43CD1D75BC143E7C1904CE92D41CFA9E6D3116BB3A551329EB30FDD8A71B27F32CC5ECBEBD9636AD9302347DF6620B6123296F411D7235722889209E15501596471808F2BE5E33DBBCB328115D0249A46AC739B04BD87BDA05A9E7516035BBD45125B8740DA1160A14FE54C9DCA17FA0E23BDED6D1C2E5265C67FEB6EE695BC5932B40634BE50DB62F7A1149EC601699CA00D8D715384E793CCD22CCDA1FAF0E17F9E73416358DD342C1F5131BB4F6D640D8D16DCA3BF8364C5FA45D42E2ADC35F87CA761813E56797D340B03EA42CBBCC3E9E016AEFD8022BAED820CB73CB47D050D5F21A2FD6D3FCE3F71C45003A0D92FF0E8AC7823E447C5454FD8B41C647872827378E30F49FBCDD60EAEABD4F99F69B73C9A119FA66616A492CBA1494D4496674CFCA9B74FA15EEB296D6F13100880813EB1EBF182BF2C213FBFDB759D95331F873C561659E5C2BAC802A13E8E41BFF44BEB298991BE53DB35C500792161BDE579D24F02C3218F432B9A949BFB7601B27E590F290E185164E828578117030DA6483002EBAB4D863E79C7543F302CE4D4A78039FE9F552307DE82435E8689D506A4E10A0493C56E71817C24234101C0FB979DE3B0230B515EB6815B877008EAD95B08EE3F", "message": "E0BAEA0B9D6E68CE4C7C2EE78C59BA2E81B81BD2E3F9D947100FE4C431DC192B61CBCF108919E3610BC7E3537EE3F31750E360E4FA30AAB0CA742481D074962FCFADCA7F700A12E29D15038EA9A4BC3590B438C70BE8D82C4B3F1B9BFC80770E568CF73A1883CC89AB6CCDD35CF6F0E60F21014782ECBBC7E7E3033D93BD4E6AE95F84998BCB5692FCBBB4C7B0C00F4F7DAF594BEB606EDA2682066F16C9455F347D946C456D95696CECA8F1C7E24AEE521906D91D83E87DCCC9062034C27FA5AD7BAAFAAE6268838876CED3DE3AA32DA33B31956EF2DBDE7842CEADF01EDF3AC0862B6B0FEE2984AE74CBF86161C09A77F73E14FD3F2CD8E6B9E8D8E717F7536F30349ED51B24E24F2FD49ACAC297611BB5C4E8724F6BF524008633D079B4830F96BBF9C2DB503CDFB163693450D96CECB9519B9A06EA2A2AF77925570493B39808EBA42F841B6C505FEF5C7995EC9E26DD37642C4C8CFA3AEA7EDD48A19BCE0DDDFE20EF0049241D7EE726012514A8D5C1C7F2D2A1909729DAA478A939EA3885F0818E3EC160EECF0A05BDE3B5D5DF63281733DA20BF8F6B3DE24FEE192F233BCBDCD70478D0ECF5A1129230FCD50C2A9392D95C250361C786060FAE5590E19D35B9B8C20072F5017359DD818715724D90A57EFACC58F4849ED7776DD15F4E7F931A456E229DD0118CA5B41A88FF9FFD73E10DA30F75B77A28DB5FD08482A6287366812612E62E9E488E7084D31C5FFEA7FBEF7888C1E515405755503B19A0FD2A8837E7FE47F8635A9665F58AF8D27D2B9BE9247FD1B0AA4D7F6E0A498935AE83FB7CA59A8B99911F6E4A396C3394AE629FDA70C723F8A62DD17398D818D2A4CFD2291FA7351C060CB1487777DE7BC01747231B2D0480AD1A23DAB691A64267E5C117E8F4ACF585BB077548D012CA0887043E1B7FB766E7BA1DCC9DBAD70D82F9198942E603C55662A3D393EB3BCAE7C0958E9F283C806F03FEEBB90258288F9B61839BF98B9E15A3675800276AE5A6D7CFF6E366A9E37DB483CD841969BDBBA4FBFED0E1A2B6B779F4490BB935F3D1830422C014CC8A9932643DB042170AEC7312361B3B68ABFA8F0AB0F14315E1F2330F9C235631CDDA1739398C9C46C129E68C219B2827E11F2879F1E1A7A2D36BF1DAF60341F07994AD5E421C88D37381EC58931681D3CC2A13DD13CFC57B395A55C25F0FC7AD8279A3A26EF451F4FD3C48B75CE1FC292E51EABEB1C36A1D361C539411850FBC3849398F40AF24B6E8C5A17EECFB978DEE67486FCC00F6BB09E35192AB39BA9EBA35B3F46EEB9076C0B6BEA87F730088AFFFCECB24CAF2EB3DA77AD026E56DA66E20F2ED84468CBC336C39BEEC346384B4787818E028BEAC23373AFAA7C3E3FA75ABDCE2F8B5002717AEF4E376162377A222940AE0E2524A03EAA2846DA46B2850B0D50FAB05A7488258FB3373C197C6BBA79E13EB33AA4ABB88E8A0FD827F12E168A50DDCDE1F4136803E8B2C0DD3EB8AA006EDB74D90F5BDB1EECA47DDC8C0E3284046AD2166C19456607C2968FCA952307EC642633A22AF522F43A0B39797FC67F329B7251B08664950F16F3F47EDF58E7EDE75C527D751F86CC92ACD0BE547D0BC7056F138D00FF38B6A3A8C1B1B1B5A11AB99DF67B8D74A1BF0F62AFBF1B38A7E8B5B6347063A17BEDC7DFF216CE862F326BFBE70C65B17D39EF873E8CDCF09695CF8037E0F80D06A09A5C3D0ABE81463DEF8CBFA1CE7768FD972C8D7A52064A04EAA0A804B41ECF2BADB573DEAF14666D018083170571366794FBFFB728A4660E2AEC2F24FE47BE72A3B51304EF0DE996E3B62EB81464E109D5965C728162D0C0CA52DC98BB5A132048978BE67B1C0DE17E811A097520610774DA7F1177F71A2FAB9E10ECFF68180DBF93E8757C65D444A7C4799B828C5EDB4FCBF0D357D2C4211CF84C4F60B5B5E81CAC85C40BA0C375ADD6E43C182727F7ED71A2A54034BA4557E4263FDB822B9C0081C2BA743C5CF261411802182C05333827D18C51B679EF66FA0068A334B6C5E90C582D6A601FBF0DF45BBA14114F684CC9749248049868BF2D1A93FB6AF6CCFB3C235784520CBCCA1980EA1F290C718DFBC39A01B1F20C53EC8F771CD9D89EEE7AE32092DD54106376443A00FC453E94276DC3F9D547EE5CB624D86260230E5391D66467A0A8FBBFBD7F49A04EB288B4E1D74FE82C30B4DF5AC13BC903CDD2CFF488C374FA207B6755F02A9A17491DF1FDEC3042F302DC654B5E981C1051BFD80960E96CB476A1222A32FB0896003DE2DD5C2AC3A5DC30DDE587FB9B4295AA40F8C0AA552BFB4E18AFE62F23D0B1ED46F9EAB1CAA2B8A8A3C61557F29F41084966CBCA834737DD9F16CD7C4E8FF6E34D7A8AEC5AEF111CC353F18CF98A54D61C24AF2AC40F67C1E63590D", "context": "", "signature": "4F4BD17D15DD22827FA73A226E47F76ECE84782C71C3C5E61F243FD8764CA41D5E867DB91F74A1DCDFB642235A0C2B2A0E714F7F04AE38E2B091501F8179C41D819EEF4BB1904DFD9FDC918AC050F6FD3D4375A91E194599A75AE03EB7F8A3820667118C516BF09FA55975BA30D1305BF1726CD40F9326CDBEE26560B77CF50DF41D16DFF089002D6C9A0D04168DB389E97006B0B7E432E4B4B86FCB77DF01D515495264B8C3A873641EBB053AF3EF60EDABFEFFDE02F938208A0756279781063C6CE62C7ADD7724DF9FB830A1B9EAD28D82B242AEC1114994FC57ECCCD3C2A6D0547E3DAA39BCB56A18ED956E92E03BDA40ACCF62765CC7030925C250BB9AE62E7009A60FD94E0098C84C12863F684539315BA3EBF1239C584559CAC2A9EF8A55F9A36188A99A5F09A513F2B0E0F4CE5B25DBC7D991D1B737FF52BD13AB96987418D6457C368C6EF66291118C1002012849E04D8290F0899FF0143C49399486D45341AAAA1829EF1306BB67B5AABAC4BFC1C951CE36AC6191962D9E3DE270EEB119BC611B6161E361CBC47F8CC3CBEED9A1594A5A0796E5E272F2DF1C68BB1CFA3EDCEA920695CA073B6E56CA0046C02530E54BB9FBEF2A9F0A33156DC596EB199EC8BE1B9E6D09FABB1670771DAC8004C3D23FB779EE45ED431D66203BA6BD7B8F74E7BF7A827AD18B18217F262F1DD3316021856CA7559FFB44FE3871FA8B4688323B2686D18130DC23E3796FB246551ACB23CD76B6E5E09CDD1B30C22781CC06C946A63050C92F94A9C3D50C480CBB6D649B843177C63486324180ED871EA73BDCF6691ABEED71E199DBE845320FC93200C813041438B38E93A7C8B799C9A25485B7E5577E5F1CBEB38C9B2F73DB9725C28FD8279329D7E4CB58E008CF6C4BFBFCD348A79976438806A249EA20275BD6A323715A721B9A81319EEA462E318F19D3D0C6418A3C7A7ECBD5C0C453069B5D23F1EDFAC42A2D0ABEF4A41597BED1A06F4CCA0B43E4137C29F5938E3B0D2FF243649F4CA22A1AC2A5BC8E9B13DD6429F1BDBD30793E9DD63FC923231B16AE81221A3781B58CF2C72C2082E992D94AC55B51CE7600851ECAC6BB21D67611210A5F3E1C7BEB71D9330A40500A471FF3079E23E08030F795AECB1C9BFC7FD814683F6A8C2C53C52B092CA4D9A6D7E6EE8EA86898A85B20BC68F8B66B4D2E3CCCF9BCA91E68ABFB3F90546C4DBF32748A08B937BF7CA54CA4B08E78788F5CC25A61A20DD5E53B3FABD8BED3DAB61AB0574E2B138135A826DF282EA78902F204827F67B633575B105EC5C33A679A28F5BCCBDD488597EDF9527375938594C828E81F42E7F58D8E0AE2A1F5BEFC19F742FF43B95C8502AE7B576627C8EB36FF8E512BF684A906768D8BB44C3E72F13234614A67D229EC9F39565E945A86867F7BFAAEF1FC21096E75F8ACB7F7891ADF4A3DB22B8BBA9F6D87A2F384BB7D11434CD4F3DC33663601A10FFBA47699CAB47B639C9A4C5A205C7D29C8EE2EB9B52A7C53BA1F70D901A26EC2702A34E50BC1422ECF0F1C124301E2F9B910C5313E6CF2A512CCDB42194AC57FCFAB4B70E326D26B725DB60DAEEF695E20BB6C05A0C04F72C5F060EEE90685AE0F8BD4C61DE72D8156831204C80EECCA43E41AFB13595E1D83583A554A11A208F3AF8A5AF73AC8A25D3C0817836BB8AE5E2D7AF97C5555E0276182C15A88757C6712895460E569DFB5B2985643E7BF3D108E5140C8B3AF5AEC354E68CF46F56457FE9398D800750396218CE162CED1F27607F3646709AB525A776DAC2EC8ABDDB0E02859474FA26FB3FB3F5DDEAF709AD72E6D3CDE185ED89B14FFCCD20F05B82E38815FED48D1B7E070677F70F6BACF130F0B2549A2EAE6D80F37E9FCA3FC56B729AA167CE6DFFEADDE8A87A1BB82DD5A7ED6C1426CA3551A22EF31A5B157F7ED7B94F53852EA8B0A144F82CC253F832C2E06F8B1CF9F28EC7330855C7BA4F9D15B36C38D9BBD8C882348B51DC6C131252918598E88FCB481E1885166B0414BD1F7105A73AC182A9A902DDB6A4C8C6E271EC809300C6CAD6EE289BC5ED57DBB05BD036E58F0D277CA11D6706C6172C8A49BEB53D4C7F449E168BF1846A96281A391FAC5623C134443F87D730FFF42CD6C93A9DE14F5916C10B4693412A1666A2A2BA173A4FF8FED42A8A9435D43415FF0E24D4ABCDE6F41A4D650D3A897CF3AC65287A02757744ED316F734E84CB18BB503B9F1B23F8AE73739BCA62982C011C60AC7EB5C7EBD8155A84021722A558D8E58986E416BD7AA3F52BEB00F40CCE9AA0771735E02D138CF17209AC84623BA8E7C10B92C165071C1BB6CB879EEC21CB258FAC7EFC6E7F27A6F1B46F1DC7A6DE23A88E4B27D5D2B017BFECEE94F8CB2C8E6FD548A3BE778EFE2565224311C29BA192B5409E6E0D44424BB13E6C83FD3A05492B84381E2CCB3E0C69F801D5A72AF1491E0ED12C847BD661FABB4A37DEE9899B75F0580520907FCBB50E6BD479478BB947C5D6DF58364EEA926D7CD8BEC653AE0C7316FC86B2073FF176BC60C4CBB29EED10225C525A0BD257CA161ACBA243AC44DFD92BD17E8AC9DCE14D4E709B4C2F325FFA82F7A1E7451E5B3ADC6938B358E311C41B6CF6F541EF01961E175B6B0C521EE584F12FEAE2CA4AEB8378F7E2BBEB03937F56EB972746D5DD3DC9439D9CDE90FCA82ACFDF106E6F4FF8DD445A0B7F1D11E35B245BDEFDE17A037076521933F0FE74384024877FF74FDC4CB1F30193F231927818260859C53EA4BA25CBDCCBA794DAA027E3915CC02DB7C8537F9E41BA9E05E387E0E9DE2596C1FF8168C7CCA926E3C053DCB093547CA27B8D319821B1F6FB9C83E2970B9DF5EAECEEB3196AB54F68F28909692163318A534B2B62342A8EB387131CC6C1782320FCD491D99517A5D0A290527E761E9FC085E1B9B138D79B33B2D61082DCD6305267528567C0FF1BC7E7C6FD93DA44A7189AB983AB7290BE8EFB9E3926941AFA6A421249551BD546C3AEE5D8E3FA1847D1CBBF7CEE9120B843ABADAC3F9C7C4A87D764A14A06AE1765FDFBCC67BEF12477999B2251B41973A1B7C19A63EB3C8BC52EF53A9A5A410D114493F7C95A8CE8C58819720D90D4BB66C1D3B2E16A6686F2D90639F95391DE2E44CE4FF199288E381CCA3BE70B72117CB232A8E9976655C3510A00BD97C7925D2DC7E0CBA47F229377A89B4FC1B8D78C755C055EBB38D689F39E607B745EF9FAC38302B3E15C423B1654B7302F81EE366B7B688C340C35FBE392123A30171ABCBB56D7CD079F3649C8F324C304792BA17050E436488B3EFF50D1A272A315C5E5F6B78799BA3B0B7BAD7E8174A636A7AA1D405081322374D4E5B5F757E7F878C929DA2AAABBDD6DFEDF70000000000000000000000000000000000000000000000081A2139", } test_mldsa_2 = { "tcId": 331, "alg": crsyspqc.Dsa.Alg.ML_DSA_87, "sk": "A7E5CE93D5FC9D570E1C2F5E9AB490F79FD961C992CEF08B8AE5E6320908FC7A7D8085AAB95B3384D494EC091E67E9DFB6BCD862B5FE3AF92DE9F224248B2536249A7279A361D963CB59DC9DFFA67B7C147BA06FBC27DA6E6BC13E499746BAFC49101BF4A143461BB8F0255574EAA7F86590292551F5234B45D500867D474945CC962D9086891C90709A924941907119122E1A35440A2942941640E2840421976C081882119120D3284924A46959C088DBC00D14A24C2101492038911BC871D82048C202405432460AB72912183262484E1906499BC6910CC11024046A02052561020481943119C45148402EA238629208691805321A2632D8A80412A90881222AD9388AC1844D14493082843182B84403279000412D1C468022152860A850A44865A3188E5844054080495A187101876163320C63C210601042D4A86D1BA480044028D1067182066E9814518AB6288948120AA36840249062424DE0184D1BA2801AA7216194281AC90C54B040DC368901078963484A22110948C60441964400412D0A260D23A629934211D2082A53206848A241191850842689D008069B308A9AC02483387209306D0CA4910A166A82462D8A9850A2360D019550D9A82DCB083193866921C1898B144D19078988260AA43031A1C2318C300864282412830851B28503C3258C446883080140448554168D1B341112A221930429814650030964CB28421A292C201444C116462400450991858992641939000C15114C24888990400B356D0A07055CA87122A008642850E1B64CE3380C89A66522014812C650C0460298A4651C020C5AC46C189328CA064D63A08D20064A1AB641623871E42089CA9605DA343003C628CAB0304932122098448B0865849660DB3670499084C43040201805D4049123458DD0022CE4C04918318E1A260D48362ADBB24DDAB02004C291144886DC02511A064024216A13B9401A170DD4126140220A0394090B19419CC0415912001039529048051A934511293280464D21492C0989444C100010424A10470621B3450B9971C9A66C6230489B448D04A545C11084A0168603204CC9B265148800DC106C52082C99840511906160B8680C153118B8041A29329B92885B964920C40599444D5440690140028A80701BC18C4B4466A03090A10210E2924DDCC02CCBC62461B671D1A049C3084884A46C1C445121146A4BA211A13866CA060852388059C050C3002A082221CB8289C2480A9AC08948A0211A988552B24164843100456911A64563120E83986192C46D2140709A404DA484600C17489C4490229505130121C2B82C432450633045D44826E498688410302027668A4431229911108149E2162CDC94045A420ACA3021E434682201208C424DE224861CB08C00413258B064D8C80CE4220A4AB24D0918498B360DC23464484292D8B44D54A84D1C22915404620331051A120D141040C1A88C40A44C22B71000333093A0884204449A104D09862413174640083112484DD3884DC038044BA28CDA408D4332711A0209501400D4420C00320062C869D212255CC88DC312288926820C2940E4160CDA804D0C3266C03460D1988D2342721C066950188A8AA811E1444210352094060A1BB100591829030908101711591025C8246A9B1026432245084845E4380988B44CE1986083244E83C8459C14125A20851CA629C8A020240128122806C4846123A32421012E810492CBB67102117022C6214A262EA3A24452120E11860588245184380182368921403114424D03C704E1C28444062D4B366841348591966923336948306A60924159322D9B204908C32453366AC0124D5A042214A87024B88541200AC1180A89466E04C06599C8608B362A5AC431A1B210232864022370212104D40202D82401D00450DA868851C8801C96245A00645988711894311C046E89B050A1A025230471A29208C3048E618888A4A46D08311122310A01826CC33292419411199600C2306A1900129C123182022C1C44718930458302410849482386800B1731C8164123928941162618C74058986D231320E0C00923013280388D1C0306CC32644A386CD816001B1661C4C021411240CB08289330424118254C380A92B60420970060068ED1805024B6490387299930625918218BB8811B914D534269C38810A2104D1B05881016115C004C09232E11324C1933515C4030882206515F93CBCCED8DB326AA35230C7CC29239F24F61A0FDA34F48BC4E8DA25640BAF0C7EA68A1D976ACAF6CA0E25195CC91C9BE14338BE49EBA15F586601E0FF4D9CFDCF7C134AE0851B99CE02654796087313C6888D430C9DE49DEAED944C11DC41D492043231661D31D090CC7C4EBA41CA031C82CE227A7A5DBBE4BC2CFCE3201BDB9ECFE646FE1297DEC623745544A68954B87B93DC356217F36BF50AF096CD5EFC4666FF0BD4C76AEE324EF73BBC6EA186D836D11CD4A5B7358B8346F6A4D2AC545CD4C4179D2F3C9DC6B886616F658F859727606C6B9B53100B374031D86C0743A919BBAF849BE1E9EF842C7A176A802656422F4DCBED14077122B4130A0DDB2ABFD8688FED57F2B7BF11C289A22C4D84FC66C4AD95ED8AF1158E76AF6822746CE09757521DEB82EA2192493B83EB102B485DA5C3DD34EE35264A4514D607313A74C7A8B84F86563B8835C54C64532CDB2859BAFECB2C52A364BD4BEC1D09D598F134722C77530809E639683B5D51206B7A5F130B4082DAE47103EB293E96AA945ADB6E3DCD88C18C316F1B423C48AB0AEA4EDD4EEEFE43A8673B23142729B604C0E2A54B91C29CAE030C4197DB9E00BA028316C4E99A7341E1A2CAD05F85087C8C64347AC2A385C2328A0D456937EBD01CF04B20415603587CB9FCABDDEEB0807EFE93F2FE4E65365A588F8EDD79C9C48B44CB4A26CF6BD54FA9EE77E74397C1E5BD6890E21B3BF7906DB07FDD4FC99B00B1500807C22CB91B14FFECB52D5A292C1A7D1D8E8E67941CCADCD573221BAFBFCF555624B3DC97A0B7BFD698229DD173BDC0B53A2CB3FEA42ED6F3979540AA2A6386D6DDCB8C10CF3B954BD3335CEAE45C622299B82FE2786F8A9499BE306202991378B4685C2D12D53527B45E72F774785EADBFAC2ED949DDF8085735D09F417064A6D926785A90D7DAAAF630E581BFD00B4E4599C192F2AF6A372C1486A34D549EF43739AF0BCDDCF6EF4A838061885AA33C424189E7A8D8E95CEE5B5918555ABFF1845ABBDB200D3F3A73E0CC4168F94ABEC7F71985E404C243A09CF0D178841E19C3DE0D5F316A8C95C9467138A28CB725A904812EA1106C9B436664DAE9F613C2A2DA3C615679F89E6F2A3A5A1D06E7B26F7325845D87DFB9F2A71D134EB4411EB2557D8F9127FA066817696C2241EA954F74D7BE70215F6511AB4EEB08A13D5CA3B2B917DB2FCE8B34AD37DCC27BEC0F20F21A7C844AB8F30CD22E508615A4E495FC246ED2CFBEF6E0962F6BBE898CB2B7B1876202F60D738AA10E2799902A216D247AA63C01756FE08EDA54E59FC24391C4469A1B5CB9A4B03D7E3F9A10872409BADCA09B711303452F0991F203C2CA4C198B064C862D50842508D14E5A667F400ADE71ECC1AA44570AC72146DD3A6A0A57B5A685917F9AB8383EB61A862CBD00C128B23B616F26FA44A7EA49145F58F8F6EDC07B9897C995E714A33C475E096D16F5650E2937C444273DC9A84FED2E2A14511448F3CF956D8459EB9DE8D8714567BB30A49B47AAA63ADAD91DDAD41CE4B5A2251570430E8C0D05CBD58C0FEF7648F963C9C25127811B671BDBAC343A9DE3D9F265450E1238F6B8CBED45A26B8279396A716A9F8A5596D8B6EFB1C02C9BE8E23EAFD8E073B8EDA0FFF54D5162E9EF96661DAB47E11DA4517F4B7B62BC540870D0B90AA351527C5C6A91888B6CE958420EAC81F32460710C9BA99097C77964CB007D997DE85E4598CEEFF28CCB596CAD81CE8CB59EAAD118B3362C0357A8809A75BF1C9D385F80C6088C7C2E12B19B70A1AE21EF023A8408EBA2A23A208629B6B5EA39DEF347CF9EA99EFE18794F666FE35BF8E0CC178E86B3A8F4348A4ABC372130464CC4A65214E808B6E6197F841980E78B385DEFAFBCC1F6175629D8929ADEBAB19AFBE4DB074C7B6699CA1D9ABD4E5A79F01F363FBC6DF659F9FCD8A581B96FF266722FE62621D7325BDE9F72CCF85B611F12C7725F6237F44DA3AAB03527128A5368A90839E776277AEFBEB7C52D9D1BAE0FE7106EEA0CB3184ABB96CE4743E53B65CF65FD2341E96435E23F832E1D5FC21DF50F9EDFD4270076CA67CC44ED7C2ED729F340F0C9FBFC84DD30D21D3B8E2BE763CA2885B09D6278B97E0A605858DE07F7066C6C49F26A9603F0C02E5BF4CA658AA731C7DD254144BAB63531D57ED694CF7B9D700BFFAB543B6DF83447B0C024033EDF6FA5DC60D0F53B84B521EE65DC2E62954339023D4C779589F470C50065DD90427F524158D24A1427873B1D7FF4A1EE67BE4719E5BCF8BE2044B9A38494E2782B84D07E851E10DAB088DDEA1B48A312BB758645214253E58594718D0976E90AFD8B5E49268AB0D879BA14D2CA2D78A91B6EAE943632627ECED18201EF7E7BF8DAE4E8214C5B746DAFBC424D33936952B3B707071D5F11CE87E4C5AA7ECBCCB3C19415154B57E012306105C94AC195F205A10DF7608AC2C4121541A86A40D694677C5185EE47162BC8FCE106892F88F31C4FBB3A3496BE4A5A5A120E0C5147B94E0A489CD6E2666EAB8412EB95EFD68F4E9FE3E8E5BB8A3B8AEFDDC961CA55D0FA917FC88FB1BEFDAA261C5AD1C85B8E644009A060EF8A120E9DF94BA52BE5825C64094BB14E0695FD228DCB3D62A7297BA714E01C423B693336CD1A62560C4F3690C484702988641FFD9370D8FBBBA946D78C161F1F660534D4D9001C407B2581B349D2CA9ED92BB19D33E27EE84A3DE8A1867536CDA89C3CD7EFE1E95CD5E45501FAFDCE1ADA69EE9CE989DEA3505300A16A1E3C8C2C149D34B75EEC62A1E1C46465FA818E70BFF090E8CBA9ACCBE4F298B2706135FF3533740B3E6D3FC3F0E22C29434C632C95DBA51B7B341838CFEBFD29A01761DD773BB0FE2290BFA1182B29A5ECF3D7012175ABB185740C2540342F4CFC9B7AAA351A3D89660098297DD5985ADE8D16491B243CF4518178C03E793F9D53EE8FE68A2080BE92EF5C95130E96F59886976CE65B86DF650526F7ED7947F27CE917A111615C4117912F537581C0C59137E38DF81463CFED494E9D49FFF55628925E72431300015779ADAD0D7C51E248565A68943707D9241470E5D6C38F7B2E36A9F699A7F3486601B68ED22D5C889FFF411ED987D7185DEC8EA4FBA070DCF54DFB3E9FE2F8AB16BD3E040D22F2D8D8CFF21299DD692902378A32064B97724327739231AE6A68FF8CDB5DAACDA809C3FFDA672D36CBF8E941BDABE62A9659BA031B68A8434065A1879E28FCE3F4437D38B713863E2823F6B38B03CDFD4F88925A2E2C34E78D0D9903125E4FFA402E0BA8450E81318269A87C275C402CF5D3CBC38D870D2B95048F21A06A123721B613E1EE76724EE287E869DAFBA9160644BAF4D82C0F27E6751341A4C239EFBB9CBEE4EB9DBBA60E1381E198D05B9BC15DD5EA98FD80299E7AAEC785817F4ED0056DF69B596FA5F55C90FFE7070B1609B96805301B12AD9577E301874E01A81C4EAEAD9ACCCB19813860A09B1348E54EE39DD876A351FEF08DC28124AF734C4CE351807B82C7A1625F873D9BFD70B7C83A70E07B9018C1CF1AA95D033C47615308B3172D0F577E1F696F1FFD09B3275883AC5D06DED8FCF1401845AFF774278686204049D25698A03134FA6ADFC75E2098448CFC608607B51D19C605ABB7BB869DE9F75FA8E9B352EF7783092DB9D08B3061C3FA3D61F3C624193A7F211E1F2F709D8947BA813CF0FCF6DA922CF60C0251F1A92A2370303E81F9788A94387E3C513573678AFB77AD681E9A43E7DD1B0366B9D2E84FB9E2985F02E9F3CEA6E0F40242F5313F0CCD68327A16CBA2023905F7C207B1F8F3709E8AC4EF0A8C9B5C87560F4F464742C93C330D944A8531CA21C13EC47CF106D988EACE60EC4EAEB6AACB22929CB094EB29C4F809C6D2C3569FB8F908D8433D02619E37DACD2E93CD22A83E63DA1084FB568A5B7745D285E577A22BB95D661B9D21153731931E2A13FE8FA4F245FAF777486AF4893ED0AE63B811E196C714C67D5DBEC20014301329E3B3B28F1B5EAD467F20BDEDC6EE04D1A603E3F0482A24665FD2024C69F33FB01E617AC864B8A9053DAAAB2FAD9D310558AC027BF781E3C9197F4FCBA5F058566C201E3CC41A17FD70CC81BA5CFBDC762A03BFAE9FB9AD6285053703FFDEC1A1DF682D444B4FBC0074358ECED1CE8B68AD32FFBC6C8F1AE43B0B83AA151DA33913CD722B7A2E997C94437316C5044BD21FA96D790CBFC6FEA63CBA98860C09425BE0AD1F2F9172B8EB25ECDB07601ADA31FC95C81D851701957BF99C176D811D2CC6D2BD7050875A3196FBA0C212AD7EE9180EA2A681AE907E1DB4C539DFCAE22F345E8621F379CC4B1C72615CA7CAE346E5CCF6510E22EE799C095A566F2E1AFD65E83B206446C0F8A77C908BE22D3AAF499D53266C2E23CEC18B53259B1D37E00A363A6E800832AF45830B7626EF2703B1F20E12979883293576261ABC2ED86AD76749CE56E158B111B7C71D9BCFB63F0DF94E622741F72B9429F5C68A4DE19F9D02CBDF5A9106F2FF55D5A826135D9FF9117B596D1AFFB65C7FC32E27E4736F81EBA55F13D35197385820CDEAF4E7B5CA602DB3C13558B6D57BEBEC6C78C7996D3CCAB1C0051E515F510DAEEB19A7EE112598228EC3D349638AB3B3EFADBB3067EC658ADEE91A3B839DF523E70E6CDF993A4D19327B84F94626F0044A360", "message": "16B859027EE94813298FAF6D9F00348CD46F2923EA2E5BFAFAD8FB14D5084AF178869CB421CC3DAE1745299B6B5D8CFCD665973F3DBE40B36C7ACFBC975F59532A1BCB2CFD0AF16BAE66E12BE2C774CA9592742F5B750C44B29ABE1238EB14F9710C63E027218F4B94F2B54902F34D2B8D07A7AC59CB5F8EFCF24E8C55865E63B0E31F30F302D13C3ECEFABB03083600271498964FC5DD903C56E3F95ECE198EAEB85239F47440269EF771365B9CE4DFECAD5B6F140C1C021D13A534296F34B0055658E8E823AD8283ADA36CC7FAA4E18A0C69937E1EE406A13A5CA2F7C3D442643831007E6FEC5540D98DF913BE3D79B69CF8FDB199E93656D658D478EE5C11A7B72B05745A7D820A1A2D67553BDCF90FD49153D57BF98F3EA55AFBF2F76F6D41E335F0B74C4E47EFCD79AA2927DCB1D14ACBE85C9DF5DCA7E351C2A26D5083C5568E31ECAE44DBBDEEF0CA58A0728F68FC69437B35C4D015219EFC270B35E098D14B9CB744AE3A8D461E216D0AFE45DF79CED74DE85511F245769BE9D222DB0F5ED456E6520936D4B72BD046B7158BBD88CE49E7443F6D2731EEC07A82F2B91764D88395BBCDADC3B51C8D567C42E106F01EDB8C3940E7E26912B400CCEBF044814D89981C7BDB635A82272C21D739E5EE8D6673363B64EE709F1196310846DC48AE2DB628CF93569111C79D2E57827AA8E50813C839F2AF04B268B0D26D7522205684A352E2CBF7A02EAD28EA68A0D850E304A62B6633CC517F99F4C734853F3AB205CF30D25EAD8C3379FB06442E9DA62FE457ACAFD52626B475B08F572B1A2AB36D19064708343BB055008C5980C72F294BF34EAFF2A7CB0B173807995DE2340655860C5EC7F22233069F57A1323DEC7D4AED395F207F3A7977CD392B68414FADA1BE976D447A1785536E2E2D2143D951636FDBAD8FD5C4ECF451D8DE7776A135CC78E40B8E50EC259AC835E56C2ECA4FACB1A10A771C2585CA26BD319FB24D88539A5CEC928602047953C9B45B8F12B2827891C5FEF5D02864769290546678647C90747FE14DC73E769FFF474589FC5CB612971817CA19C8193D395AC478A4799A0E3D57ECC9C41A91A89017BEE9669ED15609F8DF1373BAE86048A56858E606B7BE31AB27CDB3C00A772C8A85012962E2A2B2AA7F5B37CBBA65259F8ACF92BD331519E74C48408401885417DF2D200D00D374FB16191CD0A57DF36851B5495F8F0BB8A50E2935569EC8C49B2CDD49ADCE7655D32E21C9EBBB2711829FDE4CC62480F529DBEE8455A6A21DDF05D8F8B60093479E7B6EE084359494927EDCF9BBA8C974249449411515D0410EA6FE804FBA8F5E999AF58F99A58A731C039926E8B1C3DD8527B2465E2CE1930B07860FA8B1972CA4C4AB7E854E9CD7DBA86DF7A9DC4894B5A631E7E7342244197ADE357D661B8AFB420231467984B60F9A7B8171FA0EE93C0375C43B936FA7F5F1F80A05AB715729DEF2B8C585982A6B6C7A56DB18361185E4E0EFBD4468EDFBC8B6DEA4EF238AF05799A70C94CE1DF23209A4816A6FACD09CFA293562AFC286FE4C94A28B5D7411FBC14BC407AE7F0D16516C07EFEC475C596A01633486B1A25EAFBA13DC33449F10936DB1CB053A9E5D5EBB14522136B95F70D6CFFD85A4697216CA424CDD6CD265BF2925A6A7CD2F39FEE8D9EF24B928F107F04806AA5E39B914599835749D4638AB380C4927C150B9DC7A5BBF5E7DCCAFFFB6E924A47E9ECB724D67F8860CB45AA7386DF06928A8F114ED84492AAC067B511F4128F7EE7019297572D0B265A661C3866B64F91DCE40DFE1121597C840E41D1A5D2D6D78E0139C670E376988D327021C116A912396AF4CAEA1D8020C8037ACDB58858DA97DD5F0FD8890CC1AEF80BA15221800EDBF76A0EBD6EA4DD11125F7DA5258098D3C24341158519A369A2299EEAA13317812FF336213CACDB1E7494F22C6673D896F6428539012ECF3D8B3B5A49B351A6047BE418FE279F26578C424454572EA50C63524C5737936538F16DB053046750B8E9494B0B703BE942A9CCDC6657B09B3B9E5EA1141A9F4DC6EF993A00D1C02458A8AC14F26A336B047656E6855A54C22B6E822328B00964FE3BB54EEB405F99805236BB29EC09CDB187612D7F8D897C3E748A606B50769F63C600FC27F4E26593D6641ED68336B5DEFD739F5F7D3AFF37DD33CDB5F36FF4610D4E60A1D8BB3516B09AAA7CC15962424053DB44E7ACA236A2D4D33A09263E70E0D02FF578F622C8C876FC2F61921CB06DD6DC21E0E5413D33E9980B740D9DACCA1C1EEE09D0191C75BC2A28D9E6203AD05737A6D2F88D0FBE29C59212A884F2AFD60581DCFD07A58DAF1A6DE50F66F98BAAA408F03D72CF9DEBDB117596CB902A1F2840DFABE5845037E445C82AFB994B4B38EE38AF11D816E52DC27167DD61F4E298E098A244B488ECA8020599B4CBAE5C795308C072B2FFC0E324507E610849F9EF7CE6A9F5B4AE31AEBB6201990A098E30E270275BE45F7F8A9E66E2E637981A13AE93CE49EF4EF97A54A4D2327A5F5A0746A609225D98733B308934BE2896538D948BF85410D4E6FB9274F4579AB013C3150B8C8B25AEAFA6E7DF1EC64A8BFF590C7CE28E226F12C3313EC10D4F6B1A5F5F7F4A17EF5FFA871A1AC323A8182A638233C2B50F63425F237BDB2025B9C1BB02B6EE64FF719CCF21F1F164CE364F1C5EF6C701162D164DE439998C1F2C791B8F8169E734896A4944E8D215B12698CCF7FA4CAED5413C7CAE22EE69CAD1A80407B28B57033716ABA59C425299B460D293545DC72080CE1AD86D1E4B250FD5873B7BDA11F92C2155C17D2F935C14D9BC6E13699068E38FE1D48483249CD818C53FAE777370DEE60CF4C6BAA06292AF6B81AB233DC50535A2FF4AF0EF39261C7C2D8235FB706B6791413EA59E967F2CC573BC4AB954364765A9E7EED860374BAA65412F9F581317DC5477741C6ADF9ADE23611674C081BD4D118E1E8847CC18C55B107E215D40268A210B3B118368F3B87026A488FC96BAD3727CEF8EAD38D79F9907855E881B04C7EA130B7B552FB9F11CBBC11F5BA1CCE06EF64C521810AD3C8680414D6A00643146002AC98729C9BECEF7AF4A655E2FDA44FF6EEC5C4AC814DC82952EEE88F8CC06267D7B7C11DFDDE2989CE02589BF1BBF2FD652DC6A67B37BA6DB56F7BC476BD7D4D42479DEFA1B523B56B40E43BBB7E99CDB25F4D090DA4AE74A762D2219494C9B23E131A8B88A55CB336D34A2AAC62D088910F594070BB605CD22694FD685A89B66A919E8B062ADD0B9FBEC56D01819A3C603B7C1D4A3444DC9E21B666B0FB71FB414CAC479E30C30D2CA374B598FF7D898C45F9DA56CA0216D93DBCC9380AAF14735D6C7F0A27825A15D2E84D4B1D195AEBEE706010E559AECBB76E218BD8E015F1C0D3B15A6878FCA60ABFAF79CDCD485E47A2191FA0D4460EC7E882232964D482611A196578A28D088F01E52C6875B339924AF0AD63760CD93929FCF6808CA8EFEC17EE8107DAA9374F7C95ADAE7F38C4DE02AFD154C09A4F9C204021DADC8425AE93ACA039923C421B446DFDC6A8FA794BD7D304B1568398B82713441DC47CBD795C55A8F9849BB1076128D7595277B0655EE6579AFE81043CA524D54444A4441BC7503D585FD7312E6D02335BBF3EDDFC5788C1089884C999AE08D1B5CA1F0A95839697307407EE1FEFEF1EC71BB24477DA9F634F39C7B25E80B2604DF7201E8CCA4F0D03B5B79CBBD8FAD04AE34A4C0E55C8D5E8ACD5E591994DE810C3C61ABF39021267C1993FAF880F241E594CAB68C2231311E0578EDCB7CE9DF56724CBFC1929968EB20E3269D9B5403AB29C6037424F358EC333E9D091C476F3031965C84AD7BBB983EEB8F8B2D745C9281FA12EC2A00FCCED16D3D4E31A7D6A07E4401E7F685A53CB22D8511C22A49708CDEA0E2F7ED74438E430A52B86DC5B40D41A566E4D97122ED1AC9AE447B11EBBFE5BBF75BD3F213BAE6C167A892578BCBD99CD406095648D60CB6FA013F3A5FBAB2F50FE9918DAA25BB704B22472FA404CADD8EDACC9EB4F5A598E97E17DF2B31E3BED8365C46A9586790A4BE5BFE6EE63501D05A6C43699B3B6C303AD611B6502E9710B615E9169B37EB1E2639E051E5C3CF8FDE3F59C90464FE1F62E1D13385C6EE9EADD432A5C4E00FB42547CE895ADF220C09978D4ECD34E4E8CBADF6AAEC0055F4C33B2107DFD9175B7E270DF94DB9CD699CCD43DBBBA1C9DEDC027EEC4B8DEB33311C431838BED95D6338E09713C0FB4A8A3228C7338701164359B6A9268A946ECE11BA4904479BB5948762BCB81D3892BBA566DFECA944EB55476FD4646DD4D5F5A8B44C53B6EFF11205608872666DA33E2B06FB509A17725E1DFFE448ADCB050FD51325C066BDC290C779F41BA2F9553BA8723F62E4AB18CE74A3117980C88C098C3B7BBB995BA06A79D00BB2E5E6F12F69651129C4813B50DEBF2C07183C70D32CD9F2A428BEA0C9AC03E4100BE78D90BA29B5F19BA8D38EDF946A4A155C6E5DF0079A6387AB591F66ACD2A8001AE548F94163868A60EAC73D8A5F71DE07667EABE43AE12086D21DB03052766011092F0648418BDB1A322AF8CAEA69C9095FC92332C90939FB814ADD3E90CC9BD38227E4187B3DD099B174FD64ECB1C1BF5C410CEE59F248ED47818612258C8F3F9FD58CBC19154A6CB78D2501F6718D176CF2CB1FFC2BB91EE3FD3DC5AA8816D676E3E669D92EA21761091A03012CEA754720AA4C62F613764F55EACB3CBB75C180262ED0F6C448074F2E161FA1F864CEB86A711049A70CA5B4ED3E1135F1458718BBFB75EBA2EFC840F3F36F9BC8637D6710BC72329E7D8B9C1A73E69C88FB328DB1D80565DBEF74ECB3AEC732A8B038C3CA9A3123D338F0B16141DB17CC7BFFBB26085BF127380151E0457B8F3EECEDE59BA30878B668960DD92CADDD3155222F3E062F8695C476D312E78C6946C9EE1F2F0C6CFE9B2DC1459EE1B59E1B14397CBEB2592D0C0CE1F8A1A3A677AE24FF9ECAB8F17AC1E0D187232B9387CD1876B96F3A9E3668B8C820773EDF7CA4E461227982B681DDA8A74CF8B1D5D42D693781105B6C1F577911714ACF13792DDA38F8FFC0F0F4998704CB49E5BF7A3A12EF9AB7FD46EDED50F36A874018D273F122A82C0FE71D03FF7E573949604AE398C153A1977A40726508D6EDF4F417EE4E14BA209302FB768122224DB952F637D16F7B58071098AB533B3EFB5DAE3611CC108C4FA81C4304296AC22015A3BDA404348C2B05E40EDA54523CD61714D1435247E166F6FA6C5D9A814C05EAFD0D901156102EF18869BD87833A1469DD856560AD1D2333CEFA24537DA36F91865D9E66A6A3AC8A31F06F7B2535E11ECFDB3DE0DD9C488B7436C4F29A60F1E7D4D2BD7458D4451B7642FCF598A77A83FCBEC46F9B347443C1F74AFBCF22CD3EE608129FC9EDDD944AD92551D00A72CF228415679FE7FFE762775236688FE4AB94DCF01B66AD18122664478B2BE6CB142DB37BB3CE620BE623893CD1F003F8926451389B2EA072AE37E3C99BCE13609F59423A511248FCDD681EBBE94B4FF5F000159E9C86146658048E0CCB3F7404DF627821E5F3F8A7F2EDBEBF84F8872C34AF091FD2E2D3177B382E49CA4BEA8C27A3B4607784A4F91FE8816F9D8FAE865E4848A5CB9BB893D2EFA69AFD0890845D4C4F338EE5748D54C4AB8B86A60711C32B525AD037D866E73345FC11F9CDCB74081594A171A1B0A328ED94029FC718DBB884BAC4049C62E0E0B5209627A63268AE2B4DCED2DA57D6166F6C9AB9579C53EC13C83C26699F55D4778BD987D71295885D5A3C2B04FF70B0E13D93F237587C8EA86D3A3BBAB5F85778C3C25B18C754036ED201C41B0C495DF3F6EC61E6DEA849E6E25F2B15F46A6F1E47374E4D74A7DDAF8AC0EF925360F78850302525169EA0121FDFC0A4F38E2FB1A4177C03D1AE341C1178857EBA59B6A2F42EA4242C0325C34B1FEBB8B3EF28004F99EC1A03FBB6F45441283C61EB220B8874942B9E6F5B9021800F8892885D39B4E769EC554F27884A329377A347534AA88E411128DCF7A97641593B83F126E7B8CB73C525DA89D995BD088618C1D18ABB8389B970060538AC9FB6DF18BD4542B8AC3974C21ECE2247B1173E15A4392D2071E8C943EF93E24045D3F3FCC19AACFB1E2A51EF01FCA44CCDA913F8557E8083A3A0A35A3060E30E2886CEB31AFFE0D50F938424CCC0D12542F9A4C2921AD704870EECA26FBC8EA25F2EBFD321E746726BB6032C83179290531316BF03422CE859E0AA51725C8B12B0174C5F61243859B8A804CEF330F531505F0EEADF4EB99B7E10F76A40FF2A7075065D8848E2FF51FDE5FDCCEDAB09514AEB409CDCF0291D9F85425076364FA664F26A0C82401CA0FBDBEAF85C5920B0717D9080959F62DF12EFC86583EB2DD8EE5A160E5B7ADEEB6BE62C3FDF3C0D67EAC64BA41F2DF08AF0C577613B8887281BBA3469C11B86BD21BFAE962A63A49A50F3EE0B03399322B3D719E23800AB1A7C46A373C66E6BD8D15EEDB240B4621AA7BF61D693037EBF3E0AC82CE4680C0F61FF5A8C7E4C49C2CA811E81E8D12D8C040E4A34000D09D6D311C010212659EFD0C6837E406618F1E371E3ACDA51D0FE2AF9533E57DCD5F56DAAF2874E3D34BE2DE8D3C9DF5885573CA210D6027771D5A91E4D65D477D8A49052C6C5CD45940457E6145C277A1C685F37A6208166483460BFDCE2319C943244FB43EBB0D48EE2C2A24C4AABE28585F08EF278AA2DAFD43E87AA4C3866A69430B04EBD000CE751A0504E213A86BC1B0C0558E820C4E283A843E8A8263F3310C376D157FD918B4967234D8CA14818272FD07B6B877A1B02084C4E8B564E74FDECFF7942ADDBEB7770D0523BD6FACFE6CF3EF6AB2D10103CC97F23E9090C29B95F2487713EE756167BA88BA7A6D4813C2557977007D4126470A82A03E267100C8809105836F53E66BEFE7F3F8490E4F37316402908A1B27F7CBE767D4E1514EAD800389BD7F4527580A021CA439F12E71578190741F81CB094F85C897ABF16E0B8C2CE97780A6B9C1D922125624767D937E13C54F5CDADA6A7B09643907017A1C58401BB685AD851DD1EC4FFAEC4612B3BFCF98260DC64CA7E36F2505C48BAE291CFE9C37293C631639D316A982BDDAA00F28C5B62A971BF57845F3E9C3BFF0E796D2B7C6E622DB8486C2BD29BBC4EDD658E8C4B57344FCD4C5835905C1E9D9F7FDD26E70943389D4DD38FA266BE078D14AB4D39DB6EDBA04434CF96FF6B8BC80E9290A3496388A2C867BA22D483F21BFF34FBD7D6AC220070604A81F5F0F50806543658CA06B2108313E5FD7F5C008EB6C597E463822C44EB6AAA0B840BC6AE55398ED512A8D187296F69F2F11D7B1A6BDE8DCC9F4A31853959019B8DDB8FED16D71AEA767C5D4482273EA50755ADFCF637D703E8ED756023F5517FFD53BE680471589F0A615242E276AA04BA657A8AC8FEFF3C33945E6F76155BC8BF4FCB3C3BF90A81D076EBF5741AA8475CEB858FBE00BFB88FEA511EF33905F666C66D8ACE06F04FE5289B88A77F2694A341987C1BB28F1CCA89333C48FFBA6BFF93749ABF4B98F567A1424D2D8A41C316AA0EADA50599DB511CC656FC67E12775B902F9324D3EA1FF3D81A58DE02980E02FA42A172025028CB6D7EDED8832F956C02D571B21E2CAD415CDCA08268238FAB3EF2F5137F793001E1B250802C7CD0799DC10192444CF4EF5620EC32520A7DBDFF0B5453A8322D0468B5FF131B0362490FF38DE5E18FB693459D46AD7E98B7E1C66C848FC5DF6C2AA6E322FAE03A8D9DCE6ACB09EC432A839A1A32145CD4E88AB0DF4DA9A031B4DAFD79290B1350AD78B2A382662267C1141625C079BA69A3D0EE354B8DB2404050D1EE71AD5740A95A93EC7D00A5D7BFFB6D00EAE18185C96E26814BBCAA416530A3273DE2632E14000641FF83D7CA513AF1F6CF1870E4780FD0D4DC6C40AF9C937055CBF611B1F23D185BC5FA949A4303ED8B6C47D4D5866F1E4F94556C2D5BCB3C931D1ACD3FC65E3DA4EDF753965E652A489A9B7BD8268E709936D70F30E106521890F3FF6D4B8727E71FFB64F6085427A3864D34ADE4CD861D8819C7ED465D9F51ED5BEB8508B095CE4860A5ADABF9B2FDC5558D81583F747C78081EE1567048C5A90FF0BA52EDF913CE8CED5949FF25A7FA1D5E8E224961DD163D7202C4645B36BAEFADD0A0AC1A24E4B0CABA1D8BBAEB0AE345B1A602B456E091676D11DDC398470BE404EA2F8A3FCE0591D6A0416E7DAA84E088FCA2419FF398002BECE92975866AFC8C09656FEA6B4253E8A2A7EFE1BC54563B534A03", "rnd": "4657C1595D8C5C5D8FFCEC4FF96C761F4BEE06E25DE4C58E7AF937B528E0031D", "context": "2E4D6929559DD7513CD31A603B56496C3AD5B21D39EC8BB08116F735DD9931AA5C28A543D9B1F4FE0B3FCEE89546A5712E154F598B6045D39043DA4A9CE3910BBCB0A6E1C77782892E3D7D7EC01BF45B6193196FA5ED5B03096DBB5B3B223C89BE8E048AA206054785F447E6634F414B9E156CD86C509AC03A49E7CDBF077E7524E1CE01669371CD6B85BF3FAE954CF13A7A62B998606A8D906B1D13D471CD4533F67CB0417CC601CE0538D7DD2A2C585CBC3E8D4CB16CA0910F7D2D9440D3A45D9D69DBEEA9AD7808AF6B0400FB9D0D98B253A7152AE29DD16A", "signature": "C832CC51056506EBDDA198E07007941369240EDBCF58B02BF43AF535A4FBFA23B8C18DB3099A5C21B4D29201EF4D947C8FCBC4A1335BBAA55F0DCF5EC83D287FEDB9623EB330C16B74B2C7B5FD2D434FF6F431544CD543018AE513E7DBF1C82534981DFB76B69FE735E8FE53F4312BB79B040CEAC9E23A52B1DA6561E208C29B313FC949644FAA2DD4A5495A101DA847E95CBB35C0C6C2CF274BF2C1460A381ED55480454955F86B64BC9844C7CD3472C543490590AB4A6DE523DC021B16A452E93B59080E9F4618E611D9094B72041CFED5770737ADE7F56A7B667471070687479086E3BC25965ED667351E457D649F00AE85CF6521D5F2CAB0DDEA189F729C0A4BF09E61C8C56BA0DF3B2F1BA77AD6442B14C57BB78E5963F2F941753F923C791734B7C7743CCE318AF6ACF1A11B1482EB87FE5C30A08967A44BF6359D25F47A35DEB2277A6D2EC64E4EDBB7F874077A8671D56CBB6E828AC9859DB55F414C0C8BCD85F70405E17C88A97B29FA007D8302DA274F921063EC1AD75081AEF74EACD21178001FD5738762A4F045F67446103F034BE01BA79F2D70332884381ACD1C36620730B64AF43B5C16FD6A8171CB195CF8A339ABF5EDC1A7CDAA8F9CF4C04E0882D1683CE5C1AC480C21D699D3DE6925F9B2FD42BEE7FC54B99B076DF3B64295E29AEE7F72558C1A08845BB0770B06588BA2AC76B73CB4962732143BAB89A81B8FEA88C9A2B9CB6EB2F8AAE63F1AC2CD5FEC58981487DD07A3A2AAAC576042B2EE0CEBA57F8AE9EE508A901D2025E0B7C947404B0A6CB70538E6F3BDBBC6DE1EE4BDBF9AF5030E4D410ED5A4EFD172BDFBE573D08C9068E361F9E4E2AE24F440858E20E26D93F14B1BF584A49CCA882624F169A5E8EF3966A753F4B1D50749FBD83367C78B5CB2B3805A0A65D3D5F7B21F06B82A0B673EF38DD342F93CC57368CE4EB5A4B7B14F408C90DC9CA1B0D81566AE420B7F7CE30ED53F279427F96333A2B74EDC2DED0F6031E8E2A1614E86218ECC0A556D3405C29F054ADF559E012451A7EA2080CF22BCEC70529E7F4E50DD912F9937CD9B3FE9E530BD3FA578346E17D91ABAD56FD23BFE5F55ADB062F646791A3EAB2B2FE1311E1A4432DCAE69E4736D5F65B506D03C5FE3E435E30472DF8CAFDB3010FECD036E911F45C8AD1963334CEB0D77579A4895A43A791EE891189A6E46358EAD8B73CA5991FED570675B3314A8F5BCF117B1F3E933D6F74DAE3997B161E7D398C96F7BFB5FB51BFD30B8CE2C3E2344FB8527AD445084F8146344205C3E4FDA357FC27B1022AD7D92C0C0E540303AE137F48E5B66BAF25DB7181CC47BB8B111DCB86BE9F37E391BFDECE2AF910AC87161188A3DB5C23B1414D20FF65685F976DD7A4FDC88A2EE464CDEEA85E0FE560A2D2D86E57761F40FDB4D180E32B4C2B86EA927DD7FA51C4D47FEE10915F127C009C34B55831B86C6F50ADC9615E48C5447DFD73A48CF2D899FB4B7770E39C12BBF0CE26DC25AC11A291AEEA0FA14200ACF0A29F3D292F573408D317439018B36A5721467E592A89980E327B8C8C16626D79547A13BF885BFE4258FDB2AFB8949E5AFCA66C9FA95F34C7D64AA685D97956EB24D212A890A19B6D014CF95563E3577994D1B5704C841662E9902AFEF4F31BC10118887A67ED8B634EF4DE4C75BF81A4E5047A5A8565AA0F1039117DF95147FBE8FDCDE2B7E80A87AD486B397CB0C894922EA758AD62ED5B4CEAEFAFAF2DFE5E7E12506928E38E6A2C2AA28DF12F0763C38ED2B02F5B27494E7F51523E95AADA1C58530C8F2054884A215EA8A4019A6F2FEE6FF9ED328965B297FC6B6DB505693C5F0C1ACFE332DEFAF6CE1680CECEE7F0BE33246AF281804D8FCDA3F2F203565BFC9470815B71D01B084923940E978A4FA80742A3880D51D7AFDFCE9F4C07173AC35EEDBBA4026030E952D64BDBBEE14826B039F4D9C9F1578AD4DB9703C4C4C08DC6A21D000D37014E0F82B9F1E8D6B71DD645BB1C5ECD9D4FA04A7F4F40DF9910E4FE6B89ABD80FD263771F32AC9ADA4AEF315AF0116ECF3B85C325D00DE6623E319063156557B5B6C8C915C1E9A6C4DFFEAFAFCACE4DA8A9A15400CACF794E278A2B0FE6184976EDA6C461FF06C44C76B7AD29574786A0BA3E55EBB9AAC011D160AE273FF9FF93DCB4FD10D3B8A66C6768DDD8772B93463F16528D6BB0D817D02C79347EC55520648DB4B01F043484CA8B851DE11427AFA24268D4FAE6CEA594F9675309A0E4C8E533B3B194C21B7EED232C931802B71F0B5F2095E5BAAEC5D7DB9E2E9E3847C9210B29B1FE9FA74DA86CFD3D17B4047CED06C5309E8B5BF8C5BB12450764F08BB801E9D28E17681EDECBC91453D6785C15617F94B1D66A03D3CD3CEFB7613E57947A1B9E1EA9F98FC92D3E35DDCAAF83F106D62F03C78C7BE9BD89E56A82A2180B404CB676C44A5E8EFA58D327E1C42A5164919B96995847E05788E385575C35B45A5A992322F6B1654FB85E11939A5A09F8B26E8F3FB33AA363511CA9C8EB5F9F96E6A8B2F0BA05B549D777A95556AD95DCD973ED6DE14C8C057FB199A4EF98B3F6B2B884F2ADE2DE921469F2A12342852C3A8AF3E322D0FD18B57518DF5197B4858E086EE64C2991361ED4A82B373E7756D53C28BBB836534DC52921BD6BEC9C5DBD1A57EC6585235DA8FDC0D3C4E70615ED25BFAB66C18C6693F11E871F8FFCEC5BFA4B902A5FCDFDD3C120F44AC3FD33648118E771E87E75E3C5EBE8E6949306419E119E0A0456A1AF429AB219F22762B0906856CA6AD78E2577F661264F60E1C568902FC765F6412E83A63186B14D81B883DCE6FE0EF5DEDFDA9D905E16FFA3083FF96C1FFC8B8452D03525D9654774A829C0E8B75E708E22CF1AF4E105F99AB41AAF78971BB53F5F21D5156DE1183080705A210DD66C9A8EFD2C193EC913F84D4E224439D18861EE14721A20FC8679E588A4EE6DCBF7BFC3F31D5637971FFB39016762BC37E700972CC166A19C6F806053903F460621F284B1FEC8E2DF7EB0BF99CDCC5751AF5BBC96C0DFA34DAEC5174CF0A5A5CB706C8D5FBF1E7C247488A22A4DF0FC5DC44D05B6FD93B9EC635E747947E838301E0C70AC10CD3AB0B61492322B521B3D590B62B2E44EBF43109D1DF5E8E03C76C25F4C1FA284A1188D9E473B1FFB349850D0EF5BD745BFBAF1380DBF3443C4A50A107D85649467C6D197D29F5D3BB4B9507DF1C0EC8973B294D103057F29AE2F9440F7B8DF1ADBF8C56F4DB8D37C965E1A3D229261ACCA80DE839557DD165AAC7AB60AC52B238498999314F1A42F2600E53B70D024E2F81F3C536DF19C8FF139B45D98601F77F63F42E9F3E1C5C0C771C0DC13F9A0D1718E1E3C58CDD2B895F72C9D613CD50A63621BB61117CAB6640969162118F23FF880C42D22B696BD47DD1FC91878359A246D4D9688535448DD56CDB8CDDFA581ECD4C36005B13B9A4444CE395D7D20DFF2989F92E5AC15711FBFA3259BC0EB674629DBB4406973788A1058E0EACD5108DF9E30DF72ADC8B0BCEB1A68ECD789C9B1F01509D1532A7EF6FEAA2F1C1E2ACB1841AD21F13821EAD96E501F33CAC1918845422D8284F8375C3CFEEFD5143A476FA1E6F0D53E14F0416E18D8F983617D9ED201B2D8C8DCBEC81E5A5765BB818A8247906724B67546E9F73FDC4A6D3DCFFAC61267785CCF73EE1504F48656A30B0B7006C4E7C6C03A3EDB04ACF3C2828A26A8970CFA074B88363F8F1895029A8827CE31992A81172CD95F1C18EFF0E69C70FEC44EBF351402BEBC80D14BA69506D0AA3DC11FF58812A84EA7FE939A9F7BF1DE4B23E02F788A285480A8D4CF6D6BD6CDCA8981C28F76512485B19B5527DD505DB9C4FF36B0E9585D07EF726870B671573F92464ACDE708C5AA7ADD937EE431B5FC5A465FD94EFFE6236BFAB819E0C9A3C71A772305DE29FBCF4C6C2A8F73E0F11946F793DD7F71DA86EFFEB5857BCA7CDF33E688CAFBAF4785A62001ECE47D659500C3F81E92B94096E3F3321D99E3140ADE3D92DD79796C2881C922A049B3C04F3655820C947C8B6327CC2F283E6DEA3E717BB86B56A6A9C94B757D0755EA5932166F7E7C9B8A4F239A0670FB5952152EB1FF4EA397C3902D0E7540B6E53C0D67DA28FBA2AF690D41CBDEEE5FF0E29672D735C902F6B05781C9D55C5EAEC24D88F955D22747716242F250EB77E0D469A46D1A018C00A3000C8EAC961A9C3BD70C88DC0C2738BDABA87601021C8A806181C7A256361A86623A292D5B55062C448A40B898EEEBA6583F8BAFE3DAE2E414E933939C77B17A1BB0CDBB483140D999CB0414F605558E5BD2C8BF7FDCE3AD4E8E520758A53125385E3214C5DB322F59DCE0A9D48B7577E30DE09FF1EAE834706C5752EEB02F84C4989701BB8BF0E7DB8CB96819C7AA3A860972AA40611B24F95B6A360CD949FF00AD7A9B4B221CED241EBD0A5C0556459000114D7407B24203315595AD6A42B39E0701EAEBB551F5BB288026FE72A9EA7FB01D0098C846FB2EFF1ADB07E4BC181F28A0C7224501A3010FFFE56159DB983B19ABD2E47DA9D2173C97A8A213CD4F66890DF5541EAD1EBCB6E8EB3FD1BF0449533889A04D117BE520DEC836F5BD03F739916AD1E95D6AE38AEBB4744F717BA6C18087C32E2888EDDCF4EBC2134F3CF025385AA0024C9B42B81DB63068548DF322E7A578400B1D48320F31D579E1C96A266CF78DFCD488B16E849F459C1ADF3E3DABEF865E110856C01A357875648ACE2291DFD6DCB72EFCABB71AD1467F3897036D9B16CC9148B8D8986A9211BBD0472131E337D2BF2EDC3FA963CF44F1AA7A4358C6E5A9C08FC6740D86989C8285CB11E001DD1B33B6BEA8814F982A7D04A2C5EEE9A36BD723BBA5585EFD1D4BDDA4FD77C52CAB45751B357E13FDAE78A1B0DEDF61EA531569CB89FB651A51B16F4D5B941DA24284BF941DCD2E44F153E95FEB72FFA7EFD25498AFAB7D4AE54EF215A4204EEB2A149874CF8809494D7227CEA4506B14C8171C6EE5F19A8EF7B4F2A541545D4337B65A8D95AE0F1A39AE6281C9AB9751FA8DAFAA177C018799EB5698C2E73B9B77DA550BB3DA972EECF6DB55E4DE76674B7E516BD2CA5FF1AD91B63D729D38DDD3090A39FD4C1D404811301EF4E4DAA1670398D3CEA2FB6292FECDB606F672169905B2DDCC90774EF964E7DBF43AA58238B7EA6AEC2D5345D9086ADCD4886B0DD4048A1F1A073C61D85DB551D23DC7DD8019F32A43FEEBB9A0D2AF59BE37702933CF47624756D5209945DD453EC386AFC328A5003C79C06D4268B8A0433E0DAE535255D7E4DBC7BD5EB2DE9838B91BFA3C6CE33FD1F503006CE73E5CA3AA11F874686A8B390AE06DC8D8B772FA9F3907980AE63FBDDD80CA36C5BD97CB7F908886A836F81200DB056EA5ECFBC7BA2D26401B2A1A86FC9928F6BD0810C8C4B8CEC53BC29D8EAEF1C21128B4A99C595367FA14D46EFE809EBF29B6CA6DA858FE16C76713546395754DA3CE37A26FB52F72EFFB16DB6B0DF609B01320DFF7A08C5E4C321C1C8AD8F51698D5DD4E7BC17BA0EF86814B3377A43C2A84536306C4D5136F9730F0C1C9452A46240408FCB10D25567FFE6AEB96EDC57580934AB345DB55CFF05216FAEBB4331F186305A4AB5C9B68B87E2CB8B563E740B3471F524C2BBBA741F900EAE99D6D4738F16BA131B651133A49B452D42AC32B957E42605CABC039E34502E06BC52D6CA88DD024A59FD3F9CE9734F88970133DE99099F621DC5FDE3CD4236BC7758399B692C29A4251E17DA51C36AB6B72B86C2D01522ECE16EE35633A1049C95214EA6CC48AFC84AA08383D9375A8F8BF98B02EF5EEA8210A077643CEA3CBC7BDA46379647F1A13D8AC3A1005979FD5C7FD18E784633BEAB2A4D298B54E3253B0CA46A60B5E8C501611088C952E47893D503F81F0968D309CBDBFE3ECC3CD5822B60351E53692BA7F73DF05844135AC0908AE8E9B15F6F4D6C96ABBDC79C7DDE2E43367440D62530CDEABDCD4F4C20C4D4A763F889DED510B3124841E9F4B7EB2C4197D650C228E5C8D5363FE38DA24F560DCA1AADE400CE13B600BA9D37DF0DC13D3A3C3B4A05DE4045EAB275B1AD945F032CA300F2F4DFCE4BB4DE4F56E896BA03A7B745979A57E6717DC9768D845817FF88BCB9E3E2712225A3C442B79E7BC9CDB36F3C64434119890E9FBA32AF77A7E01C5D67F898998F52FD50CD8B54354C96BED13B2C23F360CEABBEE42F031C851EDFE2EA22B3E3F5D17AE020284ED5E93B47AA1DCDD852B768ECA8C2665367D6CC4BE82C4EC37A2A347A11FBF4F432F987CA09B17D3FDECD83A3AC61B25C4AA70EE4DF5A6CB88C057D831DC403F7DB5F051A01FC45B13E4CEF502D77D3B476B23776998E790270DD89A4DEC55902E2EDE37DA555615BA87770871F145968C0C8E83E4149A9FA323D4C881A224A647483BFCAE02C3D446F9798E3E510141D24878FADC1CAD1E8001C8B8DB6CE556AF20000000000000000000000000000000000000000000000060B0F18202B3134", } # SLH-DSA-sigGen-FIPS205-1_1_0_38.json test_slhdsa_1 = { "tcId": 1, "alg": crsyspqc.Dsa.Alg.SLH_DSA_SHA2_128F, "sk": "D5213BA4BB6470F1B9EDA88CBC94E6277A58A951EF7F2B81461DBAC41B5A6B83FA495FB834DEFEA7CC96A81309479135A67029E90668C5A58B96E60111491F3D", "message": "3F", "context": "", "signature": "BD40E6D66893F38D5C5FAD99E4885329925BB207D49E62BCB9B1C4685154A8B32E58B70C7AED0E28507F31B49EC7ED6ED6DCB8DB2DA90FE938994D75C80E6712F2421C22DEF8AF88906B768333E7EBF6DDF7B84DC01F06731DD640CF93F57927BB56F9DA9D4B2ABE60C81D863A20F8E5C5CCE74326D6181D01B74E3CD7F794A98B4ED7A791A1B77C561A6E7AE64E4E17481DE4CE7E26065D90AE21C965FEBA3302102D7564E3B7414E1AA62271E9B4DFB42C57C44726AF6FE7F3BDD486D7D578B4B4BA8EBC1F5D7243F94D2D2D4CB55B7F95C3020E05A6CCBE12CBDFFD6466B5B34369FA56839A0E05AF5C6613E4A229895CF5A834880A2C3937CC759F3673567F39FF2B8A0613EEE33963B06D200181F3FE69B507F2172E459B989A8819C7EBBA3AAF31F9D589DC0123012B787B60DCE3DA8A76D1A3476EF08FB8ACB72F6C1F7C8B6929642822EAA13965D6C1F3C58B600CF029758C41E26E0EDB6FD5F2EB13EB91D95ED3AB976E5C6DFE1C80879B8BE68DBFB9F8E2E60D822D88DCAD48EF2EF89F5486FCE1506002E7A7AD8F0E58374E3F82B6E72CF0CD04B86BBB9F261BEA70C785521BA607B8A2DE642C6EB84F691307618C60AD713F7B10857D28613A6418DD1297544671091668F5E8EF5ED296DF37CC6E45B36F261A66B4AD8BF55C63298A6FD79B9A128D44DF4818E613B783DD8D8116DFAB297F520163A15F35A4B96105D7A695C723F11E38964C05F5840AD333FBCF1862B2BFD0433D645F411E73C6434480E7C55EBD1B4E1B786A7A333B8FFC5E77CB303A3D093FA0D18DD223FD3CC352EDD11F95200A2D6791011B40EF6CCEAC57842961CDF74DCC5CE09B219A615B08A9BB92E2F001B7E5FD87D092BE800DFFA75D1D10AD80E543A7809384C8C857780D66B9A7A9A7B15F72C1AEC5EE6F8CAF7D6B128DFD34E26AC6F5267052557E2AF504BB5E8110F28B8CB3268900D37E5E53A2642FF7AD1EC4B690A99BD62A3883537E3D77F80B09D27DB2A28DA659A3B100E3B65088E837826FA707E8E39149056C3BB13D957486964351D88CE1BCB69968C85690C959992AF98609AF5ED34A681FD32F8D1A5E219D38D4CC228182697C9389B2E9B5059B8AC4A280DFE3D6838D879830643CFF92CA02A1C9EB1643516A31C55E0E8D0F9CBF16D01FC0B8CA214259DED8CAEA43A013A645F9CE5300520066CD2AC04BAF8D49AE7694D40BB60AAD324569690218FE19DFA58EF73D62A831501AA25F7EFB5FC9C8150955FE6524DE636CE526B100A29E6E48EE047F33BA6C0BA5ABD5E5720945796A57FC389CAA1755A339F6C584B13D6971833C9E865398C8BF486A5F99EDC9E5D69A04BA1118A3A9140CD52A951D283242B5583282DD5CA1AFC867C14947F68F8D3D91105AC4AA565650430BA9334FA8A8C5B76BAB24D1BE6BBAC8A478B89EF8E9E8B33BF38CFDFFA1D07F984036BB5D9A71031A67050BF451468D1622AD99EBFD71B7ADF09D1C5599C347A8778776E7D9DF5495728FA6E8C6A18FFD7DD6CF2CA7BBCC84B12EE03D9AC24F2EE35F4925161D41F61EC3D51D9A96A1CD67C84E7350DE302CCBBE3BD56EB1B1682FD60DC5EFC1AF97A9A8AF08F088E9B561221111CF29E63A3E7715C84BB0B9756FD8D8A92CAA2EF658E268DE024A54B9B6EBDC681AB04415F5656315B35055160DB4083D184893E8D4C870B803394BAB5E38F5C390FAFECD22B052EE4461A624587F6EBE70B90A840540F009715B0AAE502D2811BB7E345FF2F4F779AE981287BFB96B9A73B999D7778FC47718D47907F60B273C37DD1E7ADF6FAE38F6BC5F392927F18E742CFCBE81C0A4C8C75403361F1BA7F867DD94F4D22AD03C38D554BD9E4DE497ED63C156BA9086F4C8B4D087529EDCC0295A93AFB5373BF46BD04B2E5EA5863C850C3283B3E7524BD5E2ED5937742062EC144E829BFFCB9DAB3F9C4C5DDFE8AFE51BB58BA2D0C8C32393AE9F49764ECF7BBBEE807B98EF8FA9B18A88731B5388C717F321BD4761A74606226C5C9E3E203BF47B1724DA6AA13FF7267B99CE68523050523FC4B8A42FDFAD0F4A0EC0340BB6C1A58B4DB63C03589632485496407B90169AE9F7C7B287E0841B6CE570942FA518CCD80A355F64FD5F739BCC31BAD3C618B591F0CDE79614388B538EFCCE119B0884A850FBA18BA41F39F08E84D8E6B38D7760A39DCCCAF4A031EAE014C6D6188FE0333D166719D275BB56056EA4B8203673F08BB5C44C57B209AB57C17475E22E55B06453998F919557582959376745FA1E348E9DA508CF2E96FB4FEB4B903B36385251B34F319D9ABE258E0B8318A7C9D45647F99CD4A317A9CF017ED9B341C1FD501426BB6C04E12CFB5220AE2A1DFC02DFA2BE4AC859F837EAA1FF14D99D86A26FBE346F869BA7B662EE5B69FD1B8D16FE352BC5720F402A009C649DAE7DDF6CEF84DD2251D5F97C91ACEA5326DBFDF4CE695B5C5908B43EAA79EC1670D75665991AEF8979747976173A5875C912FFF4EE76EB2FFAC233B77FD330B6F888CF0393FA381328BD9936A977DE7240772876BF15A3009ADFD2AB9870B49E79201AB912D57FC237F1D83B63D8EB1EF7EC1055B6A4D2755BCE09D9F2BED40D36033360CB9375A3A5EF8BA045A816914D3489DF7B6B2A2FDB5FADC6B3E1A9CF4063D06B43D7ED75A8C78674CE7858FEC0ECAB11E1A041FF986A904BD84968F299419DF5F960C2736E75718008F9DFCECDF20EA3C9A79190AB27033989A40D3B97D89FF662E63CC0B639E77FD3E983239D8E59F0585B12C803E1BD3A5865D1D4D3F022ADB4DEEE488F2D2C08F1997D8601D702CD9E27984E171A6364C6887E8A625A23EF4988FBC6888A2A49C17CB596E4C415BF2CE9EA4741BD00E65AE90B8C53866CA49F20E575A31F011D22ED8DE7A41F71BD9BB9F7CE42E0A5705C3498415C0CE462558366B00DADD9DA6F17C666D46695B250E651965E814EC70D78C507E4EDB965678C1F80CDA6C7CFD720FC133582F03F848849B261892696765F327DBF653CC7C88FA9ECE9CC172B2E91FFE90CAACC876BC26E44B2A4FEF46A4E2BAD72A55D268E4E99B95D13A196FE6ABF7DEECE54C7677813EB04AF9601B323FD27D90D8701EBF06E539796E68D320BDD2A8638029C6612C519CC44D1AA2BABE31DDAB3A83714C805B98731329CD1FADA30E7E690B949E2E7417975BD83D8130DE44D186A90D0F435C78FC4EB6A02ED891FD1C67BB4052A6339CD75AD525D8F84B4CEB33900F7D1214C44B1EB05C224CC9569FD58CA77EA9193E591E658058E50555C63D98F8528467F134468426304D9771346AEDD3D072059103000906D1843B19B23490070DD6A9F5C6185C34ED9CB73CBFF1599662727CE40795CBB8FC3BB669F670FEC731A226AE12B08FA4F6C23B3C3B2366490CC023C4BE2766168E776F1C186DDE099DAAC158D2CC085577271F7965545F2FF9EB02C670E5CF5625722A140E96291246E941E0B9D0F94C05E66C9EAC61A1E6D5265B9491D6E0FE13C3DAF44BD6AE2C3868E262767AD21106831FC99101E3A8F47127FCBE648A6CFDF841686B27706456E9BDAAE54E5689EC2FB6274749C955AC62892B62AF27ECA451EA199D565891C8C11E36F24B13A74A46D5194272FEB4689F598D2BE372BCA45E177B80D7C352AB598AC0EE6F72C9531074F98860AF8E7D0F49258F50414525715262D689B13164EEC4B8A0419B5E6E1C831249375F6BAB546102CA90333B15A24E543A2579B074EF40E9237150561405804FCA0095D5C4D8D6456DF31DD847F517C8FBEEA4CA8EA88CCE339A4C7A565C43674BD55C58521E4E50E837A76C34CC1F625AEA9D4AE909BADA0C37B5E47CB26562BE2E37402D2210A82CA8E397CB2B88453A2F0FE779E7C6A74FA32B80A99352790B6D871470BA75506F8E6CF0D7F9DF4716D86FBA40D2F2FB7C3C6ECCE2B534B4F693BD5A6DD7E1DA3A1B1209A17FEB7E9830E67BEC26F277921D048F32B9ABED990AB2A7ADA21374D1BD64D3EBC5333F437492D12D5E89798AA7B83E6467BF69E221705CB06CE8B2C96AE7F8D0B41AF3DB1F183ABC5151C02C3CFED01F58266E3C2E67A232DD2D11F8573B670A974CE7D9C8F6FAB7D70C7437A0A0EA38F094A0908F5162E3C63C6FE09701D4AB6EBEDDDF8CB52D8EFF8C174A051A841FC36DF127501B2DA18F087B98B0F80DEE70CB7670066219289E9CA9C1A9EFFDBE14DE19D20850D98149CFF50314B91891097FAA023D699009BCE636E401610E24667AC3D5B41ADADD82872FB0874BC42593134086538DB3CBCA27BF7B8CED845B9FB7A005E813E38971F36BB793E96CBF65CE3E4BB2B20FAE2DFBF63B84962B7D7960BDCAEEC39FFE5587586C5A4E080C4E3C9A370BA4822637524925A4AD8565771E1EF566641773410C6EDBECFEA9382E9B19EAEB05DF8851220DC24B4211D5AD427B8B4824ADE2BF31983B2B426D7E872C205A0132C6D413B53CF4B975CE36749A75994589C34ACC9A87B8B147DC886CC30E02355C84579C64C1D9A466A44BDB6BABED60D143CD89FC9AAAB0B400154E4FB1AE0915A720C8B5BB56875EE54F44ACB9BDB8D447D64A407956FCE1C700CB86F014F398A34466C4F8F8D9DB8B8EEB16762A02B314A05799E7DCE5C1738EAFC729BF655E351E3CD6F061CA4CF25E98FFB486B6DCCAD82FAE13896B7DFF055C58B2B7643D40257EC1FA091C654FBE16338A02276AF20EAB9A21993DDECDBFF5C7F00EE9FC7EE9E5AA5C50C43F657C7E65B4D865B1822EA0CFA3010F310CA66174EB341C82E22D797A252C6A8DE77452E8CC6117673B10041E8165ACA650B5A6DBCBE29601BC570C13C7D8DD57679ED3F9D459F4BF0A29BDD476FAC13CC4CFCD9A3C65B63F57A93DB350BDABCF697F069DD909B4808176E265BB268FB9BC4200B83BC7B18D43DAC8997BF4834A14C4107F3C9E597F77AD3313E670159D94ADBC46DA1F2B69642B7FA8E1EBFFC228A222F951BE0ADF61422878E4939EA32B83242692A140D80DF11D95734E69B952FF7C6716E0B360BE4D0BC3D675E0CFB721681911BBF5AD8040A24901159B1D805CE023E731CCDE39E2B38F096578C9A974AC0CE9A28D923515C1FD369CDA5F3FA35E7358EFDB91A0771F3DAA64E685F5E24BC819C93486B2871FE59A0A2749A15BCFE36C4AB4AC2ED4803015FAF8BD4C309EE883D4F58131F778FBB608F07C3FB62E588CC47902B6A0C646676640AB0EE1B342537E9376CE5A328A052F8F91D66A4AB9A12263BB3184367731930B4789490BF4594EF7A01636BB2775A33E8FD6BF252DFBB4FAA2C310B1130FC0443BECA6E04CF2CEC263B42B26FC0529C5BBDD2643D44F57A392273866626DAC471CA18F115B4346E850D98268BB992FA11733E5F01D2A5753C2E3163F4BAB64F9A19E719D07BDFC51176A327851A7320DA9F9A1A11E57B6D374E26C131BC9D94630F9CE23EA9AD40466A0C6823E0AB5F3282B109B2485B211AD9F62A79E842B963D3E9399EBDFC60DFF8B12266920886CA26F214048FDBCE5282E652DD4C7F0C48A9F8B9935512A89182F81777BE6D4B5FBAFE895DBB4319D32EFC6069A02B87C4CDFEF1955FD3D808442C966E13631A269D206C5CEFE96C2E67FC8E1229FC99EBDCA89AA803C94052973D560F50EE33E74574B5B208A237E2A83DEF9E15356054251A5804577C024153B42C589249B630A9B49C3825B5B41925388A4976F1217C169291FD65A10A275BFE81BAE5C1CDF39539049B38DA2F4FB87E7824F2A983DA6A4FE9B4FE5B26649D6BBF0A81BA862C90648BF8D8376CFAA81BB9F97B080BBE5C6E899B8C9743144DDC8CFB705588DC63741355DC691C7F58D73C9D9E528784BB43E59D669CD7540BB0D8C33EA9C879DE8CB549EB0454172409F95B0F97E3069328AEDCC2518461D870B4C9B7D8606405E46609A8AC9B9A53A0C57B02D4FB15EC8C6B6FC31369522E2BA2FF870606598F5BC5877BDA4198F0618262265BCBE6506BEBCFB463E92AEA4CE08660AB55A3008385AE75FA4746EA8DDE051B9900AAB1F5015F0EDAC6F6C4AAB0FEA3741512BC254E9E2D07C1EB010C88378FEAE0988EF4202EEA1238ADA11135D085225F2C8B976E473AFB04EE2801DA342B7FE35FEA3966F79C4D167D5AEE5E885C5418DD14A91A06032916FE34EDC40BE2AD9F5505BE80404F62810EBDF8A7C96FF7DFBFCCDC32FBE13A03F2D074848495AB0D766D5B35BDD5A841B566A901D371BCDA153F52A146AC59897F5F1BA49D7233BC43452252646C15612F5F27741A97D6C72E892E58DAAE7F6B81E8E3286746211F530A2C302CB4AEEA63242BD6800313ED6F5EF007971FA3DA5810BA9E5F6C98B1637C846AC89E22112A998DA631364715FDA957DB016EF26A6E4535A2B3F3FCBED6468D65806619F42FB514C7BBBF7F08C1A15266253815367014E9B08EEA76641566073879C11B9C6A760544F852CC35705956BD40BEE059AAA1E6AD6E1AF24F26F48CFBB37416A10B146CE0DA60AF7148ED9E8171D6ABD085312AB72CD03979D7477552018A2DCE6164C3BB358A1B7687D613A82ADC25D74D39E72F5BBF136C8C7A82CB3A7A1E0559E50ECDFF699C8CE3D6E9005E03E035075C04AD101CC85C5EE7EDE82880DF1764350A49DDA44C6FBA1E6DEBD083A48F7E94238470AFE01AF6CE430E05822114F24EA0B85541D93F99C414C1385BBFA4745B4EA0B3FB45A94B3D7FD0D6A5FE05C2F32616059621A636ADBE9E8BFFCD4139B0D5A0B6698EAECB449D60E531B8BCFD634D4832499B36A2216F1FEB7B939CA80AE87672E4A7468889F17C88F529E9EA74E1CF1504E81A2D516B0F2ED4794A5E21FD4B9CF5B039FC5FB0F8F77C55CD927BF157ABBA24274D8214A1A825C2F3C8D252FB2B765AAA0A3BEFF0DA54CBC829529E19B02347B8F91BB92813756C8413B6DD145C0146B0C77CC9D01C6FCEEE99A84C28E3A77A14B0B75B56AE8A648F8091DDC917C4EEAF777CC4FAA4F3F9D117CB0F0DB6BB300E913737A7620D1BCEFDA18DE324BAA0F1867EEDE9F7002D495C8AE27F2EF4164782A04BDF46AE627817330DF16094F3E29EC837AE2AF472B867FD9D7F6AC4BF058868AC15D0B7F0D84A639B4A71F9E04E4B4E84982D8E07D0C2C54B78E711E0710F6DD52DB394E3B311A38B64AE960D72E2A655E798C16E7F8D48559B9454DBBA942721350ED975EA4CCAD19C0E422EB9E269117EA62FF7FAD2F8D75561271661B2788E2B2DC1202C5E306BF777107B53A9D65C7800DCED403946E98631211DA326F5B213CEAB5093C5D2E4E2054D50DDE8AC2E42425BD3ABAAA88F4CBDA59B926684FF8D0F588BEE61822CD88360F8EE2A8E55BADF99D6CE950F3FEF895CD8DA4941848B468E4A3C388500D808CF32673417271AF4C6044C4DCA635198D4B924B15BCFC80CEA2B97939575D0D4B6A36F3F8EECEC9BAE05B2A61165E99714A7136C802AF01380DB9E8E504A96BFD015B7E01867193E26B6BAB469B47552C3F4D46DB07340F51B5FA9435AB04113595D786A3409E7E891AD64F154C8A98463FB7AF7BEE76A185B9B7C0EEBF5C7C1F6D5EEE1EC5DDC66F041569FE35B1E343264096F8C567D90F68E21F5B4143D1436A1577169CF42BA5D7516BBFBB74C96112BD80FAD78568711780022F2C679B90E39B97AE28714288890D75F4EAE850C606A38608A23968A7A09A1766F596AFD753AAB473EC5BCDE5BEEE72CA957FFFE47035036E6234C69771D472FF664A3952F9947737B4A119646D646914701EDF2E0DDC4F929F02AC36B1677E49743BF1D715520966696872A9ADE1A5115B9C4A6BFCB40F70BB88AD2ADE2FFC4E5CCA5EC3DBE84EA5AFEA71626AD0BD8BF493006E9782FF67BA6574AFFEC666D368C8E75D9B28BA769246ED84B2D2D1F3240F4906255175837309BBCA09CC6A37AAD50696EF57E6405C1B79F72B866912C17C0C79DC22819BD4389FC43505D78E5DADB0870AE822B4422B034197248E347F8A7B23ED9BA7E86A8C8F3B8C7FC1FCA347BB2295D799FCF603C4A34272D8118421D50FE596EFDF6231B3BF8D5CC4FCB91D4AA5A7719710B6B1AA41FE7FB810FC398A87CA557ED09D56F72D2E413E558A7EE4443A1D48DE20D8F11598BB000FD0CE59F1864BF06B28D154DC2368F57549EC37241DAF9DD776623B79B9C02B81C31C187B65CF29381BD9B9A6963C30ACA466A8DC355CCD024F16626C84D1619BC617FEF6EDC8FA322DD7E0666C9FA6543847AB8222C4325F24232375B7CFAF667E16F76295295472CA29A74391C3484B024A22DBB02D4A12997C106DF0B1EE051017F8D7D20FFE8DEA674CB700CB6056436B5D80F5E25C9EDFA20973DE2C27BDBB1BF858DDF98B33A34EF25080F628400383310439E4E9C8D1782310C23832B63A1545E8D645B65ABA9D88091371808116631BEE7DBD8DA64F7090CDFEB0CBB402E152B3B65773064AB4349CF6C88E426BB6AA51C8E1A80096258767E6B67878C69C5FE0E2C3573ED65D28FC99BEC39132E2ED1BEF3D212E7C36B8F2738F723F4CE7A6D482185F569B2D69F64E719C73CC07F2DE9C8AC3F198C928EEDF178559CBC19C01B925291A2227E5277A00DC4D0FA68A2836E9D0EDE7BBB6B70FCD8216C5CDFFBEC4118A8BDB117EE10833B44D64AD1C672201B593ACACFCCC4AA2C599DCEBC44F37D4328BD82DB4D8D6B452854C08BAAAF96AAE79AAD1198206C803E7196E95A2F2A9E443D3AD1D71F18658DE5470E0C2ECFC4264D34EDEFACD6DBF02CB27127623E38653D3102F3FEDF61817EB2FBD5F134485CF4CEDCBFADB96F4AECC890BE352A3E318C8D57BD1A7618F0DF5952F5CEE62E95731AC62BA1D0BC1B5C6D4589904C5CA2235EFB2D6C2681A6E7C1D276907DFCC7C876352AF7CBB3DC347016AD7C6B8E7ACE5F6FC975C8EEE2F71B037539B2919A0C3F505FB7E91C2F7F70EDDFAE0B86CFB6AF6965061C4D5B2F5C6AB570E891890FA92B056A052B0A1E7EBE18123D14F64BDCC9579FEC83AA214AC5B85F416338BCFF924D247E99ABE3293D8DF2C10A80DD1D354974B2D0972E4EE19793C6F079BB7A7BB913691DE12FF5F147868047632B1186D5C069F9CBA7ED09BD98CFF31DA8698D7ECEEB7A12FCA381619BBFE33A1A0DE2C8B14AAAE85FF17133373C365B198DFE65B3D4326B6CA8188C35F1FF4EE5CEF215C3AD3744BB53A56B1FE8AF8B408C2CEF1F32A6BF35BC4DD4B391787C2E27B51D7E49EAD873A3E4E393008BA1F7CA45DC27B89D8F39F8AD12149FFEACE5D518BE2D6D74F93A36F82C69936D048798DE5E11456D198E617D6596BFD26686451205246889429D67B68BD28D8DDF3CEA2DD5169FB58B64446171A5CE7E8FD79846CC92B69DD03B04468D57FE75CF4B0792093CC1F7AC7BE6E4708EE636DB61F0D0BEAAF4ACA0129D09C4DA407C7BFCF1C7FF1EACEB064F0D8D541E97BA8500FDA615751DD2320F211940EA2060AF8E1DE9661B107C239DB9E866555F85B1DA367940B45792CAF93523D8375C7F9AC2EC5246B3567AD3A3E30668B0A64A29DC828A8F7F7D0F68603757661D3E30A3195344D1AB9126B0CF0DE7E9CE603E75915B45CD1E1A1178EBBD96EEC5FCD2B21B4208B32F3A55B2C89D5DABBC1B62FF40D0004D34CF8E49A2BC2D7650BDDA3523C1EDB98B404BA87CF2D55A52922E6837E5510B782E28BE3AD4B67737CB9656F0F15CE3B189BB1CDB4B6DA5B3927E289B464742D295F04520C7DE50C3B710472B5DA75F58B272C609EB918D8F564382DAC244F2BF9F48CCFF77205114F72900E6BE86AFD590044E8F26DF81CCE3A57A4A7A6FAA427411078BF40289B4E76A18AF73CB9CC44DE82512D74E3804E0599AA2660F949FC52A832AF6EFFEC09A9FBE9CA05A418337CC237D6B5DF9DBE12FE1867A8E41FA87513AC0C29FF675C0A3DE70A86D50E6FF8CAD5BEDEFF0083D2C74326E250AADCA2CE44A3BD4F0A410BD17385E6CA87D3ED1685FD4FFD92AE8FE47512D2B7226A0CA2CE859CA4D0920BD48EE0E629DB896A5869B193F4D4C02D5BC1DEA3B8B1A6A182FDAAF8BC165016BF0B2A95571CD84EA116BB333C37AF7F915ED5C02A307B3D6CDABB71CE3314AF36B19ED69986785DA64AA1D2419F2A4D569C69181047DD14A9C3E112B7AB7BFA8C5BF4B14DDB0226D1E318B0E3319430067D5E4419E051B0B9AA6B126DF7F7685F7A947802656E7D41B87FD62DC509E2DC36D7253D5652B33DB837F6932C116580CF2EAEC35FDDF000C49344CE1FE3ABE380AC6FBF174E9C57DB14498EF251C3C69DFCEF50F29CFBE783F28444882C998454A751E9D2F256252F6B1C12C5B177E64B3D297D3B78A2363B3D2B6E1AA4C5408CB414FECAAA1228BB014384D753A2154DC0B13CD1181AC4C78EEA7819375916EAC65FBD67C83FEAF1397BED4F7489C4CDFCBCF838E3FB72581A832B6B7F1494DF2F56535E7AD488DFB6677730162C34A130ECBD7D70B725CAF6F17060528E24C90A161D15DE7DF2EF10EBB82B0CC830DFC1E0E28C9412288529EA94C9C4D3E60FE2FBED0CEFF2AB6C09DF3CAEFD5D1936A9E99C9BDE73A94E84B80BFF870FE6FF8A79EB03ADF7DC0571E666FC6D645FCBDC5E3D3A00AE3E24B82D18F45BED70CDF38C3965914CF564184AD3994369F436990A44CEB40ABDE9737D160911EF4EDCBCF24107CC6E47047A49ACA096F84CB2BE19B97E388F5028E821B4951AF61AC4FA8A4E1DDFBA6A53C189BEED5493684ED4BEA514AD69A65FD4F29E3E4DA216319773E5EB1D0B42FC7C7DB488266AD4CF48C7C3CF4A229FB1F31DFEF70E0984D933CE90E8567C92313213FB725EF5DE07CFAD01366B2645E9059FB0DF2F31508015D6EAD9E964E94CC93A6FDE5315AD5D6607C3D8C2DA588D06E0FDE261C4A98E9BF9FD6AF3422E607C4D2A3027D56ED8B0795F93852A8B9EAFFF06FADD041A7AF1DA0376D3F19ADB5C81FD513AA9BA6AB822AD4D625D2946EE17B0CD6DB8F4E01D6B98BB535078C72E3783F55BAD3662858F686E8724B78E5EAF7CF7EBF5AC6B35F4E9F59C7FD514F7AFCC10A783594EB1979F37D6684DD323FE90851C4FE394E79A4369281F1C9912A54CF5A6EA56A9F951F9996FCF2E08DD2F3866772CBD6E9CCAE5ADD5D6D180352E254E4695A307C71F65C45443F0DBC59C2F46647E02A29FA767C646A7C432A9EADC144D488B5BC40761B1B4EB10E09147656C3A3C7D3E549F668FCDD41E61002C15797901FC7D6A7E2F6C1A6BA3326AFF9B185E0CA3C312F5661D90BE182FE46BC759405776E08950EB5C3CD327EC52B01C3AEB7B54B9BA3FBB7D4C66B303E8D272D06C3E8483DD928830D604837BE6E8D4B9628DB505F9E233CF8A4639457681E0E9210AB311241F54AEC6A0BAC8177A6298BA585460E035B65812E98CD314845BB172CB645AEBD6BF058510DBAA67098E074E2B2840B3AD835CB58687502BE064B590354433BF3B31A71C706349A4B1A5CF11C9CA8AB67AFC33C69666BE07AC9DB04F4C214CBEC76C24B015DA97301D6D247319F9E5BD48361DE1F460F02274C7D6CB8D9FBA8147BA3750000FD04E353DF79206C47BF8148175C97B068480A40A9CC5EF2F46702FA25B0159F5E666A6605735CE0CB7E96236C84A6D571A381E5C78997FA8EB0CC9CA632295772F699C6744D9BCF5611DB9ECC71BC62790E8F427ACAA966DDEA6A565F0AFC2E05531F5B437E577E642EB390145385511B22901710BBC1C754B24CC60CBC594B316ADC8DD247DE2B9429F383045E0B4A3AF730AD0D34C09E9BC408E6ABC4318D516C9930CAAC7D3544278AC174DC22C089E5DB40AF8FE33EAC9417064BE0AFB8BA64BCFCB15D12B12F29B8A605BD26DACB023591E2C439DA8058B0D8770C3AA1734404D4944515227FE63C3B1566CEF9ED9319B09115F2C5E3A2A2D24F3B39BE9EC6791B0DD736ABA33ACB1A56D64E5215918EE86E66B8FEA89B9F0EC366AE139416811DEAA92BDAD797BB8A81C9B90913ECD79A794EABE510FFBC6441AB4A6450EE3ED1E7E90FEA4043AE945D36F2F1B83EE1FEF6AB31682DCB2755893C0A27D05DB584EAB64680A8BB3D38F8EBB4EEE6FB85DB0597C419622B4F7F0A657ECDECBECB56590C6B6F20BB6D4622C851820DC3E772444066E89F939F5B3CC9E0BCE4ABC3B1550E15416F5718319C279129E8A8734D557949EEE8608ADD8233EA8F48D30FE3B1252EF8CDD90AA548CE25BCD13DB505E2EE5E4866FD6A66F3A95895D487431B0EE268E5C43B0B79E605C80D08DC6D8EC6902CC56A5A78ADC002B16655939AD60353781617FAC8056B79A50E80DE88A52AEC69E22FFE28B823DF1FE2CBE9963CBA9C70385D1D0670B2823364B6B9E633A2210DBDB7516E60F22898DEF3F24545B3D6B9C2C73F2C086F5DC68FE73BA5DE35D4D9E3BF973B9F411EBE65608EEC1727C2A1CD90ADE60DE5C4F35E7934D767AC187AD8C54F92F9E3BAEE15528F52E3EF8125056157CDCA91ADCCC71BC6BC77ED3487FB176924D28348638BF02455B137B66A50F6C8F3872996FA6CAC3C3E83A5416E87D4389D28F4A41B5AEA51F182E4A4D9FA444858D169451E2C2CFBC4E0EDC733EE05207F758A319218F5D140097334A705844DC63D61AEE52003E5A674F7563A7DEAC6B54F93F2C7340C4AFEEF2232143FEE8CB0BD3C218D682B1219C13262665BC85D015AE65771EE6FAA39B4F58F0E7AFB1C90B9FD42C8C6C864ED1F9E8AFE0D08AB7611DC6231B6A2BEC4DF3F3EA10D9C099A6E4F6D41570E3BC17DA7897B78F7FE7E7112A1658972D31D5BA31C91A8B0ABAC7E5443F284C0D76F0A8713633E7E4DD2F4D936C98B479035228372FF093282FE0C22608185F18439907DD2B7647ABB1EDFBEDFE19E5C544723C9D4B49F5D1EFD65E4F51EDDB06322D378B73718F2A63B9ECA920A120F8709DC7A3F52F5351BC004B6CA08230D3FED7BDC366EF841A0E2C788D7B803056BD8B0BA92395A2AA9C446665BA77659A3C3A29DFE8C77FD77CA1BB79A0EB5E861ED0AB23A3C2E9DA14E6668EF03A18295805C3F3402CAB06403707423B6B4FB13523DF22D57A1E5595BFBDE7155B3EDB890B41F2DE52099E3B779D5EDFFB99980BE963DD13E71426EC98580FF1AFB85E50A55C1A6786F583820EF4D3771DFBD24E306DBDB5358829F5D8C9510EB9B0361F246EDD78EC3DFED505D51AF3787BBCD96EC8617BD672AAFB63939016543661B0518A0A1DDF8BF0C121B07749767E9E1CD70880846CD1002C0BA06D6BD0D8468823985F6ACB51362A766EA40F8267B0BB79572B5D9F2BE12873908F2927E08391A5270271ED25396A93BFA994EB3FA55D779FF42546FBA72349157577E67A87A97D4020E455E252505E3EA2D33EE56ED74AC7224CAA24A65DC803AC33CB419EB7415A9846F4DE767A134247AEB27062ECCB01DB51CC8633F661F9F1F1C66A0242D0D017DE5C46951C604B6E7CE2EE4EB7E28C4E9DA71E87137AE236AAE702406003604C0945FBC49A68F55D36DC5F5AE9C5FF8C617BE64F592E23CC5A878DA7EA68C823BDA36755F9B3677045B1FE1D33CCBE7FAE98309F0688DB55951F1334216F4BD68898537354A1D315766EF063C9F19DCA292002F58EFC135D47F81C385C61EE36DDFF51C4722F3B94A7B6F520466F55C327A82E424C340A0ADC426C8474B3D32E257491B8CB0BBDB4247EFE7928370AA7706CEF0AD5EB2D049C6EB69259B45C46E737E96D292EAF346D5045DAA4B81220D748DFE302FCB2A8018A8A1F77E32F6E8CFAA33D952CED8F090E928977F08BF1961D07FD8968C9A7114C5F2F180616BC0176858B1AA2C78DAB2AABCEC9E2C6E0D0E6785579BECB9FFFDA409E9E9719B1D961F25FC7F6791356883DA6B302C44C4E2BB9A7C6EBD72CCBB61669B476E82B5E1C27B319A83248E669B62967D3C94D18E0945EF47355F86B0EFC0242B526686F4230FA3DE5856232BC2D74BA2C7E43A684DB82B8D38BF5D76F4204D3B18C1EF928B160CD139E66EA9F1A619A2871B2E3D7D62A21C30156CDFC2631024A42946E655E5EC7CB31202AF99BE088065F3920E511831E483C75EEC489DEF905B82B6ADE1E8D15D31DCA4E492EFE66EB2ACDE2AF033950AC525B0B2D5429E47BE106DAB0D69000D9903ED88CE61DA1358821D6C560EBBAEE5DCB21063A68C94903D1A58367830D1696C5B915DD95007BB0E97C5D200997AB525190E59AB466B477B2FB940C00E0475459A984F351A14CBB610EF96BE2C92A03749D5C8D697E3391D4F83F5D2F0CFB0CB6734FBC0776A2B3AA5DE85F011B8EF100A2FF2EFDFFCD39691BA637B49BF7E3EE5585D0946292B5556773DAB67075B77C334D40DE0D278FF2671084CFE0A1E27E5517A00CD572EC57FBECA8B4CA4788AF28476D661B1AEF5A8827F015B36B1A6C5C21A23748F9156D2DD6530607FA8AD491FE2FCF9C55C49764B4425F6AD99338FE7F66C65F1259FC9734F7B1F37A92F4115F76C98DF5F7DF73F98CA99C9622E47A91BDEF7CA74EE76BFCF472D8CA9761027004AA297275AA8DE2DA73A31A29E104CDE47E75BDB0B9742CF647AAA4A7343E156571D5002FBE95CCF20FFB9993E38134542F19060A969B9A9FD20CDC01975DB4DA89B9357396521ED0BFECAB974C4A8114030317B10C41B3F12BC6CEEB3EC28746D6891497E0BA38E3077C1C77786153C616BEC2C9E23F00918D904DDCF1E7EE510713528224E87E6A1D3BC001266AD1899AC695CAF7489AF83EA4829593ADE85B7615EE220EC6EEDF7ECF17B5A1AC620FAAF18BA36FE8B62EB31AD9168C104CB56ECC1B2239CE108E403815E47034639EC602AB94630B97995226C166C36052D6B9DBE8955B1F5F7E0B0AF03AB798EE0478E6CD45544503ED86A980AF2EAFF29D8478FB84F26BB230D295B05F089046252331680206E8DB7D6FAD6BC6580862E492193DA4111DD7E8D8ACBD4DFBC6ED2A29418A414DDE900220F9E511B632C9FFCE26B74D02366426EFDE60E49582DE4F9676A660AC778F8D4FD8E616A25433249890264D7E17356E781559E7424EEF88B8835B83B43A0C64DF1CE9A8B7F59D26C96EFBBCE496DE95EB623A021EC17C2A7215A4419F0938DB66D50CA545CDF0AF1A3E5435AD5DBD38CC9F5F60A8F63B5876D90F627312271806C3556F5C910A9F1D75946ACF0912973106695F9DEB91CDAD986FFBE934B0181C6A29BEED3A3B58EBF112BDB94FCD0F7F95D80B7D76E460D64183D5BB91282F892E0070381F95AEB4F54E49B6BD4ED9D67838EB5F24FE1DF043A67B7ED2324EE84268CEECE84F474696548BDB082AEFE3AA0217B9B173E8CC737742584579628000C6FEA7DA90EA1B8A42DD042BE882C7B9CDF46176B6D25F2E4C68CF9FAC5C057E0358E7F919E04347F4C0334C649E21886E599A8C397C0463FC946E907F6E3B84B86094D53A26A22F7A5758ADF1F8841C56327285A1F7EF63CDBA363F3CEC79A6119F1AC8AF46E1206819EB22F7622376ADB62E02601225BE0F05A43664316CFEF8850D53BF670A4171EA3A5F203D5FAD5958E4BF2F047FBC62414337207926F6606098ECEB2DE480A97DB39D1521C10B421C63B4332668EFF48E9C49DDE0A3BF435857BD58B5E5BE3BD0CDDEC75016EDB7DEE2AFFB43AE55CD0359C6E2E41FA6E473B4A31BF8C060518363A1633A334292EC40BFE76887F470FE2032D8EC83DBC7F11FBBDF71D24C23ABAF737D1E068C79643CDC876B768BCA0CFF22988ADEC340D83778B2C72E0C606D7F145343A30E90BBA6002CD3C281BECF18507EF408BA1C231E7FE3BA3205C061813D75CE3062F7268D77570544763CFB5146E648720EFC6FF1ECE9DBC731D09BFEFC8950435DEEEAFE6A3253C40B8A504617F6F1786A3A9DB2E3DF2A62A7FE7F429172CC1A71A3B05FF7AC2FEA89D89F0365823896190F6F7772A485DFDBB9AB7975766874A5D36669FC3A6CE70880729BF959D1455C228E0D9D92C9C24BFFE4361346E46CF617DC746D5685D8D4ECDE45C0B6B93F1CB4E6263BD0B62646C0C3952E5B22821418196D6D79A93C79C1211825C3EB8CFAFFAFD708512C3AC280B9454CC95B0381E48550A0B82FB675B092DABEE19B5B04052BB9F45448B490EFED211A375FAE6E3E090874E0D318B1E23ED6F9527D54DF1D393768B8B990CDCA88368F132D03136EC2A314BA50EE0ABF0ACB381F7896F1974897DE2A17026A72B11CDB4B9F51CCC9D93EF82739EBD6E5C9992CB6A816B244ABB48747C73F7051C90A72EF136BF582F7E3533537F1230B2552D83A63924C7406F5E26507EB54E53729078828E130FA2A83EDAC54C25A49389960B87818EC79160E06B177B869E3D074B621A095F3553B5422AF1D11E1785A0D048B9D13272E9175754B57389517920721C144D636EE1959E9883E06D1D051644E183C48EC06801A776E12E54715AE4B7543E04C71D7644DB759F08204BA5A7DDFFDC20F4C47213B2AF0953544F23B82FE4C7DC24BC0E98065209A9325677B58E6B2EB77FB6D92427B7DD99225C3CE4F000875FF55733AC2D268F9C472405122F66D141260A570D3BA488A7D2CF79080DC1B685AFAD0E4419C8CFE7162823904F2535E6DE0546231E58E368123AAAF934E2DD560BEDAD34935B6B318EE52A7E9B084D11095357E08E525E47903275664836E920E31947634433A0F8C5BA9ECE2825EA4752A0191F2F691ACD942397982E68C6247B9FA1A989C2C897A65CFEB0A0B1827B63B35CA7A1517085B0EBD3C83DD272EAE3C33193FE3D3AB4D1E07F0447128BC1F9D545367E639405ABCBB902D72623D4C6158BEF4304F62B43772DC646CD9EF9CFBB7F221778BD5FCAC281D2FB86A3DC4AAAB1B2629DD8268A9117D2D7911DAB67535D417FA4F457123A3FF7C19AEB95A051214EE18C87239B3B82922F86349E4210A59B0BF96A089604F0A3E7B3C9668185FCB94889366B9B36AAAF934AB305F4F8B69AF39026BD79A57B492D55C1D1FF8C41A3918076FE81B90E3731254596F64D03187917FFF425B142F9DBBFA6C2AE6D6D6C343BEF7214978F7FBC8D112A8595CBFD8040688F304D82130D8F65D396192239EAEB2BEA497A75F889B0999B2DDA23F56B013C7D23893987CFDCCA37E781416F63F8BBEB28C0820CFAE1255141ACAF17E29F314BFD6005E29A322A46D614D2C279BFB688456D028E084991553D2D607368C54ECC14DEC228A1C682C5A450958D28349DA5D024CB9DCF0B41DE0114B10CCC4367857672C86C13059D9318113222D3B4FEB0E2D4A95FA850A3918E0B4E17C81442210140C09F569D3A855C67170C3CBE96F363D9A08FC573DA8D93883F4F270DA5911B8A5C2B6B9DD677CE6E7744DD0E91BB62226B4F8558D06A244969C4694F5AEE49C202C28D33C737DE079713A55EB4FE792F8718F13879129B8BA14EF85F1A97A6AC7A5BB105CCB6E8612B036F3B5F6BD0FB298818F76D90204734A422BE53854DC53F951868E3326A0777BEC4A77594633026BE0BF46FBBE046FDF438968157E95A3B9454BE725AEA44DCB35651882F44AA821E7CB512B2D4D14FD3919A288035EB139501747085527616A8F40F0FAA6B0A4837943E2138BC682A14804666D069633CAB49111A1888BC9AF37E95515F4734B18D119DB48D07431E2D9D49F66FDEACDE44B55407DBE2AA06FE1993BA41ADEF17E1F04812BACB43B7483B932603FC9D8E3325407227232BAC2D4882B68EF5D7882DA8120DBF2C65234DA4685C1005351E6B0993BE819699BF4EFB7B72BDF23C44106B207DEE25BE89F05E4161C828925E39B55DF20E95FC9A23E9F8F6FE6EB98548E3A74C5B09EF86B638D6DB6D8B0183D71595F23687A5FDAEF27E6EAFE109AEC416A7C50DBDFC9E08F1E2033E18CEFFFE3EE18E6AE71D0975983D50BCC9072FA049591C7AB653EC9198C5B4F2724ACC278BA80D26644CAEF85688ABE8D031F0A44A844668BA1F919FB86C577A406F4F4DF3953287238256E3C106D59F701313F79D9E44259A22B002325FA8B7A3105478C373D10236A1FBB1C703D01826585CB925F69450C825B91E0E7D815DE41F411426F18D873DF80052244C6BA4DCED9641FA0F5A8E93A9C84A1BEB6AE11092470CEED4CDB77504CBCFB422FDE56EAEBACB599BD73977FBD7DC1EEF692DC6510BCC0D673484E35E13871E2A8EA47F171C1DAC808276AF1597EAFF6F8ECD89DA10A3E2A3FC6BC2774B3780AD3EDFEB0B952028CB198B18EF2B209FA98B4CCCFCF559BFFBC2E473776D1AD3CA98C40590823E851E114774A565EC690C293211DD869F1AC50B8F4349D9422CF013BD89FF8373D1F39C3F97A6367B116135E16BCB8B57948DB100F441D05762DF0040CD52F4E8C78BBE39E69B502CB99946C4F03A16D1130CB08F378725C10A38461BAF72AD1C708061CC192081886E87CB5A52B532B3E5A0800D02C0F4ECE2BCF300438F96DDEAC6BCAD50A7E3C07682B3772849BF7752A81D36C8AEF83714265210EB6309277C6B866249A8B28232795E05AC93289E65054E096663619CFB208BD742A8CD043BC3BF699D86448589C680493ABA11FF063038C84D6FDAE68B8847C6B35A05C054EEECC4619D7B2EFABDC05C604DA9CD07CAF10C39F05DB6E536BEBF1133F9023751120BDB1720E72771DD68D8000F0424C3B8A047A806433662FF54074391F230239706F27DC7010EB95D1A378121276EFB4F80A33617439F55A1D5A63803AC05C3D60DF8B79EA7C36EDDC12772780CB3637AFFCF391CD154C670590296455B68BB9B90877D25FE6A1C46AD5EEC7B7DA2DABBF5DFB85D7DA34E679CA2C08B60C2F00996CBEA3059D4DDA01880A99BC41CB1A340DA8CE3D5F8C4EAEA6696AD4ADEBE8CA748E082D5A718221CDBBD2058A8EE944A0AACC0855DD06C97A79A293BCE45998100D8F605C023EF62208230511EA3A8F7DCCCE835822E687DDCA1853693A82F3D1C3F090EBDE6E5384C680384ADC2122BD517AAD6D385E637219188D9F11E47EEB948F16AF692DD809B1CDD7B20ACCCAA20E6D1F4FD5692A2D09494231705DF5AA1AD5BF2BA19845FAD91A3096ED81E7ED859D31A7BA329EC5ADCD1F58F89AB2D0963D67569670545668A579FE44B9E1621ADD5C9378B7AFC2F96716FA19220EC93A88C2D551DFC15EBB8BCB4B2B2D491DFDA4E0EBDEA9055A76548E90DA126550F147D8D81BCD265BF10D6DCC0F0893C87ABBDFD545C5B7B6ED2EAB2483650892E011D40EA39202AE8975457ABE4B30E889C8D4D2291DE341976075A3D589A089058B57A661DA35D4E0ADBBF4A98C9107A6ECB8EB85EB71C8581ADEB27B170AA519CD3DD2950B33955EAD57FF7DD08761135EF6DD12251BF92B8EECC59F97ECE985174FF6A81B0F850F927DC8D09DD3FF982C902D1A09D3FEB3622E92EAE2BB9D2ABBB7924EDA2A6E980033D2509D8634917308B6438EAFBCE06F48536DB1D25CB015C65D895F7967E3333ACA04C431031C2E952853BCF922D2A2795E18E2993CE6B123BA928404713D82964FC814B6AD6999FD313F225CC6C404D72FF29522A8FBF5801A3478F99D0648336124179BF91D5D8013D881AB41BD2988EA0E49B2E972A2DEC6DCEE4F3A5553C388E447235F71F2D157C84BCC0AA4EDCDA855057C24BDB1E144C7F6BBAFF79A3DE357E3AF462664A81F9BC503022573F9BCA397AEADD23D6D8F3D312481523F42ADE0BD764B3DA1D6A8BAA21EAFF1CA37228F600F0111A6E885107284B373ED361FC80CF0E6DADE3DC9561331559316FE4E23F7E54E0547131ABD886CE17A8B1B42A8EEA20F6F834D523CE45A069F86A2DB50C279DEBF2965F880BA0D84DBF07A2F66BA4CAB6381C01E4F9AD49587BDF4DEF24590C213D4A6554352FD5815BF24D11A735EEC099FC5EA7828C33C5890BCCA196011E2AC5B65A35F2FE4C361E520DC326A8CD49DA285D634242FB78B2C1CD634DB0F104E510D82852D5494F20CF91B1D890116A535D7E5A31850F648E80FDEDA46E830645321A169DFE34575F1071F6692984DB528FDB9745E5D165E9903E3A548B75EE8F1CA74B63A757EB21A8C33C99491AE0851EF9AE859C53A22B7F182F1DD01AF9645FBB7D0AB06DC14AD717731DFBFEF754004ADA3C8DDD2B15B19C83466D51A2277915D3E112811A36CF1BE8105F592C6EB7D86CA9FC56F0700E13CC3C6B125E8BC7E0DD5552AD4CA81531D7187391BAB9D9EB2B1D4BA7DCA702ACCEC91247C981BC28AF71325C1F1621FB7ED3E786FE2947DFDF56FDA8062DD81A9FB49F386575A1BCA60CC35A8AEC0B27A4CF3E8A57631D03E75F581B8028CBD830D2EFD90B2DE408644B01355D07A20FC7128FE08EFB41B3D1174715C485B5416599E0BEE7B96BEC9828E5D1A1A37D10F2387229E92C9C94B9D3AFAACF86531802B72BE362B9CFA378D752E55A6500602EE54B6B925D8EBAC97B5C032C0EE302911EBFD1F0C9F96485B0D4C20606DD1E5D909EB898124CBE9F9F59CCB7C0186337AFCAB364174E9D85BCE1A12E9D0B8608412E9C1E36268002B0F6EFA78A9DB3535CE4C67C4658B87F3DF348581BB21ED73C90CAE966457A527B0A699E8A762C8ECA17F75981D1B92C6F5D907E856921DFE5ED59370D8DB709E58FDA1C84CAB859D2BB8987B9F6BFA2B9678AF879A1D54EEF7DC7250C3DC4D6FE4C16ADE97D1CAD6C4F2AFEB8A2010F29A3FB8D488A8FD3EF6E07B6994BD6BE0281AC64A690B12594C854892BFACE17941E4F8FB53CE7B7803AFF0BC027E7CA6C43544057F33EB84071F53B5C707F8CFB8FC7ECFDA740B8241F9AC8DB2C2D8665B85E0578940FBDE90A07188C24F848A970EFE1B29E40B69C2C5AB11A2FDEA9DD0E9D234E14647E2ACC55A4732D1C15B7CB014C20EAEE4A46A242D22E5645E0E1A71CB2DA037C69177A450870A9B7641DCCDB2543A1A82FC77522D4FC2B58755A621D43D6AB676A70C9063632A8BD02C1BC404808123E883EF06D5C929C8AC71DB21B3D60DE974349CF5CFCFDE47CDD035DAC85DFB71EA504E77B249120E3F0EB199CC360863710350E076F12D7C2EB7A374DCEE91B159A8C658867D3AF3FD91EB71C9A137F81E54C58D94ABA2978440F7435BABA3DDC081CA9BE505BF96862C6680C487F24DE49A964C91AFB7ED42725E4C103C2626FA85B529856064A9479732A1D7766F5E88D6664B656A3BE1AA674429E0613CCFBBD5AE61D2F4F8A442FA678F58CFD57A187531A47017915767C997E7141986C1486E14035128F7DA92DE3E00508F1D78F3D73FCCD31068C5F518BA3EFB0CBBB8BA3CFF43935930DB7E73185CAFBED82A80D4BCD8D49E1D2B33BD4E0C1CE7E9EFDFEA0A4C8EB10DD94BD51B690BCFCB017ECE3AC73D0097AB44656B0307FE59B7EE626891D1064C29BB779600AC190192DBF462B57E8920366ED252BFF0FF406A6F72D5DA29716CDDC81D3318F0D8E440DD4AD4A5895DA7C8F8C46FF651603AD2B016761663DD7EA0B758A3DC019F3136F9C0385BDEB7875CA5DCA95C74B13F5FBE9CDF4C373142A5B7D348F4AA58FE830F84CAC5CB1A08F9A2E2BF9C1FB2C624D27CADA4599AA5FC861CE933116BEF79B2B73A1CF030F21B04C1BE2CBE2F0AFAEB6D172F255BBC1F04A511B9D00ED74A66DA84B0F1345A4C874ECA97088EC76E717F2E83F50E7E8710F72356B9AD9EC53613C4FE6052CAA6D998DCF470D957E50B94DDC8985FBA9B5D81665CAA6FD5027F0496B2095502442909C4032A477E4CA0CDACBE3EAB381562ADDD43CDD61D4228CF613397EEB81B8202A2B2CDD5C1C5A4645BBC5BD1CCD7386CD382E86D7CD3228F6687145BDA56D3FE2F3E538B9887B5EAEACBC33EC79F6EE5CB92617C4BD7C8A1D8A709EA64C05D9387A3C4D95F36F4042DC87DBBCD9910E45C391C6F4D13A23C47932634C784CE7A96F631015AEFC4C9C4FA8CD06B6442D51A612D270E5BD322E8CDF4B7CC7AE4482AEA324CF3AFC10963C78077627761E3421D14620D95C8953FCAC8E485EE05FA653955DFF93C6160F242108F83065E0BF1367847DF7D0D7300FD5A397D99C37AEFF6905894E19FCDF9F6C75AA07171F0215028D265E5337A37630EEAB770A61D5F9E8F8D5E8E3B46211215B9E246096730E57D75A1357F97ACC365EA96DDEB75FE7EB6B39393565CFB417FCCF5223D0F981AB48466DC16759B02458F242DD0DDD4A357048AF6A5E82F7C173324E84C1952A078AC85BDA36C05E713D340DF854716D7618F712879B573FB8B68FD2E47F8846EBB1C3D66069DF055D92F9CFFD6345197D7A9BD0F7B76BE7CE5021512550BE79F3B2D2878F6B884643BAFF933EDF1CF8CC4897725BFE4A9C84F721964CEB1D56F40BAFD9A0EAE122EA0076622A4464907C4C384D5310F276077C3B77277B9F6ECA541FDC5F1682C57751BA38C14DFFB4D28959FD25391AF503264708B385C311CF538733B18363A7292DE553A9BBC41DADED8B7B4D0A213EC6A748EACC37CBDDBB91F4A67B025591E16845708260344B8B95E01FB93019D3DFFF742BE6D6CB642C870964F0D47DC3A794B38C635C25A413DE6E14CC5B4C5F6A19A1EDB9889F57FA8BA3B4025AD2658007C5BE0E11CCD43DE6AF9F750473E7178FFD9C2A8C212B2AF3CB2AECB2605ABD981853EE019FAE50748B504B40F8BE10339D97F9CD901FAA583E7446CD60657E9ADA31739799D2E07223001F2EB7D96CCD4FEA537FC8630D7874CCD1E4DFC1B763249D452DC959A4B953380F8A481CB2151DABB2973ABD3AF676096E4B1DAE64700F04DF7E80F765E927ECAB9745C7214EF55D65BD6B1D31A00ACDF3F81404BF32244E99ED5554208AD9C6952568C7ED96762123E0FA0E5E02C82C6CF5463891D4DBADBC80A8311F77F07BEC4DBCB71F875B373A8F46E4DA0DAD38622D7CDF2842D621CC1B8A6CFAA85C5427E52B4B3145151E203DAD62399CB266343C396D6FD913661DBD599862572A53C1C8BCF412BE600649C991157AE3288933819F70D6497E10670EC18EE8E07E58E5CE3E686DD5602AAFEFADE329E44F0938C7961E95DAFAA7935891251A62F32F0237E920A23B4A458B7F7932F144FC0CFFCA01F1B5345CB9F9552FBE69FC87E083302C6F0E153693A0715D0BDA2BBBCCF0A48D2C5D586F72B171938B880DDDBBB13DD970D6B475DD0CB8640D27F823BA44272149A7B70E8509B6B574D7213E9EE767AFB9C2242D6B70D0728F3FCEB1EFEA46BB1A1671E4426DD1EEE1F479265EBB930838CC38183988235C58EF083097D572910C70F4EF45DC85D7BDD9BBF179A1991E7B9C6ED5C250C19C0C95E2C8AC592B91178549EBCDC6457337398EE90EBE8EF74AE489C0F292BC7E2E5C069287C009CA074C830558EB7C28B88D5D9DA8173EEF59758276B7754E94E588220211ED6DAF4FACB479F08F072860E8FD3847C3528941DFDD3DF243859B273AD437F46B8E0BDA4995F4A8F4E0213BE6C01D14AF030BD348A497588C2FBDA403DB2C2128D95A694002B8D8BB99BD76E8D9A83ACFA8EA10901C8ED8EABA13E6AB987EB492BEB24F1DE90AD09CB3512046A6616DE5105E421A884D2EF6ABE8781196C9E1B048928AB2B36A8EC3218CB989A5A011F0D5037E91B742FE2D858F938A3A061A72A8D57A15D291142B56AC7100F092028C3A0A9D001A5115C18803FDB3BBED5F9BC50AA8BA6E8AF302DCF5606C319058BA33915F81D2AB16829AC833E6FE8B9ACE289D5E6B9C4256835A212BCC099D058077896790372F17FB249E25C6B15F6AE876FA31A0493D926EEC95430C4B16CF124E013080369D91C5F7E6A1B1AD08B6100837F5E0295E97715DE054B902EFE0A04D034DC8787709833C0B0364DBA5FCFBEA92D2A18AFDFE989AAE00EC9AF6C2D37D23729F55E93BACA9CD3539EA3B4C8B011B322477AC1DA54D0F4042FA674D944373171FB8047F7847DE44E714083E9DC850FA0D7BD8BDBCE5FA4E0BDC356F61146042CCA3809B424C70C6821601D218CC61B3F80943297BA9DC412B26D3B2CB76E5436EE63186DCF78402E8B7CD7E310BDB5E2FCF9AA6472E0E3933E8561AE5A7EBE9EA4DD14F720588F69763B8B3417643F1EE536DE7FA9678ECA1B0BCD7685E5EA26C07D38628FF7CA45CED0EF8004B41E6461E1EA61C2B3F20DA8E33272E8DBBE09A7374427301CF432B77B6", } test_slhdsa_2 = { "tcId": 370, "alg": crsyspqc.Dsa.Alg.SLH_DSA_SHAKE_128F, "sk": "85C62667654BD73D7460BADEE537F0B38AB7926055467BAC28FF87A46527B376478160363A164F921EE140E76E680235FE638D0FE56F79F7614D2B5F5792A401", "message": "425728936187804FA006B5D07DA7701248FCE45D65AA2F8F48B2374DD54F46CDACB9FF53E7D86109F6AA3A695AA28F4587264094C9E85F42AB106BC39176FADA6F10720DEDF8388990AD46C5EDDBA0B375C8C3CF2AB5DD1FC6ED4C2061F2B73C702744FA56050E4BF56B49A707262FF731CDB548B26A02B40BC813FB432EF4DA544DEB1DD3D1812B1076392D69E9E8DAE88F4F56CC0C8A5C4417CCD7301EC12F98B390EF001887802381543DC647CCD7A0441A055E8D8EE53DEC355A51A5AC65B3007436C0881E0295ADE35BF1C7487A721D7CDD84752F0CEA50781E1A1D2D07DC46040FC13EF41D219E7A8E9A7835B50B4F787EAC89ABB80F3574B5A540A0103B7DD3277D54C9EA9C2967302D3F425F061D5FBB2D6984B06D82638B29904689CFA8CDDCD73CD36A0BA5E83039183A72C09E46EBC970B80959AA6350BED590845AA14968B202FD4C08282BE672DE5BD0D22260B914A02A18117FDED588DB92368B5A0F94E90D9420585B8BF388C989387FEC2C510B1BDE69353276462355A7941BB3B0FB16DBBCFF746BD5F309604B87C6022A3070AEEA3B56256FA60C088C2D4E9553D3504F3AAA1C9C00F557358FA5D8824FB083F6296F87004B5185D89B74612C299806240916B2AE26991D713CA277F57FA87DEE5A782D59F85A66ED5843361E6793D7069B582BCD9EDD6E57C87F5BB13EDE1BD292C9C0009FA17C35E4518B95F1E6F19853B6D49A7A10B71A78CCFB74904A3EE4D82704582C2BBC6FF2A6DD56F8E724C3F3ECFC7DC3F4F99722EC2B5B116FDBC2A8847D15AAE5845033978F74A8D907A4280CE36B0CE769553DAE3DB07BF007821B8530008C4DD0D75709642C4A36465F9DA74C18F1F648D88509627ABCDC5998C4D9ABEE39A54C7425D56254C0EE5E9F29FA8CD589CB5CC6746AA6D8C2F5ADBA5D251BA9D6705A2A7DD5E44EBDBC432BE224706996B7BDDF83825E94CFCA4A09232011031941C39964238D46ABDF49D3FE75A20CFFD1DA6F2834EA9A09BF4E0A1C8F2D068F42A185306F3A7126E6146D1C68531ED466995127A045BAC6F4099F95B42DBF4C653B52947773992301106DEFB08E135EE3BF494F7A6CCB9435FCA3095E733753041DAB7CB10193B0E8CC936CD9F0C29812FD08EB80C36A11B804950B2381EF957C47E07327265CEBAACA12E57D8398CB08C68A4D08B39BE490D2A20DED3E7AFBB211F072BBCB5F9D4B109F1CA8FBE35B1282499D7CA1A66DBA9B3E86C4A7FC49E6BAE061DFAA4D526407EFAE20557FCF5967B5E98760B69272CF1D", "rnd": "B451AFCC85AE3F18DC3B58E3D5906525", "context": "98458F3ACB5ADD0E3A51F14EFB3BA6", "signature": "A15EF69053D2B7475B4101AE6DB1FE949D74124CF978559A278B74B30B85B90006E52476F88B8588029BF2058BF579B33DDA30571082CD69EFEA1A3661A1F52E64AC699EFCE97DC328DE7A4A9B0DD3A0E4747E2F4BC4C6B1779800800ECBE67FDC682CF0C5E4A5ED95334401E20ED7FB27BE2520C72B95B432816230595D9263D8CA65954663639B3FC7822AF25913EC32F2212E81315472B1AE95DE1F83F69ECFBC2C72EDAA298D7C06EEA1EA583C2781C64386D1C47F8C047A2481FD5EA87BDB2346EC93EA2D78205BA768430A338B269054EA26D3142121A2777AFB8B4549D3269035DA39A53A02688F1709C135672E03146A5A0A056446EC90527C2D43A161E97C4C969F90D43467A6F854CB8F6FA41DD76863F1038003F0A51B284955916A15F87FB1AF469A8371227E651C53E9E9F1F7CD67F62AE53066B3BF5E142AB7E1DD556F6B320E59A9AFBD2785241A66CB1FE00DA3F56A85DC0F6166EC13D49F76A6C775C0E3DA448B7C2A80A058D51771A4B3C37FA5D05C3B93DE48E0277B9F34E07C158A5EA1D5F6BA50B5733581C2D2989D0C8372B7C41ACF2A967489B8868F6673C8201D13AE9FC1768F8755CA22D23D524BC9D2F80A5AEA063ADED348EFFCBF05F5161898730A8D9F5AA5231031F6949D57070FCDDB99B6F586BAC7B63464A01EE6E6D5FBEB54A7CAFC64B0321533C6C47722EE04C00C51C960BBAE4ABCE0B69D043737E2F17297F61252F1EE7DC86F7A06B7F401776AC7801F72BB69034EEEC86FF44183A781D9442E9955CE31C23E0F78CFB3A52282C731E8A52BA38A40EC80FD90CCDE959DFB0A842CA8C1701F08A22880EF943DEBC0DC5922AB3603074B652BE74E19813CDB4F222F4A04EE1973AA518A3E1DC29AE0E6DAAABBE85E2481D0AD4E2EABCCA75095564D84F5E5DA19EF849619D53AC6926ECDDBB5E0C1EF59831F06866DE77FFF8D1ABFE28C13006865A55966ADDD166A4E8E64873A688BC6120AB5C2345BDE1A1A11659DCDEBE64275E959FAD9A460C1D4A4FD90034950D74B54C4864805DB658D4D4C282D57C7B7C583E30BDEA88A972F42267F98DA091449FF3505EDD8E27C7DD41F353B30F7B91D6F400777F0398EDD639747DFD5CE5DC3A6558B639076FF594E20DA5B5065B30E540EF79F01A590045069FB7B0A4707414F6D5E51CE19825E9CC35E41C8FBF8FC69C8FA62A82D1948AE43D6C4C91B54E3D303713D3644E5ACE7EB86D95ACE99CC18814E7FDF94C02B671B150769966AB44720FADE3AB7E32DAC192C0689F00DEA9A88F225B4C9EE275FF4CB494943E28E66088AED0C535603F2C4F850F8DC08DD0B2F98DE1D040CCE5E493055C6C5A9C87AE4887C2E68D46AC41F934B75AE4291E51048FB19008E9CCB8D8C4076324C45CC056BC3CE5B9FC525E08506B0FE36A7D31A16FB6B3958D03331BC2CAB8C0707161DD28D26ED5CD0BFECFA65308FF1D0E142692738317C4061F5DA03AC17C4305C6D99731110AAD6D109E6C6BD67D90F12D0202BAC0A341945E9298DC655150AD8CDCF8C71308B74E152613100C628C5FBEC464913EA1045429E550EC53AE860A3FA73D60F8D4A84A0092FB83277AD386D27D99DCFE7F8A22B7A2738D918E6B4139477FC64D0091DE7842952DE26A142F860DD6519A1CE2CD3AE828CB7435C9B3A33E2455F408EFC7540848E7C5B5D592E9086E4D7B6FAD527B0BE1D5CDE9089E11EF7629ACC4FFFDF8759C6826748415C4ED1F28DA62E57C1E7285EE39BA98CE85376F317C1882736A4A6EB4C4BB236E54CE17A53C6769D4470A1777BD59906DD6E86DF5675E9521B6EF0A84CED33B1E3E5DB903AD2F9E89A81393DED7EF69193C3F94190F259643707BA41284BAA8175DA4A849CC26B1BE847853A7A7CC8BA397A1CCA5FBA93BAD00E11108C82B20D7BEAB15045D00EB91095FF2A3594548197324F686817F56F54D614F66C198CB3A19FEBC19167295DA6FEEC5AB306A94C38365DF8F795EF7278A6613910BC36156A47131024C411DB519653C3A98E54D72D59C1342256803D7B8EE2F5EFCA9D3CB2448DA197484145B37C9AE44B156A88BF622DDA4DCEBDC757D85711FC41F061DB40FDC00BFB39FEAF1EB527A5F8012E0997B02309D62348C2FF29EC06FC35542654B7AE3C8D6FB878495851FDAA02A8077606973D473A6D28C237363D476E5085A8E7EA5B27625804DDC9B7107143BD6C7F1570852BC1DB8303C90959B7DFA8CCF933BE72CA1BCC08D0DA4957660578B8FE7BB06B54ADC59980CAC31CDFCFCA328F01E65946E3C7D45462E302AFD8D1BD93F041D24DA3721D05FBBB2AF6991DAC3C056C599B0BF87F6B31CB390F70D99D29423D7CB492D6ECB789A5FFC3E0EB0635732A1E777863B863133294BFD755906D03E1DC7D0A4B348E0643537ABBFC38E28A380322B62167AA396A795FAEF108D53F2FE21273C34727645BF181D2D88568440E8A6C6E1046F33EF70010A8AC4250F8230292EE800223E2B08FE82AAFC6C4984B58BCEECE3243CCFF39703EAE6ABDCB99FA3164FADE3C85C0BA113B7B3CF7399890E84C0DDD26723AE01F1A0BF00D6B815658D6B6C7230248C32977DD47F6303E5C0833D3280E72370B33523040C1B209CD887B8E88F723B866986D29D6A1F6D1AFC714AEACE8D39FCBE77BCED35EDC32BBD49985C6E8A51C77CB313CB6086D41FAA2F2A25D8C063023442144C14AF64F1FE29FA764A35A94E85A118D563FF76DB09A7FA9A52B83C5F32F9F096A2CF2CBF5878E4926BC5DE40A2485D72411E3325EF9AF59459670427EE3A7E95465E7D3455DF870BBE96793176B1A17DCA669CAE1D6AF40632C7026D38AA01D94BC4B8E42BFC06BD80B01A4FD1ECEACF4D9597D76A550B793AAF0387AFFCC128723ED35C55F238B226F69E896DCCAA57313B5E0AD2696B48CCC92DC09A4DB322013F03550A7E216B666647018B9C149E89C237118F76CFA76562E78F5C059D003A2AF1E7844790F912A2372A536F2BF03D5A1781AB4D1E762C167A1611A4734F274BCAD20FA7CF828B5189EADC5EEAB26496FBE9A7216D7FA7F3EF752D5B484C5A220ADA9241B6EC2A124977C899EB1C6275389494585D2716CDB297E1D5E11853F93D447D03C45B55589C9AC2753C97AA785BA06FC544EBEEC7ECA9710DED1D260123857A280906CBAA9AE642BC26858D2AFDACEAF50D62111FD113E650F0CF3558FB2CE459A2C745526894AF4BE3897765DB06BC2C57E425012E031E624EEB8C668D47F4A3C359E8026E548435ACCC6781F412391A3574D28F524B49B4702D406CD992028258411FB4FF432EF8BF7F982B5B292690E234C1EF0E215238569DC97D4B284E54872F61F981780F759C4541705AD5CB00E1EC6AA4F43DADEC1D682296C14D85CCB745A956886E222831F4C3B60439E2F8DDAA352979E3994F5367673A367FFA8314F199CB02960ABF31578A48CC44D404B9E0EE39307C51BCF99C8D57C85F69FA4285482114212B7A170C3F16FA3320EE1FBCFF684EF1164276AB3360CC85CBF09A7F57AF5B7233F44E3B45B4549353B3A2DC04AE58C20369A2286485016633A5241F19EBEEF5A33A24F20B3E983AA5C68521E1A950B932A1DEE690E2385CE116942F8EAAD6F690E43B215BF7246B19C987C9D451317441EECC9586FD53D051BE5AB1A4AD8E90BF6DC42F07A2BB6ABBCCDC75943AA86EA6D427FBA9F5A4B1584C7E74E05005DC831845C5B8C1D0A3CB8795A30B475A18F75C7745A40C3452E492EFF8B9F916BACE3A77A773E47807710700DD8CAA27DC5FDC5BECD4D6A15DF8851719B1A9A5999F02217ABCC16C22E88A662EF62E2D8F28B0F3B7B376B9A10ACA5827AE0008EC680E709509DEBF5D2825D1E9C35AA7FF7831D868AD1EF0B9A44690DAE9C9024D40B34447B0637D7FB3A7D4958165689439085A698DF597BF7E8ADA469CCDD3F90A07EE161B7BFA8E0AC36A3FAB6C09B04F0ECC77667E732B882F302596DB1777FE0446E4187379F2A4789ED64E6F4EB723CB80C891F95E7763C23E26DBC674461BFFBAB4E1BA83CC795944F4E27E844CD9C514F0B850B7384EA4DA0AEC7D5538D11B74293346229922FF71E5679FC6DE32A224CD10FC195D65348E0F1112929801B01E82834275A0888A1746F8CF7C172BC0B0C15047A92B422D20EB7597FD4D1A6413B5E36916C8CE4F9A6791FF4DCFEC087FE97FB2856EBFD7A7C43C63583C13E64CBDCA5DFB255D7B716FF66D5B453AC20D27A11814594E60466734D4406A0980A420B215986A9191EE7BAF7A1A4789FCCCE7A60667762FC5C431E873BEF23F887D16528ABE1CA2E3F23039BC156DD689907314DC1F7980DFAFFFB4A6AA73C34576EBEB5283C4D3D7A470A76ED1837828B19AB2969CB19A702B46BD35220C7B15ABEF6E471C6BA3907CAA99FB6F3AAA2032215A5B125483DE7AED97D23BD57AC695AB4FF26C43A172B50C59F5B029E7A152765FEAFBD46D1DDD9958ECF8CDEF1168D4141C8AFD140556B0461B474D551F737BE85AC3C915DBF25FD3F3BAA9F3D88F964FB4EA8478D57DA33F866228A0D76B00929962540ECEF578EB7BF4EA594CAC729E234CE89C5198078E08A5C30526186C67373B821DA09BE851447E92F905B67176F0103F1987E9C48231559CFD4B7F7D93369AB664D9246C9A0D5DF569471014E66C242FD3CD83996B6CE808361CECDB0822AF373FCFF38769EEC3445DCD4784BDA3521537C831DA3D4B54618237D62B105D726127099D764759962013399217D32A538A4C09DDD3CC48B83DAE879B156F566D31711719BBB80A4BFC1EA56721075FA6238EDEA3F87DDE2B676C72F2D57ABAAE373FB3CE0071600C3B8308BAE8E68835C26F8932619BB81CA007B469F5611A05ACAC8033B3EC8D832E107C923BBFFF67F8B301953998C9A1786D97C7390E3DC804B76EBCEE000C6C1BCEA7C77DE60ABDD1D9041D2431BA3D6CF06EE2E5D793455BF7E65F0B8C5DB84451537EF8259FB53E57FDB23A465C56B72ACF91829268E542C44ADBBD758E971A487EF619DEAB3E40810B3375FD04B93E4CE56F62B71E92FF17C1385D410BB5F0CE83536D369EC7C86EBC739E8DFD8D1F764A743A6F5DBAA71900EACDD728EC0963E95E108EEC8939A16CF752F16ACF19F511EABF44B7E19F8538AF81DDC59B50A28F775AB580B4F888667E8909B59326EDB30068C5D47606654A47BBDD036D949956140F74D8E57E71C6EEBCE4740E1432FA6D5E2D68830CFD7C261FFC4C6F7B52D4EFDFBB2576E2368F6C5B67DFC1C3BD91FC0ED4B1571E5792526264BC0E7BAD9E4CBAF9DAA3EB6207177C9A2518161BBEDC32C7B8BFB30CC9C271F5202F161FF2E853D4AC5C66FE8D390D5DD887C34E0E18D1DD84465544434D47CD25259A0AE1CA8A9CBE8D7438581F041F4B8759EEA9EDD51AEC74E2950F8B29755B66E4A2B4B1E7D7BCCEE01277F4FCA86A9C966580AFB23B66B985E883665BF58DCED4717C90B05101128F295D37A958D7EEA3D772136E4AE969AACA8F5FBFB8C69F6F80AE7FF959D659B25B631096929C4B26ACCEB9659F3BF207A261FEFBC0DFD4C5C6733DC95179197B8CBD9D6DF069B5957C66B2827C7C84824CD2878DC3E454854806BB5440DF1EA18F59327691104DB8633ED02F1BFF838933B07186F4CCBE9BFD672C001B886CBA097C1BB376D4D5158CCAA826225D33A353CC8D0766839A5F38BDF215CF37CBBE93774720648C3FB50156381F2091ADA7FF0B0B7E7FC5DA5A0A45AB49A18E4015A29E838A2D123B53C7204C9665F3AA4916842C78E570FF5B58C8E7B5C80F9DF51E1FEA23253989253302C05D08FB259354E42DD29F68BF67BC07B515D0462F87B9A5782FF9266506733ADB1D7E32D7077DC5C387C8EAB8DAE16F89B5694332170B1CB49F19DAD1E66A144041153BB261EEEFA01DAE3F328CBF77DEEB08859F7B990BFE9868C19D1EB30525912B2CF1F86B39CD5465AFE16ECB258BED4116D2EBC6F0167734C7FEBC1BB8D046EE57381D6CC25D369347C754989D8C5E638E57FF70AC12460D5E23B3B6D5056D0ED1D82B654B63C67BC1C6846244CA6C4E9EF188AC929C5DA0946245669761FCC8E2D79D938101CB8722A7245D373CCB85830E85CD0B8110128657B1A298DB0C9C1A37DAE3DE52FBFE6B76466633E3CB825B42ADB6D941F1E6A6A3C2A337FFAC94ABB83A9B4C197074824E9C540FEED141C0FAD196D67F6391E9E42CE8CF437EF10F5F72854F2213796B4505BCAAED50E48C1E001B692E5448C57FE8BFA220009AFE70F9D16F4E014B9E8D88517C70785164B7EAB00E144A0975E4E5ED2F47F36C746E342EB07C7E3DCD800EFB0BEDD20AD3E0DE671673DEA2E55C0EB73A6F312FB92A34FF59545F4AB285308DB25A96C9A8B103966225491D55523B31B8442F63FD290F4FCD23BBC796A67A7D30AB4311C439B98C729731A77052C6EA21F9E3C464CE873BE243DEA14509CD14FBA05E8CE6D6D246BC3B39AEDF28126CA14ACDD8AD5FEE5DADB962EEF614C2B9A71B64C34EB22148948A4A7FD80EF97358F4BA9DC882E3C50DDAD885141731ABC8E5E0C8D030A6FFDA199DC6F79801BD63A65CC2DF6C40D8F90683DBD6A5541B18F0C7394D4106CD75EE0B47A182D508FC1C00671116FA05C2BB59D7D68B5D0B9026C59675A804D4EA3AAC84FEDE815D81CB2D76D9BFD9026019AE4D78EC6D08ED28AD636C875312854A3568C74E0147D1EED450364133FFBA11F99473D155031F98BADAE9CF74EDC9FA7245A20FF71968F9FCF204D6841CDE546065311634A43DE956E5C6C5D7E4A4788B1D8B94EF3AC3E67C31F5FAA20C76C58D02D70EEE8A5FE9EA5DC26F76142B61883985B88A6F2C30963F27741036A4012440C3E3C7973DB188BFB8D120595297D940823889AEF0BD47F119D1F18A68486106A4B72D2DA782675FB2FE5F2EEE7CF35C4A8DBA3AEB67AB90CBEC68E2DB57BD279964CE50D0D253BCEF35AB60CE5DC112DED5F1A91B2BA13CC6A65A65BA88B4B49EE43178A67EE259FC3D5D434B01A0ADF8DC46F01A9BC156929BBEB97B89E42DBE089929354B74B49A0470651FB9742033D1A8E76E5961D294C004A1422E1265EC1EB2DB4407F26FE6EE8F66665E678C50F23A0531F91C721375E1C07B406F83365B020DDEBB9E4BD43D48098F69A31E8D8FE5EFA5BD77C4647937E77430800376FB06A5E0F531E5612D121041DA3700B6156C3AF57F5E12A82D434790B6A90E87CFF5D429E506C9C9E8D1A88D38BDB0BE454073652FEF949E93B1E965E79BCE74C313B08E42FF63714F7B5F35EAE20D0F9027BFDA91EF0682ED117847899B3463F11607B26CC2DD1EAA174785A7A34B655D085B3265E226D83AF79C27F7FA35B49DC2CAA4856AC07689A49E577C79BFCC815888FDAE69D6D860FDD7371179C4011A558DF3750A8DCE96BC0D3E29B8CC6F94FF9E2E5AE2602346EA262400BC51F31403AA03075027DAB5B679EF4DB0CDB6B00E21E50473E17E48D5634A7686D7755D909449C93FDBA1399ECF2A2CF64C37EAD6F4AEAE5E26C24A06BA20808D35A4CD3882C33586D02FF3A382B0B4E43B3BFFCC3E58E292F3FB8CEF29E2C8CEA423286B440A2A11DF1CB97516F2977E0960441E55FCE30670A4301E2AE3610530D6C123777C391C34F901D50E06C032006C7622983B914CB016E4AA842D709F82BCB29665FAF2AEEA2D7F6A76CE28C4D6371DDFE6A54985324B9458969D0F4A62BCAB408EB12A22930A57BA7B25E779320CDD23C3B88C017CD9C45DC50E07D18434970F41DF1A028B5BE715A6A05F6F428A0C84CB346523062B4496CFEFB95CD7E9C6F23D8CAC12ACA302520E087D0CC0210A51B3AD9253051ECAA57DB1B6D94DA570BA87EAE7D9014A93D17D17D786578A34F0D8788475D1DD6A8D4E5116DF596BF644AB96B810842E18FC443C8737D11F19E3342DF8B115DA842F130078F2568E8135490FA6254573B04DE2AFBA9AB10790DDA926DA2B3969F103C02D2EDB3BB863C5EDD0624A73760526CAAFE0D88C3429A186910C036B0710BC6E17E44D38DFFBEEA460E359890ABCC29B98B8A26ADD70022ED7CFC6256F4E085A21E3CCE97C4F857DFBFA6117CBE7CCBEDA28DC756FD9F1C9B749D3E7F4C71C89F9AEC597E4F06C671F48B14862A9AB91B5A18F65052FC4190DD97284D2485FDC205621E1102E9203E71CA06DC126EC556D7C68CAF9D537C7DFF90D6899DBC1625C3B0B8BDBB4E6C5A106A15331CCC68835D7906C57D2632F75B074A7F8F4C81A541ABE71153EE16C393F807567CF95C2FCCFE12AC2CE48C93C64A2E5A916CADEC417A0087F0B2CA2FC0B104F79A2994F051614DD8831EFA3E44192D660BCC311B80C6177BDFD765F8E95F6C84D3A032DF38FA17CBE81FBF084B7C004E1E57A85001A7DEA7800BDB7E6F293799D2E769BCAB6AC2D674D70252E548563D15D1062D9924ED90F8E2FD78D33987A6C071316A08F780F9A5BF9024A8AD349E389A628153CD5969CB8805F6C9152A42D2B6E2549DC4EB9C8CCA2ADBDC4C6298ACB5DEB1A28A72BDC95531C0706D5DF2AFB0DCBE40B4DD9A3FD754AB6091C47C1E52C9699E00DE279B81DB7B9F26EC4D208FB844B2727209EFABA302AD45240D5FB6C04ECA01A398C2565FBF77A9F8936237BA21F7D08E61B3FD4876427FA4BB5C4D9F57243B2094926524FD8E0584B045B5351E751FCC22DAE59FBEA36409E8E1922826AFC0E6AA128FE523B20934DC066023E3C506ACF072CF02CCFFC568E00E31335989940462AAB9B2324D444EA5E3FA98EA45CDEC9FA684C3A6EDAAB602BA1E962E9A8BDAFEDB315FCD9D7EE0CC5E83373C3289EC79C19F69E1ABC5A0CA96F651577A9CD0F87450FA2DC26891A4C63B9A7994CD07F680F2D18CD4853423DEB7938F466F2AACAEA37A02FB217713B31E12C1766E05E2EDE57A9489C44D195ED6DCE4F8BC1F85C2F44C32EDB9EE1957B374E02BBFDDEE5D13C490D428E03A43FF576CA33DD382D66C615A1367E2C1249BEA6471E5563ECC35E98B663D70747D85AC44A58451C9A9180FBF4600BE091774CD6A0C12335D5FCF00A65D9AF58B77F9160DB8A66DA6D6FFF50FC9AACE1BF3A1E08B52981ECFB9ADE2587D8190A5CE9AF216E9AB4C61A3F7B0C3C624A0FD3A8E56A694DB72D04B009EBC8CD3241B37EAA3E137515C217093110F4F78A21E593BACA91EC4449165729014FFCF7C78DCD235B19D773ADEBCABC5459A2E3E69B4EE078AF1EED2E25F3F7773E4594CA0CABA69DE731E09266626301119757B62627AE6006B9C10A5A984CA27EFA545D60382B41D86A1E40E3E5AED50E05ADFEEDD84892BABBF6A5FA2F81C472A361383465F7E5145F41377919794BCDD134A015051710568A3422CD6DD877301455B7FFE114E7E2FDAD0C4037F6ED463A0B6A3F7AE8BBB143F0F3E5CFEE16E639447090B1E62D051E3295F780F6F98CEB43BFA48171B3DD587863CF8C5A636029A88577D5160B60FF8801CAE56D2122D9281591AEC759FD236F6423FECFC19B5259232AF92F1FA00DD0FA3F0B889483A92779FA1740BA4CC470CC4AF18D6AAE1512D48F05BA957F34E4A0C5DFADB20A903CB6F3D3A696FB45267D94043B296433E8439336D3F8F13855B673E0AD3AF4BE5ACD9F6C322DCA816671B08199A2000BCB7C261BB9C5D638801FC748DEC07424CE519294641376BB1A1BD941FACF2A24D824273305FA08169CD59C33EF2E1A5F22449DF1DE403CBC357459E6C752FC4CEBF3145629FDE25B7007F0D0876F8E8FD0ED8A628AB7FA4D1CB68C8607DFC9376DB3D2357B61F386C4632F20D78DB541B9F62DB08E694D67BA479B15D1B803BF5181789297E0E25247481D96166C90298725A91BF6BF8A654F04EE568E3593E021FFFA67F4522AB0640FB07F3D96C6118CE32FBD7803D3050E9FD7CA956032ABCE07B9EADAC3E910F028D5A23B2F5CEAEFB971372E8B6B4309964C52CDA0B6E9873DA7BDB7EE119A11F7D7702D388711F04AFD8B1A56CF0AACFC5BDBCD9B8380590F734F31DD062CAA8109ECC41688F197C0801BBCDEBEC795D503514FF05FCDD408F1C2BAC88012DFCEE79F25A93317F739293268B28406973C86FEF46ADF07240807F3CA94CCA24FACA22615C0DBB920DA9003460036629E8C4145DB3BB39BD8F3093F719BAC83192ED50140A4DA744943DED4908276B0586B6395A0E167B695038CA3EEE71318139106C1677B6F6AECC944DA33707B2FDC2E5F5C20D0A6EBE8C08123373FB4B59C60B02507E19B4AEA3D6D44C26827EB79A510B01EE6AAF5273ECC23D772C174EF27F316148522E7B3017082832A2EFC315BF5A12906BC0487262ABE60555EDD2D5C663A35FDE696DF74DA0D83C5131011F8690B1E5A3DB273B3988F6B90C433F17083D255BC710C2A21E99CABE0C9573403AC6EA7D3F0E4374FD499C92DE98E9CCEBA792C8C5CAC7868922937063B3EF50571A67702499795E601C019555088CC3A1A2CBBC8ED5BACAD0F3AD8CAAB1D14504451F7D2E2B75AA01D76C7868AFECFDE0606F7019925AE0F9BA0FEF84739E0E6DE46AE221E2D28D37A961ADDE92FC4CEFCF83B97C1234F0E938EBC77AB41A3EF8ED47C47D2EA157F798C068ADE5E0C223549A3B0921B8333D7B3B70D1BBEB391237490E344DC4A117ACDF338C9D409302AC61651267B81C73DD305CD7EEEC48B6FBAFCCCD8537909F8037FAFE9BBD91E3C4F6A9842B4B0404ED7E543008BBA5D27B2CE1EA9DF19B33508F2D66A0795DFA9519967FA0BD2A7EC0C396787C872481BA3D40D9CCB852D6ACBA30BC08DD8DDF18871CE3F7E170253D2431F7A6493FD0D95603A13ECFE7F957F07E4192A9B872378383BBE1056A13012F8CACBE5E21A918757A216A42EBE6241DA2E2BCCEB4764361D684B4A2927B64645BA6E55603A8B0D3D2B997E088D0CC9B26A45330FAAF1ECC6CA120C2B92F10C9873CC6B4BC3C374C2C09C36D7E2D9E7762527E3B9C853DD1BD9E0D8E569BE10544CF15B1C60B04BACEAEEBBE261FE043E6C59D5C80FB86E83AE2D950D9878F31347DBCBC490416E55DF93CA3065574D903479C4A8664CDE2AED0C8D9C4A64521C4DBEE85D70EE71BF5244AEBD5C762F51A8D778D551148B118AA52DA91624758782BB93409151FE0CB0302A2817036038EA65ACDDB987DC5E4F371C4729E23CDF00B694FF02B3242A761ACDB6EE3B42CA02D00D3689B68C2146FC00EAE0EA0C68B3C1EBABEB294A43E7CA95B6FB3CCCA9A7855C1DE7C7C8C7B994A6EC273388C1E8082710B801F31177142D33DEE9E11ABA4C0D72DD1EF24B0561FD39FDB2AE79F7DD5D51E4CE613F9F305322F195E6B2383115F2C99107D453275A8854595677EEFBB3F41A4A52DAD5E36A4D81A4458B4F913A4C9D36FFA8C4365C679B245A10212CC9B7D286DFA2058D520574C8982870EBC3C8A655820C598971FA69B4BD79FFF4D24899DB9BF09B4807025EDAB19D58E142A9ED135FC905AC42DF94A7CA089A75B54C6A70DD9882BAFAEF94C076ACDE8A5E552AD7608A14A9B92C4F136E5A83F100D5D692CA3C800825881E5B4289AF42032EA3F6155C89DD713304BB14C9A4EDCEADA5BE62A4DCCC57544DE5567F5820F3B08F9EA20F5896F86DC329EB7FD08D6784E7432825314AE59B1301F4C01D1E3F0E1DA1A91E68E59BED37329164A2314766DC46BFB2CE3D87EE904A38728379DF4BBD0877B2EDD69FAF0B1CBB698130AFF02BE27422451723C1208886CEB8B08F44594196662DF4227318240BFA7180C3289B651E089FCC3291ED014A62F0C5A994811D9BF2A8EDC909A2990982D23596231FA75F5A2553A0847D6CF880FE7784DF7AED18067E141071380B119A68843A2CF0A50793BCFEA7FD0D8A646B418159502B2ED011B58B1705846DDC206B54C57446056575D89437258C84E094151F241FC4A46BCCFB7FC0D1E4DDB413BBD2418CE94DDDBF71C788010D38C4488CF433D67031869D80CA33E0F31308CAA342EB6E207619E37F6EF17668740D6517DD24434C7C75AB925455CC1FC0330BCD75DE959CEEF797AD5257CA513CFB35F866292793E7F0CA8EE930852BFF21E6FFE794892C2E6744BB1152298FBA5F58DC1602C8EF290486E45DE8325826DFE432CC0D79FE9DDE29BDBD966508C47C6BDC042BA5E9F22B69448F16EC75C9A1599FEDA025B44C5DD0C999E395B9FC1FD7BE99FEFF49A235155C08B48768664B9DDE1BA536A6384D204674B2AD29881AAD80668DE19C60495AB4DCFEC79C23B0DF68153CB62CA47E47040C695A66C93E57183E35D6A963094A68CCF3C6775806A6133DF66D134807877C1A340FA1ED24B4FD876506A11C6B058D2FF571DE2C38795918FFF42C12E1F8752E69DF725C16998D8FFD4E0394082FB099283F2550C026643F33C550CE7D98740EF65A3E1DDE3867EC7D2E1D78FAB91394A7C4E7138138268D05795A438308F77B4C706874DFCD3D4BFA56E96793079FAB0A8DD4DDF44815B426E1DFAD24C33BBFAF9FBC34390B0F8098D34B479D02C59613B1678B3D2FF64C6E6B6B384F667E39888DE6B763EBDBFC07EECCCCD749E9328EF975901C4803B94675566A60B7AB70224FD360BE3C1BB83EFB660B96E3EE22E980D3FAC70BFBF8643D1CC84511E9107718DC5B3F973C4864E4B18A9E09BB339BBA09293B831E382C0719B0A76DBC47A005C00E5DFA0CEDB50280C01FE43065432CF2CF63143BF02ACFC3CE508B69704193084A755934D8A67DD0B679A16A89D832628019CD5CC782407215101408987B73839783F6D430FE077FC1510780C08B4908BB32BFC2507A4FC26AB0A3E07D59726D37B575C82B9F1CDB21F33240642345E9E30CC0FBD31652B59EB10C70D1FB8894BAD7F4F318CE3614330775C4B7547EBFE7ECC99C1E9A8D04623A945AD01D362BFB3FA8B8F403EF9C13E7E62444E79A34E8E7147FD183543CD4526C6A77151344F6D73718F630B1A4C7F2BE7450D7F6EDA827BF8DA4BCE116905D3C742BBD73ECDE91853EB8C48DD59B4458494A4D99EDF56FDD6B8A7CB2C40BBB21FB0590F3E490B8A8C44F06BB81C9318A8C514219FAEA546F509EB03980642E393721C70E1BABA851C603FBDEB9D942C125C9FD511985F7BD74349570B055CC172C598247DE8B56C1DF95BEFE6E24050E02E30CD30D739F08CDB1E2964D4F86AB87077BD92E78E4ED0DB9EED5662D09B01A7327033C8B254F7E4F48DB8B9656992DBA5CDB6D6430DEB08C4B0A3DE74517AF0CC0CEA766A89DB734EB49CF9A1A9E198E9A9B821479121930ABDD391B2BDF778DA10CE87E0E2B750A939BFA1930E815B62BF5491C6B9B5B404657BC58E36124A8DBDF183B864D258A35D65497148E4EF9A37FF4460F9CEAD5654578758CB48D5FDDF3DB82311D8101BDF208BF79881F38A2231F24D43EAD0D9F9328DF533DEE5A3FD8D48C4A987F02D826277047D54EED573545057EB38CE9274D6E158BF06B1C3572D2C676D297EB7CBFB8B4044C766F5F967309754049B8ED8D455809A8AE26CFBAC9F08291A245890DC91512B598F180ECE10F95209477DD0AF3CF279EE2E3A795EEFFA8F94236A888616A439A0D026F6C2FD5E044C93A7CE3A9328E3FCCA7683A74C75F53932A7FA7B6050382159A1E384F96FD8DF761D111C21F20E89CF130CB36A3E56E91A6C4330C0CFCEBF0232790C8592F0DA1A21C10AA8E76A8F0CAB8A6743A05F66D32BF1A55A11B3DBE21CE31A64E3E9AB8F7661A562D5C144953C09D0A8AE68072C4CEE68D1A83CC0C75FDED0C8F3B0CD9221E6C3B53B625326C8B1ADE10C6E21F1FD8BD14F462C755F0DBB33E577DDFCFE778EA26FA4898E2EFAE9DA73DFC8EF2EE8ACD4F39518D81C0C50CB97D9BD60A02541E5A32DCC990A6DD00DFDEC228239879B9FD086E56FD5B0E277239CD7D37B6E6BD8ADD4FC6ADB960439200A7986E8915F798C8C686F799981463F6A0769AFDF2F0CEA31865E60121CA9359B5ABA5097A315282AA956BCD5AE459A61570EBAFB5B8AE63B802F01806DC98F96878F8C041FFB5930F27B3835DA5EABDE39D8C73B1BB92B2C79860264D8B942E844A1F6825B0DB40DF36A6FD0F8681B27333CA9F7F98C96AEACCE9F64DAB17511D24D713FF8BDB199B1906498960AE88A2C16F525758A20A3CC268C0C1214AA55282177427A1F0E48CEEDE87D2FD8A1ED58A2820D3E7B146CAAFE490FA2B94B5C1A0FBC64F338F62945FE0569C65ECF22F5455B0E46D3B343C6860950912B70B5F87C6763461E8D4E536BAAD23D6F7EC0B41E181AFE2E044911A92233230D6B791C442BBA86F40FA76DFDF881F56F1E9723AFA250D1DF2B7A7B99D70FC093417ED5F6385E0FE237E766BE17E3A1FC18AFC6A05E42DDDCA3AAA548475C8BB5F56DD308D055AE8C9900B13C7F290DEA9EED03B8934CB2538A4B16DFC23DBE5E1292B5965E46FBFFE02B18C5A4CDAA67F2A3C4EC2C5F065C3555E4DB3176F6C3B2FE959C7EA9484031F65B8FB5D7EA2B463181EFB3E56FEA7BFD98AE7A7340423BDC7A7E1B968769AD77DB4AFF6991258E6C46DC77E806DEE65A42E101459C26DE604B8EDC02102120D89717C3297D58A24417ED7B5E1474E8E9B62CDAA867B53352995426CEF7180896E9A41F5DF423D5D972C1571875991C093CE6E4AEF1629937E7A10D333828BCC2AC6964489CC0BE4D6347E20CA60239DDD0238568AAF828CE6143F1B0445334EA9BEBC18FB5FF9F6C47B0144CD8EDAC375FF0A554F6AA7BD8A2EBA8B6B0F9F602E664FE10911FF80AE347DD42DAF54C00734BC88B8557C3DDA8BAC4674903CEA076C3A77A17EF920F30950E618C4E56743A6120EA5B1F5D6633D29F6F5DF8573DD0B7ECD3AAD7649550272F8FC506B442B811287902C4449FC0953DF3451972F1C08B9786BFBE39D518495CB4710B5B04DA0AC3A162F7DDC3C0178DDED715DE131B98911B9339F9B23900ABE07D172CD63A2DE8B1E14F9CADFC459B20A13B59C985844C0C7DD3BA6A74658A844A412093EBD4446B05BA7B0C0741A95C51F904AFD11FA8C1F15C1A84A0BC93CAEFFF6C80B6C3C20F1BA66131BC9981850CC4CA6EBA968750C4016723BC59B4E5FBBB58A837664125AA055B2CCAD076F26AD6B642B3A4660AABA099E4CDAE2897F1C630A98E938FA9D2867D5F6A0FED7CF506D8EE59751ADAC5A0804DAFC8099A8FE6CF3B6950224D92CD83D9D329EB7F6847069056B894B6284B7BC96A42452B5AACCD618F678AF2335383BE28AEAA5F360CB9FA3F79C4C4367844CFF669155019A14902B21A8F76EE454409E27FB2AE0CB52FF0130C3058EADA1A59F1CB67F18FF77A8C9899E35019004D2F5C49A8C25066146F7AD98EB98BB5B4A29110CFC584B16465D9F31099A2E714E57D261E960615932DF14BE3BC2718F81ED793A1DD5BB72D20618CA8B6CA1710D5912FCDCDDC68D66A920E7D85161595CBE63D9440DAC09878AE01D9CCF5B7005CD000C44F3B8E179EB64514C62A7B889B299F5D5F0DB578E957FE081EE843F2FC7300516E9139942D7835D2C04B5AF78E08542FC8E32887D5615F472DFF27E877A091EFA3BC11ACA286CAD95BAEF48858D19E44FEDB6A6C8FD07B6BAA73A2D4D2EE7D250C733A641F251313A4EE3E7B029D3BD0BA0BF67BA9AA5449EF92E213300D4BC529CFF51335ED73BCAB81ECC1BC5366CF302B2C4090D2CFA55A391B9DF175021F4D6B6BF88063133CF078E750A7EEC65828A7AFE7CB2F64EB51B356830043A1BBEF86371628B2B75597F9E70168F8BBD3F72007669ADAD47133804F530E676D76C663494ED43F0077C8E741BA0C5DEF3E84D748748C806E9B353ED098A84EAF2FAEE1969FD1C8CE016C877539E0120D2A1844FE8FEA852BBC721E70EEE03BBB008D16583ADEDB3252A041FADFBA27A9A08A85CDFD31EFDB802361566586C5F896B428AE18C9005D703DD134179B7D53DAB59EE03E52877FEDD110512C90DEDE9C84EB1D467309B119F1E308E588E16D28F53C7BA8BE26897134571DAB6D4C2B74A4842A1F17CCFD97B0CD4FBB7EEB7781943A5D5798D18ED4BE4EE06562D4675156939FAD5E99EF7A310E2B61224663134D6E895BEBD24890701968C2F6835F5DF0380BE07026189D9996A6283040D3AF9DF99DECB7E69D12C90D24192A873CDF13B5747D49B3E08A2CAFA188995269CDBEC834621CA5F50854A6B3B27989DA3DDF161416D5607C9B80E5B9438BE8AC81A446D7EA3503718CB54E263FCC2409038BFDC0459D67BA5E88B71A665B5EC2C8B687A4622F710A330F0A1F6966358A491451DD384249D7AA90A07E16F9BE4EBBAE2318FD9D591228BD519DEE5702F53368AF16407B2104DE0F4FE09FD583929767170A6F70D8C20F7901E11B5C41A35CA4AB3EE31391364609361F0164CD02DE814D628914857F2B40D827B71F2EC7DAD1DD6FEC8A148AF6760C662412291B19AE14A79223AF7FDD26D879BF6056677B2BA76C51685E3384DA9019B5CA9FA69D41BD9F2AD41AA77F889E777B09F4000AB2851682C1DCA3B5D5EEC299F5881A33F34CCC933536A7EF0AB92F0E3677148EF44B01FC1A64052B11F9FA8B4F1391BC618AAF6F95F9738FE0F5AF319D4A5E0C545DA6D2AD644F2EE4B4912DA08C63C36AF5FC5B1C7D5EB02FA09F391009ED8FC1D31437D69E890CB860F6E06F1B15200F777CB39722C85DF9CBD1DA6C3CB99E7FE84076290A17C24751E52004106AA134FE98C1C0F8DABB7B7C3527333403CF6B2D50AA6B274BE761C51102D93DB2F174C795D5808F32009026F3A3505630461BAC93EC3A7424A2659BA2A11B2B2B7B4DDCDC6884EE4D8EFE595E294BEFACFAF17097B6F0E5A324E616556D5696D8655C0DD2845E9E6C99BFA5FDCE0278DD623A7A3C89C273F1604E422B722813A0AF630BFB6ADE162C1165BE2E1C2F18B22C2119F1C4A317F1E410EA79BBC8631B06A4D28F57B70A57ABA8F01CA812B98E85A76FF39F3C13EBF40E09EC1A9D6FA3ED6C181809F1AAF3DCA162CC68DB4A96B8C236F08E4CAC0940BFAED5E9E181F863BFC1AD2673D4375D3EBCF81C0C3F9E2EBF072179A7E450B68D613520202DB0F7DC661B0097616373FD40C46FD8A0CE884332BB43E8EA4A8ABBF3DDA35395EAD2C72F066FAC00C6AC36E001E2F1FC8E848DBB2202C0A82CB0F08CF321A60464D0C7CADD7CCD78BE7C2592B396941061E569CAD0F16ED0F815254B22D91C8ACE9FAD6C70AEA0DBE077078F7605860BEC2F084BFA8DCD98EBC029073856B59BAF94E4DAB27F6FBF498FE46A4089B743028291BB785B978F686598F725DF7D84CBA38410916B9D3708E844101D35E69F182BA27E564E77131BB10CFF0419C46D8199219BFAAACDA26FA9E784390BE535E23B0CCC44216872A44D48529DD8CE5DACDF19956D542D86D18C56648BE21C5C3744BD2C26EB5CA0165C6763B319E22C93BFD8357DF9286A93EB3526D01EE416FAFEFC891C0ABD08531AD2988F5FE717BC71E4FBD489A0D7B66216D03E41960EE962E75501581D33190959A89F1B8BC3BFA6AE75256C021BD393FE363BAF06939DE31504A71272063239F70F3EC77526A1B94E0E50FA8AA261E96E84C4E4022EBFD329254645FB8A41000501368E47A53282B2CE9439087D93A89D248A7422C6C97A1DEB96407BBF77D2C2CEC38F3B56D7002715901E36B50B364B68D9DBC7E51CB83A3C67D6FE85C2B49AC57877CBFAB47D2A43D9D7E4C73FDCCA06D365ED2E3630A928D383D3D0C2DB9297A13EBD6BA6F6B5FB18AA936586E6423F5108619614C0E658B791C51AA880603ECE4D7CB77329D19CE16C4B2C06884FA38C7DCC7761625C1477C644989F4EF34421606CC32C4119C05BC9E6C4431FA4B1924533CB4E87893AA1418ED282BB572189F9EF1884CF44579D81AF9100F5ED6F64779045ACA8B295992980374BAFF5B3C83FF6AB4BE3411B0FA3A374175C81561A86D24BBDD74FC02B61DD2958B3A64FCF4ADFBD9A8DE486D21EDAC5DC1AC865F75CB24BA560E609280CCC3F96D2C44258F26DA740700EB9AAD502827FF0831F9E1E01E33E22B6BF6D285A908F37E9658317ADA354D3CF41C6BC0D2DCC8EDE5FA1312E5E0DEB03DA6D8B5DD1E27AD5EB9CB1D4BE2D27F05F8727BAB1A9278F24D27C5BF31A739F98CC9C4BBFF479BAB4CDB0F5E6F10A8A2AF59DA3472C9B3887BAAD41A9C600CC79E135BA9492E5996F2E5CAE0FE4C03BB60DE498C67855C021B69EDB03C7E5633E0DD0E10C2945E4F76B6AD521B029476F88E1F0895262069FA3AC2B37FA050AC3F9A61B3104BCA03DC9DD1CAD9FF101B8C158F3E6B753DFCBBECFE6F7952904CCA7D0FF53FB9049D5BCD0BFEA060348E509E3EC48F246C8A705017AFA96211EA9F2A0FBCF4EAED53EF03508A7061902E13AC36BBA68F05C1ECC846AA401BDF74CADD6921552AEC76616FB617AE919AA373751FB2D83E1929D9173ED26BB687257DC987DF40B046C715E5F7868BCBBF5C88255E8DDC3B0B3FC4BE9C88052B6F000ABC92531FB97678B904B39EF0773AA970AE9C441FCDD0D4C42526A5B8AEE8BB754AEAB401E45E0BB40A35CFC554DEB8BAA59CA9CC675DFC4F1EA3F55E299F33585B6B0E08699BF9F2B4889CF6D2FB64AADAF9A514BFF455F0ED1805C2FF7068DF8EDDA6E7D61412ECA54C52EC6BCF0DDCF0DD6F430D4F9AE3039FA21E19523F5046A1BACA6F717F4DAD16749DEAA73960888430C74D1ED0011D980840EB23920DED3F444354EE17C846AFB6F999084BF7D5A9D3D6E7E3BA978F6CB2E5E055B6A94013D1CBB141C5F94A00732196D83370408597CE748195BBE6A3851E33424654DA32EE914D1802C36936E6B63C8F8095E5B30E5845E1CC2BD7CE99B02D69B7ADB93C409C3BFA329EC0A7E01874CE3CC448A620B6F469FE7F8437E9F7EF95CFCA6604ED45E5E6F36A1DA2AB392380B80B400FA1DF8AF38451FCF425602FADEA7B2A052F93CDE95E396066EF0DED8BD7890FB61BFF3E40D8BE9CE9BFCA5CA335F900AEAA46DD5A449E99599608366F9A515963591AF7957435585639F06A75D1BF3E753D053788394C7DBF93B66B18F9EDA81B7D74430F70524BFC2D9CDED51F897DDA04A0F3783316B62EDFEE15ECC0E7A1845C83894998548CCEEBFEEC067ABD1A47FDDC0117410EBECD0DD883F1ECFF0BE3379EB2FDD7ABF1F9055AF90FC80FF4A05AF155261DEAE90AB7B79EC4BEEFA02CEFA59FEF41E419344C7265BCF0EC3994E1D869DE7BEC5D1F8453632ED697005D69EDED114592DC9656A35FCFB2047FA51DF003854AE2A442271D175021A744EF2C2F0F63168F28E085F574D9394EA3E0BE3B204B7447EF269B382AD6E8E25853036CBE9CFD9828A1B8B70C9F8A44A933EEEE283C8B4DCF77239121FB4893D876979A78DAB5E73941971EEB5E7CC06FD515144787004BC6BCAE916773A3FBAE2AC7C1ADE07F3A4B932E8E28F1BC73AA17E23D93AB77FD3533AAD63DD028D9DD5494E96C119981F096AE3408BBCC44362542ADAE9F85474D38D9BB7D98A97A00F31125F9A9E951B8EDD9E24D373A15D22E868E74BD444F6BFAC1B4123CC8C3B37D7AEB20634CC343D98D294F367F18704818510041048CDE0CE537B90ACCF7F9D98E4A00804D2CFC711C74D2A0B546D24EF5627C52F1B97ADAD7C4B0821F3C01D17122033DBC426E10277B789BB980573578175E5183F6A72C5D449E0032FD3FE34B79953290EC37652DD98CA421EA0F537DE1843C349FFFE8E7EA7912AF96CE5C3674BA5A387A9482F20E168B9CC0E652289925D6D390C39D79B1850BF3D957E787F52157EBD623813DD7943BAF9BE66881D57E2F42F0BE8557A732840A5DCD09DF5D1AD714E82F0401F2757DC90E58FDAD99CE0F5C9B08056A85A3C6035D821A8E8751F6A67EAD23327703711273BD927F947691AF40188127C24D0B0DB8986660DAF6E49D058F075815DAD58EBB787182ECCAF6804B6906929C37941C51432240D321656C08ECDBA68A0811165CE5D97E772BFAD5AC480F1809201BABAF5334032696382C8EDDD7BC72A938460159D1836CAE92BB82699ADF7FE5F72CB0EB82971A15A40A276D2192D66C42FB82B62FF9F79380F5B5BCE8C5BFFA5A9727F54A8217A0CECC0E687BEE92D6AD7F702516402210DB1BEC72DD5A08DB62E27DC189D8D83E0E9A613B3F1FA54A9FB65260820C5D7C6BD06A6847BE00A68A8B1B2F9B0E51BCF363AB9CFFB2B2C0191733F6A5256D6372AAA62D9CBE5DD7655AE27AAF6DC7E756E20A050BBFAFE08D1493CF9E7D87A8BFB7B9A8DC89DCB69139295330CBA5580BD9234CF6CCC75C2000DBDD8924194853AA4D21A05945A81A9B03466A8E25BF67C74750D07B4A61321E5C14992F8111A57F1600F0B241585F3EF4B713D9503D0EF11384B281FBE9DDBADEB0627113E0CF1DF81E99136029AF6FCE52425C96CC2BD78C86DCC6EDFCECD7AA5F7D88D552301B3A9BC425042518219EAB57ED9CC3996D09277D2BDAD74ADFDE56A2CD076B06B25A811F91925EF658E830C72A7EA7BBA3986E71E94C57813B9405D239551308E0756676401E064CF9F28423DE0C167A8EAAAC7E97891319B3DB98CB6D9269E39BE9A3B417060DD0104870B007F80CFADE3F7D013A128891574347C37B2E72C99904B73F87FF1757091758D30A4251FE53AFB15B5787EA7B4FD99A48883745DD3E999AC2382423A3F4768C058D439ABCD56401FC052F4AA5D2FAA90A16ACC9A2CE03F5750D5966CECE323AA23A82EE8B9302501C37F59B46B59CE5E3BE18F624BC7A7E403C5F5F70264956C72F1AA7E8C1C9A33E10682CC8E5CC834BE9E3F6C49B54FD67CE79145738EB75E03C8B6BFBB2A93AFAA157CDFFB076D04B1F02B5BFE4D6879340112D54908B70D6D0F675CE3A53F1833C9B37F4B0AC6A5A44075E052773C97F6309050CB919F085B68063D09E72D6EB1BE61F5E2FEF3C0320CE90C489799A08CAB65F44D3819609C456E1DA4F6E8AA97824278FCA51B1D71D2363A760D805732CE818213B227882AD4451613E32079BA36B89A44C53D8FF8C509CD7258A104677C0AC0276C0BBC869969D866CD0891DDF6B650CAA172C3A906C1C140C9390EF18CC246657FB7729BC2E4C004DD8F898D9A9C1D484A7D1B86189C466A88453A8F7CB5486D0203C654F00B79A17971422CB2ACA981D15DF520E2878C96D7D00206509DEA6AC3799B73091F0310F3D661D3E5AB01D05D03AC973F5DBB8E7DF56839EB6611B1E614FA869C386BC76BC52976C86A744EB3C81EE2A1E8E695EC422B364A836FA71FC2A2B6A32C43195A81A5F2DAB7520E76986F7771E6FB8D412CB45FE01D73018FE91083C4C2F9EAE604B7AA805F5CB319392CA53AE3E17B43CCE6F04B29714364546F67F6952429C36E644562912726CBD8902350D29B8085559656DD7E68D3EFEB6B275816EF239C8A282C01AF1E5046533B8CD3A92A98FD8807DAAC86E3510C86BD50D1D97B3575D8DC5841D5C0C86AF10F36B0C2660AD4D139EFA44E9167A81DEBD112D5B8B7395C1106B686AECE0FEE1B79C19F4360260C1EA8657B4F67632B7708B7A29D2F4A01B031E29B0E8D9ABC7188E8A9500A41EC61A66502888D6D1ED4497E18F44C633D706D65A1BA228432FD04B9DD589989C9B1B93C692E7FCFF84DC91C8DF7D146904A146B8A61FCC254439A73192F8F057ADE5587B9A4D6FD98F03380C1C2BDD167A1C2EFA6136ED037FD7A5C45C25EE8304D22455CBBD32AD610BE32C0CE59DFD0B67F9B38AC3989DCEB463D74CA678537C86A13E9B9B3CBBC4E38C480AE858A4FBD1503FF073B9CC6AF5223DCEAD98B9417BC0CB628BA4668D55ACA04E7CA9BADE9F38719EBCDBF1C611D376AD2AAC67B413D7FB67D0E1936CF50FAFFCB031556D67296ED02798C91DFBAB5F917C0BF6069D03A6AAA67FFE18DB298624B4A6E6E7ED17A5A66BD98C26233F17432190D3D4C374FE50C78D1FACCDEB170EF4A443B0C92DC4B727B3B0AA97048ECCF83D66F600607BB47AEE85F37FD6752B3D066ED2A2898D14425D60C755A5681816DC1FBEBB1B6F371C27E1FCA8A4A60C5373BB33E71D79470978527328A04E18F6D5EF5DC9A0E6D50359096FEBA4F182DCB32FCB0C5005006D8352D00026C54EEEC33606E97C4E98ABAAC4F8928D1C6B3CB7AEBCA3B0E2EB25BCDF386DDBBD001592FC5CE9977226B4BA8070C28D02969182AD0255229A5C283A487B972FE0274F2FF091949C894D07C7EFBD8247A4F6843391B8DC2649C04D2895C9F90511D4D33851F1CBE233FC0538D0741015DDA2DD25EE6BCBC8E38652E18F853CCBB053680AE7E816F4B52C19BEF55892F9FF4DD19F32F2DB4C8CFB66B66DFE93568474171338D2459CAE323584CBABF597CBDBB17FB347E41D81C481948B3038A7F34A0F62EAB11E0BD1F80AF6D9F815305E65AB647BF39E7255B3CEE54464A73CC3DEBD880ACFED8E3519F4114786A9E2E3E754E7D6FD5748003763506A2BFAFE941AEA201E574BC8A4EEE5EA15F74F245374D0CE958C40AE6B4AF66357BBCA8601D2CEF8B1EBC26AA340E1985D8258A44B6D055D33ADBD9D5DADFF39E80EFD29D99C06B0F5DFD31FA0636325773C5B9846CA25E0CBADFC05E9F965FE7CA6EB1D39B80F44B3E3F1B4882F32ED53FA2CFD388B4A1448F48155A7833F85CCD1EA964A775686908D356C1C9A5D67C10524E52B814C0461B7A48B9F1B13AE13D6B288A964257F6055C934E477C3F74584259BC49C9CC6E0F842BB50E3D3CE503DBDF3CE6FAED882B6E3E31165237DC4A57F3B4C5DEEA326809C3A626354055D071F64BDEE58F7577BCE93752B44CAAFA2C1CCA0B3A9690CE0385326508FFEA702EEC9FE50D2E61669F7A7635C1A98B5E33CC71B1F6463F31DDD7D27BF53313E19E4CFC0EDFCB114194D5FD1D6CB6DE36CC1ABD592C8EF90DE9100DE591019EFE90574AB6DD638CDCD6807CCA9980817D8921E4A5AC11072A1A5DB0E25C26CA34CDAA4A09A756ECC0E1000513C3C9FDA5165C8BFE1693EFA8CF29F21AA7141527E46853272F32C90B108D405C2DA2B172E188DC1D97C8AFB943C18A5629BF14FC69B139157FB44D0873961B9601A54D358BB725C0F0A57D9A302002BABACCB9E2C1CD9CDC7479658A27A93AD1C988B53A323343981B8DE1934AB121AE52FF8615D824993C346CF54D469517B152D56E191EBD0AFDECB95143B89D3F67458F3965F224710FBD636BEB916023AC248D518B253E32A5B4DFA8BDC28ACAEFE793F487A5B5A04E2D191C74AEB3A4FC90D449DCFC89BBBDBFA930A069426F0BDFF9AED9996C98259789CB521A8E42C637AEFB847025D404530799BDF1834B94CA8743C7F916A53B4E1A84E0F27EDE214BA5932C2768CCFC69F5F222D398DE8F28B9C9F940F59B160B12EBA1180F45EBF946886598E5EEDB83BC11DE8DA3C04A9197854AFB270CF0893D1B160B55000B1655DE14F79F7ABA2E6B3FA72EAF8107443488097EFA42E7954BF8D6549CFEB57F16B39056337051E66D431FC2AC196C05D10E236AE4F6F42496BBD8CC0F795F87F8B7717BE74293A1829F2E56DF4F87FD76F62FC1587BA746A918EB380E99296A88D7FB7F02C95E659E1C704F6277DE1A4CE2320FEB255AC6469568C44E436E566F21CBCD4737C58DDADE380B75826ADB7F6CA68810DC4A794AE534643E875079DFF98196209CE68EFF04BFB0980940A6FB3D19E46679DB75D65B53E94F74A64BFD284CDCAF29B1E6B32B45EE544016FD9569F4B5E0582953412609095291F07AC579C276DB188391A3A1C37BE29F61DF01867B796A29C8A1F09EA883F5206533BF54C95427041F6391B015D6994C74DAB130A6CF5520D40B75922B9CAD13D66F0E57D76E283DE58ED45712DA0015EE3A24F117B3B65F11507109A4BE8E1881BB3495ECC353DEA0981BC261D6CC290A4644313F491FA5234C0F6DAAFBB1DF13D407663831F5A5491BEEE37FB877FF7D4E8D6F931512EBB59475F50DABD3F584232E9C03407C85AA8E6F1C2E1785FA68D443A5254E025DFF7B8D9B1CC42C4124B15D49918554814F9B5585B3FDF02CF9ADC389E4B29FDD67A64454A8B66AD26CD1EB5758B62FA16EE95ED8E6BB3D5A550B6266798423D588", } for test in [test_mldsa_1, test_mldsa_2, test_slhdsa_1, test_slhdsa_2]: alg = test['alg'] print("tcId:", test['tcId'], crsyspqc.Dsa.alg_name(alg)) sk = bytes.fromhex(test['sk']) msg = bytes.fromhex(test['message']) context = bytes.fromhex(test['context']) opts = crsyspqc.Dsa.SigOpts.DEFAULT if 'rnd' in test: rnd = test['rnd'] print("Hedged with rnd =", rnd) else: rnd = "" opts |= crsyspqc.Dsa.SigOpts.DETERMINISTIC print("Deterministic: true") # noinspection PyTypeChecker sig = crsyspqc.Dsa.sign(alg, msg, sk, context=context, opts=opts, params=rnd) print("sig=" + headtail(sig.hex(), 96)) assert (bytes.fromhex(test['signature']) == sig) pk = crsyspqc.Dsa.publickey_from_private(alg, sk) isok = crsyspqc.Dsa.verify(alg, sig, msg, pk, context=context) print(f"Dsa.verify returns {isok}") assert (isok) def test_Dsa_sigGen_prehash(): """Test ``Dsa.sign`` in pre-hash mode using known NIST ACVP test vectors""" print("\n" + test_Dsa_sigGen_prehash.__doc__) ''' NOTE: the prehash digest values ``ph`` are computed independently of the ACVP test vectors. crsyspqc.Dsa.sign in prehash mode expects the pre-hash digest value as input, but the ACVP tests expect the user to compute the digest from the message. See our files ``ML-DSA-sigGen-preHashes-1-1_0_39.json`` and ``ML-DSA-sigGen-preHashes-1-1_0_39.json`` NOTE: for ML-DSA the ExternalMu mode is recommended over prehash. ''' # ML-DSA-sigGen-FIPS204-1_1_0_39.json test_mldsa_1 = { "tcId": 109, "alg": crsyspqc.Dsa.Alg.ML_DSA_44, "sk": "83155A6EEEB7D30F9C8E8FEACEE387B8BA44E9BB9272B53781E7512F369EBC0E58F2B129A38BD54D021D1850B049808F0CA0D2399E7A0D7C7C54D9F26414CECFF5D89866267B66E256EF6DF257FB809BDA2E5EC579EDC68DCDD5E69AB5BF0E07E496D0A57CA0FC90CAB24560009C036B769E718AC3A6791700A4A2CA52BC921D62A44104954014250E64B010212700C4C821A1023011C489C1429150884C9C828862C00440C43000348023298858940012A56521A62980C2850A344A4BA2055A368E8880104B464211B99184B22C84348A1B1842181922C2A83110C62C60084C1B414E24A6114C2622921448032540233325590651132825221104224606103044DB221210910121090901C94818C02D81062812807189C808D0984544B24091C2011117454A209094424D5A382E12A43099344691B2005B2828494061E0968C19140421830C49280E99C64D8BC660D4A62410010CC888210A97411BA8508C3084E1244513154A21372058326282C420CC30488092690CA06CA11226D08804E0820C13100443206A1B99119C324694C44509879010962420176159960513A351D412664B206EA42842A3286819308E1BA9281CC54918C84D91262C823061C142921C252EC1C8488A88900B81081CC42D0B9149632266238688101900E118880495405032495202054CC0514910620C06461C22601428680914908A848959308A21380CDC128CDB928800312943220E0416428B18088B4604DBA021612881A39801128091A4C660A490290AA45060286EA0104D448490013651201821D2B490DB38651398312349260A152E18402608883100C725D3408D0A35468A40660C03868C38010C377250229022490DC4986818155201926D54B22D22C68CE3064450C05109144961145240980D8116510322840AC54880468919084EA1366422C270CC9889D802890C15661B244A09164003C531C8040918A708DC468812286D009989E0448901344D89320E131170110028804805DB168C8248311182701A30661B084E0800208C3010133728E2A4290B33084908448148859202050A82209138129842858B066420410523B1491239888C0026A208229AA0640C15644A4809E01424C4480ED08030043304A4008299224D43347010A28D440010D230510BC98009C02D22C52C21818100422459928050282D10446DDA28090C1151DC36304A483063344D24224E8A3489CC863143B23023A46513B6459C480502B049598229D4A804F1237C490E67867F273523AE76514B62429474E5407C3A6C21357B3BD5710057282C22F160B375150D332111AC7D8414DAE6BD13735507638F277E1A7723A59D26ABAF703D0F11858748A5F0B2EA1DADBC9CFED30255188DE7B3C2161849352B2C7469D8822D82226238C9E8EB3C730E401C2D956F2AED9C8F512A4FF91FC9950B8800D11CD26B689CC8ED3641C076669D5BE7A4C07C919208B19323542AD1847D9F7DCA5B26E22D91E819A3E21241CE97967683BF50CCF9CF14B06807F569A2A29B79BDC07CE94D1B9DFD82E4FB7E4FD35C209DE81771ED45585D039DA01B1FD1E8344931C786155C2B794D103B1AEAFEE21864C27F0B3455A835C6CB18D984072B98E194702492E0A8F749E580DE69833353BA99D2EE5984A130AC92DADAB5AF27BAC96D2C19861D349E7FB4D70202783A6AADF30CBA2FD7609AE34C4A0FF33716632570D37CEA86BD6D0CFF299DDB58473E8A3E69EC64512AE228970AA38FF960867EC664816025F3C964A3605838D15A675A8A9B939CD32BACC9730AF30B594D432019F5217A62F698FF4604F05129323A6FADE11B5232E3CDC3EF99FB3507DDB0576017EB5FDBBDC6466FDFC699B44A526CE653E9902F66FBB2D56789C7466C0DA9AB6EEEF9666E691AFEF3E232816376D5084DBD2E6A4F9C174DC83A312819C372A8B7F2B0568C153FD72226765D053188191BCB002817A69268FCF8B50E6FB376E6A09FEE4E2E67F5302E60272B0B95CDE54D68B032D91CA86A4A8E03AC120BE83B4D12A2955D8E98826035BF3C7B66114443765C4CC6ECC1A93CC3BC48E2784E6FB0B50F1D626FE03B9ECDDD0300A9CC9AF9212D510B24C8FCCD4198625A900EC601C19D37C2A9597D95F0CD6AB6BD985A622DD95E50849C487625A21E8ED5C39D132C52A7990077BE88B769D23B1221D4775AFA3FD7CA0AC8067821DC0EC17538087381EFBF8F5264F223AD915A14BEAE97D136E3C62BDB4CB83503CD82CE5BDD3BE8DFFB27CABD345C0F0F212534E6DCC527F27F149DC7AB07917F0A336744DB33D2822AABA76ACED03628E418D8F9B40AB1B2A7C4CE3E0831AB839A3FD8B1958DAE4C6F8C51CD5FE6DEBF60606D212179F9D04427A11730D4CF2B2C98DFA23E4240427EB2B46E4E78FF35662ED45C3402128ED287607AFEE79070A4BA5DB092E574F0D628549A30CEAD20F423189003929AA8E9372AAE272C36E9AAC340571E334C65FDF04B9B7B31A11559A4D3108F00FEDFEA0F7203670AEA060AE66F557CED9BB79DF45464BD44E0B920998D72C8780DA4089BE80B965C3B97702F0727B6DEBE5C0C8CFDA4E5F34E69C5337A720C8A5F38875A235C96C577F757426C6E318C950A9D38C9893E09D3BD3C2E89BE8A4DC738CA84910AB150ADDEC28F40A22CCA13D877008116E22B9902553139303D2E1803686580852F8B5184E62FAF1EF57BF6822C051B5ECD66B724CBB632D55B94A11533F73C40B214E673EF9B871477FA5BDDB660AF6B96FC7CAA26B6AFE3E8DE6965716D4AD5ADD2AACD60484E9B74ED0110A84AA1D9C8FCFC502F0FF1BA9CC29D9A06E1C0617E16158BD91E80C74E79C8741CDC9FBC4FD61B89B59B67FC88AE8AF8E0329AD03DDBED9BB62BD7DFF5AD3FCCA42337534148994E17B904448CAC5A12F91625D46D58CDEB04599F1F793B3885FB49B8FA550A1A4B1B68B76FA409B323F2FBC974C6EF375DE3869BAE6F2054D1D1FA33E5F97E4C669B6774BB45460E2277FE247AD04223DFF3DBCCA1FC6F3472B9D46EEAD6BC61F353D59ABADF6BE340582D60E9B1BD5B88A8687A4938A90C304725D78C0707F76DCA4952CA535D872DF9B7221ADA3FF7B7CB5C5F0079B4AA78C77BB3D98FB08A737DB540326C135831EB495978B818F44F078C4AF9346F4841BD828D28DEB861A1AE127CA8408E66ADA67143607A124894DD2BB1D67734B5C76CC92DCC2CE86B1B0532D23811D5CCE00F076E5A1C39EC66822333F811F5D7E45DDCB54E8ACC05AC12DD1561A0E79EA3A45B35C4E75B3EE24B6EF5AD84A7604A28EAF3A633395332A8CB9D18BCD5C3CEEC7CB6B323A7B10D9D4712523469634A5E697DE3A539F171A9F66B49A9A511AD9A1191D3572B996AEB58AB0C4D0C7C78404D3F91A23C7E40ABE6DC8BAD9A19C5C48996D138CB675C67309A854C2DA10D34CD94BC42B5444896E7A8326E48FB2811D4BE5405760677A5D44BED353E41B3BB7EDFFED68F43F0CBCAB40A65384B8482BF3AC25A3A358DC78FEBCFBB361DBDE6747556F957B6DF2AF7C873E96E17DFFB97BE863AAD93314071A8EB067F26487E450B96C7CDB3DA67C8CC13E742C841F3A34883A502FCD8", "ph": "6767245eab491f324bfea406717923490da0d74acd5da9c231ec08d4d8db0d0a230114ecf98c8bcc42c4ccdedbc3ade39bc482510e198b718fff71f713137d41", "context": "", "hashAlg": crsyspqc.Dsa.PreHashAlg.SHA512, "signature": "07BD84C2C1F873B6060D651BD49B22F0366DB6892241FF5487083A8705357EDB546D75ED19285DBCECAC972BA905C600CCC4A624E892FA3EDE50D8297C5DF09A576F8D066CF452F53E19014E936CF91B9506F6A33C6625679F6EB48A3B1309A79E161262B2A6BBE9339722E1BFBA6C922695895C62DC5634AFD24C24A53B0C11BCEF44F52037358AD17FE199BD3B37E906EF5878379D2BFC60818AF1C87DFD8BEE1D2C62C396D5F2CBA16A8EED643875CE8DD0E2683CA270BD1446B061B7398056FE0E401FC275279164A546BA0E932352AB35F71BAA745A6B4A2920EF8818B949B65B2D90B5CD8E8A11CB158835E3FD56DDA0A8D708984B5990F19AEFB212F51DA5B0127D19B7CC372CED2359F2A3A1BFEB277A7B7B5B36CBFD0E36BFC0E0C316015030D5ED516526AC13D73DDFCEF309A885AE9695C52E96802281D0775A4C74772A7323ECD57299441B11C2EE7FC769C031B2FE16AB7B0C555045BBEE539D547E26CEEECEF5D3481B993FA5D93F796866ADFD0C7EE8D58532718BB811CC94987B714BD334AA7E7D88B0CCDE1E4FA4D05E58FDB9CF81C3490955B2656828E00F21F8E50CD20DA5E821721157A446607CDF91FC2F2996BFD94CEE9FF97E3666B60C30B1C55D83569D5DA17F8B83A8C824C7CBB918AB32E3C11DCBA9298BF6F8EA1D20E7C7C37A9B30B9C20A622F0601811F8B7BAB7ED192C6D33E10FBE0D2008FA8BCA0D3291484A928B1B65816E0A0EA9D543056973B9A964EF6E782D93FC40DF302D78687A207CDC313AD5C09E4A3B1886E570D0E29F77924A1E195FC5C98E3DCA1924269CD319D1E761574C25DF513E269EA8126B8098E30B43386B776232AB6F7E701B63C7A97E406469C1118ECD2C8D87E639A1D76BC52C63BA02BCEDD2300FFCA7C98734FA76ECE9FCF855043A641441AA87A22B433520DF598C43363BF5CF2909811D86E939730E9D872C3BFAE441856404679E0AEE0A08A9F5574D98816B079B4527DCCB2F0936CC5901557121F162C7BAE62BB56A213DAF2588AF1A35A4A52515210CAFBE3872A67644ABB7070AC63BE21A35B25B43701B8DF1AB452DD712C4531010208387DA526EC78C4FC3D1349A70C9D0DEEC85B30C1568C9B0766B01A7217F615C324E72B8A5454B39526294F6398E770248552CD0693C466DF3B7A7F60A047C9AF956E9FCCFA192916BDF2A1F79BD768D530D9332919D5429D68C964384C100F765070F83AAC9E8DD4207313CF2601129E4B56BF43B234F4129A0F54BC2322AD3CBF11BFF93410356FAD7C8DA43436DEA22EE2D99505A26A80768738BA00D4F72DA41EFF1DD5D08A61509B54519A3FD9286A1F88F22C9A6414C15989F17C824D3CEAC6996D154D1093864F5520EEFF4874F31A3403D5424D74C5E5FD93D6E677FF4BEE1AA63CB61DCD00F1BB5276B045A2EC42DD5A9CFAB5B6CF4B7BD7884D6393E73378DD4E777A5A33896E03823420EC60F68F40FD847A79FCDF2512E5AD37B08468BDC66A1607EC9B376DEA0793867264F4F218B91B19E5430FF5FE7FBB3172C23DE5490F79370F8332DEDB4C64AFB7F79B35F426B5194E5D7A3A896ABC378B07B8D38CC6059602F8BF396B6BA9CED9B6B27950BD78B242D906EBAE45F33BCD64D2219BA4934D82746038CE27DB54BAEB97CED1664F0C260157940CC565D995343AEFE486D4E75D6222309DA5AE379D6B3B1EACE772FA22B596DB8293949454023E2C03828C3B4B2399F69CEB3B79CE144CF1F72F95DBF22F0AF9F1C330875DB69EE0784D5F4878B565E12CCF84BBD5DA699A80AD992429367DE3D83910A7C05B8AAC3B3F82F8E7D7845A7B220EB1AC7266C1D07B4873593320C4136F386898097E4A7AEA85CB4C782A772210FAA6FA831A5F52BE0AEA9D9B59F769C57AF11677858BBEEC7AEBFEF776BD378ACB18726B7010BA3E7ECA55CB83BC7614CBA6F23CBA6A330FA655822EED44D3DF396A6210FFC8DF3922B4D0E660F5BC079DBAA3B24C7DC8781A12B0EACD24D7744A1EF830DD301FC6521B4F6FA70A61277418A39D04065188687A1DBF8F262CE17C14345E9B90CCB0A61C7369D512C36E046B93EA3B6EB800B9E823A2D415FD825ECA83346AC610B04E34801F766BAC80BD16A73DFD2367FDE476E9996644599245476BAC1303335723D3EAB2551F8A212D4B2C762AC3B581F14FFA51FBA385A8B3D4641A6032FAFD0CE7FE85510D11A287D97158B6DCC1AAF4C2E5929FE28DD1F9FBCFFE3D62B73BC5A76AB376222163C28932D2149B34D8726BC284D0A9F28BE77311417B35F4A54C506A956A7E2C705BC9E28514668BDC4899861E9A679966CF0C48B608883A2B4AA6A0B694D9091CB8D7397D014E65B94BC562832C82851A64FD6FAE219B49EAEB5D1A88422EB233BAD3385431BDC685E2D7D97D6A780D28B76833260BC414C8307BAC07FA42C893ADD679AE085360E65678A282115E00D77570961E5FAB95EE259AE297EDFF56993CA2646B473A867F22D8630B13AECE8F7CC9B7BAEC16CEE3CF074F11262CD9AD1F2B9A9D002CDBF842FC25DAEA7AB71EE3CA6E5C38622905B0418FE4AC85F5BC9995C401B079DD3467E6A68B3E81AEDAA5BA7434EBAF55FD3421555C7D1BFA034D28AC190BCAB439E8CEAFC24E6476DACB3312F234D9C1D354B022CC0E2A6FFCE1683236F1D16CCF96E3F90CC06ADC5FBEA60D897E6136E051292F94E4A17A3C62EF741E2703C9772D3424615D709B76BC8A09BB19EEE07ED6E62545173EFB620F8875A7E551431B53BD402910233E5975DBECA52D7AFF890F9D26FEC6FC3B697BD2D366E059E8C0D2EC3957CF2FD82843DD1C9BB87787C1250218CB50D11916DBD9DB83490B5427BD3503FEA8F82D0F5AE734C632E14A6E2E6D763DEF9E998ECFFCAF70F54E602062880596A3E0DFA34EDFFD47E732D249FAF96EC1F8CC0A68876B0C167F9EAC39F6368B0ACC184ED560D4702BDAA219F6D19E4E6324183582B066C0F0FE00C1890AB8EF44B0817B11598EA80B47B1CC0F91B71F57EAA95E7523DD208D7D7679F7F25000019A1FB8328ED89335F5A08946B682E7FC55E4F65CD41DF4D7F63732EA858E791968955CC3FE040AA01B5757F062D016416C7626F6FB935F1BC7F9F84D50F71642DA2B7C86B46B07507D66EF41DA2332945149C9829BDD61699008EBAB959BA82D38A7FE2A0568014B41DA71F3B95F3DA1264251B75D0B4708C76823A1ABA31F509BBF41B42816B0A2365752EE227F03BC19BB361DC88AF627F61773DFF4AF6B7FF1A7336E1334F06902F1CC0E894F1155647E8C9EBEC0C7EAFA07295C71748696A5AAAEB0C1CC18548687899BC0CCECF7050B0D3C4751617893949B9C9FD5EAFE0000000000000000000000000000000000000000000000000000000000000B182232", } test_mldsa_2 = { "tcId": 324, "alg": crsyspqc.Dsa.Alg.ML_DSA_65, "sk": "86906B6AFADD3987E324CDCED1B7A9F9248497713BAEF0D98A291D8845614964DCB8832A71FC31418250E2C21A4FBAB57901CCCF6D5509FA5AF9574149095F0D028849C951704027EFC8A94786913B137A7CE633E2A31C338E2C9158BC567DC97D7924012F5E66DB2C426B7DCEE194DF89E06C8828182BB0426725445463363E45283751104217323271645024307087612070052855663166437876682274625474424867857377143577334046157710874028788000010752105656460174731506318237760370387525183576365510421520087222662134753528431788578536528451115455767248413356401103615807373865257751011263150451813134536710735552450283355130008773301571074410260158646617586854503382753764317570126524770125777761341472326375276656275076857732480141765652860523140032357440350203388018075650788380180871048435546254721576558573233833266472402377030848178273461564717832815251150637805871015524768314424214235404110572055247864877763628133674235415572062828723471034754378474527858441785722313437014605225767084203501265302025654665872233064364670068146683203250773817151628635445382045528410581013737385005078462717146527068374354000865205337741654641635536638737051557532476227843760063827560123828654061328838476266410260546126154376610112668082270617036315404652444137384032404641072641285136476647150214440555782312562321163875306566335630025130756281086526823070788870376211621210431548624425026302846257605184538234684175815035560830454222858573524865553233111072202754356541102124044338677317772371752521761446544844031724306820356881766863140447787463165126062643150866304044684640785353842032581278476805276138087126310783640802831332464665062657014252022641615434870253072671548250171434455763486078418560852260656515234614338387538875046283457488020256684081428845237405384736702161475131654717234514418065443056650584124365642146831657247570217167806723648127670325803013868325617508121764110631512866833433366312885325557157525020466428622182425337620547124058656385083160634605837104213354557607570032355176847272672650703634528621437733307427462675841210571288475788132478211656521047504750462255052107347673674584275884641485683485517530177286341240724082104285004147282487621314011038813140150638635401034003573665182406162864770215320617888061086263656485627114232264230731486384271135357305643247666760224167550424342360635674764645358763827784141510836436135472775238427032611428565654313102614212667630563035034782000458806374565526041527867242040174668588132313313852768704682363836027613413522628003635762881776310065758483561056418676672457681311462120346782014738024412268132850404366656660345465587608237062616734370782884085475110267058214121772475087856215024320544448246434428876551387084206133828131032211608477335665786771817540424524552077208203620200741715531680316383431883203358858524063542123866668327523838317818362867168528121304405077241772050872173075673416127121001025730371737141801714050468844382128074237428240348672414235638812128522741435082406721342318780163751887332813633588507283405707813785656307138438383732322813768842376115750048464688650642310824082146558780868761880788013086751316657258342402478847112430275578E3ED1356F6D1297225449B58224A80625A0CF0AF816EC831ACAE67BE4B9DA3F1B7F92FA24F82A3FD8ED4B46596180B0A9D74249DC782C39CB4269DC5F34DB84750DC03D2D7702943EB55265DB846551A5A8DE976DDFC5117D277B65CF37B80AF14DF82E2604D2802F975876832607157BA3FD8EC1B00A61C9237570F5A6288EC8F0625FAA4FCF603607006BDEE134707FB65023BA08CB4099607D4099F10A54ADA839F5B8EDC3D221D8E3A72D3CC4B02977F02A50D92DAA5A19C2A4E5B6CBD24C49C4028B59CAC1DD41C4D569A29D7C70975F5B374C908EECE52DA197CEDA9A10D7B6057E9BDACCA3336144C91CF798F3C6CF94FFD287DA7CFA0DC892533E0BCD854ED6953D67F2A79061D40823132B2626062A28D4EB7C64D728D69BE6769EBF2436349D108F717E5179D3773CB63098EC44226A2C95751BB88AFBB12DFBBF81335CA5CFDD7C8D926EE520419A308761A3808DEAAE0800E23867D426B1D6B997211F30C524A70C484C08956AC48660DF2F0FD26055DAEA46FEA4CFFCB3C9780E9599C05F1C070588647B35139A09561DEF73CDE8B7EB9B39E61DC9458194D4C9A60E48B2CB988CDFD20CAB227DCEACFFA3AF9CCFF9847AF80354F16DDD710F44ACC01397A422B5D04BCC37BCE67538C1A8D26D7B9C7FF5153EE193C50C8F40BC0B4BA29A1A92F74C9316E6C583DBEA8DA342BBF60A9306E47B1DB6738682C0DD65D507A47C04767E80A8EC483BA2889ED65493FBE2202B865ED300A4076AE1859C391592974089CD846306326EBF47423A599F332BEC444EEF3121192686C758EA5582A46D2F02D94FE7FF2D3AF8043A553D65A34A6C27ED697E2770CFCBF3FED59D4A2FF580C2B665B10F3F88053DC8F35827481CA693EA660BE8DB352D3850BE81093332BC8C958C737C53D371602F21794560ED2682247777719E0E04134929266E205C0C9905F2E4E76A50F0C8F390820DF420F1532090DC724E29339E2EB593EA02F7DD7AFB863F60C2BD364D4E4A83AD6C0CAB9E73CCE5BF218BE43CCF8F7A794BE6537D096E8B8ED78630BEC84732753B7DE2E6D9F4B245B1E795161790EFC408F09B302AEAC0F9091665ADA496A33887BECC0985CE94EFECB048EE95798D4ABE63300ABD6CAF3208C8AFCE13B2F40C98E14ED2212B1CFEB8D1D9A4E3CBA00C8869E3B22EE349DA7F1F45441BE67E699541FC7B810D728A289FE3A8935A9699E542FDC2E07BA993A0690A718D1771B74BE0CA78A16E9FD201247D5285ADDCC10B50DBA084FED87E0DA4ED7E60EDF5E27E6D69DF995DFD529C6E43EF141ACDD267F2843333451BFA348E26F56AF8BFC031F30A036E26B3B685728DD8506DF974B5076F626DBE3DE68D6A506631476AB284762149A283AB2AEA44E4F92DB72E654408CA6EDC1AD8F1191ACDAE61824EE329A65ADED7F0F12F2A39BC4C3C8496ACF298CF9D042911E4507A0655D3C8E0D481BC32A98FBD4CCB11F07E2C0D5A60E110F9D1FF476242CE22C9769799AB79B1FAD33F3C4786A195E7372E30192F0F3A21F6B27D78F871A12E8EC6BCE2822A966E70A3480A703EAABCABE257F2B58281798B82C206C7277D92F66CD401ABD0DC3A5A650947CFF84F30CB66407BE9CEE5449BD77301D3EBD29976C215CEAB47F4D699F1153A1ADCA5A4A0CE00E6AC5B1D0C48BB399C6F7CDEEE7B7AF72D5693AF09B009E5C09D700A1C27F01B567D9783AEC63F2A1C56EEADF821C90D68B71C7D41A2E34243B3F43B530737B3ADC178FD8D50EC07D442FCC2F5618B54ECE79DD90EC834E2A28388004BA3D2AD314FC2F92581C05F2BCB5AE4E557E896D35435EBC161DF6B8EC7510131438FE027D9FD667338828A116F405A87631E97A08E47B778EF42CF7BF5989476269D07847A0EA120CB3F128346672E4FF5527189A9E8DC94D407980EC3963E706FD919012A1A319A59CB390D3AE367E4E4234DA83453A95C8896CD0D8FA8A4E5ED46A4FC19266685100E87560F09D9E79A756BB92AC5482E72EC4B83948078D59279FFB9E12AD016F443228A34FAA86E5DF7CFB82A1726DFB8991F31FC3285454438F5CE9CA5A970176333EEB1682A66F360BFF1B32F9AA532A6E7DFA69D2DF4065B7B202211BD2443AA4A0EFB982C5F0562ADBE19CB5F57564D93C72C61F3AB93C62D5F59F95FAC7B6D273FF6FC10B51DBE8061878C89EE61B013EDF16479049B0654CDC65014DC00004CE6D354FAD795160AA754859DBCFDECA88DE585EAC7D33AE15348E6E011B7814E6C1988D495D8089A2067BF820746C678B3C734CE74EDDB69ADC7E7607DF583C412801383138A4B1B02828666B7CA0C8750E43A5DF88A122D4209827B0BCA7FD950AC165F4FC6C3C78B82C9606897828EA3897634017D0B5738547BBF4C9EDC969B199CA7B1216C2CA40A0725C0BA961556B5B455EFFC5D6017BF8905970DC7897010D2CEE6106543F46A62C603BBC2FA1A630C23430141B374E94D6F9D3F4099DB49A57096421331C6122B2F317122423E154597A2FF6F1C887015DE7D1618CAC6AF920F2EE6BA6D79405E569AE6191F9B9FB18D0B7D5B20E5538F37621749F4DCED603BF2BAA45F6EE5D1FA85AB81ECA7CA4552F1BDF26690155E36D8E77605FDDAAA56B68489EB115BBB4A36809F314FBB1F9C46397834AE659C1FB172CAF0C6BEA8982C95AB6EFC88FFC25770375C039D5E79FED1936297C2BA6DDCEDCD421FE26D0363C7028E748622B954C66C2D2ABC036D43C091250BC53B5A449B6F1B584E6431D1456A44CCA573EFA997D73A8EC37DAC08C0A49D1FA0C5BF02B9145D084BF451688FD24CDEEE2D518C426AE63597EE922ACDE246B5F9D59D1A7EABBA45171441D01339AD6B2FC72729705BB7200C4A4D41F6B18AF857BB3975F92D8F303BA102E29F2B35B9D0227052ACE611840D348B6FB4335AA2840544965B37F75D95400ABBA4A9DC3B58F2F4D217C0EFAD01D53C945A3E004662BAA4E94EA1E9B88A7359EB5B461E48901F0D9AF9B6DE010F1AF72E26B12605DCB4B0424DE9748BE94963AD0A6ED790BFE4014922438235F0F00C9DC96E44C01185F5A018B74DADC96849BD92B691FADD5CA9F1C95B0256B414B41EF4A9C985CE9B871EF905F77812C20FADAF651F18C022F717EAB5A2DB20002081E8A7C125E983E7E25BD615DDAB68FA75BD5C8D00B2B1A627F4BE66A6D713E1294FF65C86AC1898844E8C844BEF4A108639E4F592710291A00545A968E21898892836DC4CB9BAAD95E94F3455C00E00791FEE0F2293B309ABF54508C2A474EA96790757EEB261E2EA3688260BCEA099D4FDFF44A0EC323313848F19B5D921430D624C573D9834FAE440C1654E60F6A11979D36EC92EBE030E6049CD0D11FC214444A3C51BC8F7D7055454D934F9C418285B0D8E1E9DC2184407B72C17770DAE913F1B1E004553616D897ECCFAB8133F638B83020C6D9FA0E9C5BC25A6BC55E3EDB86F2E9B8AAF3DD50717E2B1CD900A9350A4C24EF7ECA40B148E98990B2B1804F8239AA", "rnd": "9A38023A287A4EFB77570FC8C70F1FEC0E17D98BF86B92368847528E0F8F7F4C", "ph": "0b80f2e8f74c19682b830e65a72a8b004654c2e0fbd86bf57f1749ffd8ed4df1d570ba6f9c1c434aec44bfdf4d75a0b2d5d36f8dad75bdfefc1d00f3c406c701", "context": "F12543B3099278EE83268523AEB2855FDF819C09F67695DEEB0BCCA068D121FD7ABD7B4C6EFF6DAB21CF018D4A7D4255E8BB60318CF9096C72B2", "hashAlg": crsyspqc.Dsa.PreHashAlg.SHAKE256_512, "signature": "95288BD44ED92AE51F6B0E3B4B67D9F6245A57F3787A434FE1B54149DC1F8B6B39D221A925A75CCD3F8036D34D44F67B810836E1868A427BCD62E9199D3118B8EE3EF95BC48C0074F9A95A3B8C04731E52616A28B6ED90FAA178D580664474C86A346FFE442FAFBD87A5DDCD005F8EB281D0855B54BB436994FA1D5613E0F512C87F5EB73825DCE6E00C065347C9C7FDDAAE326B3238E4DCC18D8917B25373CE103A249A8DF751C355B746AF1FF22A20FEB7D147C5492199797486DC844AE140339BA1AE6DBC0C5CA69DDD5D7071E10B467437E80B1410AC9591A0E5E2B6AFED585D79E194DB9F0139442A2AA0145BDDD90C49E6EE4FBC8A4837508867EA67684BB1ADF2C078637CCBDEA687EE4FABC4C4396ECF0956ACD54CF0CDDD6CE6B3D98999E4E7CAAFC71FF23ABA092008E78CF854F5FA90660992849090FDE7B76651211A987C67892E38654D10C6FAD5733298F965F56FE0ECC920A97AB1E064C680E6B2E53B5FEDEF3D8AB3596D2DC5A1EE8181A4C1ABE6F3D7A2E23F639A89F7474D8A507BD6A1E84808D907FCD5CB9E6A992F278212AF6CAC18D7A47F45EA8CC94DDB0020DBD8187B14BB7A9094D5B9F4B8418767B0E77B67BBC620A2521A560007CDE402C2D7E2486A64737E54CC803C68E020980AEF2257566BADF036C0304A15CD7F83DD17BE9F217E4A76FA6034CF11E7BF16714CF9AA07D1F4FB7AD98068C5B8D12B728D119D1AE026908E2A7B1813C69E6C5A5CA406D7F348152857A21D2D815AB4C4D2EE67344ED089FD496489837D1A15B5FF9A94F6D8E64BFD31855B08C711A4DE6599140683C88ABFF7D6C4946AA3488FCC947D9410D1602ACAB70E2D8383082BF3BC192550878AEB6CEADB1F050DD24DB69FA497A6853676433460166B6516A9BD7C3F34062053E3FDF79DB87DF920E7AE7692DD32CCFC2E85CD8A71B4D8851BF44BBF79B45CC861DD0217A8279A8B6B4A13FA5EEB6852C5C73D1A3C9F6BC11921D1797DDA2D3CB0B7E69447709110C5D9853B6C9E2863387C5E5B79F6D25C61E29BA040E0AEC3C9D40F1FE24FF8854726DD187FCEE6BFB0FB35E2D038E8B4AD5C3BFF7F90A7FA0E3E9A4CE730BC754C867815F4BD181FE67BA0DFA9FFB522546D208F3758F95B09A759FDEA81E745D20B53D91D593230C75BD494E0578892CC9D72C43BA2A70180BC5011383698F58F113917EBA881548D6AFC824F87ED32A60C2B9FA15F95357DC3D21BBF20D01C2447F24F5C7EA636BF82D16030822EA180C3EBAD37C1E6EC4FC4D7D46E3541224BAA0FF73C72BBEA0B8B44A6B15B2CACFF380A41413CAD5295C2384F63DA96F03B864071FA2D6C9D42F2DBB6E8610B29A7FC5E235D7BD53BC1148101A43ECE9F8E01E06B1646B6B23D9669FA51B66483FF8684FFF96A8EBF97748902D194A8F9C1ABBC1072FE159D07CFD05722C84DFFB1921E5FA16755785BFF883F3750E5668717614BF67D212654D4DC391DFDA26589CCB433AB5AC03CB94D0D51B5C9F30DC6D72A5407422A1B2D378A713D836B15E22CC44C88B4A958270C4DDCF0B3D7D1845C84D612D4BA79614F7B90887D3858923B40F28CDD590A1006A46041821572B90ABE58326FF6FD33D374B9B867345E24766EBB15782F0521B7A29C569788D99D259F2DECDC19DB26B976E1B27B7F91531753BE53AD88962436305136526B7B4B7F94B539A1EB83FDB04C49539A73C3615D430E23441038F41DBB64DBF1310EC719CC77DC29B59DE7F279109C956B39C99AB537B0A160FB1CD42C817AB08FB62392FCDAF5E0CE2F127BE81E8A6027604CD90F15B7922F18F20497A47D7778A698302E92B3A6B23F5219D23391250EC88868CB053FE4E1988864BE9AD934D4629397DB774FB8FF61A0F941A25F43FBF820F00417352DB338687FB752B7F7EF2EF94CC4A64AF69D14C796C644FEEBB3B97C31C4C4CEB027314B4CB8215B6BF715113A2349C40B0736A1DCC26420516CAE1CC20CDDD7ABAEB75DC8DA19683BE36B41004B276D56B49DB9F6E03ED87D911F679107F623511DAB1676138FED2A1BF5D4B4AB1CD599C9CCFB591646C407907DFE9E7E4455CE451962B199A3F45215696B6ACF3B444B188AEB9DBD3E79A98BBB21E99A610763A5638AEB0B6075ECF4A98CFC396C0736AC0942F9D4F8FDAA7E11F1ECC905960846780F0B415D3665BD0EEE9A1449791902D0E96CFF2D9BA7C2B1E5369A5028322BFFBDCD5EF7F3091056E56185812035BEF0FA39C6716A2603F08C4E2D813A385801B069502748330F8C24C1253F721E57900210635D6AC7E567FDB8FF14CD9CD309D098C25EEBDAA555B1FBCB4B8FEB2BB2F703F84A6F1D164109B43C645C26020BD0B64270F88F7E350681556D141D8F5B2817FF17B0F41C21BF59A964B8BB98C07A64DB970FF6A01D26C6D84775CAD37B7879036F7E85916F9750F68C32640E836BEAD8E8FF2DB0F2A258F8365A4AEA48C1E5BDD34E7C508FD041838049B82C7B0EB9532EBE356F5F225337B124EBF0451E95348F4E3FF6F29564DD7734A83D696DD89A8EF0B987F5CA5F5BB9848C2EB811D73CE300F88A366094557B1E2F1B1CE73CAA1908C14274D9D38FEC3F532FAEEBA8EC0E43A5900EF0C0D694560E8BFE64CEAA8EF3C09F93449E4F99C71FF06287830C16BCD9AC4755AAAD1D79DC7341D7CFE6F94ABC035012DF35AF4FD34387531051C253D9F75745E8FFC7534D5A259B69F990C35E2C563F6D89D90931B5660B36CD780FC0CC870BB538B9F067EC5099484BC1A2A3426C49C7C3EAAA3BD61681CD3294729083096A17A859044CC7F80876F92F291F327BC8C5E499F9AD99766503351C615BEFD33B10C557497870ABCE49A8A88E3D8C9FCF90C7C91824B07EF7E5A6A6AEAD61E6F10928F6F92DCAA96F9D6ED870A9CCFC199E94E113CC325696A2500051AFE19533871F5E9B303BD9AD992D036AB83518FDAEB883BD81BD932A62167358B616EAAAB7ADE6B4A94B6C1B98F8F4AB6588C9DBFADA3083EAE0ECA086B6D832A824C9000DC06FD8A7C9624015E96A45C753171478D3BCCCA94C7AAAAD8028CAD84DF45AFF9FF7AFFEEBA841CAFC3684FA60C4346591D62ACEF63A88807BD2928BAF966A712447EF3ECFD954BC840468D55248899BCF129E03F55E44A171F9D5C0F9195F018E3FE25375E1EFECBD2B3FACCA2C71E55A3789927640AD020CB460F3CA3000B48834643DBC72A5A16C55D5C7C2E0116BBDBCD795F4EB305383EC8696016A5E76E68577B9D76CF012395C6147ED07EE2756E61284CB867F2649CE7E660C2410DC66E411E0001256BD694D7271A834A4B0054F91870CD9B7EB8F6C03C2E9397333E61055135381601107B819B77DA820746834489F15606D7A4D1FE20A52ADBB6448D377D9650E9691B2ACD9CEC0D918A10329B9C95958584645C05017AEFE60F7B19DC655DF38B41E134AEE61991DA6F931BD30055AF4660F337F8E1FEFEC31542B4F23B53DD9539EA4EC8FADEDC4FF4172F64A3ECED42468A91CCCA02C279DEF04A7DE301B8D969944DC1739C2F6066A3342608AC6D3C009CB54507830EEC321F8F7284E51B2D7F5B9F152F1FD2AF1C85089259ACC890974AF9E2F0AF7BA12B3B22325FC8E27BC8A8B3EA16ABF00AC292FBF93C863935960B007986CEBC77A5AA5903C03D390EA7EC519CC1C095523829FA89499D316703FE77080816EA347CEFF99CAF77E61059E8C9C6E2F6ED4D1DB908B7F6D671DB0545AE072E8383F2B3FC7B7E12A0ADF7B20E1BC6B19151A6BEBE1532974CB0A3981003D1FFCF28EA71199F6E4DBFD9EC38D628896D7F3733F405306E8803AE61123BABB497E6F6E1AAB8EB80CB92865D8692B26E0DA0FD26A2EFE62DDD844030643655D9F301EA07EC6098908E56171C3D3C619F7ECD903798D2DB8E154683BC9748907CE9F8A15F25A096EE3602EE4BB58A89B5253E6E70C2961CD04F0376D1442494288EFFF30DC9EB6D84423B6351A2B55EB7951BDD1F782DB27E3B46806076C7922B50026E444EB78CAB8EF59CAEEEC02AC63522B8A16B1397D3BB1D57ED60E60FFC9A41D9FE56BEDFD46F356251199FF791688863F0E060CF0C87123A5B1295D6FC433DAFC5299200EFA989F0A9A0FFF1D49EF06CF9547D3D91D5FD7385A2443E6AE5A5B2E27DF31590D9E6666CF91194D3AE5B1CA99968A8D1F1A6655E5AF64A5EA74D16E385FEA823C7B53749407ED182F1F60270657513375FA124CA23BC820A405D27B7B4D9DB18ECB681EA3EC0D4601852B05CD0F4000CC5F64340B211C9EC9970A7E9C7A15B642FCE264ED33701AB0B234EDAA2CD4B1F79A27F4123EB802100B489C74373B2264BFDD080E1AEC9747D5692843234F7CEB4F55DB7944BBED9E7D473A42AD7A528AFA2B18CC6A7A9C683EDABA2068C62A517F903A3F8DB2EEF67B00B5D33A13CDBBD1FC77B34BF48777FD463429C2AA1746496D505AF225CE33BC4D8B441E62A49899C4C059EE35A902D1F9839EAE990BFC832A224C0448D8C6DB33BB56412A66FBC2E42379E02F4FD2D58DCDBB5158B64D1F96CEB90AF2E84D2ECCAB02637EDAB5EDF540DBD3EEA22D394D709198A1A5B0FE0FB9CDD6002F417AA6CC10348A96BCC4DFFF2A91DCDEE61E1F24608DA7EA0000000000000000000000000000000A0E141C2128", } test_mldsa_3 = { "tcId": 169, "alg": crsyspqc.Dsa.Alg.ML_DSA_87, "sk": "BACAFF15C9049CF9A0A3BC9701BF0D395CE8F15FE723B95FFE7985F4D77282B668232E20B2D8D3111BF465AEFEABBC6E6092543BAED1E1014C463D0ED0BC8768F084D13BA08FA4CD471283DF8D41EF19650C817FBEEA5474355466B393B5413E2B2C0F1A1C5C8F773CFBEA5B587F507434C7DFF3AB81C2FF39FC5B65976204395AB6201222265990314C48604C24604A36305CA41119353094C04C140360A026481A26324108409BA62D5A22910303112312600C978114442982004E4C486088A88D6014651420889CA64561928421042004B76C8A242092B009E20006080248103661CA368809452D58486919046A188069A4122C12474E64424A02462E04918094200CD1263008256A52008988982D54004D24B225C3B27114122C84A029CAB48919270911832910974011016C532088E118050B8390934049D39068E2A22021856099084DC3804548888124207090300D82042521C42C0C80610A176148442EDC860D240964001391109468E436311B01925A22058B280962049109054D13C0240A3544A2C6655CC84999A0880C122013412200488E0B95258A342014394A9A368112084A12A2650B8081D8426C63386041B46884425124380910079013A28C50462001142D1B102D0C9608CA066500450E0A0309A0020DCC06610C4862E330680A0921001810012185113222D1962D083610102965482428223110A3226C61420A122465DBC28962128C8C94118A18108A064D94B46C54427101880119C60061A664A434095BC20550B20920C20C0083844114880903200A02224BA26544461009A38951263104856D1C1286C2249204C70540280D93064D91409223082898288202A9080AA16C8B444C91846184C80159926CC9B6080C33661992212049094CA68108852C0AA0490CC764199065D398854A342ECAC49120850020317109C908A3B46D08836DD0222E63C208122730E4167110A46C50024002B948098181242642D188085C1631440021034508C21225E114214824281B330A40448C12A3514B10655B280C02036442B0509B86202428421343660300250B285050960D8B344514100D40486D0B424D43268022A43012C54453966C0990109B968508C76D5082511342322332844B0285DA907190366418269120268A1C272A0C94909B002EA0A08103464A0CB84C01197109493223C38D23204C108044E410001C108E9B86459B344CE3A22960188C23284E24C24990B0298B208D94C2051B3125DA204EDCB86D98924C8C8024C0A62519050D121985C024105238250005500BB21124B23111A52D0B136802084919218022A91018152194164860448E111210A03071923281621070141981041391D1420489A048D41604484249092281600285024701513028620004DA18210848808CB665D3A22D5846911A968109228882144A91801124170949468281B44923208849304E0A934014296802906521C120D0348EE4428619070D9C1225030450E1302D0316288048519942446496401BA3045A948D5BA44499186E63449119140021C5700BC08019044D5BB46DA4A66993442EE1A08C823608D4926D434861098721002504214525A2C29000304002466099826002A44514016153800D9346689C4601E00820D2486A10353041C04D142951491409192426C4382400910808027048300EE2409212C4808C48212247444134464A062920872C1A332021380824098AA146085C400684B40D9A4601A2442508362ED29885219950C84020D3A68C14072951281003092C10B0510CA66803800512040624256960962D619281CA96841102929348860B23428A340A442612C14244E0A6910B432811B30894089009B340192568E2A290E1C46960885083404C9C4031E386640A296C42186990A8888A468540A84D5B2265CC8280033984C1226E8AB21010988108382921A88518284A4810910C35525BA60D43366289440811A66819210113B15002C661C2B68D1C032D9A38520402518B200DCCA689D4B45019930000C588E21490234840C0223103342223862413120521134818128641B62D9B309124B40C0A010E82A205CA462CA0B06D943624223882A1A84D54840403081090202082346A09442D43062421C51088346A481050C3A669002692A3C0480C21508B408AA0322A0C840914A94863422199A06964146D600222901025D0442CD840841F9ACF364B596302C4D665A981297A29D1F520C9C77781B5EE3CE2194BD2DB6D31571D13EBB19B0AB31AEE061E00A779092FAAD988F3E43EB78D39CF58445D3B27392730EF3906B8D944DF178801EBAE4214CEF53A81D0F5E035CD9A78FE3013A1EBEC762A868E67F6536DB722FB983CABB3B4DDD8D97F5141A2BEA2009B507B700CAA6DAD9E036D3FE5FF7062A587BF44E939AE1FCDBBD080C89FEB72EA879A76A8A37C1D52A735D0F39E1A3F3462ED503AFDC725B4DB8B3320233B13C33BCAEFBB5FAF0A1EE23891531787ABE8F0EB29068566BE75A8D0796672A4DDC73A583BAECF17B46A1D7222EC1E68560D083C410D63102546DBB58583F6D800C11D25EEF976D918F98F04522D9BB639CB02E0E55F6C10B63408FC075898FBA03AB6B2609210047C9F1BAC4672BD1DD13D3FA73A297C738AF4A2E567D236F4A6AEFB04259605E66EE5B7BED9C27054624ACA7776E6463C32335FB250B53A7100A8D2007B27884BBE0462EB05DF5FBA02A6B160ED66A994C9A03B1B298FDA07C725310CC0F11BBD65C3E49A5B225F36A4F8FA2541D571048F01EE5EF4D1010944EA75E9DC128D5C2DACF15BD06036C9630DDD4D4C096F4F0B17A831F799F1D9209D05A075861D29BDD3DC25395BC857CA06D05A9FD7DA51899E037920A0B898D4A92F3A1C697FE6BAD0E19CFA4635755AF6B9157D9ACB588F99D8F43FB9F69F114FA282723F9EB867348DAC936CA5B2016FC64222344B7B55306CB4BE9983B012C78829201CBBF71B6EE2BFB3777A5734791A7F962A5F5A645A38D483698B9E495B9F6D145F133A582C276ED70992D4084D3988B4BF18729C9441B1C3DD8BFD1F970FFFFBB8D2DEB1A702F0068A891E89CCAF996C962A954DDE93BB58F38942717F0D26C63BD54C8AC1AF4E02DB25C2D99D5C6B95C404D1257654414DECD128C8D6416A26A0147E01906D53AB8EAD05FA340EA4F051AA66ED6F7B00E244105DB42E0B709582C8EBA4A1A2127FDC29126497D01D2F46D2DDC03C82C5925BDCAB5D2A0AFBA7868054526FF58A3733DA692DA2F29C24D68B73AA3047BE6F7EE29251A7D3762F9D4C82136E6E59FBD094CB408EAF86DC7BAFCDFFEF27CA13D6ED19A639F50EC395FCF0A2FBC8BDBC21A7A70AC27BDC8BAA66D6768EB70664E4CAE420A909C0596441E00EEB3A139C6E3DD5A8F4E758F0659CFBDBCFBE5CAC333B5AC1BC3CB208C9F6298CE274AD27D20131D2B83DFF537F4903E163C171BEF806A9D3A4C47D269CE82B65C308EC96765684D4FFBA1EB09DA138DAA33D9E925BFB90157E3BA45B45C326601FB099260B2B796FC5CA8A17D2C3E844EC5EECF2B8E77F1FA58234C788D98FD385308A3643325C44E5B2265FACDCE97F66AC9BB7D77A5CFBF1A9A2E3F5EA8F3B0EE56D063FA05C6DA0377E3178884AB805C84B4769F014CAAA309AB0DA865D8D8F49E5626CFD9E9B5A7A593518E30F26459F47539FA6D94536A56B7D16B107596A7126F04FC583B1AA65265167CC8FF677AAFDFDA4BF371407F8B1D2510A31EFC9DE3AB470F8982CBC416D316FCAEA854F0B04650D25A9B5B04D0BD5093709CCC9CC687DAA3D639EC2D3BD9ED6633AD2E8EDFDC494655CBAC2595C8D01607996F155B3DEBE47C68E531E51DDF8BC185BBFD39D62BB9D8C94760F31290FA6E14488B7385036DF0AAC2896A20BD1684B778E21548ADB95DFB6336EA4529E297931699223385C42DABFCDA28897998BAE1DFCB8F3CCA03ABFEA5BAC03ADF45E2A02B32B180DEFAA237AE28898E1187356ACBCE6180F6A15EB0970FB2732399BEDB33938422EEAD311422327B003FF0735226DE3D34CA77F9DBE1A3B3DE66B9E5F4F68E45C07B07B0492D18723238923AF06A7A1A6C56C2E84ADAC680C7E414742B5FC4783894648D8814DCBABD86CB0E921F56F6B31F1ED56BF4C4444AE03301F83B398748EFA2688E6061DA018AC6305D47314296304590FD757E5DDF0017040A07C93FC030C39D6409B1223527D958A3419EC580063B816C6A22756A460AF4CCD6D9242C16B36196948CE80F873F11DE8E696391171F3D37D771C26460D267DCC2674E4535D202374D54B67F143F775C022C59F2AAB5D6A4293DD47215C25A5091EA104B344219F885C700FD69639782531184B4159F95584AEB8F68C9775D5582E26C9EF591606FA4260FAD228FF8F36D2D0E7CB96BB748F6F2D51782BBA590411C763CD9301D25716A1794D882D85F83CAB3C2FB942CDB04953BFA7236BAD13E988520E4EEA4DFC898D91F4F7ACF81070697451CA1EC4D52641F57A51732FBB67DCD1AA25D016873599B6D54E6A4EB1A2C2AAB37C1BC0CE4C116B1BB28F41AD4E0C0010A6280F87022907BBDE6CE059A0A72A2E434FA94889A1703D06AB0B16462F49A93A302E91680957EA638838FA1EE00ED464D54CE5992D1A3C55D975C93F1BD6C170623BD70E75C5B90AEE466C4CCCE765FB731D76D8330C1C870E6E0DF42CD76FFDB17EE06F75DA060FC6F2EC70D24B292DA05D65B04CD17726331653D82F852BFD198F84FA09B0E18495AD12957D3CF0D9772E53A5538785BAEE9502ABF6C8ACC8543BD02BC008850DA74B730268127979731283D52F9CBB27F7BAFF0EF79188134B04D0299359095F10467601732BF6930EA1EFA299BB07DD04DBB89629C081F402D4E5C1AA16A8703F4AD3451CEB4D1A2D4F397E9003BA9845A996D295630787A9345120BF000D9129D704681991BA28EC71A028D0F20E1448D13D1164A44BC9B4828C812D82239B6F352F91AC0D325612B2D320292F82FC958D00CB39FC3F5D9A133EDD99FDFA1D77F1900CDE85094D3C736C9E8EEF71D8B1898DCDFA611E2098888957F384D633B92FD684023FBD59C0020B83BF0D01B85729E84637FC02C3DA987C8E986BFF9F00212D71B3CBA11EBC7F7B2D146FF7F9BB508F7D99F3ED24318A863482239EB1B54E16A409D00DDC556F1C8669FAB4B91FA5DF7FBF7B8C55327932EE2330C718E803A1F907A3DEB43FEC46A1ADFF040F07D86B60460D829A2028E8E8FB53E97A67193ED0B0022B5E2FD58ECA30F86DAE0D05B53451C1ECDCF71E7DF474E3650747BEAA53BACF8778998A91516AE3DE196C2134ED17D57CEDCE1F26B8F0D4613121A845F448A97A345369DD9C1C68CD301D53C3B54DB6951BC0C74D3AB59B26135BC0D9D14EF79771750C4928A688697678AB224C429E6D963EAAD6D1DCF60D624E2E2AB3AC8F6333A609987A5D8A330F6AC588CF14E5B5BE5EE15577860F19C5860EC2BBE4AEDBF5F7FEB19652CA3C36B9FB46538910ED114BF224809181F961E8B6863CDEB2663BEFD549F269B07B4D8262CFB3689FEEE9FDC00336FEE68C35FD9CFAF40C1BF38AED603A9CEAE31AABEA2075CB858A69234716286A368A72D5AEDC7643AF456F7ED312E3AC42C6563F76211C33328DA73B84B7933A34C5957802F792FE116EC06D806F0819D5AC011B3BD823F41694751415DFF0126A9DFEBC3810457AAD00B6BFFD05644C8F26A97ED56D184A2DA0D015F0DDC93D27DA49FE64D1D3161FE55E69D8F9BDC6391D5C95945FB838024DCAF812168A8643A1C9E7755FE67E5C59B303672351D4D479F2B54A2881F16196779ACB4005079D314F187FB9E6380F0742D60814B9C2050C83CF1566637E128CB48F4CB92FC2692893FC276293ED3823D1D84CD204F2A9051DDD727A169235BFB207F7201289394FC03FC1E47C4B20B77017D92130918EFB402AA17A58827DE5789B5A687564B826CCD5275610070A2F93E9CFAD521248729F55A6B217D6A9B1CDD3AF254590B9CC8F801EB8DEF653D8DBE298B9B7ABB61495BA4FA3F69F9C3DABC99C8C4C545884FC303A501F33AE07964958A7B3FC20689EB86848FAB7480D9984157ACD845B26FDD380C8CBFF36CD4F998FC86099B29A3E877D76E89D8902987D8477E98249EDBB1AA7D9285DF86C1CA18D8E97FE0684F8C43E70560C1F0684180BC799C4A14D64E20C818D8CAB18CEF18EEAD2442A63E708D7E9718EA76D4DD78F755F59AD30EED3AB10D260F11B8A5BBC432A51735FCF30A5A21D6114ED7C4F75B45796B6CE6C5A91E6A86A0BEB0B90717B53C0A8A666333AAD0F5CAC478A7A09A2883AF999883C13BB9E49957A7424C9649BD24D0A14FC7028CC7C7010B3867D40E03455F564AB5CF7197499E72EA9976109A63B867B893B62738400D12476FE16BD5AFE9F7139C4854F8C2B8144E9A7F49343098E678B3C54AE5DE495D35FF9E1747B8F015AD39CABFDC61C6B63C838985A125EB191C3B2B4544D96C8A35175412AC618563789C4D4E1543BDB127917F206EC7F15C3658656A064427F4018D84FD438CA1CDF601D8CD7EA80CCD532C732DA87736B06E170FC74C6EABF49CB69FE767F12818677FD5ECC91F585D4EDFEE576726B40D1A7800D1466B544B07C04F56A6E72F0F1440D08F8285486E58A836B2565E9DBCECDC66D0B304B2F4C3FC16A9CD97D78C49245749390D7C5B3DFE5DF63A0CA18ED6D63748EE7456E74B89360B94613E81FEF3011ADA2942183CE5ED2D07414329ED8B152C91F475D74A0B032F7D85D1E668C619AD1AF7CB4F611C99574AFFC005CB95736E6FFCFC32D4A988DE237A266A58CC94E16CE4411068A2E1F7BA694A41A3FC6FF05298FF5A14FFAD9E209E68204B38B2EA39457389E2245B88890E3A7", "ph": "467e5d55ad0bf3678eac31d351452961de65921a96053249befc151f90dc03ab70b0bfc6c92a52fe0c289637c91465aa92842d3ea938c4368b2daeafe1ea47f3", "context": "", "hashAlg": crsyspqc.Dsa.PreHashAlg.SHA3_512, "signature": "5B60070CC5C16A8BAE125DC07749BDD8D2036FFF027C6E09FBA08F9ED0ECD359EB2B1FA6B744B9CB80108A4B930FB4774F3E425F8DE1E8B9C1CB5DBE899188492FF18D2B87933472AB64EE010377382C9E7FFEC464932106E20918E8F66CDF7327B4E4118508CA33F9915102BC1D314797AC81A07E1B767C2A7DA8665C35A8520EAC93C221DD4F1B62CFA92B098336E63D196F82D550F174712E08D81EF9BF4EC5EC5B10B82BF4EEAB013D2612257C62F89533396A54985FD5973952B337E364011CD05C551D2111EB7339656DA6C9C27A25ABE8DA42DD6B866FA65CE7D7F5DBF9553BA2DCD7B27176C6643C5D632FA1264D64C6BC81F0A90FBD15D9BC21549957E0D7E11EA224FD56021EE8975AB1205241A9B8420F91D2C88C7FD202FB4B9FF47F8B1B402CECCEF8872FEC8771D9E5038AE5D1DA3E3E769C8AF91147F7514C62312B68A229C995D426D3FFE0DDF5ACDA494E01985655E02CE17BD99F8713FC84D11367CA9C3FF283D67267D51363F434B75F9CCDFEB64F8A167C99E278F63B09A3E80D286E2024B038297B717BFEF8CA2FDF26B970EF90C4F9833EEB4B6B026AF8BD5CD6076CD93024A6B39F5D10B3C4CB2887732B922B092EFABF2FB39557CFAC9EBC4F89E600C0AF6C3C5163F00C470419AF935BCBC6C37C48F5B6C71B5F4DC8BAFC5A19DCE7973FE88CAF8B5F7364C5473F1F2A388F741472802A00DA9898235FF0EBDB5A0E6522EBC5EEB39C51603F4C953B0C1E50655F45185B86E345F8B5D5D622B3311863ACB00B9286DB1C046145CDDE6E2BACB5E675C2405064D8B17B77E0696FD1F383B198074EFEBB8F35CF64F6D0BD4A1DAA96BE5C8ADA6E700F6E83DF6B7BB3A88DFD078AED0BFDA99C8FB88B999E454F8DD46284C2FF26A56141667CD4B6FA364302627B67BA81E76B02CCB0650701683C4E17C88727BAC298FA8D9279A5D4400212F4DC5A63340E550E7AF4940D77338E3B9946181CDC6FA1E49294648A019C7DB198644FD4B0593127F58560F226DE1D034A3FEF9B3FBF5881D665D2672676158D04B77BD00958C9D7B08734C9BC3968803E9B1A283B5A9F95EDFF400F67BFDA86579D365A35AAFA6DDFA8A38904F0ED64356091367E1036E18FD1351E78C0B22C9A137AC5DB6D6E340221B338C3E2AEDEE03A53AA2C5DB29F0741872CB62066F4561436E7E61781C14BCC7C1FBB98E997E944B6D17F6C09AEC5A618CAAE1CE9EEC65E9ED93B7658FADCEF5573FD1A1BD620698A971C6B085DC6DCAE5BEF92A71BDB3AC22E7CACDAFB5376A3BDF99E04F1212D62B96433A1ACDDE920404D7370AE6EF3A4C7699AE33F5324CBAD1486DD51F86C4117364E09DF985556930A97732565364DB137A90403963B9F3E121E41A590395151CD4FD5F058A7E558245FDFD8CCA3A8C9C5AA73A391D82D89E2FAB3EC7E925DDF4592E7A5E367178A495C47C4E78AD1337F10CAA6C85DB50CB110C1F80E019BD44D3E0C5BA36517C3946DF7CD3AA89CC2CA0197AE248AA203C77F2A1B48C5E6D2CB18563A8AA7E5A2960DC0AC0CFF567703C5FEDE8C98D8D73FD98BBB1BD91036C3810925FCAD2B724B51875018321A73B386D8FF0F3EB2230EB375777FF5C3F2132BB084D554116419BB113499D36BA951967DE31DC880842C2A973D225F85DA457CBCCCAC632F3946FA30B9A07DBDC2617BEB4FBB793F5D87CD0BB7A011F8F2027B467F1D7EA9479B93A1EB17F89B60A88EF2DFB5723CAD8CD1F86D714140A204DDD3E35C7142276AD4BD0FF9D2C86399D7C978786649AFBE142515A51B594DE67A644E96447D1731646373618FBD1BCE307E9711A06A8BF7C3F3F035955CDC7234F898386F04545AA174B36B46A555D2951B64EF34C28A178C251546399F778FEFE4E1AB231B51D66BBF396CB3FD46443B5E5D076CB8E338D3BA90DD91EB93B8F930ABA11FB4BE44140D53CBDCF8455FA212645369592941670250CAD99ABFA606CBF5734FE34C2A6CE1D8CE775861225CBB8C57EBEB48727E08542AE178A318031E48727323CA42AE7D49FD80B0909EACA03E54ABC3D13E0B48A5822644EB908E94BAD891D3D2B1D7B688E4A4A9749D43B4BB3923C4F06C059016CD29F0AB1F9C8EDB7236B3478036E0A03AE8E77D07F12CB0AEA44B488453AD65568B0EAE6C7650FE857EBD4D01A91BB28684429591EFA19E6A8F44EEC02B7A22912C12A58BB84B19DFE714FB14BC7D8FAF2EEC9D38C92AAC701ECB24DF1AABD6EB2C802A844B71B03BB6A4D9590BCB4FBF1C14572637B0D8B914B545B26BAF81C6CFD690F4A501C6D04757B3A5763F474BD4F73FC8F0EFF22613F698951A01D60764EF7EE05A2B91B64E073C2BF1CDFB42D8B72BB82BCE2F2A216824275B9BE33377EFFD945403169C1297CC4CA664E1333AB6DDCCAE2255E7E544814082B8D4DA7BB424FD8098278C384F6B0F8ACF88134584311D21C85EEA30DEBE351773551238E2792C8ECEFBC7F5CAF17A2FF91D2481106AE3BDE9726DCF742D97D8368939B862CEE428715F16810657148BD646D49F91700C170250DEF82748733ACCE4ADFBEDD48454F2354F73D11AF4BD6408D1F495546DC0778BF633FA70219339A397198AE241703D505B3B714BADD940091A34386F01EA4D62FC40C442F0C39EF92C8BB6B56DA0CAF82BE9AD491CF5F60BFB802512CF7BB64A4B639B0FCEC2A7F94A862832B06FD0E3DDA7BCEA6B0D9CFF05C7F1FF41E35748EC154EFD4D3AD64933C4F205BBD72542669B29847291B4FCA8C9868D1A78CE82C2DB6B7742DCDCF4BED16B6F2BAC693E24E5D7510610D5A4719E801A1572BF0C1F2AA98F6571E998DEE02C331B859F5850B2F527F648980588ADC9B57DDC34A16D5BDC0AA8AD1593FBC421497E876519CEDA835B7BA1C3791217C0B2010D088652E2EA878EB8AB2A0453AB793FFAF3E20F3ABBEF80301443AF507FB63665D78A2DA550AC0591E7179A8D23D32E5BDFBDA0FAB1F6A45304E53518EA52E7774D797239A509E741A06A1A49DA538AF4CAC583A005E21F11C0BAE57A79D807BA968F66596C09528C973F9C08E1D2FBBDFB8E71DA55B82B34ABB389BC4527CA5363CB71D839F462582EFA7B9690293576FBF2CDA5BE7891E67A8734F2DE8EB664A9DAE0BDDED016DFC6D50BBC5F72871913F9F9B89BE05CF309803F9EE38D7360EC31831FC4239F0FC3B61705944D6A69DD1F3A62340DF9CB869D8F3358B9AA23D809FAD0730628E8355E5B7E27574233D023BE914CC43724BE8DFB508FA181E3E1C90C78720928B0D20CD0ED2CB76A4AC613B1711CB2D80CF47D1ECC3200F29079940646ACA86C2909E7220DA7446562E255DB4104BF9B8A4EF307DE97C3AC115E3CD32525037C472B148A76CF9599B19565C3243704C4E5A344ED0FDA4C04CDAFCB1CB9F1CC85BFE21251BFAEBA698A6BD489497317FBB1E84EE9C2E5EF4BB177F6405AA52F985DD725B1BD70591420B00C3A085EA68D214B9D883D0F5775E71AA502509768A19CC1C23D1B4FA06E60ED41F10F81CE32E01879EFC5C617629C8748E547DE2922D548B088E5A6B0F60C15B4BD2C49940C42D37846A99EF82914375C011CB1D12496E57DD6DFCF5D3D3497E3DA018CB7398134151F90107B59F0611885054BD8D658786AAE8A0300ADEB075BEA12CE3D10E5DDB139265BCC68D021408307B8C167E04FABC3EE21345B26A14C14DF6E9A5B026C3B65CE1BE136D3641B8E259219FBE3C4DE6384FCEC5F86AD7814FC422CD487468E6E3035FF1C38CDAA2554FD5D009D7AC82EE16FF875C18A6D6C1CD0C53EC29B4A6A62B75FBB844058BF9406E90C830702BFA38EC0451410930351A7A9D5425FF90FA1D3FDFFB7F1287CCDFE4EB5EAFB61FD51B529A75BDA9A09B9F5219297109DD764224E750EEC7C7AE7403AD101EFB92386788BBCB6DE1959ABBD4EB7BC69E298322BA395C7453CFC2270B3EFA21F2695F56E518E7C813967F1EA3FDCF8ED37AED204047FEDA95F54CAFC65C371FE3C82B39A1E3EB5FB420AD9BD363FDB0A616CD41A475A4C5DCEE48A16610E5D87CA9B07F06BFDA4FFB716C767E1A6C2C43419EE57D7390A6A1212630E36F8CC3CA94F5B34720D5671205034740B801EC354BABA6570A79FD8A6F6924DC0C061681599BF9B3FADD49A55CE30F55E3337AB05BD3549AF9D5BEBD13B1E1E93B0FC27AF71269FD0A3161A6BB780DE83D784B2DBBDEB3D4815D27D973E65905961D2757C61CEF6CBE45C9AFA39B2C8D25D628CD003A8CC2DDCB3A63410BFDED57EF7C119606DB8B7B5EC6D3FC36C4534779170C56B6825FF765001CE5961B7858D162A5E7585ECC885377F1B96969DAD6DC18DCADF9DAA75A5DBF98864AA66022A5E9B6F4C7047938369364B003DEF80793150BDA2259DA4527A390E557299279A4E6FB09C23E15CCD510596ED06F2B0963EEF9BBB181C5F84F2CC57746762FDB14E5F7B056771D39848FC901B070BB7949C8BE5F1279319D86B1AF956618438E24FF238BE1A84F339F02D494C72496E2ECF30D8FD1A096BD630554DD39AF1FAE9D4AC50D556BE93902DA65744404BCFE966958E26D782593CBEB1E5CEEA31B0182C8E7EDD8E28F786CFD0821B3B82F20A56AED6A50BAF8AF6D9B9C6D3FD5E815DF3C1A99C68672B43DAE64DF718ED629AB986D84CA35BCC4D68F747029F29375C4F879BE20912002EAD49F1489A59274E80BECA2FAF6B8341B8D706FE6B10BFE162855554ACEFC76C42B73B1015F75E2AEB2E1A0D4AFB0C6E68B3A40EB96894897EE03AD096057CD633609DC18BF414990C3F4B56CAFA01DEAB5042D29F88A1A213A69C748E0BD9B004B1B08A6984D854187E56C57ABBE704783C1B382E8D625360263B2AB2DE7C82B4A028BF3C7C1D5DFA2EC2A289C0E256DA605D87ADA75150F14992C657046AAC5A459680C66E2DCDC95BA0E3594360AB79C4A339D028AD22501209A025AAF65398ED82AA071B568B802D8115F6075C533CE23490DCCFF47B865E45198FF5C9D4AB447F5E39C675E41DDD9765429211859930A47E69D758A0E360961258229E57AACD60A91F3DC8FD3820D951807CFA95F00CE7B78A39E8EF0E92BE2441DFC5D8F9A2F57B2DD5E91A525E7B67A1E00EC02FF7403B346CF6D25164EDC102F6CA4EF4FCD190A117B924B37B91A21C2C2F06F41FC9AF79B873F4EC016E06EABE7FA0DFF5A83F9C492D5E3FCDEFE09224BA331AE241BF40CC07835528CA988C7C56E51DA9DA86D7FF7699516A1C94D4A747EDA47D6241C13D5D845D675C523F4F7D820EEDFC39F3E31F03ED8539DB6266CE82D7DBE04D732C6DA28F7BC7B68DF91F374AF009143BD6E474A17C59C10782CF13EF15A880248D7EC7CB8FC4E5790FBC94123747FF2928E9F72EDB56D60E3911C69CE3C1FDEAEDBB8A1B4769C986FA501EF34728B45909A2CE69E4D8AE4A6744C59AF2AFC632505436ACB81D28F300F7D42961ED30D6F68B63D75B65BD86B5459E8F9EDF17586C30032E5A7B5E04B08C3E1DAC0BE2F111FF298796C95F72B241F63F3A412A90028AA057A808F9BE45F701B0715A36D0C1DF5D801BFA37FEA8CBCC0B719973B5F090787164DF1936A1F91D994DC9CE2508B6B273CD5B34C76826B7580EEAD9DA2DCC590AFEA466F585291CD435C1E2E222FF0CC3D6309E641CDFD88A454183AC75CB61DA293B3ADF1852DD0C94FB9D023E66CDB991A21624195C591DC541EBFC0E5A01EBD2B7D548970DB49106CF81FF26261B492CB98A5214D94A5894525C784432C475C2D461AF99562C48F1584150CF0294E8F1DE8DE032655C3ABC5D727D96E8734C855555DE4B28830CC5853A1E88DF8D2A9AA8B1B4F3E0CE2738F064D242B29F7FE7F9CC843F481F6C148D3DE70DD1A65911232636652B66C7C16A75DAFFE7CCFD1498982B67F9F134E8D1EF26E2B7ED9F261955231B96ED662A87E7F1425EDCD43FCBC7583E29AA46EEACD23652CE586A7EB81F22032817F4105C03CD0D5F0B5961AEEDC4C1A5D75E5A77CCAC390F42A759E8DB6268D7E442A3EB6E5A7C19DBF79B2165ECB93F2FDAC321C0431F47837110A18D88B99B5F35F5FE478DF8F5AB26D3448C0EBAC86DF870595F241D19BF8AA43C5A4B4B807CE375F97AAA91E9D8B792B58F29D3F1007D9C8D45CE459447D0CAAA0F0543E21BAB3B87CF6AEBF9774B31308F71166CD25D7A164319CB7F9EB70103CFC4E9DF331DEB1A001DB8060A890CE23F20DCBF90D579C4DE40652DBB1BE30ACCBE1381B2AC3CAF24021A9325C57FE3288F84CA328500285168F4E1E88A7E6305CDB82F28E923FF161A2E9FB798F993EFEC8A68906E36C454E470AC1965B5C2B239669C8D1E810676CFF296DF28CB185C9B4D8A73C7D5BB1A1F80AA687255FCD772FF9263B2F62A336BDA4C141AD4A58B923FCE0030385EB2D9E6FCFE0421434CB1EBF11A20344A575B5F7D9398A93A8EA7EB224F57858DA4B1E9767FAE3366AEAFCDD91B1E2D333D4DC5CDF30000000000000000000000000000000000000000070E191D25282E37", } test_slhdsa_1 = { "tcId": 377, "alg": crsyspqc.Dsa.Alg.SLH_DSA_SHAKE_128F, "sk": "6A2783D1247E1AD50C62F553E4D79779111B5E2FD6670F6C3C090A3EA2A2798EC3D3A28956F7F02FF378A58E0C4807532FF3915AE7DBF6B7E94DB542CCFE6422", "ph": "a3e831b91bed4fa36af10cbbcb018dfcc6330dd82f576c22094518a8e282803f61d61ee10b583045ebca86a392e493af", "rnd": "DE8B537DC0F0B41A65A124437DC92BD9", "context": "0540D4BA750071429690BEBEFA2ED92DAA6EC301D38C0626EEB1F2B17C5EBF1717B983D6F5BE1DA18D2709C617A2CB5752A0A13DE142928917C97892A2FF69A056D561C6852BCE4CACA44465151DF0674394B0E6FF16EC787F0902C40AC946D18C1FE407090FEC0386A154CEBA1292198E835CE8D0F6C03BDC6AD5712E55ED0072FF77A8367EEAA07D80DDBF51C9E3557A3119F7CAB8D004C71B85F3AF6A846360A6979E670D4AA77A26A1A1FB8856625E84DCB2B94EA60A9DDFB5812565C61F22D847A82C41DA56E3D24671C36DE37C9CAB597589A63CA84EC4DF41642E79C097640EDF05F30EB7FA6559F5F7F5CE7D2019AF9F265D", "hashAlg": crsyspqc.Dsa.PreHashAlg.SHA384, "signature": "462672893304A8F314936EDE7D323D42EAAE29CF6E782D6B3C0604AFBFA316C9ABE1908D0E720898CE8275AF4C127299B9E098EB1D4454E6CA62AFD215F21CCAECC8E7762A0BBEB26A2DE4146338D9229DB2170E66CE42EDC619B41F4C5759CC80C3A4AD3BF1BF3AF9611035ACE125A62838F62E52D866554B4F51650EEA42136535F9316F1FFE6E0395730B5540F4D49B4BF12C2459180CD0B798A6FEE6DE72F5B1181E4E65F6516CB9E85DA937707701F6352D25086C4458DF085F7E01AC4F35963F1672D2E5587DA9BC373E0C22C5F2EF241E0AA8F811253775AEE839D7BEBB228069DFBB85B96C1ECA545EF6A44DDD049B18E9F42EDE5AB2397BF10C71E7AF562D055B669EBBB4DE3665023673B8716CB32501F8B125BBAF03CEAA9CB7131EABBAACF27ED497DBC5ABCBEA53F97C2EAF19E82BDF450C2701B3A26ACA45C33C0FFE411E20B3FD83241C6BA29685BFD4854797ECC9E6701818F6F881703C79F8521C03F1C95A5768A2FD288A7FD8CD670EEBFD46EDA69558D7F512F4DD55D98802A5C337A93DFC77FDF45194E5F4F18ACE14A131D44B123D1437EFE5F896243DD6EBAFCDE58A7C744E9E3EC78E896FBA6BF589AF88F878B11C70144825A938D6036AAD33D35A4C07B013A4503DB7474062BE93C0B95592D16A4DD0040A10E83868EBA41BBF267A4667A84E2494333CA7DD2077FFA32848ECE4584657497F31E85C5BA52F7DBD65DC68F8149820C4AC51195E421CDC787E8AEDA270E0786C1364597C38CE188CA8545588A0E27B2FC46FA8B9D7B264D1CA93C8066BADDB73C9B81D65FABCE71191615B4E485684B00A529A00ADBCDC37343605A322080B320F00ED71458A60A2840564B0CC9BAC80CAB353CD483B1423A322B14C613CCAEF96E887E5ED41930428CEC3D76692EB77D8980E938EFD82D4BC0E2AA4930B1D2B70F05C3373C75679D0EDB6FA5B30DDCC30F21A899C424030738406CB23155251337ED3327D7361D3F81CF5F44E744AD940D35AAC2FD235FC09F373D622A668129BD5F5A47999FE241B347A98976B963C6DA21C3DEC22971325DEBBC257A7AB184C01194240E7440CAAC13E69383DF0CF7E5048755BAE9A5C5401ED349FECBEF9599ABBA416537C0BE72897BFFB9FD2C066B158BFDB09580FF91FB2CE873D41F949807CE8F636F3D44975E4E6534DABDCD6A31B49061453871ECB520347AC385FAA8320D0E0A1B32E566F74541E98A9C2B405B32C8335AD3523B7B75F5B233169C2E00DFEAFEABF8981245EA136923C438B3E08C96C187936E337682C22A2660A3AEB4299729243F41FD96D65C4E8C7E62E00B97FC5C090AC78EBE00078BB970EC0647C045D6E8FEE9F99AF294DFC6E56D02E1C94687DF0E4F029715026A3E103C97171D4921D153313FA281CA73EDF0E5F5BFC086162FF6B6833D610CFFAFAE6A5FA1FEE11161431E2814FDB76AF774D04EFD8FA8635B470C6254CFBAC48F52AAF837975BFE1B9D63252F3AA765447DAD08D6A494B82D284A28FE708B1FDA2B9BC0EFB48597B441EB3F106C05F1E081C4C0691D0CB61567644E4BD9A115C80BAB399261B9653630A9C1583CF8FF8BDB2D9E432D37E84962D6C5A62F74DF2B0D8F31D9C67C2B23DE2E0F3D12C897D5C3533C931957A9FDE48FEA057F33FCE54F6AA6458E6BCBECDA9DE4D7CA56B2789756690FB69A561D828FDD95F6E6C07F93AF7049EC1D92417ED213BF794E8D64263532F071E7F7C5FA5A1C4348F0C9E1DD1A983F87D77A13AD59220600CBE2DEFCCB8A0FE4F9EE54D0918F9EE794D4602C9A0F6015F96675B63113F955CB8D85DA87860C00514A89AE1C52AF8CF2E3525679465C17D8E0F834051FAA2883B4D2309392ECBB445C71BD67D55FF2431918D995617896DF91FDC96D6D1EAB8A232F4421A4C111D0CFBCA321B88376F666FDF889AC96CE45C249B192363AF017F2F07265DBC753DE7253F5ABB7FAB1E6205B38DF534C53EC4D0BF97AE2AA6BA563C086FBEB2B4E14A8274C4857B0BCB94C787A1DC1243CD72C74707CF5851A97952911C2BA7C8F622D317A72CEEAA180E6918356C06F878AF7F328ACCBA50C3D060C9E0A7290004397B0D583EBEE3928B6FF06D34800799AE176AEAD904463A6D422356883AEC3D2AF42F8EAAA4A3AD9C62BD74F583CD5D6F4267D7FE10D5BC2D29B5B4D295C27B557755E3B1F674D95F93E25C850BE8C65EC6D6F9272767A04B03C78BC9C28017205866CC89C2D1EE71706B8335EEB9B00034E92F9C98667CFB4221F1CB66AF58FD7C5FA911BEE72B76E193502AA820D30EC8BBE41096C2D7B1DE9EFE115552321CBB665389DD930F2EE7BDB54BEC454B510BE0AF04829DA47F881CA52AC517181E1EFBE27548E1A047F5D4BE867E5668B741490AC325333A79AC91E62E98C58BB7D72AD79AC0634E0C6DFF30DE1171B0CA48D79663BD275A4B9EC079BA71E1B4761B0924BBFFEC6F2BBBDD0E05AB5E05EAAE0FEC09ACFF562D48F0338A108D0474A0C8B11496A9F84C9178E1812156B043862E30EF40ABE94EECF5F10DD2151E3C341E2C8549B31784848910C95853C6BFF70A0F389407BCC5345FADC9B29CDBEB0442980E2601B9CA54D3BECC1F50CC1E6B1730550F7C29E16D7E4B79108654D894FF8A93BA2A0BDD1F23C943B8BBB48EFCEF4504FFBE4BA6A49AFF0C469B62D4768214BDF26D7C655EEF904F260D69B874E4488E47D1D6E8FC635A4FE5E92C0A326F35863BAE94FAB76D4D034B3FA29C4E294ECFD0EAFAE9A6BCC45FFD39FF380E1A4D0C7CEA99CB8BE27FA18C51A93AAF74B9FD7B138A7A8BF44FCD7FD77A15FFA81AAD8A7FBDF78F850FFBBFFE0A2A00C7D1E1A91FB692F237487CA6B4F75682E6F1B731948E3A669EEA979F03D982D8AE2BBFFB55F815AA40E3EAE30E544F860723B3B4DAFE284633DCE7CD31B4ACF90240B95DBF50B8351BF0B0E711AB37CE60FBD8DA952C96DA8B4048C3BF9DF0376990BB35714D4611C4283CEC1685C7C1A21FE2DC9819382935B99C6D98FC43E6F334766389DFDC75B1A59D8E03262A65D6181AF34DC8DEAC081ED661E616EF106A9BBFE597B141D57952871B8277AF8D9D2540BD0CBB895D036D14C5A8A06C7C276B9D2CAAAC6C4838A90F5264C877CB07B83C1A85BD665C522E66F0913D313E70BECC989D0FAA9ED1F5B96F74B47A5D9AAC2CD9B3EEAE43B1FB5610ACDAABC26C5EDFE7474BAAC441A6637D63842D8D2F5F52DD0E568C68DCF159F53FC5531E4AA43E3D3FD5DBED244F746F67852F449C562AF56CDD4E2378775BBB61AB0843FB1CDF84483885B830C8F4FF7313B37275884B7890BBD2686EBAAB21A81C4B1F924E173C4C844CD1FF40D67775372AAD1073A703B97F00F4E7CEB836CB2CB7AD7F6153024B5DF44020016BDEDDB294A24618DC8F6F06E1CCBBEBA833C7A6CFD8CFD8AE7A53027BD52264E23EA299D4E0AF34C1343003716B3C8F0A9096E7D2FC84EBE21C28C2596B2E32340CF91FA2750828D10118160EBEDF603E1397A53C4C496E295D31A6BEE26EDA9ED1756263C7E1BE9D969B29EB1750566EEBC78719FB43D63911E1133D863F78BC6F3CF669561356FB68F694A48791F855D172AFA64642FE9847CB007EF308C7A6AB118935F89102D12A380AFE25DD5CF28AC3ADBB32D8F216EAAA063B001127112A9CDF50B060A6B0406B86C8719A0115F62D5D1518924B5C10BAD2938E1EB3DCA6EF0B74F798DADF0A00CB4C8F932F71BCC2AEA6674BB26AB071050CE780CEC54BD0C80A9C23A4C70F5DD5B6E6FA3AAB03CA66CBFEAC555C200190A9A1B48C9C55FC38210F055E428801E91A80DF2102C76801676ABC757BB3EEF0E52A7F96ADCBE3C5F46DF3AFA42B2634CF7F0EF1E0B8BFD0C8229BF8DBFA9A0DDD2A74007B63D1B172CE8561323BEC1D870788C49F795A610840DB9ADFE58ACB31D8B9CB7AB9AF5331372BB264F56C73E19F1C7778E61B71CCD5BDFA89D31CAA5CC8DDB8B3D0CACE66BC7DB441C4995F63ACB174E45CF9807A0CC23997DB378A71451A8F81091B62D404309EC462DFADCE55F02C467B2AAA6BCA4FDD465F1EEAAE3DEBB0C9F458B1F24575217CF393F8838D9D438EEF9B834608E6B192FA6FB7659D45D287D72E3D65DBED1F53B7F475671EEBC765C3D987E849C06271CDB7CE2D3C5F41F4826C6F12AB9E6476C2893FDDBAF4895EB89DC265E2C846CA21CE2A1A826944AF37BCFDFB422DD5DE1197C6D66A6D4C8C1486A8B018B75186B6F2F13F4E27DAA4BC232E3B73826EFCA98E445A93B9B2BD8851F468BB2ADBB4A08C683134787F1F94621111C3FE3529400C048A252468D07F615E38F1F9DA1058B74A3CE44D486FEDE2244CCDB0A413C4C5361BE628651FE1A11BDD520E18E728F9998030CBB86BAC4005FF66C535DE763C291EE91BADC59BFE3B715CE971344AE4CD9812F4BBE0ED5E1BAC4EC5D2E66D2DA5F6BB2203E7839BC4BE8429A8E578A3A07EA1EDD771FE6304FDCEEF63E852DCA5D61C15B38ACE771B22F62A364AB6D0ABB40D5DFDB13F702BA75607DC9B0205E80D99CD0D7818097B914E4C9D63FCA8164F21A3A7F8127F4C494F2F3F1F5DA2C2CD8D9582EAEB20C15F2C0A447F1CEB5815F837A02A5FC7B1339043E04E4332735005B05A436E355884BDD3C822654D82133CA9BDD3F2AF82FFEF5DC186B1D5561BE70BADF0105F21F7FA3B9D69DE24E517EB2AF5E7A9B420F683D823E18B2E159B83885E0E5FED3EF2863186BE4A05D243C5ED526D65923D8A9F684990490A69CB091CF476CB5F024AF797D56DFDBE772DDC273608BAB297A514DD75293F2925F509CFAE00529506E93E8FF37212B72B24F7B37BB3B51EE03E2C59BA94A6CE147F99B0C731E57370B68A6995F22DFA1F5605FB1DA55A14907AF55B282C24013D746080764A1D410BAF5AFE21F092BFF0CEFAD40FA5E7524827B131EAFC3BC9ACDED4461049C395E1FCDBD0E5FF46175EBAFBCB353771E9E5DE56E15A590FAEAE9227D841D079974D2E85282B80B8E1F03E039A43C0521B1964C59F10B71C14CEC3A131BABF02B8D6491F7C934CD4BAC685C5DEB1287C618AA81A020F38074829C8979977A24D1ACB74B5578ED0041BCE8AC85639FDFB818D6FC9EC1FFA126F4AE79D4F398C3DFAD9A7F42ED09321F3D2D83FFBAFD8CB063AF10C7777CA6E5A42764F44485ED027511CB612C8B58225278AE06F12FC91AD4F65D3A6B21C7AAB02BDD48F376673F79C96A722CEC0586168CA4F7D726965ECB46333DD45FC0CCA6C91F2830028B9444494619F2B404D6EB067DA98AA22B4F78F4987EFE3759FDB3222B589B99D5E4508AE99B7D3A352C3CB32BDB9C22F3F3B3E18A964A71BB4284D6DFE4D0A7DD6B9BDD732B5E35F4746A6BC3EF3C855F6BB51D9232C41B29D94BF64A326EF32C67E3AB54A26C7F9427BB2BED734FCBE3C1DBA603C6366AC5F53A3FD0FA16F1DF9C95A793CDE8E826E921A8A0D58B231A850089E531CC0534566EC489BBA3BFF0F33C38626ABFC9DE5DDAB6EC1B713D3D5D4CFEA5D7274DCE7E5CCF0087CAEAB86FC559A8FC71D1E7E492697643045A2D1F82AD80E3A58493E7F7034CF4ADE009F442378019FF24C439DA7D43644A4084C5D000AF4B5BEAB2BE7B73C30D259901CA8D2BE29823358BD7E6FC429ABD3ADD5C729951AF2DC96BE1FE582025B6712334DE704062253F3B8DA8E7F5FBEF3EA4CD50FF6228911ABE156D96A5DEFE145712065603A134E6E2E4DF1D1F542895EFDB9EFEA86F914D70AA0255C8FC17B9F95397117C7913B91551F01D65F0536CF5C126E64C706203244D465877A6B4C633AC54BD5C05C9976899E908A782AC8A1F6F5B5C7A1EEC4768F292687180A0FB76D1A12655CC7E85BEE520BB7FCD40185EB7605193384C99262FC761871DF787F6470BF9E5DB53793B416FB7D7BBFFD63C655F91EA502958FBB98872533AAF0ED9E67AC9BA5BCB381AFAEC641DD082F984AF96520CF28CBD50866E1F33631D006AE60A7DB4F4A9C69A32EF62C5180239C9155B60A3DE3E1A4B582DA97C2A3CB581AA143A31BB68E2E4587CE1B3813D541BBC2B3528A525BB24D8AF2B304450244771A01C159041C05B16A0E092038226C0CB3E1F34479CEB687110B624000EE8F45B0E89CB575F90EF9FCB76BA04598FCD6B6C6174062880C370A4D64235242D71CDE6CA0119CD217BEE41601272AE68BEBE41C4FADC1227C42ABBAD19F88DCCD0131B6CE5EE40DE23EB867F2CA269B5717602E6D34807310BC4CDC75AFFAFD409DB7EEB4F2568DF8A27B0B33C33FC48788E9099A5DF6C3012A10AEA062F0468B96B2BF7B111F845EAE2F82C925EA32A410777011DBD86D05571484984F304B6C901D8D8D1F6A9E8BF08DFA8AFB5171A48FF130D992A8FE80FA1F4D56488A5F7504565E53DA8A6365CC1AC4388D73F1F8342CAC5AD4FAF7C7F45484A39FB6512A7C531AB6DAEED369D9ECEA3DAA4175B375D78A2FD5FCBC978998BEC13A1DE3AA8F56FCEF0EB8B4878BB08BD9F8DAAAEDED3C433931BB947A9FA1EF4EF976C924650BB6422E2C0E04078394829F42AE54AC53619F8D2B88B34A92FE780444356F5B9A591AB9DE956DE3275D8F636624F5577194CF5421E0C2A13D699DF36C1197EF1438233EDD9B1F9854B6725E11186BBBBA9FC1B7D097310E63808FE3CFCBFEFD1AFE1E888685EACEA505EF776C4D63F85650E68EFBF50A0D303E9E85F4836441220518A13578D7FC869DBF90059A329171F4E5B4E8AD36A27AB8499B2B068BC729B1260A68F60832E3D53012CF43AB0B1D40D6A922C7CBDC13C284FEFEE37E2F49CA32D78F94D2B0103331A7C479912D968C36F550F1C0EF5CBCF5C009A84DFD621CF1875846F8BD061A648AC401961C7D1A8C380FFAA4FACB84C1A8A92978B751924DF65F7F1FCEB26ECEF3DFF949CFBFD79FFA24344344747ABD14DE568ACA122F204CDC4DC1AE3A4258A07F1CBBF42D7B493B671E7CE083E86A377A97FCB1D21F967E9A890B1FAEC093F414F8B820A24729DC31332B9C73F684FA64EA4C865095FD34B1BB39EC42E4A8DBAF97D6B2AD068A9EBB8454696CF2163E68908B7AAF4BB78515692AF391963AB54E0113CD4515828AD50D7A89C205999961ED93702E6B995759BDD1D5802D0938F1AB85E4F7EB06A6451BF187A518696FF6641B47420AC0055E23569279772A3E7713475C9C2B8BDCB4DC34BCC7E9F86CCC936494946366CE71F187FE7BCDBE8B657BCC5F24EB4B1B40DA6DD8CF91D66369B67C910A39D2C7BC70A1974FEA5654FD1BC39B66E71274C3BBC54A4879BF03C69C6B06DA32A5DBB94EB38211E1021BCD346AB6402880B6286F216CE9F1F66215A71F347FF94DB850BDEDFBD219BC4F5F9E79F92F0668089007838E68AF406CB3C4ECB51D53EBD556849594DFA60C581717F5AF1831E76CF91E9279CE9C546D694A9F8AF823D3C7E974D5BD2DEF7A3E50BBCED5B2A3510A8B256B795A9609DA850039544E2EA02D50FCCED2BEB060081BE16FD965B2BA139B49F91C62938BDD8690556B7930FC4C5594DB53A28BE12734C840ED7892067F905BB5E41F870DF99CDD472FB699749F06D6CF8B6097D170558BB7D75526AC56CCB6510215FD620AE8094FF6326B71A4AF9FB90302F4D3C5FA3620D27E0B9FA94BB6F71DC15F621312D624C53D91F44A3A5FE04D68B846F116D7DA3302A76512D0D89787103D44A3DA5E0CCC346C3636D50E441A88F2E662718D3CD5771ECBDCA0307B033AFA6E961D6B34AFAD0A2A8A0E99C22F31CE5735C83391CEF8FBD2CA1FBFCA14EA415B5DDEF29FED0190E8F9D31A0A5DCD0A139D48636CAB2683D5E62450FC4005BF5398A737F5C6B9CEA8C31F4AA689DCB12CFFCE2463A36C6E97DA868ABC6BDE2A6964908BD52705B39A76FF0D114E0E0641A865EB8D5210CD4D140DB118399ABF786C95A2C4CB709EA1B8EFF8AF4A0126CBF527A9A1CBE84B99204ACA00A3FEFC6A3C29692099FB3F7796E2CE689E94129BBC6BEA17D5858461AB68D881ABCFA90FF1AAF718E5E058BAA746A4456FAC1C0A492CC9B7D2C8C8781008989348CAB5B22984D84EF77968B81E025F72F825E3A316F38A9AA517B985A958AF1FAF14A8343CDACE5549F0E120DDEF3B7081D246E8B2CE04F77960ECB1069AC8C6F26446185D004D8840468EE93ECA60A2D56FD8E8DD512CB862613F812BA77B9967745D23870028D2940FC76852F07ADA13CDD7C9D13D320B9C07D4EBC34DE065CDA9A7AB2715FDB76B042B125A8B52ED09FB8E1DF9300CBE6D7CAFF6741D909DB2B73AFC7FF793FF0314A3563E6E7D30A4F0429D599E44FA2A4D59A12855941C005DF8A49018436596B73EE3E8A6744A15DF132AE323FFDFE5FA0383D7027678F9DB27BD286BBA498980445D05E7DA805D52B6E226BFDCBC7A587C7DAC2179A7514AFEA89DA97D9E289E73B1E68E2FF01252C2E53484DBA839152B09367D28E2E2062AD07DE37FC800AF24217A153B164B4688F5D428919667D3840C12199D857D2DF5DC554FF3CBA4035A11087FE2E411C1664A51F0A24186FDCCF27823D08A32BAF307D78896B5BB76D0C657F0EEC08F048A57740425EA4C419FBA57FCA9EA3AEF63CFFA20DFC338DD68642CC62E035F5EB09E048AD98990DD78AAEC0AB18CB526740D95F9FD05A2292A8ADF4FAF130415FC439B379F02D08146C34BEB278E64B5C225A69BEA6A3629FE99933607E1C37322519BDAFBEE0689B77AF218AAB4D6A8738F19F23D0326E2708F791D2102F13F38CBA5F1B5DDAEC7E88856DFA6CBCCFB6684C87031951475FEF6D847F3BEF490253413A053EA7CA9E6893BCC84716299071C0B89E49E0D75A37B6874D61014678A05A2FA717ABC28C268D96951BAEC9A5CB2CAD6CCF5A664433E9B9F5DE4013A314AC1F9B6A30DBE4F952F183D171C9AA23D9C6257498C3343F283E165F51353E0A7B1E9646317A910E66C56B031A35542C92AE9D74A879BFB09264D3C5393CB956B772F7F30B08883827A81642D3A84559B32E8C7D0779B03E014961FF5A51ADF3618DCE4A900E47BA1094FA625DDF5C061C96E311E19BF7E3BE66A8228E58FCB94BC5BFF99E7A28B73BC92A39D49E622F368DC41B8CC2A90E85D6BFFAA043AB45EE6CDBD576D89B9FF9AAAF6D13096FD28FA8931AA35CB4F75844D04588045A9075A53469A7CABB1C386D14C3B2F95BC461A634558CBC34BE9E8E6BA15578B9FCCD3EBE6D99E455D6B6A3E1134EAC46E045D0082C4F9422569DD2A5F179D8FC28F339896741AD849DA3B93DF39FA4A819BF0D02E617C54011F175219E3425F4FFDBA5F081C5F64684B92CE8B49A7DE976DF7FBD9C60DE5DC262329B4EABED7CF079D8CA60BE936DFBAF9A021422EFBF90BBD7C37635FC5B63660E278F72D929C502D092A8356761564FA71AFD8316F7091C3A4B55DE0657CBF2692809A09C28A9FD6E1992FEA33EBC9F67DB7858191B39A39749C2424D0F9839DB99BF7689594C03E9449C2F1223C5904A6C36168ED62F6BB32B271C0FC19B4DAF16C7AD2E2AE49C0A7E0B9EC370F9978468B34AAE05D5E2CA5C9EE4DC6FA1975DF3106CC9CE90B5E6F22BCFBACE70A61979F85DE7A206DB7BD5554A16B06FD9A225FF5F2733AFEC044F06E356E7F1328C608AD28DBA839A10860ABDDE60E12626AADFF4B7B5ED939E0912D55B6493971BA2FA9A42A970651DF2EB453B4B4256C719737686117486A2C2346FF09F2250E4E0E575BD23875175BAB25961B5EFA4CFB82D4689C0792BC44A703249CC6E91F126A6584BEEE0050FBD798915C189D180E897EB47BF9C538EBCE2D84B9992B3F1F68EE109440D44792B2D8525F868CF1F5F2A00ACFE56824206B30BFED661EF8DE8B98AFEE7C4E8F122D8011783B645FD91137C6B1FDEE9E1C45233D857323B1445AD0D0ED7A34371F1BA55BAEED10E138A6FD3E9297C6081C45CE3C6ED756CB2D405295DA7E43BDC86E26CBB61A2B0449A751B6BD95C7B7FA23D6F1CC2DFB2F195249B950FA840EFEF2C283443AB3C1F6FD830C7A9022CE61A9640AEC19F529CA649BB3ED27B37B04E407F647E1F0EA1E48830DAD29DFD6E926FE804159527415FF9D7C489D6E9AC6DA70891F2FB17A98E2D34F08819D96D6E3B6DEF388B4D6DFDF89FD5E7523FA19CDCF5E9FB6B7A64E615136D689C5621DACE3275441DC4AE076C5EB734C00FCBC7D2BB5BAE1CCC46B23CCFEF3603D0249E142E0F1883C3C628D467E3F0DED33E016EE24D3337572C4682D89383741C3A40A66A9647329884E5ACE07AFB2C6753733F8AA0812C0069592F6CB76DFB44AE2309898C1AEBF5E155BD7C603543219647D90821EA78DD409827B0AA28E4809FCFFF989A3B8273EABED48A9DC976FEDA1AF1621DC2FC373D6DF4D33EF86D7C03CEF091FFAACC67A45788C31D70C3EADE404E95C3F1828F6DE99C810268F70B656C357561D3B4B419E54ED46DD8BB98A8D2C2A3A552DF7A9B0B88BD216C704838A3F305A7433481FAE65C794BA1569D2CEFEB2EEC99C64B0413F3B97CA06E667F990C133C4DB19B35CD27FCA18EF9E52B940783969EF5F8923F53C557AFDD737A37AE9C618C32D4F7ACEE34B4800026EC4C5269F4C267B1101F03689271F8C123DF38008F3045F2F7D71A36D0A40C69B58597AC23A47F4BD1D67E7422E7D0A9BE40A4DD6F068F9886B9C73043D8C785C080001DB74E9FE34EAFDDA03B6099EC8BCA50279716CA05F402EDC0EDF0B323AC14C7B0507E2D5958497BC5FE62D17E8A33420F6D9D9065F67C59E0F7B85B17B72D58B5939EFA0456ED9642C6988D8479E3B4172580B446C7AADD81913EEE4DF6CC15ED5D947C9B7A710D14AB55E591CE740845769A4E87473DA0612E6862C6E516D07BED895BD93DB6FE828C3F4B605D00848814BC56518D9421F581ACC73524271E68E5BD26C188EFFC552AD38CC33A763A665D9F6A8A741D6BE1C8BCE4E5ECA664CB3C16427270CD1C1FEDA7F1FEF3F7C15AD0FAFF941B71974BE5AE03F551F2177F02F26030C53F0CECBAEF6BC7920BF087D99ED567B84C916D2B82684264C43A5A617A7A8B55970DE88DBA5499DDFD771D15A7F35C1B5D2915360E9B12FBF4CC6621B054523079B65F6832E12399F684B9FCEEDEE80EFD12945B67A0A20416BE470EF54710217F4452D2896A0D76026509F5D5E185275A3DF4FA46D03A1D68C4EC02F8CB219FE7E659411F80399DBF95C54B9CEA817EBC9E8F8380AA090FAA3564D2CE0D826A8B6B9F838435AAE35162973FD61AE84551A92251FE01CD604EF6945A85856B3636CDE88DBBFFEDC4D4C06DE2C066C6F1405C77C5203B8E7FA5AC0E46AB4C49C41362DBF281904E1AD0980D57A9E697CC9B80D8BA46200207FAE71C87C1596EC1726E85872C12A74484CF10892387BA8609AC40CABB61370EE0FF1827973216124BE248BD56072EF0BDCE91205D31781E021928CFA36D120E321939F4DE6BE91530A514C58834BB12800F598520E127B4A219C06682C46C25A24CCE4B3F5122FA9EF11A1F6F21C017374DF74536F1D245442A39F2761C89DBCC8212A9ED160021435159D425F2AE7C9F00F85943980A954784EF6885D34021EF12EB14E571D0634EB8B827285A18E6A76567CBE347E73C6230E1ED2D4AFAEBA01F20FB7FA9886F0299E3CA5F7504A35B77EAD0EA2EF931B8CE967BA4665E38830DF16D00CCF99689673A3F9B2543FEBD79DA3172A0BBE2150E2D7FC587C68C40905CE03D7C144EB44CA9B8BC571637AF55DDD25B03B36209CE0EA52334F5CE11C592A3505EA8DA62A0C7D8D23D2027BEB5F12A222533EF0D4AF776F6AA9108638A464DB84BBEC412C5A954F0344088EC7241D8363CD760885EA60501DFC5EF8776FB42BE0F5B9E3BFDBB9504DC848829B3869D03DA5F6FB1E2EC9FBD53FB9554353904F35E53CF6155F03E8FFBF1BA24DA2FAA58DF268EB5D6DF2B3B99C14A4260FD56F954DC4248379025354BDB28048D1E5ECDB5A678DECCB8F635FF67898A0F14E634712B1A803EAEA3E9612256D6E233B423DEBA592EB7451632149F9782E989E39294BF2E7C81BFCEEB4BCDD841EB785062AAC25C94E06F8A2FE73D7BE20C49FB91BC6042472F2B3303E30BEE274AE0C7BBA5E2F6CA51AC3B841D452852805929091CED8EE1B35ECA9C13F0A800A934C28A93452568373A6D1BA9D832C3074493EFA712839CC27C0CCDB8C76E738A4F841894BE5F8C0757587A7E8B512823832A0674B5355CC1FC7B2C39223B97FC893D428B008A03F8678E85AFD42ED1811EF86B742C551C18607E232DE4FF5076CCA0B7EBA8945227046342EEC0310984C9234281EE41B4900058DDA2A42751C49E16A2790BE3AC8B8E59F8E69A52BD8AEAE05B3B690F2732CF05F0ABF500F957D2104803A97BF44B9C76894C18E85BD188282DCB10C92666E7D2C3989D8DB2782C17B04820180C0C6729E257C3EF7329D7041A275D68A502E6921263AE7D3C20E255E708BD18DAD626E5D6F8F1B99FEDC60D9151EBE6DACA19B6F7C4B6666AC1AD1F8420A74CE9E7C0322BC1218B1F9F0611A9C97F482C835EC2EFC41CAF467AD134B083AA2B68CD92EC1BF835910CB1002E76DD362C0F8A1E51AE12B7F79B8866BA9ACD8210BEFBDB226960EF02680357BAD1A3B1BBB27E96142E767DFA48B11371CB3A7F880A44C5C2F92080A8272CF721A25755587225B96A663A055313CBBDF4A1F7B6718E561347753C2DE0FF49C103647A298FD142A2B01E6A6ABCA7A7150ED8C153D4226C05FDAAB62163B0A933C87A5935134F265AD57898190FE86AF863893FC406A9A9A7E7D5F4BDD715B9BE93E94F252E49396439F546437468614283C1EAE5444F3273CFF4DD1D6E994C7F2EFC7B42CA5A012056D3878E4A0364C4BBDB63354AB732B7DEB7D82DDFCD6726C53C6CE1977ADB25F6D04FA33805F8189604B50A486370DE7BECEA0D453E24EA4C8914FA9148AAD26A12E765752C98103EF68789B367871F616EB0F5F9D3D378A0D8700F9A15DB0A0F8F8BDEF9C654A1F5C2184FD157E4B9BDB10BABD0E1DECE17C008A73D8C05B71F26EBEE0D072B4235D1B813CE33CA4BEB3B42D7B3327F2C7126A88F11964E4779D8AB3B675D577EB942CE6F52740FBF6DBB7DEC0451B292800FB7DFB0B1D43A012B7EB90C145A1953A4677E852922B394C873A84EFEBBE690FCF34E0FD6B4A2779BB1A06502A723EC9F54B8581EEEB1AC42A96E109AC1353CE0730BA9634899C3E606DA02CDB809F01293F9F43A2A7EAA765465BDBAA133AE66D985F6228657AF9EC5762E02184D82029630C624855490293B71044F63948BABBDB7A2DEAB2DA98F44D6D07838EB6D79F42A53944D913906242C893C5CCF0CCA0D6C9D9E9A43FBF403613F1C17813F18312EEB5119A1225D971B902E1B00E9A668A626B6490D2C22717DB043BFF9D6BE628D2169D76BE43C2C318071463B46C7D94FB86B6F7463B2AF5CC20E157D003968242AD2B05EF382B0FC525B72724F2241836646A40AAD8BBEF8043CF8F74D9EA5FF3E142CE9464D53DE715DA07AA9C31F9415E27D1945CBD1A3CBE63C8805CE5A5AF74DBB539A382CF4932E020B2F9F99B464F0E0FD31A8A393A088CE21FA57C775026DD5F32DA496624D9B7165DD2B939B71BAC1773135BAE03B287BF92A056FAA54829DFEE0AF2D9D1420E09599FB2B9DCE0A6F9BE08E717B5DE244216F7D0A30EA308848D2848C8E26B24F3DD83C348225418E6F553FD8795E98C5CAD0B93AD7D7B3F804E58457293326EB7ED507818E1D2A9F70E122A3713DF68194A944DED1DAE27D2C85E9D398642476906420A79BDB1E7610AB7F920E8F15D99B2ED8D4180E5BCE19225A81A8F61C24D5B74F932581F80B4499F11EDF51E5AA9443D8CEB6EF065CFE55C8320080D3E834A4B4BBC01AF360E1E12F4890B838DEEB7440C6CD831455B399F1953EFE7C581427511493E26D1B28CF1DEA4087A00D6ED680056DBA8E7D64F2D1DF5AE5A47C16107CDC1C610C4B8D32C4BFECF3C6B0657D2258EBC13D0552FA62F0129BED7BF45DD34472489E272530DFE530C8026E7F0C443B4AFB9E72F93C2070C25E8B5582B5432293EDC9F9E321B5975EA8A20A224DE5B6B283D6DCDD74C9511B63CD5B00DC3D4CF6059E7627DEC112B24DC6D80A936CEB160660D7113EDE35925EEC8C7CFE22AE539A078661613BEC6BE6F241557F38103B55B0DADBCFBC70DF4FC7D20D34E811271EFFF9961AE0115E1D37AEFE2CCB321E44AAE14BCB409A3550C5627E677360C5BBEA6A69FBE2340F123107A13C5C75B319B73FCFA81DBDE409576CF3B737821CB6435DC234AA399C557DC05116DEB26D0782B664DDF20F0F81D20A77AB6F168281275530A599A9D0CFA83DAEC4E9FABC2D97657576266897AB64DCFBBB605C9F049713F8F979640B431FE883A2C301269E40FC2B5B2F653A298226E6779EA8D83038F2DA9DA50ECA24EFF3436C72615E288AC71126139FFD53A06008EFCB8AFC385C205272A2F6702F1B0AB91F9372E56D7C36D7DD42548D06AA982DE3E8C63890E3B13A9680B71B8BF9DF69598892BDCAD46A9C76FD89102CAAFF08B29933E4038755A18E225C5E275723B2F5E28A964966C03DC650F660AD3C73022474150B8A1FA9FCFE7A17B6DBA06E0E2EB3D17DBDDC98FF16454A903363B4F1BBDCDF8AD662F035468124D485FBA5D44DF92925FD67BC16AC5C822EAABDA2A68BBC015B099994B91E656AD9D2959DCBF52083E65AB47E780C2A2E4073FE69C14C440811E8BD291F826D0FC7CA8FF75CB869251D24F5BDBA95B6EA4103E92B311972B5BB2949F440A536C487D9BFC08407062D6110E103267A67DB1506EDB70E028B98046005B87A09A2E9FFF03257681ED33AAB37A6F9B2D3641F1C5D5E097E5D56432C438E459E59744B18D64B1D39C3D754F42631B76E5CB85383D3DAD8346C781728AB5D75A213C9F872B98C88F2B3281F16DF1D8C22FFF444C5C427F81C4A70012839CDF4B1B463D70A67F5D962B3230DF3138DCA47FA5B43571F9B1B277C80F4DCD417EA75800164539ED3D5D0DC313A01DC5EFDE683A1686EFAAA042736CE42633AD191CECDB33525EA844218F6CFB561574100F88D6E58F6D79B40F70A09A79C40D9550F69591CA7F34BCA587EA2F971B6A7BD10FF9958CD0B3CC0CB741D01E3806575BD0B934642ED5E8694F692E96DB993D144BFF90B2891EDC86761C2DA439CDD2439FEAA0720BA00361A4942731D01528865C44B7FE483A0CBD4BE08F20FC935D5C5F08E477523B6E6CDA2E5B738B45CCB448D66C7AAA9489629F91342EC3343F945EE2E8D4381326902FFBBA749449B29729BC0D306E1F9E755ED4058FEBA6CD061A3CDEB156B37C72DD2D2DE6613598A4AEEA9E492DBE82F3BAE226332306CD0E8DE3432936812D3CA61D7468505067A3525DAFD1BBC01C8C89446D1CA5ECB56170A883DFED306361898BE56F1F40BDB334373E58D5AC4F329EF663CF7BF32618FEE4924D3D5ACC660ED7D8156A9D86B8F6E31B3A744C3613699C8FC327907BF58ECBC2C34B0DAB827F4BE79A1A8C95630D942CFE634B7279BB25A24677BCBABE2FD9F04F8142B03F95BC7472F10D85440DD968F1A9EA582286BCDB2664540A35BC1B3716846781104777A084F8B500BA3C42142A9DD68809443A2951528AED09471CE74AFE97D85EBAA8BE50AA56B8213D80F65872DE3BA2B77B1A003832CB1A0B2EF7DC21241E7D741011A9782BC1FE3931EBDCBC7682CE7DA076FB5BBEE89C4E009B17D8E155043AF1B88F888A1A4A7EA3D72C328C413DB1B408D56BC360AEF17F5CA4A2859FE8E61C74DAA6AEDF4D28C75FB03A5D81339D2BBB5AF870C09408E1718CFF8410E98975B74207F202BA2966BAE683483A399B96E4FFD52D985D1A504370CEE1206A96F4124761133AFAAC2DB3DADC857803F7DE6F7F939DC3E64E49B8CE85D18CA409412D84CF14468F32DB8A3FB7180FE20F20EBBE5D06C55162520D5BEC75D3D5432844A47FC2E082FEA1A938DD1595F0F46239EC69250D1ABD26C53235460CA1FF564236B8DD97753A8965F3EA351C02D69666E88D21622B3F50F4760BCA656203207570F0E886C94FE445C2A96C0BD9F64B3283FE2EC741449701993EBFDB6EB8FB2262550534B6859C6864CC7475319F466BE77E975B36873FB0A5EFBDB044CF573B8765EC58089DE7B04AB187F7DAD10D9365BD3BB6BE750890CAD5D532DE5939B35D933B8D242500251AAADAB65302E7CC1E24FD39DFF3C30375785D763D971C2695DC50ECD30124CCBAFB30A9024DDBFC80E3A205F4B0B53AC020FC338D9C6E1CD0B0813A03154EC91A2BDE59F9B27FD6851DAAAFEBD5B7CC0A91371C4D37E9131279B6D4F0B10B94817F1C7B1C9BBECC105120854CC49B450C92D8808A9FB409E5F4DE6AD97DA797913D673FB7F1B90C7DE6E2D74A93DF2C92122F2C7D3E20FFA696CD17B9EF80E27B845D175726D4F1979556D99CBF7ED665172958384D828B7DE1F8D9ADBC204B80EA68DC94C18F34C5FC29C9C61FB52DD2D2E632B14672667B5B0B05D17323218E74A50370A383140AC8B7CB70365F9102C9543EA5076F781B6D276B312D612214159893DAE5260E6898DAEB7AA9A27D6E27821AE7C2460DFF8368AFE6FC9701FF37352C4697D0770C08E0236C528CE248B158D5B658B1205D58ECA5A854262A6DE75A47ABAE9A48ACB29AEE47CC6E52A76C601D3E547D5A73E1FA3371F96F1CAC9C2687499B1633D281C5E1E7E62D80B60AB420C7D143155D8F57C86138D641F90C8FD6B15A26E05473CCCC546293BC074B8E7B2992053BC7027307E7C9BEB5885C87C8E8CC12605AAACF70AE48C9055F9C05DCCDC2F6C92B24F388B397BA592C1E93F9D348C5C50584F2E347A5405A06CC206B1106E1D27D014C4BCCFBA8DAD092BE2841FE543481316A073CFD6D6D2F5AB716B267DBA6AD84F3146C520116A67B9BD1147CACE8C772FFD52B73CC1DB0599F63DAD0D0FCBDDFAF90816820A87C93F94AA77084481AF0A3CB41BFCB0176F90B461D50B8C8345EDE2A6BAC744DDC318C7750D8FF502C84A4EAC49A17DFD956994F5A290AE16764122EE5AAA2F1D50FBC7DB4AFCFA32E3E3D0AA055E24F1DA15A0A0F72FAE47E30D2784F6EE0BD6CD0F4678394F2766264A3351C53243270095BAAFA37698F4F73A8EE9D0940C40D8E5967D6FBFDEB42E3153E3963C326CD091E92E75545C748D298A80781C52D86B535E4A2626E2103042E7853DA1F2DAFCBD2F70EA564B662B24A7203182BE2FB88023F340D0E59BEE14AE7D07E984C1E517E4176D76154841C59B1DDBEDF6971A1AABCD3AF2A155CD6FD6E755B2F90A8495CD2E2F6196E0F185F6C0F9F4454D7FBA2FE4371A255592BA732548F3837E3733F5373D816A3529553834B478A916661CCD6064B461E9541D072658B409C1E4A7E74CED82CC4A29753F4CD94AEFE36EB5B134C032BF238C2EDE2FEAC356D2D22E932B6FAED434DAEF0F028B350A2C499E8A91EBF16E805221F914869B342D2A9C43E6FF504523723D42D3F674C5A000B8F36D2DEB98100E3F858202CF6A3AED9134FDD6BAAA99B99540B9346887767EAE6C7008F4C85C9DF7393DF67529FB0A6BAFB66E34A68D009A29AA5401BCD1F7934692A77FF1060E73A30749F437BFCD8097777DDA55D106042EF7C934AFB77C47933407AC45D6DE31985631814037B138A5695441EDDB8DF4F4D508BC0E23EEF3D070FBD113E8000256885E5023541A302C04B19DD54EF38EC81F05AEB4BCD0B289671DF0E350F350184ADFEB12EEDBADB02AF51D871C8FC848691E5A38F8A9E12C0910141CC7D40310D4D260A7F35EC965CE3B34E0A41F8B1A26627FC422D13DE8547C068F2A0951BCE7C1D09E803829D6D2D362D5706818275AC16E62623A9713E3BD2410CF3D98B738436F37EC14EED73A510440875BDFC81C44C2B369AB38430CF811EF45EA3206CFD52139996083CF71910A1CEFC9B698FBB4D7A8960CC9B8A7FEB70CEE168A70185505F7558AA9A4EC969E3F9E10D8F8179BF2A001559EA6C897E0C70C0CE27AC0766D557BC97AF01D0808AEFAB64E0B38636218731D8CDAEF9BC164C60EA7141F142889AA9D6B37EE9D5F94C70FD5FDA24A6ECA700D47FEEBFEF33DB4FD1FEE51DF2EF4589B0FC2057809D75705C78764DCD2CAEE0E2B3F7F72C6DFE8334B6E6E0C7AE38D655891553D9FCA4D550CFC4FDF6ED2F63584501D22453EA8F6F7F67E9D70408D6B7CEAE0D81E35272B0DE6937D03EDF71DA90E44F273751CC32A85C1CA4BC9EB516820900575DFA3736F3CACD3F5A3AEC9A12A0CFE893F8B91862805588B3CAAA6673B4E7DB08C76E43BF348D4D586F69F584367EEF455D6F050793ED5616CA7417876944775F44069D55C214BD12618E74F47E5BDBF4BB2ECA1EA998A8DD152DBB18719B42834ED85AAD0CA023B1673D2B6CEF8DA9D3E697307C0CEF29726083799732DCADA30069F9E28487489413A585A8F6DE152A3C170DF0BC5F76478EBED934FAF6AD017FCFCABA313D4EE62BAF26E11D3E6D0FE9FD37879E6EDF5C5AEF4910996B93EF3CDCC74B826966350D699D75583148D9436AEF0BF5AACAE0ECE2CA66795DEAE1C40824526777C99BB94B8B7E0687EB4F04282B20EBC91E996133A8FCE45AE8561E6D1083D1F24BCE215C51583AB073A165A6A4FB7841FE3CE899F8D26921C677EDEE7F4FBB59607C410F7DC308A701E1A85E27C5362C9431C2AA712937CF193232648C59107F6AD8E470A2DB28D25D6C7DEBBF8287A523971BBDC127C843F71AA928C8D571A997DA88B897E37A2C4BBD05C369FBDAF72F62AB8568B5A10E339C98BAE8D810D7636B3FA6FC58EDA60F53A3D6A4C2CE8A0654EC06E7580932188598D4B1EF233177700357E32B780706695A9B8469C25279E9C0C49698B34D9FC8091E7DFAF75652DFC6403E5E84FE7D17E30FECDFC25216147836A55B83405F3D43D73DEC6D92DFF4BB9A4E46FD3C8C7023F6A9BAEFAF8128895D3220679D4994FF7824988A56E4726C4B5E0A77714C8F5109323063C6D24616FA5929F16C87B227984B80EFF7DEA6785A2B0A70FECA15B74D665CEF71569679AA82130B7F934CABF37DC27685E49A6B441388EF627198F6AE2C82C1EB4E3402A0E62E6942FAE8523E93C74CA92CF8DF39A5B9EEB4509FB41F9A61E9713AAFDF2C472D9724CFE7658AAFE3D07643B1C3A0A8DFE69CB9690AD64A7ACE49A72B5AC343F4D6E153858EDF915ABBDF689E63F8399A1BCFB1E58BAA40F2AD19EC463E8EE51E668A0F1F71777FA2F0C0B6D11DF68F2F47DEF991A2C7B7A02260F3748C7712D028F29A2B32AD5D95C77B0453C9DFA83ED75130753656484E30E8A24354DD32548935FFC5F55EADF55640FD48D46E224F10A2E35F9E59123E0C70660F818B567114A4CC9798A7312B60CA148ECAFB68E59F20D8E342EC3FD4FDC50B9CDA506547A0FB8A156DB3B780C7A855A14A860E4D7E57EBAC8327BE8979DAC4C28F8E4FCAC21C5BBDCAC6C96DEF4D5774F5445D9E11DEC053446D24911B94D43595E211E25B8A4CFE921784856D9465A9E2C18A9E8B29BCE645556D1572A7DA953BC23B164035010E5C2689FAF009BDC15A9D1B84DC4F8601414AA39E9635B795EA638657F6560EACF23AA9267208E4BB519235175870B847E2A924ED0CBAE28A614D74938764AEA9FA0381EBB6915A9BE19F1F597A283DA532725447A4889560F2CB356199305A0DFD59167295340A2526327A4CF16CB3C8F72BA131D0CAF84F8FB064EA6371B089C5F81B8E44D90309E47B864E58BEDCF9778B45E7A350BF741FC0324F276FAF6095E85E5F4A4328F2D52586407E80BB4795DC9B9A4DEF9EFF3A4854FCB3C2927FC444FD3AFD99A1741BEAD17BA3EB247D01F9083284D25E26ABA57CE5E7B27916C3DB0D9B3838E28F5012F6E20B9E2E2D5D230AFF6EC45124F5077E80A729E05CA5A215CBFC890CE16A95C35D06D0D2EF4D2326E982EEF73C380E69D097D3DD15B43BDB0EF04EF0CB22515D92B6703D04B7F895565E0D26482376EE5D657770E55A45B657C46A8CE813E01C5C9090D2A492861A23A28B75250D07A672DFB37F211541B6FDBF36338536FF92A7FDB96D7B570DC7B1ABF718E784442B67D68B26E8335B96E69896491B5E970F0CC92A99B04DAA19F10DCDC51C231D6D31A31DAA6FBA94D34DEF0A0147FC030A4B9CC4AE95B01E9556FC73535195C805D19858B9450ABE314EAF5AA3657D4510B20B5D83C98ED55AEA96BCA8A5E9B6E5B81A3B59DDF17243FA273D34BD2036AF7E99E8BDD2DE18E0371947564D6A664B2DF0F28638B363DDD25B326628EC89AEFF31B517907A57CD8B8602BA9955B89B6BF3E062DB6C738AD991816B5DB21C515A36594EA8860652E1E9EB261575A98A53A0AED97D6F7DD9520668D560760A8202C675E0552BA926545D54C1C745B85C6A95239BC7E9790D10D9066320876E628F85A778A10B7B273B9D107AC6602839777759AD4AC0FEEBDAEDDC51ECE17D3D4ACA9EB5902023B18B4FFE59571F1F6EE7D139F06E12A01D242AADC76E34770C44239708875B9675B6EE9E7EB4A0B1DBF28866EBE3747FAD87ED4B2AEB5988532FBF8E2DC88F79A94DCC0B63DD05FB16DA47F63F6484C6B13CE073334B9176E1163F16896EFCE6EEE95D6EE8D42BDD3611ABEFF87310D3E90254661292AD5FAD141BB897BA19F03BEAC13F7A71F5A0262ABCB084393146A640ECCC17FD6E831FF92E5DEADEE7ADFC301FD275E896CDCA109345EA6D283EE1ACB3864F03E44125564529AE1D28A15CA5B34D60B44B22849052144EE47AA019D79CD40457318F0F677CD71F5F383F2C95F696C6145BD5C05CF683C7EBC47ABFB2746E6079C1159A4F3B360613B64222DC4A0FE74B4E0D549959DAD1D9657C1BD6288AFA66614CFB8D9FFE13B108279A66E4D1C34402A57707AF439C66A7AD4B52BD4FF85CED5E49ADB5759F604110E236AC7C30FC75D13FB76EC3D9D9837D58DE15E7E82D99C49AC5138145852C7845E875271A948C4ABD65F1978E36F7E0F212C403C8BE5B7C85CFFD0D035512C4E61C0FA279976068CC73B3C3E28E1ED5AB99A363736C0BCAE732AC1F25ABE93583E53DA9B2CCC8DDC8BDEEEA98883D94E0D71C5355E774E1A4EEA816C1C2C5F066181B3AC327EA0A7F772A892D24D71FD5FC088CA2148EA31E585CD75656BDB4726D4B4485BEE4EBE2F0458B4511BCA280399769C7794C41C36E9C21CB02B6814F58AB7070B8308501D8615069125B5E147838E0DB2455F5387D57628EA56374F21A5C8FD09840766FBB9D448A1C86E82E24F62E279348B063EDD3BFC7A7A65778CAA170996F3168242F30AF254C78E313CB95CE1BD67F70C207238742C71EDA42ECBE1872AAE6A694340C4E6035F0C0A871149607408514144AABA7A9A3DD46612587EE419A4F7C69B19AB9F83FA99B3CB3AA4D530B89A08D6064431A2AB7BA15DB397CFCF7D2FCD48C5BE9859AF044CD88FCAD01163D6145E24CFCDCED632D7179577F595857B954C8268C73523E9072B6ABCF02CDF8637E0C22302B6F5F8B5872F9496D102F270A949C56D4B6A2117062AB6E8E6D6B5672CF8C241160A5F107BADE24E2A1006A0A493EBC17468D0CC3E0BE4F4362F8BE3A87E9DA51A17F0F6DDA9306AA04DBB0433CACE20E0ED80237B663DE9BA32241EBE42A798923221E0BF49BAFAEE30C10F32E6AFDFDAE0891D6E562002B2D11F3F1044B0CB574C2FEF3DCC4ADA3F40E1F84ADF71FEB5756E55F1108448ABEB4483F96D51E952C5547B1C4A14BADB57872A95A5C2F535B20CBF3B8C65A089A51B26E4431AAB490013A5D44A938B1F78CB6BEC540C5D4324B6D5A84DC66BE1B256897631399AAA4AC1BB55BDB9D3E66A20EBCE9BB6B06A4B1BF56442895769D90C4E507F7E4F57ADA5A92E1EE4320352206F5D3371AA65056F06889C5EDFF52843C36AE204F3C793981B22835B1F29E41742CF2266885EA062176345DB5ED21FDA8287C5607636FBBACD04C0FDEDC230AFBAE783C44547672B5C2D43B2B0A21A0951E644B810A018F1C7FFCDA8B3C09F54461AD402A53CCE4D2A01386F1EE319A10689A25CC65B26445AAE66CFAF64990A2A288593FE580058C52F10EF4AE748181D2A6CD7F140A063504C3C83D9A7D6292945DBBF892CE7C27DA4BC367A39A699D60A31ACF26EC923D91434F180375C100269463102985803E89A6D630D9BEA2D26ABE6586702C5AABA86D3964E5525FB56E2684B733DDAA828296E434448C7AADFB4B5FAF150373E7292BD830C97BAE0814DBBA2C8EAE6490ADA7C8FD82819AEC4A9F0ADD1B32A68A92BFA593D3C58770307DF23F7C2131D95C33F66A22FC34B0AFD710EBF3B62FBC5737686F119F1C7214182E59CABE8E0E4E27BC5465B50D0A29A082B6E4E88C45C5A9D7B080110EFBB5F648874786B37F0C6504AF2246B6EFCC2EFE6796097544A55BBA70A03E4F9F064EB5725D4B6E8384F5ED24B638134545B766AE7BA3CB8B36502438148992205AE3A00ABCF774C2C468D9E02711D9E141D4DE5D23EDF6ECA6A42E46BD556F0F54794D45D165016A98856D6D0492F54301F6D24F51EC4151D2CC7D1A178728CE2714F77CD1B59AD3B1343C1CC68609966246CF7ED21047C2CF23775C1EA125A063B384981991A623D7780D238EE94880EE93E2C6FE3DCB0F815F42CAC2F111F2DBE1C4BD7F75E29851E7C52DB15F07E4A6E5ADEC69A78856E10309DE7D35D07CA8E90CBF639EE334108691BD80B576B11F2750C57A468963EE5D858EA3299D754F45FB7D7F9C0C3201E1F94E7407A7B7787E085C224FFFC517B5A0F49AFCE879D02B6425A3078FE72D9107A062D0052F9A244A7067515A90CEB71203D7954208EB10AFB6012C235C7FDC55D899393DF256A716A76446CEA654BE8F5513CF582EAE730D17BFDC592D3D5BA01DE1BD8105EB1B7ED8E051A6263DA831868E42FCBCFE478A086524E9344D19E31D1070A199B970FEEB14357CF94B9DEFF6CBBB27C94EC787171F96CA9AB46FA792A253AA9333BACD3830A72A663CBC56921688CFBE94AD82D03CAE47CA235960D70161C21BEAC9EB949654398B5FFC36DAF6BCB1243A2847A686275AFCAEBDAC3797353845A869550A4C5213A722454AC614AC1E9E64230B57D975BE013546D04BF6FD1E0E95A8FCDBE55AAD3233253EA5D9AFCDD2D692DCDC356C4027534559BF1C99D3E5D3F781403C000C1EA0C2EEB325FEEE8B9A974C9A34AEB12ED5C971C7924861EE1DE3C38A0EA274633980B8E0A45E5152A921B55B8EE392F87984640AE2C5ECB2533B13E4EBA8FB0166E6C52D346467AE82D9D8AA7CA97D1238AB56D7F7EC62D2CD2E7BAD4784B76126249D3D714EC5C2A093F7B6AA035A4F3F03387DA34D7F01931F3D4616D6678B6A840218203CEF98CCD4C8706D6C950557F8D3363FB0ACF3CAE0C0F9C93A3E161218D45E38E09F6732304F8771E2C2E464B3BCF1EA1B719C7D1F03D4A627F8D382D255C40B22E5960D7A34CAA5AFA1A0F366FAC0BCF9B92DDB24253562548A9B80687D81A787BA7F11D6F88E14F995B824DC0573DC34687E8C9C7F1B2B801C79528D43B68C1D6F74A2524393FE20AF4110E6D3CE35F7F2B2555EACABCE545C34111E1FB20EB233354E1618D7A5EFA01562CB46D2EA0EA0590804D13B7473BB8D06B9767E4A18DC39B5F74DAAFEDDD27BD1225526166DD048CCD3751B37862EFB729B0E7CEBF7730030EA12152F49B76D7D56CCC22B9B941A86034D9D831130D5E8BB4F621255414CA440E6A1FDC8A3466F0CA00B605EEA203CEF20B329268C791247B58F9724D1E56CD115768E62735FCBE85035C0E0433B38B89629885D6E39192C46FD1158B15C341D672CB032995F65C146CB128D9B568D1723A7BDA35B2B6C316766B1F357AC0D1AC7B63C403C67AD42DE1824FA7C8FA5A7E6D54CDE122E5228F3A93CB235DC7D65426D38483A547534C0274535FBE681F7F723A80EB3E546A2EEED7F04C796608258B6942DC2F2B1DDDD594E6EBFA5FEEEBF141268EA2C288CEE2A2673571B7C6892EF4BBE76EAC93DA42C5E6C11D3633FAAA3", } for test in [test_mldsa_1, test_mldsa_2, test_mldsa_3, test_slhdsa_1]: alg = test['alg'] print("tcId:", test['tcId'], crsyspqc.Dsa.alg_name(alg)) sk = bytes.fromhex(test['sk']) msg = bytes.fromhex(test['ph']) context = bytes.fromhex(test['context']) hashAlg = test['hashAlg'] opts = crsyspqc.Dsa.SigOpts.DEFAULT if 'rnd' in test: rnd = test['rnd'] else: rnd = "" opts |= crsyspqc.Dsa.SigOpts.DETERMINISTIC # noinspection PyTypeChecker sig = crsyspqc.Dsa.sign_prehash(alg, msg, hashAlg, sk, context=context, opts = opts, params=rnd) print("sig=" + headtail(sig.hex(), 96)) assert (bytes.fromhex(test['signature']) == sig) pk = crsyspqc.Dsa.publickey_from_private(alg, sk) isok = crsyspqc.Dsa.verify_prehash(alg, sig, msg, hashAlg, pk, context=context) print(f"verify_prehash returns {isok}") assert (isok) def test_Dsa_mldsa_external_mu(): """Test ML-DSA using ExternalMu with known test vectors from ML-DSA-sigGen-FIPS204-1_1_0_39.json""" print("\n" + test_Dsa_mldsa_external_mu.__doc__ + "...") test_mldsa_1 = { "tcId": 1, "alg": crsyspqc.Dsa.Alg.ML_DSA_44, "sk": "6BD41CC40BB8620625090451FAB36D3161BBB94CFABF12023023956A84AA1C7E10F73A72346A7A8F171D5A67C0B271AB9B99504A0DB361FD3B195CEB38C7519F7CC04987504EA0FC5B8D34682E0D9017C7636C3B19C71D4B143A7E7DC7C2040C4DDD73E6D98CFF73DB62C6FDA15F405590ABEC5E01791DFFC814871219F9215003A285241281400681DB84098180601280415340480CC02080820053A22463A831E3B00144820513044810B790539485044626C09468D2327293144E19B108D1C021432460E1148D19A12D542640C000311C32311B4149A3189064924D41C06421144912112213220E8BA82C0019684A0471C94828A2944421916C9B166883308DCC126AC2484EC328802201615AB02908B840E4B45109010E91840404826000B98D0B97815CB6442225641A395240100A09A1690B34901930401A2301199124892448523480D4142A20B36CD4028C9826518A9688A104851B2911C3962918A34C18982CD2348421B22004132ACCB68C98A64C53302E14028D911892A000701AC02C18854414156014214844020193B864109289091486CC8669A19209808069413090D1388401A02DDA808804B48110132E09C529649285D2C84803906803012AD314208B38929CC04403C84D43104C22A24803C46C0481455836660409220B4491609820DBC2456140881922084220459B382A01258E0929484480489140062331484A144A1B016860160422854120018ECB12656486080009500BC529DAB8209B4249C1A281E0B4918A306D22A4454028641A892082B84C1B064E102871D8B27102286462266E5824919A402002871114308DCBC285CB206921943049A449C8242E82A07149B240E23405011466D192902336701C08261A001020A52121C161DB380283B86024342099860C1BA680D84026128709529040DA8461C13441200966E08801DA12125C82891CA80419479024106D13348A122210E39401114246091409D3442C4B962D18472A2428084C0408CB400DA1B61018878040067221B611D4B00100C17024036C6440096148266228868A908C5C868009992850B8414C4466E4286122172694C0689A843001B76C121305193962C2B029D0A60D20962003179148B064531681E20251090468A2906591002583948522932420329020224E0B176484A82409332EE316882091014B348C13B38841B06108050092364C0C03600B914089C82003974143106011C368201466C4146EE20249C08829101530DA0BACF0DB7EA86D4F64F7E3F923E7CEAEF2556B6826FA629F42B53F004D679165D63265CE94D619F81FBB6903BEFE248C68C5B7C24654880D43A3B1CCE8170F488665B63B062A860C9F46735ECDE2D93A1B03FD6A74BC4C1687907B7F3B1C18FFDDF4AD7708D05A1BC3DEBCBFB4F6B9CE5D76413FEEF6D4B15773648A81A46D249043CAC68369F113BB45EC3F5DD0D3134DB81017E6F57A4B920E266A7F55CC7F43090688168A167621F1402F7047FEAEB94BC72A5BD91658E568CCE4A915156F989519DA5F58EDC88FEFB52DB9E1D4939C9A9F3E5F8187A6CEBC72988BEE0D9B1A1EB5B9F3E9A7B06B1097589D9F6FD78391E0B7E97A98B16A6C25AC8838044C4F27BA7C456730253186DEC07F1EB3C7B9780A54686DF288331ACD05886E5DC017C86A2C537BA19CE360760A62303CD3A754793FC2D22A14D6FE3EDF37E0E8C1293F4FB85A7E4E4836A8FF7833A2F789D9832CE1E7E2DC4D2B75CED33B321E3AF0450F0946F12DF76C26248977F1974F14713A4AFF3D4DD1A499AEF4016966435B4B01937980E9FBE56FE68F7C84885E212DAEC6C757A8C979A4AD2468C217B46B3AC36C5B3CC2B7A814F7D7D37359BB8BADFCDC624B39C9E2015D35F950958BE5536679FFE14171B8EE77F43028A39C2A1EF151992568FA39E8296A4169B6D7BBD2631DDFED786A5060200F1774B69B0C1C1F52E419E2F42B897A11AAFD514DDA14CBE2456D27FBE6FBCE53DFA29969CA7EB58C757C65A62BFF1D4836D2303C48713FBB83E7279E9A3BA31A3BEA862D3CE45C170EE9EE6F6500E85A52724A151524951C37FDB45A3A2E576567A9C81F017BA6C62CE8168D0DCF578355AE77BBD5D69FD29F4FB29357F8CC8075F7E56F2CC5FB555AB609A5047FD45C9F1F38680F0C414E026F514A44D79228B2E3CB79043D421B30E31ACEA52760C92C8C126F8650E676BBA76B702F89B360803530CAEE6FB06B7915CEBDB76C107FE9CBBD04FDAA681954326EE65B9C5AA2B9D329932915991A8357A39B37EAA5E6BFCE751ADB1E60171DD6C5B5D7E43BF19F2373F3AEEE9628FD9842156E540894750915934F93289467156F8A4F398192648E53A1EDF4C0F71483126DD39B71DCF8EBCBE6E2A5129AA3951723FCE906853F9A37AC50546B8103A82D844F2B08A0E0637577EDD9A9A9D5D635DA73D4CC83E9EE8B3DDA50F014CD66FDB25D099D451D204198FA6A4AC39E9759B435438B1E272E4FB476208BF69B825E8AED0AD9FF052928BBDCC13A330CCC3BBC4D098B03ACC25A38917BA825F1F3EE69D79573C7E38523B6AF03026B37250D9DB6FB7BFAE0541BDA05D3F4137B3E2E2DA492059C555675F126DA318EF31A2FBC535B25758A8B3133AFE6508BE8298CDC903D2937436DFCF9F495011749FC888C17D26755F1A446F05B82FF9568F807A8480CC9E02F12953E20AA16314C994CC7560AD062D1CD0CC756A22998F7FCD3805075B563BC7B7728BD601993CA3D1F491FAB38255D46ACD1A01408EFF40FC235E8E4B08592BE1C9D4DEDE7ED08C53E93E257DCECD65A704B57C648823673E57757F3FBDFD30EA640494D8B727DDB4E60B3841FB4E38A14F5A01E100223DCF0F54541778ED4AF2B804EB8D73D66E11A95A154C6A4FF6CC55708F5546819FB4573930A76D74EBCE331AB4BB05423C17966C8C1B5BAB8E4D68996D550ECFF0983E8E0DF673944C7DD0AABC16CEB3CDF1C43EB4EA97BE10197A089512F5D8A7240BB298B8E7643A57A46AE67A422F1856307984F41CAF02348E0744416D3FACEFB3C5CBA32650AF7D93B0F8AAE465420DAA8799AE34DD4DA383698F9D0AB40F40A6CCF24F7A0312A65269DE45BF2977C4880255A7906C17E8471B15018744051F746B2A85FDEF7C5FABC051CFF6B06E13750C2DD35331F8B5686E158C72FEDA9989AC63E9FCCCF338955D0287439788DC436E9A63D62365D68B545396C03AA7B757E132C2A1E7F917521CB115095F099D2AD5F26175CA808D1701F2A06EE84F08FFFF0E27EBABBCDA3B145D39A32BBAE744DDABBE083E0E3F631D122A94E6599DBEC7D0EC25A11422736C4F2D2830388C9F75C5CCE2255D2A41077D4B2CB1689C66DBD47079C35B6AEE11AEA598B2D99A80529872E99AD57EB9F6DF4839C456B526CBE2AE758BF1E4BD0AF7E6195BD5A1148A1366ABE06F4A35BDADFD60C87CA4C7D98F2A9C6F06DBD12A4A4B497D574E81644BB1D7D4FDDC077E6C5E309AB5AAA3153DADF178E9ABB258DD9D90FCB84841A50C1A2A9466E4485B211B47A0C711639B709D61655415F3482E8A544484E15427153D3FAE510ECF7D1295614C2BD080E2F19AF56F55002", "mu": "49A3370334B906E2044557D51118839AAB8A97EF68A0746FCA362E557CFA196A4B29254F34B4EA125D83C0C3170AB1A3971D7673CB56C26EF36CB71FCB6465C5", "signature": "5D287B60D7AAF5E4996773AA4AB51DB069875B77E34195236A5F22CA9682F918134A44A9A1B87EBC1CCC6D8B0DA3AF6D948F17D50CB8FD8BDFE4590676B492763954A1F211DCA39DA52F7CC84A114CB675384421B312CDF7545A0ADF9231DC9297167BA03862A77D3440398FE60E6621422F80337D8AF6C18ABF348858370A77F52432E4CEB0AB8A1CEB07398BB682C5632274DF13B08E02FAC4385CF5E82F06A1454DDE091DF3A69EDA22C08152238C40828F1CB91A1EC28208E98AC789B42D5EDB4106FC6EAFF83266712213C63CE7768EAE00D74A79CB65025467905B8538F83586B0C4CA84EF5319E0A308BF2A40AFE6C7D870F6F7C949F0C192102B87AED8209EA41DC79D40F7021789C40B983E35DCBE3166E146A541EFB8B513A8353EE9F890D7F1025C32E9ACC9D3EA3F22203697A5A1494EF33C7F170E3D03C6F002CB5C84D64905C6D14D6C33C2809E65819CAE0E56FE25CB09C88BD675C45D08F4F260BE9F57724CAB4E9376AD9E64D73106BF74C734765FCD6DC8B780D17B4A4D593CB906F9AC16E7C3BAE44753B8F1E8583B6E55F7128196238D811E3C7C9E9A777A75FA86B984BE8AC4915474599CBF99290E0D1E1660A646870B3B0AA0A7FC517EF150381FD54752EEDABA8CD41AE34243AEE4E6A2343CC089D49F93A53149FA6CD4A242F7BFD0F0366C3B100E4F2C6CA263E931A001FEAADDB98EA69B9D10557CE4290B313A98ACB0633EBD36FDB23F6FD6F3F2BBE385659234593F7F22C65DDA23DC0995817492494DC8B50E031D929A324F59CD07E5E2165DEBA850D20BAFCEC2A081D0B483FF5CBA4583A8D16592BFDEA97729B47B29B9AF19BDA1853ADBA70B5AEC2AAB737B0C28CD16B1AD3AEA6C41DB94044664290C0F041A0C61C459323CB0BB0D7601CC9818FF81025338C49AA9A2FC9AC21E74F73BC3F6C63E633AE16C808E1A4AC3990C42AA3CC86750AB4C702AE256E02252CA0DDB6535AA55D1661941248CC25457BB359F1B4D98030C74900D7C9C052BAAFC492B7AD5BEC0464B020A007B84FC03BA050DD7DCBA6B3ED3F58CBF8747A8E5AAECDEFB917C12F5A09D865464AB27CB264AA034D176E6332D42C657F50D6FE1911E49D16638F43DE84723A7DB701C9829906803B9406DD49B02A46BB1EBA737D3C156FE561F6CE981D6D478D568EAC5FAF8E2F45DC5D5BBC7353990F3E212EDF5507AF74DF11006750FF4D7E099CA125E70A9F636F0853E3F9B622AFA5E3DFA1423EF2B16EC8E582B4F00F6D24D06CCE72A2A71BE94FB0E1E45BD81B14190F81F57ACF7EDD3FC773973242B0C3725C75F4CA4FC1A93AB729EC3C03DE66114FDBDED6AEE110916DDD661E1C9E295322F24DCCB0C615966154DCE750CB501BB3138346ACB45535062F2A241F3E91F362C2519AE8514E261F7851A0B4453C8CDD448BACE124595B2F871A9767FF67036DAA9E382C58379D0F9A3683A6013C3FBF5E9A6DF3985EC807B235169E027167920D5449EB6587B823504F508CA5AFBD007EB3BE06367081C0E6C7E9E6A40B208A75B7606298938F4EBD251DAF394A5BCEA227CEA803D4814AEC01B3992C9B51170B5F6051798CB8E9F574C5A52AFCB95AA127F1017A11C335696CAD6D66DF6A767841494EA5D788F44688491BF57D5347987CCCF0B8B7935DFEDE5853DFEC5BB3ADB0A459DE9B7C78F6253ED7939B0728E92448A0EF6269640B7131965D2FAFAD22E5778371C74630EDF6608980C853772579D268E181C7E916E6F098D966C9FD96A40E860C87A1FBD535ABB5BFE91BF08D4891229626D5E02E02D58E81E167D09AE6B816E4121B6035A3B7AE2A0D88BBDB3338564660EF5A6A30934E3AC88224258BB8CFFA7ADE5A5463D659153820F5D44956EA9430D9156E18D173C45FD73E1497841E7FD93DBBEA1275C5DC47DA2534BDAED2BBBF88E67FB25083F1899688B227F4DB6C5B62C21DB861B85452F104675B5FCA2EA286523E12C308B7B094B6F6E2F7F982451508FFE5F4FEB0E1D8EB4B3808A4F23DDD80F3FD6DF8E0DEF5EFBF18495D3CCCDFD4D601EF5C9AF227157E3AFFE08B4FAD8255FBC791F8F981B8ABAB8A7E6ADCE2B3FB5E4C695B5EF14BF10A316C9EBA08FFD9DCBE30A5E392090BB1CDBC6EDA50A8D9D2ECE9B06867C909B4CBAD9747486FA5D6B8418A84CD030B9AF1543B28E81D31F4DBFE81FBD85A169A378B3926417E155231DE3F72F732273ADB6A882339B246ADCF25A292B51C5D3DFFD3F9CD6BEF5B9EC3C8BB6A6933BAC714BAC6A3E0E85C56AF7E48BD8836A4DB0E695B8054EBD7C29E03A37971A9423C15F5A233261A19E147C0FB53079B1DA3CDE52E8ABD14079F1FCFDD1792F4DA54E1A4602DDB25841AD4D8072341EEC8975762A879774CF4FCFC76E538B225DE859DE7E38E10B1AFB2912E748D25D1D577D50B99137E79171F29A4A378DB61BF7D513BD67429BD60140E95CE55B381DE6DF46519D27A4AF33A3930681653AC14361D7DF0A60E7492BA766E6BA093C867E4688F34B3BD6B9E40C7D6810CA7229FD1FD9DDB599F194023E74819893A52EB7FC82FA27096671DC2AC19AB85677277AAB9A7DEF8BFF07D4DAF58B647B9750244C243A7936BBF9F2C718CB2FC646E02E3751AFC66B35E0131B7D6ADD7C2A01AC4699EA726C2E70F97CADA7D41E18CBC560B12C150D483A94256EA465867A622E82EFF21756FAAB96568FB21D0E041EA352017CD443EC573F2CE304C81CB9B3B4199992C1386A8F8E8B0B0CF004E4807E6B471EE9D15540F2B4BA130311383440B108B03EA6049E8CE411805371323CFBC17AF27D98238AD74A2BFA4440603B412069DD11FE5BFE729CE97642F82617A4D8AA9E88CAF708A1D2FA4326FCDCBE416D14A035A1A631F24861B5EF2E057B7EA97DB2D07AD6286A6EA0CB5F2AF0A6E7E2C922B75441ED59FA50EC215AA69AC6E460FFB97F5ACBA33FD9DCD863AE60C37F7C598DA28DAEFB878F9AB86A3514F5784C02E0BF343DA22273C984F8E861C4D083A6C52EFBA7EE0A9E94DEA08A58BD075BEACA4F195F2173A649CE84A032EFBDCDCF215994BF4E05B9D7DF34B317CEA9BD31D0B3046236C9CA703BF25AE121976C5AA1560B0A844B6ADAFA301ED2493EA516D079A55349AEAF225DF1824854BCA9A12C5EF16C968F125FB1FA423B68A131160C780E54F8E311E28AE3D3267883B759973A565DEC16C2AE538837ECAA757B407A9F463ADC9BDBBBED4A808040BE9B8C0249DD46E45094781ECC5C9059BAD7AD43AE6A3EB594EC1180C0659F17A8A0B957970A080D2C555F9C9EAAB5EEF2FF12163B4A515C6278797CA6AECAEBFDFE282C808B969BBFC100022586ABC2E5F60000000000000000000000000000000000000000000000000000000000000000000000000C1C242C", } test_mldsa_2 = { "tcId": 61, "alg": crsyspqc.Dsa.Alg.ML_DSA_87, "sk": "5CE4025F56C34F2DF330A1C1177A0B03A479407E35EB8414BBCCEA7F14AABBF95458F6184286CE18ACC5466078AA96430B30C1AAF9A3DE3E0ACB11C980F13F9992C2EBD8C5018983BECCE295601C782B25960C8A2FD31473EA5BEC0C534B96AC256D7B69BCEB68951344E9F53F0D69E373FB7D45EBD709698214F7C78FB82DE490280D4A1840C2A44993340E128170E0228A18994CC1B400D9460C82864952087001B84DE40465191544093142C2226C138721CA000E19C66918344161082014060500434804A52D9A3271D4966DCA164D8BC6295890301280640B3040C2144D88469113C8441C0382893268CB9240E480910CA684A1C868813622204340638630132992523866C8406622453184861181044581088C5AB42424008C0B40691046220A82856144321B2140A2480E08B06C04150E1AC28D0B324AC196910208055A3204014026083346A4048D89108C8C28861C8431C34846441092CC948C44C884824850E3046E1229458C184C04A38501063182146C1C47661B4140492629C238325A9620C8246CDAA625012141230260A4364AD340001A220A99A66C0B187243C491D2388102B36003304622410DC1442223A00D600289DB186994924C8206128248101A050A01190E1CB321D4B66921374D08422D1B02869C1092E022288448722032214938120C022823440481000852164410130A4AA268149391190472A4A22D8C944019896D19456A823840C9226D04C1216018046302621B272AC020820323721A3028D3C42C84B829040925111708E2A025A1108DE4468290288E0B158EC3B8119234004908700A4421CA2431E3144191487102082A0A012A48446C0927804A3649E1004EE2128C602429034366113652A4440822A0715A425292C68DC4B0451BA8710B164E52866C98484C08B761888601D40831A12269D20464989208D9B84183A60104144D892201C392651C874402350818018501974C59162D11102A518201191786D82851C442261C312D20A46C8B104584100E4946311AC36C938284A1441144B249C2464223048A5BB00D98326C0CB945A048206332849C246E1A4612C1324D14333122C02821C720A1B644E33462E3A2892303811116120AC63100A08102B18008138112B52C61A8242208414B126959842081024404014280942511B32401B61123152014C12022A620E4C09002968D1A11402432040840900112448B106A91C25049A6908322100B8924D2B0514114286006224C102CCC24210A268D42822411B965A3062A84426054042419B385D9342481462824836002A08CC4B4804C38444C462D49B649E0908DE3122C90C2014324902432691AA58D19B53012956923C70D4384700840429BC4815B28041B2781D4C280C8B82191860D12415281A671CA3280192665E0A401CA12848418010A0331D2C6115A305292168151342C14238890C68D1CA3901CA645A0380C59B42099C87149B0251AB2800C27828C4471929645D8142920C169E408301B046EE41681D4B631004650A1A648111960D2086499860818216648442E18972909916592A6101241121B282E0018524B1829DC388593B0841C07225C389090044C411828C1348692B20C8C8431DB203103970804B7614C944108450940426C841892622211D338418298886422414B1632DB006E583685D1248263106AA0042841948C23356414C281D0140D08A090D316915B24405B383021444501B691C41886DC286D5838664C124250126C0200248412290A920D0BC66143282D580450E01890411091043300414028228791C44065219925A01260C84692A2C8499AC80418184D4034700CA2452389448200628C244C82B27021390162866D52284AA3944041B24DC93064983051E3A41099128D81904C21006062028DE4280E9B840121096802A5500B0700A432442442721C8269A4388A1C9880DC02100A2971A1188550146410C86920A44992C2204C806CCC1289C11460E3288161206AC0C228A0C441A2025060488A424465D4066ED23812CC88512002605CA6691204280A83054CB6450132850C004449908D183591D4C82C81140EDA480E8B160A60026D0C382693386911A5301822080915320AB92064C42C2216501A499163107019360C08940D212905DAC29049440D24342522276952168614C34C09156CE44680228710D4A22C4AC45013A3290C07307F6CB7C2DE138E058083F3D615A678B80989E436529E8CA7A1A78A7E3DEFBAA90F48725DA94424A0AD18428DA260E8CAC1F7FF03D0F0CE065183899CE81EB7114988205F5F723D347879BB9F1E4852DC59A2049BDE75A339B11C57173BEBED1B3AE23F785A908B609F11E723960932DA04631AC64FA117137763C90EADECD2D70A9875F2589DA8CBB30F428B08D0184D2927D03C875BDB37FA117C542C30EDB2169D0AB9057EC516EFA2E6AA1A23FEFAB8048D9AE700C9C764192004B506C2CE3F0E13494B81D4347BF1F02DED333B62BC547BA902E69FFE45E7CB393281FCC2B4B269936C58367ECE80D80045DCFE28A5A9E03B6DF2AEA34406A1D13241C6EAD47D7EBBE167B0A7EBD0BCA76A297B6D4BDB59112C020ADE383CAC97CAC3F4B022E1DBEE4F31F31255FC9E211EA36C664ED2CC5BE36F30A4B094E282DDB409A3B404E4AC344C958EB31F68A0096C16332B3A302AC06198C81AD1CF8A3B70FC362317DCE2534CE67E78CB652D5216BD5E98E40DF28E347E93B05888A1DB1CE5AF0D5D75FB57050EF3E8ECA4D0C0C683BD699F3820AB5FB0B32B5FE6023318F9BBEB401D655D3694C67A64261CC474EA5472B5100AB879893AC662339E3B9646D084EBFCCC94E0DFF91CBAFD14F41267C0D2315EBB94C7988566ADB6BED4E95D8E483B923A7E4A498C9A3C1B56E72D64E721072EDA35A02890647B09F2F92F1491A2C0BD460CDD07D5ECACE568FB695AB98610B9CD562AB41E59E148A4FB6E31A34B8684A3FDA010B93DD1BA79AE75887B6B07E7615E7E872D52C01BA4F52C6BEA2DC9D181A44FE0F0D577BCDFA319996F34B116DE784A8BA45B1DD5587CFB4A0E2ABCB2288EFEF1B9E3B9C5BB51756014F4B3F1B326B175F14CE6F93B3420993EF52D52576BA359D470D0ABA9B82A9A7449462ED08A918DC541C6519143F023C74DC9AC1271CBA3A4010F02A36C647388F9EF1929F259773F35A943EA768D7988EF47967FF2BB9B16E9497E65AEDC51535352CD1E28C03D188B3258644D9BEB1CF8C9C997A936B514C25174551943D03A33450DB6AA0403F4B01F4E9158B90A03EA94D3F92DD7D6DAEFB9248760FB88558E56B8AD7DC84A37536BEC2BB8A84986AB5C12441B73994DD71CEE9D1C713C4741104C3BCE78C1CBC63E77C5028798372DEE910D8727AC0B5E0A9C5A35BE3F108926C49D312BB71ABD61447ACB6F8EBAB34A87AC48DA030E5C0E92BA59476EA8A466799DBCAC6B60CCBF71B1AC6A9E814793624105D90CBB493B34952EA1EFC6586190A326C751FD0ADC751CFE9B116578DA309C394D61B8377F2F4A0FA3E9EB818411D75DE578142F34D385EA40FF6FEFE23BD6CB0F2944BBAED7CE629673B19983DB0A5885E9358EB230DAEA38F6EFEBF30F062525D645CAE12F1A9C9159D742CA182ABF64C8DE961C612CD5CCC25FA10BE670C7B6BC67248A4AF7563FBE9DC37445A64733A32B3C6C9C9CAE72447A69727A4329AB2F8E01D8B060D0EE199F48C9502FA3D4E2C5737E93038417B13C1A776CEACA6DA1DE652C39D0B136BD0F1047E55F249ABB4780446B94594C0CF9CD0659BEF4DAA282D1F334E3195EC719AE29F075A1D43F13655AAAF78AEF038F9782E4942EB1577365F37409B99608944D8FB7EE49105402F9CA9CECECDDFC56EC10C667CF4EB629593FC65005B92B1E887786AB1DFD481D85171608C44ADD6F6F74C349613D0D7B23AD34F0818C01E199093424977F15D13039237A4B226555602E7BBBD76A5685E7E6C7D1CAA1F80AF5128AB3086588C839B38E7266ECFC4B30245598B88E1D7583F655909FBFDB28B8F98551F94C38025DC7969E85A5814EE6838D565ED95EB0856A88E3CDD55139FD3369EB023AE717E1E73276CF630292AA1020CEC1EE3A0C6DEB53F75278046B26255BFAA370F9E83CA64AC962A0B25DDCE144E9AA63E02EFDB007ACDF8EC9BB0E10E64EACF9798B7F9B5C1634F83786D67766FE7F5F216727B329814069293CC0B6CB0EAF5105B0EBF52E315F5879897DA2AB7C1DA68CCEBE8E66F1133844CA054A9F1516954D7DD25526D95B6D1D0A4A3F75D0D7DAFFC578090F72BEF9F2641C820784233E1F2D50480E95B347458D2F98E50709BE131122A9C70A6776B8DE4DD3573E2040FF807940EBB3A19BEBC8B9D24985E23A040AD2D55C433FFF34FBBD20E101194EE3BFA8E77E05196BDAB0833F4A612B1EE9BF66922B9030E8865A30D56BB3EA5448A113FD4EF5DACAD9ED2E16999409C8F5B784B94EC462F3F2640C1E1C12A995288D9427006C41922F74D033EA3C1E10DF74054D9DA2A089454D98E3E9D16F808E556815845A6941F8AB729920E3B02E04F9C95B6C451CCCD5812172DDCEE23A3B6BFD9EA8ABE26FCB340E327A52F166AF848A160E855B3933618D46EBC2D49C9D1F791BCDB1736AE95F6A35D0994E842B205355F7258BAF4F6A3768CF3F23D8D5E0331E6412A9884A5695FADC472D655A122A30A49917F81AF06590EF6CA3421C1D7663A5BFE9FCA65FCB3148AB5AE05418831B519C69B68338C9A21A92F0D5A57856D3A8ABD20A2BAE6BCD65CAB3275BEF1AF0F994A9AF54491DE7536931F523D9E85B0785F0E26B93947AD960DAEEDAE5D0449FB2115D661FC6E40343E8C1A48A41AB0B177168A899C1D27C2634B2275D51A2CA432EF89CED50876FEB3C87597B7186EC97996757687B786C7CA7859D3A3295A43F3CC10587B0599C182617146679E2DC22620373AD0F43609F1AF94875E2049DA14031EA0FC97CD07963F9266BEDFA735CF4835BA9AD5309AF0F01F8548B7B719D156021ACAD22B2E8C1D3729F25D9D68C21B21622432716739C61CD6C16CC70AE07E8E423210D14868030E8DBB7AAAD25E85792EADC73B2D481AB863F94E87E0D9342864EE3FD100BE016DD39E22EEC697781840F1EC249D127C0DCD73391D8609764AAE922FB1A02CE5CDA3974B9D2DFDBD2082734B9B5DDC6E98CE1DC8D01197CD03CF9DDE3078CCE1D066F1F302829B9E38A4776C60EAE7F6A4703011AB3E21FCEFE5E2A3733FBCBB4A2C8323228A5AB76E0CCDF5B4457160B36CC38897C1180D44065F2BDF7DE88220E917A01C6E6BAC4F6C0D12F3090F7FFB1AF437AFEFEBF9FBF0035C03ABFF3115009AE66590A4FA45E1BEFBADE9A017C44D3DE21D275BEDF6FC5F404FF0ADCC7A2A8CB1CBA2A943A33D6E46D1BC68CE1F33BE6511DFFA464D66EFD86E879EBC9E71B0188A37CEC1FF8D3135B91A636CE9506FB333A4503F04DE3ED8507304D034D1B52C3E7A92B69F4463426A02820055AF2F79F7C56D1FA27F6B011E5A99198CF807FDEDF6C9D08B88EF534592B993588355B230712E108E9C17936A587F84A77F2F847B4F48821C27D38D5B256FB92A45FF2BA0BFACC3517CE67FA0785879966212D7B25B5136BFE7E62E079DFCD768CAC491DBCDFF8D9C1A1BD22B37271D9769B393638858DFC2C466F3987DC6DFE460FF52F92F90862FD814BE4882973FA11BECC6821D8F1C319EF0B0F415D119FB7522E4027731937FC82F37FF0873DE6CFACB7E8788DD86192A2E7B3B79ECB130477092854AAA0431E80F790D58E6C0B09B6474B98E8D9F92EF04248D17544FB66755D351B4AA305E86412D0BC9A078538BC98BC269B872E349947EBBD8355C3733D103B3691A0299F8B142FBDDE5966B9E24EF4665C19FE40F22FF4C26CA0CB11B8CA83CED0455AC64E03E3DDC0FBEFE2482F90BE1902EBB56655BACDDD9176BF053281F34D0144559D4AB48929DC48166EB660120FA01621075C116A68B2DE09CC0F75FE4F88A4D8AA9AA76146C09768DF26569A6663EB743CEE3EAF36D6A9AF71562B2D750A43D71C90647F784B94C48CAF5E0EEA1DF833F24907FFA3333EE40AC46BD4DC0F9F8D8AA252653D838A958635696B4C12069EB86E195B6C7206C9C30A77047FFD98E2EEC631B313A9B3E807B86C7961D4D66817D9BB1D0E9E5FDBB31E41AB14609E8EAD4C34E9A57C4D2E12B1543CF8BAE94CA2019E91052A26CC8C16455C0A8DD6990B862EB1D1627D82B1515E34186702C5E0BB92F6C74A4E5EA367751E8E31725649093112CC17B98D0F1259360DD7A61C6C8A5F0C85A84C84601BDA983A0FF715F7B0BA60EB281BC3F3E3A8EFDC21DA229185546CCF5659BC69438AF02696EBAED820146B074D6BB2859677E240820CD5A932C6C15AB0D9FD48F44155CAF1D040DCEFC1F3416216AF622490FA2AB7C85E1E19CEB449265F21839A1A1EAA03985B9076BDAB8A9164E4449661633F2496D9C6C60F96192659AF2D43295C61AD4BB36C2ED483DBF6F97D8ADB4326950F48049DD62A436A61C1A493AB8C0AE78F0598292E44990FCF16B7BC0AFC70743DBEB22AF372E366F876B94F0C65EAC3C1B9B07349FB755EC0D6C3200733F22C5D058546A9309E7219C271B0683474D309DFB5187AF44F6A637DE9DAC972F60A447DC289D11D6E3765B3D0CF4A20FE85FABF8B9409810B10D4CDE28AF1EB584B39F1CF35A76CB7DF5A1182B86E32E353A4084E539AF70EED76BB5F341BB10F194C511AA17FCDBC46045F6B62025F274044547C751A3F83D4D08BDF2016E9C525BFAE269354B25DD0BAC153BD8BD411C2F566160E2222FF383B98858C00911ABFB8C46133FE9035C02307119B0DD151490D2F3A773C323878D3C07D6C2246E503DA712B08", "mu": "8D47E774CE2E855173438A096E8795B639A36FE254F5A66A9A46E934B48F544512347D7EE02E9439AA6406436336FA9CF7EB647760DF720AC5C8A363672FB579", "signature": "D66A1FC8C32DAE1531A8A5221A69D9F03449673FB8FCD4779FA34C802432A4200AD63AE3CD6C369A8478D4997B730ED137367CF95F1A60022347A25A2008756D809B4DDCE870E803EB0D329C7299AAAF1451E98157AD05D4EE552B0CD95A4F8C7C7341BD289F3673D1F88DE202A5CF7727A8FB3EBAFC878DD3AB117D04057B7B6EAE8A606361BD49568B04A7119C97C19BDDAFC2EFE9F1768A4AACE3AB3A468BBE1EA0AE49FFEB693F8412E53AEFA7B8DB9B476A29720B79CC4C054E7FD73FD611346B3C17E29CE62018D18B0EEEF4DC0D32D37D9B5C059D8B62D422375AFBACFB55F2739C1C3C9E18EB08EF86BC11C92B900B4BD4431D9868DF037113E4905DBD285D645BB3EBD6C8CAB96BF802875CC7A2F4A826F1C465643047BF24C9E4DEFF6115D87F004CD09169DBC3CD10C0CC561C4D3A387F83162F6073923E3B49B08385EB9DC246EDDC2E434EBC998F5FB5A017C11A832BA08AE1AF2646A9C402B6386A02A63C8D10A7ADF123E3B2EF804E5E46288059EE8ECF5F9BB0F64AE26448BA69C579CDAA8660DE83DF65ABE3B612417D808E7A9B562253AF19476CA287C714AF64975EB4DD9AB31984A69DCF2B0A171ED6D2C4565ED2E03C10B2739A3A6FC7B91DE5787F20A8186CFD595E8E43A3F59998040BF7ED77995E5C3494D6E248552B144E37414DA1F03186AA2CA819605AF5DC24F17C9795D1A8DCF3A6EEAB851A02D4EEB4F4E1DF311A6530C6DEAC4814B63CC5DDD3E0CB0BBC580BD36BAA6DFDED5F3874277D3FAF32A4F3C36CF4C1598D644DF8F3E78F2100FAF41C80BE48E809EC6F8D22B5BDF7C7D2BDA2207429F7A4D82A5F4EB5CDD9F8739A39CB7E1BD704128D58DD9D98C5AF2B3E6C16736107EE4EDCC96D19781E0F1E8FE468855775E7149774F310BED5B5967114131AD114D0E826598070F522747B5CB1DEBD0A88366CBC54BCAD6A048033B4CF95B0B658F3E493090B34131C930530D7308425BB50807C6370483FFD990C12B4A9D1960EEF0AC364A80D72B2AAAED588F4CB8F4C73B34A806F18720F127E8D20A78EB1D9CE602392A3A0BB32972C874132421B88C857C7ECF900B94B30439F47D84642CAB3972811F8AF42B614CF1C11C07787BF2C633BA1342F324CC41514E07C7DBAD78755E74D53CC5A3F67E6A769584FEA13E3169784E2CB2DAD120AC40408E752EBAF4D2347CB68EB4280AEA4C5B5A0AB0D70CBB2C299D281BA3AC8F113DA4F95609A1D38463B8A7DCE9EC81E13B01484D3792DE7BAF160835A8929880990454C570B8CFEF851F6C9F866A757F3FC1C052FF6400EAD7D9D8199C82D97FF85A8A1A092A35F4EC3A751166A315B1A90C40460222D80B9B9AF00CC6D5396F99E785EC4673589AA8C456F3979483E6963499A30DED0AB35E6E68456951F968BE49B107538AD654BCE975CF6A11543C01E63C72F2388014E8DE1A889F81A166FF6D1060D5ED4949FC777714BD2D823D489C280991C2429CACC19CADECE2455D791B2730C8867AA2D2450C5E1D4BE77B18CB0916653CAE09017DAFD5B03FC1A467910F98C4402AEB168EDB56CD9DD4FCE136960262FBCD3B726E07B18D224A56DBD8A8177C7F5218ADBCE78A6C4BE150537E6FB56FA2D61A64F18E4A859E0240656AAF6FCB875BF76D2E07B3A665B503F92E06F3FFAA977FF4C33F140FE4007C9330CCD71AB2297CF6F558945749991EA78691FB56831165D392F9088E68A2DE369CF67B9D21463DBD98F565DC8333475793E6E00DA2E04784FAA7DF452FF5A4C609625BB6E2C8C0D389CF3DF588D180CC32A37C89C34D3141BD72E62D062D188D7747FAE11ED59CB9661C0870A8FC132E031DC0FCBC0DC1E99CD42D709FD1298E7A28B86B6578084DEF2456D0F87C605FA8F0E135B5993A15F131312153428758BC5096AB76A93F7CD55FBDD661B53C8790E89B524672AD41AE36A7A9664A5B7960C4D3F94477F7A515FC5B887C777F98F99C2F1FF12786B739F578F1F0859059D6B3F8304A1CE51CFF2704DA7521731DC9EDA542BF6395B9AEA7FC8F5AB02BDE8EDEA321F990CBF4AC40F8E6F57B5BBF2AAC5F43156265E95962878AB4C3C53CB619A2485E6CE802B9732AD6C5E31D00C9EC5BF5C764C8EDA20739E3BA65E1FC33FB59C3C6F5FF430DFFD8F4AA8DCC22DB0367A858F29708976DBDD2FFAA7BD319758B84573168ED75933489B1501FAC880C952E6AB80EDB20C6A669FB68277EFF06204FDA88C70A8FB22FF57332E4E96E8D45B2B9BA8C39AF085DA8857E926CCB68272151D661120294179816F65CB347F1738761FA1D0F8C804BC132620EB0EE846F8D451EDDAA39EDECCEE3B5C0F2AA9672BE2746B2636D6268ACF31497A61211EF89B7BB0F1AB24FF06941F7CE2A7E9A1DA6ACC6E2592A33A2853F326BC595D631AE75863E23CE6DEE0BA264AAB37B7967C40C7D17980CCC3417F4B616B7863BE219295B0D5094885F0D9E7C0DB3270A19D9E3FB0E35646340AEDDAAA8EFB4CAD620E0132B2E6827DE0546A920B4B1147DC51AED079502289CA8F68A32119248F5B44B1A3878093950B8666B8E6C454C3C67FD5012F014316E42730488DFFA93B31C2513242261F1283790E6DAFA5D0B715E896BFC70A4A54D2125B8EB1D33DC2F16C5D8F9609C4167CE162C5B91BA650D7F7A0B90A4254D43FC83B7D9A0E8E007F4D4206B9796A9563E180447427370CD199229219BC3DB1E8045EB277B4B575B59D8E1F5ED1E522144FBF9959C0DA102FCE7FD897C4ECB4E4A345D692C310DF31441C7EAB467C1A9CD075DED9BE2DFF16705CBC83D1A57866EAD871C4F72DE02D66B1AA0BB6CA34DA2E0B72722A5FE8BAA9E76AC3C1DE279CF77C96C58CAE4A1302773171218A75B1A7358CA93262AD4DCE2B47BB0ED5BBA273C3A185795D5B32172AC82C162347B49743BDC5F72FB0D3BC9E78A106665A37FD5FB36F3B4F7D39AE64EF163C3967BCD5025C28041815F374C369E048B4722A914679442888614E8E908B5C86B6E58DAC7438EFEE0AE5A388A872816497B5054192E1762B60709317B41A23AEE33BD9220FDBFB84BF1DBD956BFA78D705CF79EC69957F38BAB22A33672E0FE27CADACCD17023B90288A328B5289DFF91A2C8AF80FE3FBF5B208AEF9770C5ED9057084882D0D30D72128E5369DC48FAAF813205AB7FF5A45F87110683CF8269B5F7630E0F022294D9DEDD5F707D5DF233270DC7AE5C65527DB8DF92ECFCB4F212D0B36268B1A43337D7488C689DAD6A83855CF4360248C69555041B89C640B32D563C0151BF061DABAE754CA39656FB9A844A0973F67532AA664982B385F33C0507652585399FF37BD8D6242FEDB59B9C28FE72D142E3F0B6B7FAAED1234772F41D14D358B83E87ADC63CF32CA9C1E02D135067049EF6C273621F785049FAD51E7864301FA5BA3FEAD4FF715F982BB4F3F9DA448F13650375A36FB6863907D592DF97648C017C6E3F2DC5C201EE45BEA314F2E74BE499B51CCEB8D1C7CFAF8B0EBB6F757B3EE5B9E1C4EC750A083EA3E984B5760ABBEE6788B69E97C883A5EA82121E8999AD3B25DE28F84A3D10051A5E04F459826FA3F382FB1196FBC44945BBF5A68D33C00BA38329865B2932DECDED7B31F60E6FB3E775F77A8279D428A61105A409933D32242135A520EA6BB5A4FD74AC6FBA9B68DC0CBF494980042E3FA4A467D833E46B132AE574F058F9E55D5E034FFB7AF531AF78C5686461062DC2466751C4C09936D92FADCECA8D881E0FF94CC6C3875811EFD0A74E884A4CCC3C1DFB30E8DD266898F69A3E24F56F2A656819C43A0BC3A9344467C991ACDCF3AF063FB81340EA6C7B73D961F90B3B538BBA83C73DFFD893E69FB68CEC1FE6DDA0ED0274870949F7760A8F3BF2D2250C4ADE1BE33E6C8D9829013141B7ADAB0411C00814EFCD908DED011814A76B13AEED028099AE73F2EFC87EEE1A6A1ACBA77BDB0271F215F7DE64273C7D73C430A42F790D8A95507933EF00AC97E7C29E0925869129EBDAA167F272E90CE9827BFC22FDE0FDD17CC667D7DE5E1F7107F34BFFF1201F64312B400EFA25101B6E2C1D960EF2351280D9E8841B8DD957C0BD15FE4F68AA773EFA46C39F06B89615799F464D96E4AD97076081ED0D1764F1C3C59B2A95F8849B87397F4713175B46472B94E0EF38E9A75FCC2893E0B156C7A4458E0408A9EEDBE70C984BF7AC2A96AB963BDD9F847A09AEFAEC306F06E90137DBD6CC8427AEC486E8945AF9209EBA6CAC9F36130EAD8EEA67ED8399A3094A59F8BE6A6F11B5FB13BBF2887886AAAD68E312F29D2FFF403DA2EC6C86E099839D82D1B8C2681009CF5520A5F54BCEA9F592FEA95F6F69270D6BCBF445113518869065EF6F7371DBC9ECBCC69B5D7D6D36651FBC3198DF01AE9CABFC6C6D25BD06DD499C5ED07C3E8DA99C04CF6A3C19FB846397AF0BE2176245BA10A938C018EC0604473970868CC3F4672993F6C70CD08E05FE4845DF7FB331FD8B17C25B5F3CC011CDDD8465D57FEC3858DA76438243E14BE89ED5DE461CE3D73FEA38C321549673F7F16B4F6DAB642A3F1B6C6DBA1B211E674299DA300A04756CFA79210A35251FAE681C35578FD0626F249BEED85A81952CB54C86E33E23B195D0E1ED9C050E981CBE8152AAB478344A3B63C4FC14DA48A91A9652E76A83154C62D203792C3D2F5C3A489D2E369A0533E910E52C273795EFE17737B00C904D8B61B0BE05AEC22F3A40EB827F14EA4ABDAEBF5F57264B9603FF61331C57D8AD6E5C73B0B49A4842CA1F369B22FC0A508A9F5435D1661FFD97E4304EE19436952E4B0792A4259F0E847700B98D72F9E478E0835EC9ACBCA0C59ABD26C601F8906F8CEFCBF97D5F3CEECB596084D0BA0546735ACC3C9166D156FC025E4753BDF29815E789F86354C20C279947CD999F134D347AE30B1A029C9C610A7237F981CEDD86FD72CFDDA56A7C1A676A7F8B8D2908FFAC5E258C78C1DBF81A323462874C2A45D3A144ADE2B9C25ECBDEB66CFB7F94FF13FC9BD394C5FB17A03408CF0E59938A4C8D53FF9686D33563F0EB7957D7586D3A0507A45E0805AFEBD7C544EBFB0CD1B48451D7E7D96C9FDFE49F38E5E1BAE95241B11B98E7F26E57889C06700F72591EFA73E801310AA25205CDE6F5224796A25F9DADF01392E1884C08BEEDB1246FF9EE3F2358F8F88314CE2D0166EB08E715C4B7783962350929E449AB78B7258EC535731CB53F1F84ED8CF017494C1CBD5E6AB902640A80B48D6374E97920086092A508D911377996784C755BA69A0077E0E392A360C659C0364A3CA6C95CAA274BE0F5EF4104D82615FB363115FEC2D6544E609369B139F2CDD83D117DEC833B1F7120F42D4B3AFF04B87465296259D65C5881871A6FC18BE3CE79EEBD1EFC020CB4B257B1DCE394FDC9743779B42B5E02C7988481311967D816FEE0645C8FF6C0AB8F15F8F43A0E850A251C561F36B94A4FA578B37250EF3705A4B0FD19BD84EF2C6D95A7517039C2A616C6FB4FCFF9BF04B043BAB5949E7C5ACD8C19CA3FBBC20ADA133E726FC6E2D8359638E88AAA04515C0DB655E6C0818BBB799A8B1C9DE126D6AB7BF91D927CE6B30AA237FAF83F1621E7DFFA27477AC09A86CC014AE7911539EBA09583BB3AB41BBAB915BD4F36797D641B2A5DF8906DBDBC3A1C96F0544C28B8F085C4B34418E2A9539480B408D2E60AD5547E1B09A6A3F2FD554804B7FC977D9006161A44176C372E414D3AA96D86E0BD8EFFA668A51F7E96F0399B212DF485EF430CAF3ABBFADA881BAF1D51E8E4DF659CA9BC0EBA530743030ED176A6158CEA4EE2D004FEA435AEF12D13AE7BAECD2D172254FDAE65F0DF980C9389DE599B6967F01E031899456D157D0D3D4EDAF307D17A5067AAD6AF2423C81427EE41F8BC6005D0B1253B6FF7BA9D64739A3A8A00E28E318F90A45BC803DC0AACFBE423BCB67CF178298C869FAC227575E30FF163DB728C73EDF70A2CD77BFC8D9B2A407ED9B78C34C05FE4A4036B6D3ABA214AE9C3E2E05981C9299C177D202B6F979AB93B74C954F0500851BF7C66BBB6DE4008822E7C140EDECD67F9412FAB1465F2068074470AD8A28BEE7E88F02B54A390F40EC64CE97350DE8A11B88D5E854CDA7700F2975A79FE0F95CE1ED9161B94F07AEFC7F9B6E1E46B806BAC1313AFE883546C839BF60386CAFDB6AA11BEB7AE2A51783FAF467B6233063F0FD42D4777F4371A1977F26800DCD83A9BE3F8A76F74CE4F23772B54BF2BDCFF22E5863C0A7A96476420C9AB57DD25350224514CD676C579EAF504CC08DA0EEAC9D94AB200C15FA5FF529B03BF727BF268016D7B69EB0CD9110F59185415F1A13B28C7B71006DC6415440434A0939C07B12806188629675FB21F8118ADFDEC389BF80F0F304D7B69DA590AFAA8D72314214633D505A68A43F85C4FB0553809EACB1C2E13E7D81A2BAD0D4E9F3F520243D3E84859AC5DDE7041A3C46598FBEEFF23491AFCAD0D20317DDFA000000000000000000000000000000000000000509111B252E3438", } for test in [test_mldsa_1, test_mldsa_2]: alg = test['alg'] print("tcId:", test['tcId'], crsyspqc.Dsa.alg_name(alg)) sk = bytes.fromhex(test['sk']) mu = bytes.fromhex(test['mu']) # Must specify externalMu AND Deterministic opts = crsyspqc.Dsa.SigOpts.EXTERNAL_MU | crsyspqc.Dsa.SigOpts.DETERMINISTIC # noinspection PyTypeChecker sig = crsyspqc.Dsa.sign(alg, mu, sk, opts=opts) print("sig=" + headtail(sig.hex(), 96)) assert (bytes.fromhex(test['signature']) == sig) pk = crsyspqc.Dsa.publickey_from_private(alg, sk) isok = crsyspqc.Dsa.verify(alg, sig, mu, pk, opts=crsyspqc.Dsa.SigOpts.EXTERNAL_MU) print(f"verify(externalMu) returns {isok}") assert (isok) #################################### # KEM #################################### def do_Kem_keygen_random(alg): print("ALG:", crsyspqc.Kem.alg_name(alg)) # Generate a key pair using fresh randomness ek, dk = crsyspqc.Kem.keygen(alg) print("ek=" + headtail(ek.hex(), 96)) print("dk=" + headtail(dk.hex(), 96)) # Encapsulate - Use fresh randomness each time ss, ct = crsyspqc.Kem.encaps(alg, ek) print("ct=" + headtail(ct.hex(), 96)) print("ss =", ss.hex()) # Decapsulate ssd = crsyspqc.Kem.decaps(alg, ct, dk) print("ss'=", ssd.hex()) assert(ss.hex() == ssd.hex()) def test_Kem_keygen_random_encap_decap(): """Generate a random KEM keypair (ek,dk), encapsulate with ek to generate (ct, ss), then decapsulate ct using dk to get ss'""" print('\n'+test_Kem_keygen_random_encap_decap.__doc__.strip()) do_Kem_keygen_random(crsyspqc.Kem.Alg.ML_KEM_512) do_Kem_keygen_random(crsyspqc.Kem.Alg.ML_KEM_768) do_Kem_keygen_random(crsyspqc.Kem.Alg.ML_KEM_1024) def do_kem_keygen_known(alg, tcid, seed, ekok, dkok): """Generate a keypair (ek, dk) using a known seed, check against knwon result (ekok, dkok), then encapsulate and decapsulate to check the keys work to generate the same ss.""" print(f"tdId: {tcid} ALG: {crsyspqc.Kem.alg_name(alg)}") # Generate a key pair using 64-byte test seed d||z ek, dk = crsyspqc.Kem.keygen(alg, seed) print("ek=" + headtail(ek.hex(), 96)) print("dk=" + headtail(dk.hex(), 96)) # Check we got expected results assert bytes.fromhex(ekok) == ek assert bytes.fromhex(dkok) == dk # Encapsulate - use fresh randomness each time to generate (ct, ss) from ek ss, ct = crsyspqc.Kem.encaps(alg, ek) print("ct=" + headtail(ct.hex(), 96)) print("ss =", ss.hex()) # Decapsulate - use ct and dk to derive ss' ssd = crsyspqc.Kem.decaps(alg, ct, dk) print("ss'=", ssd.hex()) assert(ss.hex() == ssd.hex()) def test_Kem_keygen_known(): """Use known NIST ACVP test vectors to generate KEM keys (ek, dk).""" print("\n" + test_Kem_keygen_known.__doc__) # ML-KEM-keyGen-FIPS203-1_1_0_39.json # NB seed = d||z but be careful because d and z are in opposite order in ACVP json file do_kem_keygen_known(crsyspqc.Kem.Alg.ML_KEM_512, "tcId: 1", seed="CDF4E658BDD4636F09F70BD76CE6D1AF028562586EF237C7481033EE03C31FF238CD80FE6CD34678DE86E55E145BAF191B675C19C485C54EF3522C044D42F6EE", ekok="B1B5987867073BA270695AB4FC076975CC5C1BE18F8DCC36660ACE35A72D678639483C86B780A483FB3C77C8998F7047CC027CE6522998D796E8F288EA893D3E34ACB1CB4375657819012BAADB7B8A878F8FD4C7B6B42641F5B1C286ACBB41783B2CBE62A167F92A274A4763A2C293360179421CCC933B96A8C693FE47730DB1450FE04DC98B8C4E05B6A10B5CF07B44A620C3576932BA420BC536C149D1BA3CB40DF2497A7E9CC8E385A291C411717368180AA4AA00026C08B1A051A0B0C6BA96572AF9511FF020A32F47CB2EA4A9428345AC347CE1968A1159847F2B2D46355C63FB5043765F37E967A97B2113E52A66C3C8D1F3127814553516BFA2BCB26B537F1FD23CFAEAC28D842CF334534FE24782D7841BC3C0E2A9721D7084FAA32F03B00F018028A9F650136C79E6A39DCEF08D23B1B936A2A2B5790022EB8184052A2D39898761289F13BC587898F4538ACA0B19C471BB7DCA949A478FE7D36A71A8BAB72976EABA62BAFAB2BF772EE48CC12B63C06BE90929E562925562803903A4C1CAE1984A82D95A3A507608C337A3F7B89FC09883DA24B8E3ABB3789D1CA938C0E747FA1A38153B96D1122DC6B69258F474324A3A7024713B9CC896118F09087B52BC079277B0B9004B45330707AC5E1E8C34CBC40971D8ACC49C93A5903A9394CA873A7E7AF09CE2192BEC9A6070D28118715B5EC592481BBDDB67C14ACB88823B7161E85798A36AD7B68AE5584FA02C66EE7A6A35A97D496C8E9927421B110E00468729D5924D016A68800CCCA3AEDE4CCC6471C07C2A0B8B5168B4647CB240AC8745C22B0AADE8B4883A7A43F53ABE21B384BA94741A787634E72B599C25D3904627C69B91013A4AE749117B0F41AA86B389BF46707D07812B7424B3E5F1BA000C9D1386091C29337AD697E3089D2D5146FD1BBF66ECCAE1430EEC8A1308CB99210C19A71B3A0DF42559C4A7EC7BA901C3BB6168B5CCE02989E54DC193229759B9FE3B5E31013117DCB67EE53201E18F52931239B7A2FD477970CBA3D0621CD555C498600759746453C94FBC539608F4B47631B3A6C4AB32849F8716A557B93A417DB8FBC47945B60765D6D59FCED9312E8435B43711118891E6EEB2C1", dkok="6441B2F8804D0D9B08827A6E8AA3B25032BA71E341297BBAA3F33835149825D2810182C9A24B0892355F68CC3719B2085CD2B205910F450A0D4F4CB49AC0A826B88BBDBAC1429C6AF3E25E67338D3525658E5433A7CBA2CAC6CC07933A3BB1BBD7A10E87B481EA54A43EC926B82044FAC0895C1B3535669C77139729763CBE466BCCFCA940AC3734070B88B7C3D944B3D465188644819A9A8A413C9D8911668C4B567EAC80531CADC8717549C483BB39866EB68EB8E2AE53836D893864B7CCBE519893C8F7CAC00B2AE30C059E54A09799273DF44F2C8CBD426C618BDB676CC26073D46D9E652EE6A667A5F0CD60E54E9D22CFC2A2CA23D39040A38873646293CCAF2BB9110DD217B0EB065E7737A4B85CA6A73C215C0D2B899B01B30E461009E28CA280AB6805FC2A91C6CB665194D7430640F65A87714BB8632718B94EA649A95BB80DAD67134BB8628A6790C5E9013939306D8649AA65B67260BD6D28BE682562352935A95839AD672059D9C30794C513A5726EDB962E385A71A76A9454BBDB9C2E45315C3D07298C19015D68347D7067582B3B8F8CB59AE582AE4B2C74AC6AD894330F93B18571976E01AD9DE592CAFAC2805712AEB60351989946C13F831327AA120C8A368BBFBA7A8999B3B9E762E700227E0B4D0E7C00603768FA237068D95B5B0045BC1206381B5E9175460F31855FB4BF2C2376C0E515A6224D3BF94A099A89FC215F9C39958C440FF8EB71A4476C9C4C4357045547182A537181ED48B07C275170C853C08C71CD5C2E526700688C394E166062EC35A5B062A31306BB5C30224BCA7E1664DCD3C1061141CFE83714449FEFCA2A792B734AC247CA3479C0A469F763AABAA6331D413201699B2AE22A79F076C6F2C1BEE8AFF3D3960CC37A242391484C8FF872C65D576E05CA0E7F614A3DD43D8E23658699960773178BE97F2E96BE4DA5530C3A7DEC06346A092860458681024969A16A3CF128D4439DF9780F38F16F89848299416A0C5460600A517D615DCDA4204D36C167BB083272C69977A175F3B434DB79724A6C51279428CA6BB8476CCC2C23033C768B1628B1B5987867073BA270695AB4FC076975CC5C1BE18F8DCC36660ACE35A72D678639483C86B780A483FB3C77C8998F7047CC027CE6522998D796E8F288EA893D3E34ACB1CB4375657819012BAADB7B8A878F8FD4C7B6B42641F5B1C286ACBB41783B2CBE62A167F92A274A4763A2C293360179421CCC933B96A8C693FE47730DB1450FE04DC98B8C4E05B6A10B5CF07B44A620C3576932BA420BC536C149D1BA3CB40DF2497A7E9CC8E385A291C411717368180AA4AA00026C08B1A051A0B0C6BA96572AF9511FF020A32F47CB2EA4A9428345AC347CE1968A1159847F2B2D46355C63FB5043765F37E967A97B2113E52A66C3C8D1F3127814553516BFA2BCB26B537F1FD23CFAEAC28D842CF334534FE24782D7841BC3C0E2A9721D7084FAA32F03B00F018028A9F650136C79E6A39DCEF08D23B1B936A2A2B5790022EB8184052A2D39898761289F13BC587898F4538ACA0B19C471BB7DCA949A478FE7D36A71A8BAB72976EABA62BAFAB2BF772EE48CC12B63C06BE90929E562925562803903A4C1CAE1984A82D95A3A507608C337A3F7B89FC09883DA24B8E3ABB3789D1CA938C0E747FA1A38153B96D1122DC6B69258F474324A3A7024713B9CC896118F09087B52BC079277B0B9004B45330707AC5E1E8C34CBC40971D8ACC49C93A5903A9394CA873A7E7AF09CE2192BEC9A6070D28118715B5EC592481BBDDB67C14ACB88823B7161E85798A36AD7B68AE5584FA02C66EE7A6A35A97D496C8E9927421B110E00468729D5924D016A68800CCCA3AEDE4CCC6471C07C2A0B8B5168B4647CB240AC8745C22B0AADE8B4883A7A43F53ABE21B384BA94741A787634E72B599C25D3904627C69B91013A4AE749117B0F41AA86B389BF46707D07812B7424B3E5F1BA000C9D1386091C29337AD697E3089D2D5146FD1BBF66ECCAE1430EEC8A1308CB99210C19A71B3A0DF42559C4A7EC7BA901C3BB6168B5CCE02989E54DC193229759B9FE3B5E31013117DCB67EE53201E18F52931239B7A2FD477970CBA3D0621CD555C498600759746453C94FBC539608F4B47631B3A6C4AB32849F8716A557B93A417DB8FBC47945B60765D6D59FCED9312E8435B43711118891E6EEB2C173EAB9578A8556AA31C7CDC35F49987E3F6E1843CA41137BF1D50DC20557F4DF38CD80FE6CD34678DE86E55E145BAF191B675C19C485C54EF3522C044D42F6EE" ) do_kem_keygen_known(crsyspqc.Kem.Alg.ML_KEM_768, "tcId: 26", seed="706D0283EC389266E596018FEB19E8DACCC5E72E47E2ACC8E5240A81298E5DD1C15B8C9B80FA3920FC873937A3CD2CF4F5418327986AB8FC09827E25588FED1E", ekok="133878D73B12EDF2579F324BF9C073D58CAD37A4CE2B6B5FB2146A94ABA5B4300704B71D36714D362102F6933D29CC20810B7A3C9964286A6251A2407C19B745B63FBE38BC75936B0E7B82A4837414320C48E9652C643B2CE951E1F6B52D850F44A58D555509996982DE0B652B08A0B267540E79C75DC1169C31ACF977492DF4738F7002E5B78260086181997F0515B34FD8AC36B19D3FD95BF923CA787459A75C5F75D55C12F3687A1294F2927ABBCB9CE118742EF37C45FC3EA05441D1C985F3D2AB43FA8C564C409A948846974847D301E10B16C041AD5D61C2E38A26E0771A2FD38733D97CD509A7F70231D103C11E6259F974B3EE2674E325CDC4CB06EE420DD67617CA5B9233B990FDF6BCF919CF3EB20676E41B8CF400AF5431A2706E32F5027D4B0C3BF8CD5BD662C742C79D061185BBAF4EDA29E1F9807F55A95643BD7BD453143C7FC87552E2487447E1AE520A03A15C43E4FB7CFF5712172BB446F591A6775B3886BB11B90DB2F8AB5AB3BBA40AA2FBA00A22CB4B71660D15522818A1C660A73AD0706412258601E65F71E462E305B9BED6C16CC70DC8F4B2415090C40722005B7747D978DB110B8B918F34C837DF35916F74AC38606734B2CBAE6B1F7CC146319513658539E1175932894CB2C5931EB8620809B70A59C5E7603CBCC207E0DB4C51F096B02756ED578A39CB4719A6245200D0653140994885974C7D9E26CFF6C354C5FC2792D4007DBB8747A201C954487AF66A3F2011D8D189A673045DF73DE1D108A202696E952DE0F26B4E4514C9B4A061CA23E13CBACDF598C8C56B2501659A15BFBEE8404783369961B6D5D74A33E93136EA4B3ED8B92ECB4662A6B192D288E407618CB1002F079F46C3618587303C57660401227E27C49AC67D79F83F42706DA5934466967C6CD0510BB7439FFA92113C9A6297C98DD003012BBD0808670BEB7AFFE8AFF2AB4185E5B5ABC349229A37CB590ADC096D029489D1AAB76C71820E3CCD6C740FD49A292B5C4A9CD40E1D39C47D839EA360427CD628DD5A511D446756AB18FFA66B52F97BDED9555142805971A4D48C1518109357400B2CD86F0E3469CE8855E4B364FC784174E56AF673C1FDCA7DA4DAB4CB41B2C6C6522E876744264DBB684E66A89BAF1362F9A72EB6A03CE399586BEAAD0DE290FC359D519B0E26D294A380ABD8D629F9C8C17786B073745B3871B4472C1C7C2C0063455DB49485D79ABE93F70FB6710F6339220EC41996A218CFFB9C1FC48B5836B8931053092804B6567E5CCB1F5E893382A46DB9865A6A883CFC31B3E4C451B5A10835051C4B9AA220D49150F1BACE19AB8DAA2B4E3C92074AC99D25ACB2A3AB72310D690840FADC923C2B0BC8C98F51271A1A3330B1D456EDC57713E38CF15C88D4050ED3F2101B222A1C114C10BB7947D10741919E114635C5C310134B5A734128C685A7BA702BB075BA389C658A529E5C097E7EDC1573C34E377B564CA67597F379302029DB915296CC219AF21A77E36BCA854FE2875260D1090A6067DE4BC52FE08531E7449461845267116CC3456AFC4D3C663AFA2A77F2F0C3E50B009EE93C27730BAA96443A81515D75B0087B4E41E1A733B32C0F9448E060CCA876F711B47601F9D142F158FD10342B1D53D44CD40A7D5DBC44391AFC06D6C8", dkok="B4B3AF00AAB3252519367A7FC26C7D159006F5570863E72C408761088065D86352478ACC1CC067C844982867C9B3176549170E978C0A6961BDECF8C440382184F10693001330D026FD1774446778C0B89471E7C0E2D761529B0C6B04224676C991E575FA47A12EAB2B5BE31BB45AA5EAE29D826219A6C7BCC22A5E79BC3F2E9125CEE4423AA34F40A27B554C829EDC3014873479934A2A7730F05ABFE499ABB36B9EF5CAC9FAF38C09812ED4631DF6EB723F74569354482F8ABAB2C6C179491C3A2698A0322B84C400CA35C8C8105D36B67708A39853D67CB52408150044B18BB9A7B132D8910ABE17765F3714B1F63DC8289747133DCC7328EB1B8E2AA28975B0CD5F301B17C733B327A1C14AB822147DFA39B024653434C8151C94364DB99CE1D75B40F9751EACA806D62029BCA5FAC9685D423C8A74CE10A0CD1BF61AB27C0B408B97D7E172573C50B4129061278D12543B3B3712DA5A051DE3261EB038C2C7AB986AB0ECD38B2B51538A041CD9843FB083736B1487C4044261087383D49034E8397F33C8CFA2C249618BB3B2A963383ADE2B09F29419197218A1B35B1841504D321863456CF1F0900755C19A47AFF0DA9D4534BCBEBC385B99C9C48A403E49B57A06A68047C8F4541CA590A702D34A35F96CCC7BA1F2464D2683873D0900C35595B604AC3E97901B40774B2A67A9B58300B70C32293CCAF73DC34CA5EE177A9E6032CF07539B66256AA81DF01C39E5142071C656A203564841337FE77618EB8A3A86AD23D45B91B62A77E923DF23556E5A68EC1C7D64F34A783B6B7A151D3C1216C3DAB3D4C67638CB7EEDF84452A100364431B1825A150B1F7BD98207899AEDF40DD44686F417378FD6A3DCC5905DD159EA2CB6E3F82060729582FC0BF2D970545A9A62777130498DC3231375816B421C5BB20B63CAA618E21549C64611C4C84EB85B2A5F1AADB2B1CD288C95DF998F58B1B1F5F8B43D23861D32BC9839A7744466CE29359119008BF34806510AB530BE06E014671943E1F2CB30792F802850092402A7187AAA226DAEA333BE8128912A4D8ACAC7DC829D3693585AE86BE9E98085C7C376B1B381483E7BC629D948560C97770F3738E38A10C16401C828B4A1E27BC9555B4797BC8DB9B8A81AB55D826BC69CC863928EC17488DF8B2AEC09B198F7880B0C0800062EC2E16F7A93B15BD657909896809459FEB16582B73A73E8C766662CBC368E76C08DA83A2338C72175DB23C8E61C48643E236359A90BAE24030DAB12383FAB13EED4B33793CA1F312D2A695F4B31950B84B55504CAF37643A933760DC5ADD7145CAB6C1BD7B33CB51736743535628528EBB226242BB35579726302927575C065D225539908E388C889F42E92931512BC216004CAE7205C7F348274CA6A81278B04EA33962C3AA2F6B33E450FA0AA29A3F33A91E0A5371C3F78080BAEFC6B4377359570610E2917CBB6769AD3B313D0C76C534E6121B60C313A08E1B89864584ED06305294B0BCA37717B4F1B78BD1A7B13AE509E43C56E43E20B8ADAC45CF25F901C545087847380BBE0B0880F2AC17B6621EC181E16E2668DB223F19017B3C7670E024AD1B5A9E6F2AD530A53AF140665EC31D0831F133878D73B12EDF2579F324BF9C073D58CAD37A4CE2B6B5FB2146A94ABA5B4300704B71D36714D362102F6933D29CC20810B7A3C9964286A6251A2407C19B745B63FBE38BC75936B0E7B82A4837414320C48E9652C643B2CE951E1F6B52D850F44A58D555509996982DE0B652B08A0B267540E79C75DC1169C31ACF977492DF4738F7002E5B78260086181997F0515B34FD8AC36B19D3FD95BF923CA787459A75C5F75D55C12F3687A1294F2927ABBCB9CE118742EF37C45FC3EA05441D1C985F3D2AB43FA8C564C409A948846974847D301E10B16C041AD5D61C2E38A26E0771A2FD38733D97CD509A7F70231D103C11E6259F974B3EE2674E325CDC4CB06EE420DD67617CA5B9233B990FDF6BCF919CF3EB20676E41B8CF400AF5431A2706E32F5027D4B0C3BF8CD5BD662C742C79D061185BBAF4EDA29E1F9807F55A95643BD7BD453143C7FC87552E2487447E1AE520A03A15C43E4FB7CFF5712172BB446F591A6775B3886BB11B90DB2F8AB5AB3BBA40AA2FBA00A22CB4B71660D15522818A1C660A73AD0706412258601E65F71E462E305B9BED6C16CC70DC8F4B2415090C40722005B7747D978DB110B8B918F34C837DF35916F74AC38606734B2CBAE6B1F7CC146319513658539E1175932894CB2C5931EB8620809B70A59C5E7603CBCC207E0DB4C51F096B02756ED578A39CB4719A6245200D0653140994885974C7D9E26CFF6C354C5FC2792D4007DBB8747A201C954487AF66A3F2011D8D189A673045DF73DE1D108A202696E952DE0F26B4E4514C9B4A061CA23E13CBACDF598C8C56B2501659A15BFBEE8404783369961B6D5D74A33E93136EA4B3ED8B92ECB4662A6B192D288E407618CB1002F079F46C3618587303C57660401227E27C49AC67D79F83F42706DA5934466967C6CD0510BB7439FFA92113C9A6297C98DD003012BBD0808670BEB7AFFE8AFF2AB4185E5B5ABC349229A37CB590ADC096D029489D1AAB76C71820E3CCD6C740FD49A292B5C4A9CD40E1D39C47D839EA360427CD628DD5A511D446756AB18FFA66B52F97BDED9555142805971A4D48C1518109357400B2CD86F0E3469CE8855E4B364FC784174E56AF673C1FDCA7DA4DAB4CB41B2C6C6522E876744264DBB684E66A89BAF1362F9A72EB6A03CE399586BEAAD0DE290FC359D519B0E26D294A380ABD8D629F9C8C17786B073745B3871B4472C1C7C2C0063455DB49485D79ABE93F70FB6710F6339220EC41996A218CFFB9C1FC48B5836B8931053092804B6567E5CCB1F5E893382A46DB9865A6A883CFC31B3E4C451B5A10835051C4B9AA220D49150F1BACE19AB8DAA2B4E3C92074AC99D25ACB2A3AB72310D690840FADC923C2B0BC8C98F51271A1A3330B1D456EDC57713E38CF15C88D4050ED3F2101B222A1C114C10BB7947D10741919E114635C5C310134B5A734128C685A7BA702BB075BA389C658A529E5C097E7EDC1573C34E377B564CA67597F379302029DB915296CC219AF21A77E36BCA854FE2875260D1090A6067DE4BC52FE08531E7449461845267116CC3456AFC4D3C663AFA2A77F2F0C3E50B009EE93C27730BAA96443A81515D75B0087B4E41E1A733B32C0F9448E060CCA876F711B47601F9D142F158FD10342B1D53D44CD40A7D5DBC44391AFC06D6C82F90273A68B93E4DB09A7DD17CEC9E162D7E11D4DC5F6D351A5F912C87F2C2D7C15B8C9B80FA3920FC873937A3CD2CF4F5418327986AB8FC09827E25588FED1E" ) do_kem_keygen_known(crsyspqc.Kem.Alg.ML_KEM_1024, "tcId: 51", seed="845CF2BDD27DD31B55E5E82E4C817D30C1D7B26A2CAEC2495A4F53806649726293C761C35003FC105008E8B63573F21B3EFCAD48976E6FE52042C0CF8E24243D", ekok="E1404C335AC680B3B63FE7B05FC09F65B877E9633DDA59119ED4309480B3C8C6CFE7CB2385F680853A1B0C038725E7CE95618481B7CD0BA75FD6C097442A2F7800A27FBC809BC7A3C257ADBA305E5CC5856AB548F2F671460A3866E2506F776A1C1C39ECD01AD8B0BEE7531E32FC986D3591A94A78380A52CB335DEAE18E5B1CB5C9815766578D54A2C0BAE5BB11474D146C892016075B76B6B7CA391BA91A2BF5518A193758852E0CA790058998EB710844439739236BE62C1DFD7C868FAC343CCC19A1A2389AC718122C781EC491695498FC70220EF04110F46DD6B2C63AE273D070563AD6C42470751ECA539C28022475B52BD1C71327338F634BB4AA29772CA12E52A7F9B772AA57011DB3A0CE4BA309E7499936655F6A22E5C444404537A4201F55E07F2C3C8B476A1181620EF71328DC8C4BCF3210F75952CD08086D200C9BA79E02BC9E8408220868A875C9123025BE1850AE0A77509FA247684C9151712EDB0955684B712CBB40865C1F4034740C2C3EAC810A15205CCCE33004A82D97294AC64A8C73638023EC8BC484CD761BBB9C5456BA5A04398956452CCFE32396B4B748C3122706F303D9DCC9076A01A704CCC456AF73B21EF01B3216E98AFEAB86B698B94DB3C064DC9329750411D943E95BCDAD88C8FE21C5FB2609F6198FA068430D27C13D3739C4490D9B81728A6C6D07204EAC6135DC940C9190554E4C602A4891FB0275335B4BB6470068738082E3230B552513C65BB6592419FA185D4144EAF61BEA3595BFA44D76FC06A7FB52029A8F29C92D81311DB6C99665FC577EC516968ACE7597240181718C8315857B06064A81D43B52FDE092474C41AC406894A2C98A67BB698CCBD3CC23549A6838A8B2964B0326831527E405270508119C0217BCCFC2EABAF01764A5D3B160C60FF6FC8F8C65A454A589BD4B32BC78CC5DD89797DB34934553B369C5CB928EC1F96B8215495007CF9281329C8965E5B680F4AA5ADCD5A25A90CE25A8649CC708677BC1474B8493300C0C308A8298532F82173445AE21D09A9CB807D70ACE96DC4C9998C639EB628B704C0C2C5732782B546C632834BEE371830578567242A5D5C8A7D6A320A922714D224C4639578183A9B8F2C1B8181EFE0986DE8468DE63AC8349BDBA6C5A1C3C2406872B73BABAD04A4DB94183020B4840C84D37A584C72887756653884A5B7D413D00B70C56626F33317908558724C9BC993C53F922C2F34825B5617255785223AB62C076CED9F1C3E3712617207A01F1B7F96983EA0A481239A7B010A0D9E005F09CB88BD78EA4A51059363826B40C65A1754F4056E96C4C3FB5317FBB7937D4C89A32B3965A1BC4A6B0FF6690BCE61EA46B128715C928D197A3F9101305026E961D59290EDB34122D219A3B9495BBD18467D71811D1BF44B560A6B96470C1380701AB458341DC5A3F65D3200FCC6152FA07BA1859B1BB301A373BFA11398890CE269687FDB078E2115A4D4ACA0B96C0353AA42F73A5802A87F27A4BC053657867444DA6BB43FCB6FB80A320F40E9F2829DFB1338AD002BAD7790D51A32E80BD948AB03B6B6110685D7320CF23231BE9A9455BCC8706C95938176B1015198F950D96561B34B8816C21A41B9B0319C69576714228F8840F64BC7A07CA78E5960D3B47DD1CAD92ECCF5E489F01839D9F4C38C871CD685A3F79F77A26D6A5DE7063A1A07B28621031B818BFD96DD063BDA61769F3295998A8084658231D3A6540753639472A23261944E830FA5A29B2372CDA9BA7D83765AA6C996DC95F99137785337F4D669A85A2A837DC5FEB4320F459633FA89B14A8672310384944B22B3235F9D173C823608C350978D239A9432599A46938406CC2E1A3F82A2E06663BB0BB69051ABB10C05B0288742B200E2A8B930372731D60997F337E995C28782563C5B4946E7C68015666FA1A284F8287FE62A83B46BB83F8323FB2282DE650BBE40D71E388C916BF33C13FE425AEB1601CD15817A23CADA84B52A0F78DEAFA3F50D90EDD1B842ECB7B28548CC1FAC984B603CB54694AEA02A524015FC36AAF15BCD494BBC4F3064F4374307BC26B20B8A7E78D4844C898E0791B6070D83885179C5BC2C0AB4EC39E0B86C87B972B677B5208E285026967C84A7E5139A32C4B029916951A13C7C824196154270657844A8C0CF3E5648DF721C5673EAC8F4941E55A3E473D486EDE50FE", dkok="0DE5643D690BF5209600D66A1525556B5711C58674A4BA7F72DC2E15D30720F283EAE2AC7BD97EE60655595CBF90F4512D1BB625E93DBF2A8F0C94BBB91A6750554F4F296DD0220A43A0BE1868BDE05015DBD5156C708048F920C6455F8FA387937B4E2279671D959ACC770F16426777B9B82D53912F972AAC2C1DA95C32761610280A8EF9ABA0E1268DC8E96B181B39D9134EEE477953D8AFBD3756B1D91503E72A1DF0088BEBC072D2AE9444C781E89A1992441DCBB39B1A6A87782B5788416CF0798C510C6ED6BCD62973A3C63B19FC2AC46238A553398DB89A3CD494F084944893B4AD13468E839137DA3EB2599CEEF32BE9296DF0228D897364C5F90619A4850552820F2353061BC23E3917BA8A1064567F5FAABD58567D3652BCA0504B8D104CB4373A6284097D0AB4D0703712DA5EC6EC6758735CD4E6BB10B0A2ED9C5EABA9ADF59541B89B71B6B97592A9C9E8A57B56F4993A84A417A387A80A63CAA41C86F45CC5CB19A139B9DB1926212B619E862C1EA0883FC41E93F7107F53296BF1224B14B7DD3CB6E7C5B52CCB063988162A693DA7345B903667BE8636707B35A3CB4E5227A303A33B5A0431CC562B1389014D6186D78C048E675A0DA626C5951DD0A12589BC1EE2A75438A2CBF24C42A4B3878591710019A7BC3BCC84741AE9AC5CC061829CC8A130B4986E30B070C9AF43F5C7F5B073AD8B00AB8C135AE2B522A47132898F07C9A1B2B21E8BF63115FA8ED083AB01BC801F53A6C3C5574595550CACCE6D76CFB7B34D7A780A576347E275B416D5C2581C182DAB5E912538F3471A4B4B835A958BAF003317E060A7D1769CC36FF2A522F2832C57BB66E3687EE158045D2CA7B7866C193AA27EE1C89DB9257FCA25EB66784E004C048874C4F67E4860CCAD9CC067A0514F1943242CA1BCC45FC250C471038E6A503EF86A74D300BD552AA556CCBC13383370775F5E9A1BDFDABFD4025FF7C6A83ED27A9340B15B84C315F76BB7CCA8F900202E8CBB88967C6B969E9CB4B7C4CA6452AA3E7F9A34D1AC36C93CC634BB41A2D01EB54299A308257273767BB43157F31001DC848C40CA1318B510F32B04A8BA577843712880FFBA8AE45A8294B1925EEB51D93B86BF04B076A4A396607A8B0560CA6837A684658400C5B20A96B910BDF542A9C3475A884B0556978274228337C88D9DE2C4A0F8662CEC1FFC1B34A4C4B1A106C7C71C99D15563C827C07A538F1B9012D9AB7BADE442457B7E6B4A280394CB5D232A0AC007C1B1CE2E20B3832BC207E419728304BE75CF40B5090D893F3D845062F609EA12A28DE4C64F1A1F21E510E2DB8595AC3C3E45039D940E48302FEBA7523B093487769B3DF37F8583A73B73AFDC8447F9C49AEB3B83C5D4B0E039A6612A2318647C368C05748A719BB990398B277AD76A1300198D554CC3735852CA577379944B6BCE0DC43D042CBFF993C1F857593909326A4C843F8631FC27424A579F5BA0BA8093930B466509FC024B7B530D020E99301E330887374A9A77397E2574BAD3CC0B6550AAC4AB74A2DC6067AB995C57B11FD42EA62105B4C856CD8942449A9BEE89339172710A2C3EC5F69B3EE61286144DB50B2F90191CB2101258562D6A0355916393907B15D6B10EAFA85975F59E12E3A14E3C7350314C15EBCB6CF44DE3321E84B8AB510CAAF2477A0CE71CF1545A7415A303649E9312779CE31AA830A30071CCBEFB4669657B1D2A69C95B13D5B5431FBC1312626665332FDB0C81E0A4228E00005AC3AF0B1172D67488234374C074A22338C276D773246A2A04584705A0316C8A18AF2A60C70B421F146B035C346B40A5C724B5633B57C4339B10D810F9C4AAA1746B96DBA1417C29D6F9376BAA7C05C316CBA8CA498014D7902E6D878BA2AB9B85CC19342251DDB785A7521D768A4EF8E10AF7A9200AC3904C699739F798F4BBC14FA05683043B8C173780D8AB98D28B00C363059B12036334F6848042C73043B03DEEC86997D758F218A5CBA9CBB2639C8AAAC097961AEF630DF5D11885A7010443A4EC8C406AACA026D3B6F7EA99D3247BADC459684980068917C2C7A12F0C2F34184BD9FA89402241AE24B54E4B47BCE905B5C60869AA6286E2B2C4136584E9553951AA71546D52F7AF50560737B67300EB82B2480E3BD620E1404C335AC680B3B63FE7B05FC09F65B877E9633DDA59119ED4309480B3C8C6CFE7CB2385F680853A1B0C038725E7CE95618481B7CD0BA75FD6C097442A2F7800A27FBC809BC7A3C257ADBA305E5CC5856AB548F2F671460A3866E2506F776A1C1C39ECD01AD8B0BEE7531E32FC986D3591A94A78380A52CB335DEAE18E5B1CB5C9815766578D54A2C0BAE5BB11474D146C892016075B76B6B7CA391BA91A2BF5518A193758852E0CA790058998EB710844439739236BE62C1DFD7C868FAC343CCC19A1A2389AC718122C781EC491695498FC70220EF04110F46DD6B2C63AE273D070563AD6C42470751ECA539C28022475B52BD1C71327338F634BB4AA29772CA12E52A7F9B772AA57011DB3A0CE4BA309E7499936655F6A22E5C444404537A4201F55E07F2C3C8B476A1181620EF71328DC8C4BCF3210F75952CD08086D200C9BA79E02BC9E8408220868A875C9123025BE1850AE0A77509FA247684C9151712EDB0955684B712CBB40865C1F4034740C2C3EAC810A15205CCCE33004A82D97294AC64A8C73638023EC8BC484CD761BBB9C5456BA5A04398956452CCFE32396B4B748C3122706F303D9DCC9076A01A704CCC456AF73B21EF01B3216E98AFEAB86B698B94DB3C064DC9329750411D943E95BCDAD88C8FE21C5FB2609F6198FA068430D27C13D3739C4490D9B81728A6C6D07204EAC6135DC940C9190554E4C602A4891FB0275335B4BB6470068738082E3230B552513C65BB6592419FA185D4144EAF61BEA3595BFA44D76FC06A7FB52029A8F29C92D81311DB6C99665FC577EC516968ACE7597240181718C8315857B06064A81D43B52FDE092474C41AC406894A2C98A67BB698CCBD3CC23549A6838A8B2964B0326831527E405270508119C0217BCCFC2EABAF01764A5D3B160C60FF6FC8F8C65A454A589BD4B32BC78CC5DD89797DB34934553B369C5CB928EC1F96B8215495007CF9281329C8965E5B680F4AA5ADCD5A25A90CE25A8649CC708677BC1474B8493300C0C308A8298532F82173445AE21D09A9CB807D70ACE96DC4C9998C639EB628B704C0C2C5732782B546C632834BEE371830578567242A5D5C8A7D6A320A922714D224C4639578183A9B8F2C1B8181EFE0986DE8468DE63AC8349BDBA6C5A1C3C2406872B73BABAD04A4DB94183020B4840C84D37A584C72887756653884A5B7D413D00B70C56626F33317908558724C9BC993C53F922C2F34825B5617255785223AB62C076CED9F1C3E3712617207A01F1B7F96983EA0A481239A7B010A0D9E005F09CB88BD78EA4A51059363826B40C65A1754F4056E96C4C3FB5317FBB7937D4C89A32B3965A1BC4A6B0FF6690BCE61EA46B128715C928D197A3F9101305026E961D59290EDB34122D219A3B9495BBD18467D71811D1BF44B560A6B96470C1380701AB458341DC5A3F65D3200FCC6152FA07BA1859B1BB301A373BFA11398890CE269687FDB078E2115A4D4ACA0B96C0353AA42F73A5802A87F27A4BC053657867444DA6BB43FCB6FB80A320F40E9F2829DFB1338AD002BAD7790D51A32E80BD948AB03B6B6110685D7320CF23231BE9A9455BCC8706C95938176B1015198F950D96561B34B8816C21A41B9B0319C69576714228F8840F64BC7A07CA78E5960D3B47DD1CAD92ECCF5E489F01839D9F4C38C871CD685A3F79F77A26D6A5DE7063A1A07B28621031B818BFD96DD063BDA61769F3295998A8084658231D3A6540753639472A23261944E830FA5A29B2372CDA9BA7D83765AA6C996DC95F99137785337F4D669A85A2A837DC5FEB4320F459633FA89B14A8672310384944B22B3235F9D173C823608C350978D239A9432599A46938406CC2E1A3F82A2E06663BB0BB69051ABB10C05B0288742B200E2A8B930372731D60997F337E995C28782563C5B4946E7C68015666FA1A284F8287FE62A83B46BB83F8323FB2282DE650BBE40D71E388C916BF33C13FE425AEB1601CD15817A23CADA84B52A0F78DEAFA3F50D90EDD1B842ECB7B28548CC1FAC984B603CB54694AEA02A524015FC36AAF15BCD494BBC4F3064F4374307BC26B20B8A7E78D4844C898E0791B6070D83885179C5BC2C0AB4EC39E0B86C87B972B677B5208E285026967C84A7E5139A32C4B029916951A13C7C824196154270657844A8C0CF3E5648DF721C5673EAC8F4941E55A3E473D486EDE50FE71C83DE8267942230802275FDC63E2905E65D88CD42D2CAFD8053952F4295CE693C761C35003FC105008E8B63573F21B3EFCAD48976E6FE52042C0CF8E24243D" ) def test_Kem_encap_decap_known(): """Test encapsulation and decapsulation for known NIST ACVP ML-KEM-encapDecap-FIPS023 test vectors""" print("\n" + test_Kem_encap_decap_known.__doc__) # ML-KEM-encapDecap-FIPS203-1_1_0_39.json test_mlkem_512_1 = { "tcId": 1, "alg": crsyspqc.Kem.Alg.ML_KEM_512, "ek": "EDDBA9CB830474EC0111408243A97335494DDDFA8D5C6A344B0C9ED1061A7D4A840891C24E140BE6D7BDEE01571A1312D4000591F2224B850105878FD3966F537AC348D042B95785B8171F18647619072780C131BDAA462D34A039014012BBB2197A4328F89CC5B750CAD9495BE607D5017DFA105D87C830432795B42C5E89D8B536C087592829ED934822768A1824696A278952627CA2EA73CDA4A306F972B8521B6A7B28DD0AC44E6A8C46BA7291D48574F8356065AFBB073DF9B84B520673F6644D3959BAD576497E0BC846F560CE697C35493A995597F66315639A7B20B84105EAA48F3B4593A0BF12D64AD4CB043B6435D44A2F5E136F21621B88704DF8855C4F1689761A239DFA6874455D48251EB087865AC3825C275A1018B112F01E82D8698F684C8EE127D9D25FB92B180677A36930793DAB0306AAC8BC80A79885B0737C6B319600BB859966AB9F082490E31B669008CD055921CB2360667180611485E5D70E774401739B16F54601D4A600608119E4B3112AAC92D1C094E40318D4259044D16D3AD62B35170B54D16F0F850C593B2062CC3A769B4D28B6A776F981D4BC835612349292B748E30098D29C668A80F68718BF40B7E785CE41C094A7326F3E6992D99B80E64350C5395823B1315160582EC10B01A4337C52C355E98B857B2DF0006A0E8AB49F5BA23B8C7E329C20F91386852A8948751C0F301465D713E7857A7BD8B6076C059BE378F74BB257750F544A31874B79ABEA78F8647E77001506919AA467019E924B7BE53705A5C9411A8B513C8C51300849136E77919CF83CBA9EA1CD6004AA7178C8E7D062E5E13544E060B34984F61C2EB6B56580C45F67DA8982A97BD5BBA9D98462161A55357079C15A2A33992D4B66093DB03676D0C385DCC6DD3C18EC8138738AA0FD6058C9F721C5E3131D7828C9675048949D0CE32E92A3363EC0527F54C89B5140590822D9C96CB1BAA43A8CACCC085EA6FB602B871128AB2C8A2A1644623A1D7175CF4A23F4B497B7BB4D0B652EA4272D7A99A9A5F4C54EAA6482D0BFB4E46EE482B892895C78DCBAE4414543E0BF8AC4C82889BC6DDC385624AC7805CCC644BB430588AA19723AEE5999EF2AE2565C3BB3", "dk": "502B723FE238EDE6A7867C66B49BAA99280584DB1318281150128D65F8A2D54381444994AD938805A3065271BCB390B9D100454A5644C5E858C1F223BF83654627AB98F433AED20E26D8597CD41D802C6323B18446487E51D3660458156DF1571E092763133B87F35BDC2CBC39422A65FB36488B523123B36E3AAF7A8C4DFFAA3719460ACEEC6F5F6957619B776925854A7A49E976592B042A7D3C49F3089F3FAC6F29185BF5DCAF77E6AB69F7ABB926A360385F5A79B7CB8CCC63BC38E0495A89A70E461CBDDBE34AA2F6CE7BF3C1533569B61A88DC1038A5B27C42D024EAF60041D0C771833D3C3213572CBC1C356CB649128A767A27150849D3684DF92159969A15261ABE78A6DCC549AA027216545F862959B45A22AEA7C01D64630CE498E788BF93C8A2FF4B3DA52387F5B171AF979001917716C2B887FBB0D7D243DBA5337BFA8DA97453236B36FFA278E36A28743A10035B34546514EFFB2CB4CC92F7C614EAE9BCE501B90CD94BB1A1A4C9FAA922BAB2DF8C9BCB8B76CE0B035C8312A990C180F23BD1018D44870021345DB3B39DD55A79229A69B1D79802735E40990CB6092FE614327BDC1FA7B158C16327AAE85456B48D8E64398EF90B24D9C8FBCB9DBC72422126644A83AE4A17069A5CBBCAFBA71473256F1568CB18CC4612A0379BA1E4330A782137282B82ECD25492475F50B30CC7A31521CCB1151CB096944C4E5C21255C1C89C130BE9070DA1696FD1C2901E975B7805C2737BBBAA2965AD10DC43727556A6608E70CD7E59B8FA3CBCD4CB2FE48912B2B72C2D592E0C1AF7702387AF167964685B1D40349F20CA6808B74F87DE67C255145A738F7B3DB8B89F6A71FCF2BB7ED11C6EB2154A37B4CF7063F8BA12433B457F4E3CC4B05370C0A76896A7EE39A863AE49945FAA497766DE3201E34AB7678663E33F85B12C9B570184E0DA3092598AC5B961D7D48C9B30624F829AB66F63B8D34478D35664FB84BECD1951375183B6A2357587F8513C6C5431C0198316AF2CA3987B9F5E219B36116108C8C8E767FE7C690AF248CE0839C13EC4A4CD800FC719BC191B59C5A17EDDBA9CB830474EC0111408243A97335494DDDFA8D5C6A344B0C9ED1061A7D4A840891C24E140BE6D7BDEE01571A1312D4000591F2224B850105878FD3966F537AC348D042B95785B8171F18647619072780C131BDAA462D34A039014012BBB2197A4328F89CC5B750CAD9495BE607D5017DFA105D87C830432795B42C5E89D8B536C087592829ED934822768A1824696A278952627CA2EA73CDA4A306F972B8521B6A7B28DD0AC44E6A8C46BA7291D48574F8356065AFBB073DF9B84B520673F6644D3959BAD576497E0BC846F560CE697C35493A995597F66315639A7B20B84105EAA48F3B4593A0BF12D64AD4CB043B6435D44A2F5E136F21621B88704DF8855C4F1689761A239DFA6874455D48251EB087865AC3825C275A1018B112F01E82D8698F684C8EE127D9D25FB92B180677A36930793DAB0306AAC8BC80A79885B0737C6B319600BB859966AB9F082490E31B669008CD055921CB2360667180611485E5D70E774401739B16F54601D4A600608119E4B3112AAC92D1C094E40318D4259044D16D3AD62B35170B54D16F0F850C593B2062CC3A769B4D28B6A776F981D4BC835612349292B748E30098D29C668A80F68718BF40B7E785CE41C094A7326F3E6992D99B80E64350C5395823B1315160582EC10B01A4337C52C355E98B857B2DF0006A0E8AB49F5BA23B8C7E329C20F91386852A8948751C0F301465D713E7857A7BD8B6076C059BE378F74BB257750F544A31874B79ABEA78F8647E77001506919AA467019E924B7BE53705A5C9411A8B513C8C51300849136E77919CF83CBA9EA1CD6004AA7178C8E7D062E5E13544E060B34984F61C2EB6B56580C45F67DA8982A97BD5BBA9D98462161A55357079C15A2A33992D4B66093DB03676D0C385DCC6DD3C18EC8138738AA0FD6058C9F721C5E3131D7828C9675048949D0CE32E92A3363EC0527F54C89B5140590822D9C96CB1BAA43A8CACCC085EA6FB602B871128AB2C8A2A1644623A1D7175CF4A23F4B497B7BB4D0B652EA4272D7A99A9A5F4C54EAA6482D0BFB4E46EE482B892895C78DCBAE4414543E0BF8AC4C82889BC6DDC385624AC7805CCC644BB430588AA19723AEE5999EF2AE2565C3BB3519E879596C07C24B516C80882627308F4244B98164FDA55AC298B3955EB4C9A35956CA9712BCA0ED46C82CF3506460EB702105E3A4DF7410C9FFEA032F26C02", "m": "381C547CE06B687A7A17C1A99D11A7A4C35B82685AF51CE452099C60136FD84A", "ct": "387F23816CA3AAE900520559080374E6BFF44117D50D78EC4CB4A5C08A955DBBDFCBDE0803301BA3E40A9C33CAAE6DFA71EED311D9ECB84B497D3259B614DA30C71803288904D0E1B9EA8FB5750878602148E6FCE794B91E2778B07D87706E620B727162290CA7CE27DDEC5110770614175CE61A837CE46DA95D6AE7FBD9D4709636807EB67CC5992A643EABA2C253050C7B63CA6CA83617BCAF453AC3E24B9C3617038AA3A2FDC52A32EE7B2EC2B67E5F442BFB8D5429F079096FA7D5B9FBD81B096A75F2C9FAAD8E97DDC003EB88F55F482775BA7BD661BFCFC27D3A7C1071C5A7B020E80F6950BF315A040F4CF025A74B42DC008F4C084690F43E8502BFB740538BF3DF05336DDD6E33A3A4679A33C8A724125A8EC897A593741CA9C934CEEC2F20C82CCF439011C5066937377183C8CC96046985B92F6D014E0223EA542A8BA0A789478EB4B4F04AA98F7E6A4D4AC8852E8670B5A4097F7584FA136A159DAF5005D9FEF08868BFBFBE15D320AEAFFB3DE18C8F39A22A876D750AAD4F85546A88B0D0B498535B590B191894F43763BD13379BBD2CDEF4C98A571103E9409B2227315AB892990984FD6C9F375164959E3035B16C650CE71AFB62F7E3BFC624FACC973B104B44F6A2BCEEE1AACF0C3D8CE9ADDCEB26E3E786C116B70A3CF2C63524F472A2F15DBAB3FF8FDE34F015DD8DCFCBB17793A552E805AD5541ADFC6890B5E3A4DDBBC1CDB9B36D12DC49CA22CBB91F5BB599EF86DC4B5820B8E3D965839DFAA9392D29A878315BEA9A6885994C0D07843A4DC2FB87D0C8507CB17C549C3E60564D263221635F831C9F1F6539F07248E5BA8571541CF69151630161C0DBA57DA3A3C6296FEB02C19E2080F57C657CA74656B88B708450DA5DED44594B12614054D643FEB674E18FD3B863DE526EFB6D2426A58AE363658E8318578029DA3388D5A3C81E53E22F2802CBFD52760AF128EDAE7D1FC3379642FD8B9A791B289D7ECFC546158FBDCFBE1643B03B6874F3BA918849D93E5C0172E684C303D8D58CC5DE703A35FDB5796B81CD415B35DAEB60FCC043827401542FE35AD72375", "ss": "9A4E2BCC0E5E40528B4C2879D8BE4BF7AA266C16762480054B475814789EABCA", } test_mlkem_768_1 = { "tcId": 26, "alg": crsyspqc.Kem.Alg.ML_KEM_768, "ek": "27A438FA8215847A2B2774332529C74A92B2D82525531877F57B99AC594F628B801FE511F6423CC751240FE10E1655A4625A6E373267799245AD0BCE1763C8D8256117174572B8BB80E50FE424993590657B4331C8252655FA3B104BB8ED866B2FF45A5D4906E78203169B08160B4808D24F21D90D9F13A4F3341C2CF24AEBD4746C3159AD5746AA0817D0181FD671A78506BF020389C149585E253A77596FA48077D8EBA08780A1FE171E005B83E679B8290897DD67AFD9373772D66829027FBCF79727597727B50EF21919A6126928F2AD1C5029C3D827F41CC207805E2E9B7AB0DC7375EA0348C5BB0F292DE41C93A2E1308E311BE8E2A14081C9B27A12F0E34F5B70B4D64CA922149317F556099B81FBFAC1317840ECA856E2F443AB918EC826CB1BA30D209263064462731AA590CC103AAB7E900A02EA133CF6BA11DD70B67BDA5FE834632635C7AD6B11B3D50694B97F5867C9EE167783B499B08985ABBAADF102CF121B50FFBC6E1678352C609F9C6ACC7F643A1F4052B67722B7051BC3336BCD052F2B6C6D1AE807CBACA59B0AB7DE3672B2B24070434E713C4289406EF61C0A087B7381C840E36720E0EA4EABB4ACDA7B373D0B8CE87408493498820221F59B41B1000F91C36C7C5CCA0A2C563182794354C2E0B6442A069B5D533B77731F13508820370FBC8C6B97A698E4CBC2E507CBE46A147078B50F28979583648D6A8726E4CC85FA528B249388E86FBE369E2A852DE5E5BF6FB9AC9B17199FA50D42876A6FF7590D3C31FC7547163C5F427BB089F24226096918829A6613581CB1C4FDA16CE5A5011FD853A9FC5261261DA0B809FE0B391042748762682A534FF88006C6D82A4DBCCC7A32048EF675D8A21E20887FFE626E8B157F72A2964A9C567FA502BC87BC64C698546196F9A806B76595508ABA0F18A685921F64A1028BE613BEF905DED4654AD74674675E2E154D07D45DDB21A97FCCC9D233B31708705DF155D086B31106CDBC358A2F4812226964BA34462E36CE6E9B8B977818AA1C3940B9BEF4D37F04F154C3C56BA0D593DFE19EC21A62750890B27C30747669AC213F0682760CD08B6D4C8CFDDA8FD0220F05804C66A4794F747F8A596E3471BDEC80261123C172F71A95D6BA1644B69FA93D3D6B9643843A3B014A4EACAB95867D3954A5BF603E96EC682CE9BB89BCC49A2618307A18FE40965B3C14F45075A0759E78CC312D81B90D37CF8443C1E8C53A88F3382BF82E7DFB9CE3D5B83C0794F3789E3699AFA36C06E27CA32A8C5350EBCF533374E743ACE5F26F46439BE0A04683F732BFF85D4D98CE3EB79B1CF843787078A6E5C5642083A165B77EB74C9896537EE938D1A1416D2A11DD30061588B1A96819D7B477E90C75713CC01D576967E42E81DB35F77288633452C40B655ACC862F594AC03CBE47570451E0B2FECA7547A50B7DA512AC464AA72BA673C17FD2313B09A216E7797D98C8070C2C07121067C92B5BA7C3C0B8B413587C6CB0F17272172872A171443B1367DC0B372140969534C5C19522ABC8BC200F07E90ED65A09180BCDD46A5EBE22319992521EF074ABB99C3DB57A65854761A36104CB317AB7B58B346FEFB85B0CCB26DE6B6FE2F8D713CEB390F798DB6C234614E4B7B0FA5C1572AE8BFCA9012A8F7955672D", "dk": "B95B0130F5470702156847B0517C6CC9B71CC88711C04BB69E0407E3790CCB3198B769616BDB71158173E4BCB8A7C537B0525075823F3468C78CC6B71C44592D2C63AD6CCC04E452B0892CFEFA96B9D05D6A0AB7D026518EC22DCE9AB80E169B9F9169E517903B82BFACC957D0C496B0FB7C4D9CC016252A1AA13863E9C5E5B6079F598A3515431D5BBC769003054771964BB1C6280CD9D67B7E28825D78092C145A89425E2AF82987764B491CAC8779AC301057C4D0AA06B31E8EF563063547AAD86B9A3238A4B8246CA68BE4F67C41B89870994AF08CBB4E665D161A9889FA0853AC5B03167003C56CBDE2BEBF151C09B68F6376254E0678FA157F4975B1893BB9E9B08F4BA3A54366ABA1C0B46BF33C7F3863D6058EB3F83D1349AE32DA087C17B8528AC4B70259AA158ED6718FC4B1687E647AAF87991BD013F172AF75F44BD2B42B8ADA04BAC926B8152D7A6532909A723CB95725000A4225A08EF1A9B0809AD75C2D4DA63BC5D7110F0A16A439855685C54A9A0AD244CCEB5565C6187B1E34727D89BFD5E011615CB8D037AA846965B807A6DB79C3EF2BCAE7B55096A39BED63ABB582574641C2C25422AA41BC3B81173ED0A12FC115DEE333358B57C5133EB70303A2812677A26CC4F68DA5A3091FE1741391A888C46A534C4B06624CA0E31745332A13576D22197650C298F277906BF5A8196BA954B31403E54B0758698EE09859EB4F037B5F03560CDC861CBE408AF6751168C3B13E88636AC2A64B7B37E9A0AC0CF96F451A4F5814082C8B05CBC352D992B070122050459040154D7F80064783009826A83486878FE5C3E7E527C98A314311ADF2F87C681A7E3AD72D8F8BC410533D5E92356CD9010877CEDFDB66B8C09B18C18ED773AB6556CA774C028C73940953C59B757E70A4484AF7A673F92B98DABBC7A7CF153787B3A206A7BB9ED883A6632B6DED372FE1440C3EC68FE846BDE3BC28B7E27F7EA7859C5C7F0C78336896093CDCB897F9B36B4385C6A21375B9C8B2515986CB98D36890FCA28EF897C016D7ADE9545A376874B330CD2DB61903685B3ED714B016AF84FB525587A967B1C54977AA9EA3771D5667367239D933ACB994B4BB1617344056527C4129D73524368706490D43D528CAB800F9C71460654798F5468A7781E1D70100C74204109DC086BF522298DDC6BE2A5168C0C136274106225A56074B801DB48C4F104EC600248AE715D3422B26A21ACBF71CA5D44B911C60DA8C8D80ACB22028CF59B26419AA0C8CF73481C528448547387C7DB7B42CDEBCA8FF09851C32084122AA8EF1CDAA474AA071B597571632F486BEDA97D2505DCED67B6CFA276736233345B1AD8A807398A5613778CA35188AA362984B078C1484F3011F32781F7045A7A693B369D5B9ECC5665F89C2FF67B198F805B962290802BE13486D3E8708733B4E01E1265EF72C07D8992821B40266AA3B28A235666B481165BD967ED276B35522AC48B6CE7FD279F53460C5A617BD462D3537931A8B29BBC487DAA98BA3E84C27A15DA1DC5424F23569B3CE572C67D4360A65A31B91715D44B2B84D38AB63A1C390556E590B01DB2BB613DBAD0B8B204A1839C105A5F0904E8244722BC13C27A438FA8215847A2B2774332529C74A92B2D82525531877F57B99AC594F628B801FE511F6423CC751240FE10E1655A4625A6E373267799245AD0BCE1763C8D8256117174572B8BB80E50FE424993590657B4331C8252655FA3B104BB8ED866B2FF45A5D4906E78203169B08160B4808D24F21D90D9F13A4F3341C2CF24AEBD4746C3159AD5746AA0817D0181FD671A78506BF020389C149585E253A77596FA48077D8EBA08780A1FE171E005B83E679B8290897DD67AFD9373772D66829027FBCF79727597727B50EF21919A6126928F2AD1C5029C3D827F41CC207805E2E9B7AB0DC7375EA0348C5BB0F292DE41C93A2E1308E311BE8E2A14081C9B27A12F0E34F5B70B4D64CA922149317F556099B81FBFAC1317840ECA856E2F443AB918EC826CB1BA30D209263064462731AA590CC103AAB7E900A02EA133CF6BA11DD70B67BDA5FE834632635C7AD6B11B3D50694B97F5867C9EE167783B499B08985ABBAADF102CF121B50FFBC6E1678352C609F9C6ACC7F643A1F4052B67722B7051BC3336BCD052F2B6C6D1AE807CBACA59B0AB7DE3672B2B24070434E713C4289406EF61C0A087B7381C840E36720E0EA4EABB4ACDA7B373D0B8CE87408493498820221F59B41B1000F91C36C7C5CCA0A2C563182794354C2E0B6442A069B5D533B77731F13508820370FBC8C6B97A698E4CBC2E507CBE46A147078B50F28979583648D6A8726E4CC85FA528B249388E86FBE369E2A852DE5E5BF6FB9AC9B17199FA50D42876A6FF7590D3C31FC7547163C5F427BB089F24226096918829A6613581CB1C4FDA16CE5A5011FD853A9FC5261261DA0B809FE0B391042748762682A534FF88006C6D82A4DBCCC7A32048EF675D8A21E20887FFE626E8B157F72A2964A9C567FA502BC87BC64C698546196F9A806B76595508ABA0F18A685921F64A1028BE613BEF905DED4654AD74674675E2E154D07D45DDB21A97FCCC9D233B31708705DF155D086B31106CDBC358A2F4812226964BA34462E36CE6E9B8B977818AA1C3940B9BEF4D37F04F154C3C56BA0D593DFE19EC21A62750890B27C30747669AC213F0682760CD08B6D4C8CFDDA8FD0220F05804C66A4794F747F8A596E3471BDEC80261123C172F71A95D6BA1644B69FA93D3D6B9643843A3B014A4EACAB95867D3954A5BF603E96EC682CE9BB89BCC49A2618307A18FE40965B3C14F45075A0759E78CC312D81B90D37CF8443C1E8C53A88F3382BF82E7DFB9CE3D5B83C0794F3789E3699AFA36C06E27CA32A8C5350EBCF533374E743ACE5F26F46439BE0A04683F732BFF85D4D98CE3EB79B1CF843787078A6E5C5642083A165B77EB74C9896537EE938D1A1416D2A11DD30061588B1A96819D7B477E90C75713CC01D576967E42E81DB35F77288633452C40B655ACC862F594AC03CBE47570451E0B2FECA7547A50B7DA512AC464AA72BA673C17FD2313B09A216E7797D98C8070C2C07121067C92B5BA7C3C0B8B413587C6CB0F17272172872A171443B1367DC0B372140969534C5C19522ABC8BC200F07E90ED65A09180BCDD46A5EBE22319992521EF074ABB99C3DB57A65854761A36104CB317AB7B58B346FEFB85B0CCB26DE6B6FE2F8D713CEB390F798DB6C234614E4B7B0FA5C1572AE8BFCA9012A8F7955672DFE50077ACEA522D5D4A81CF29E2F2300F21929A23EA6CD55660AB706C08D58DBCCC8F4EF69AA9707A354D69C6514B5D14C43270452EB6A708617CF4E60340B47", "m": "E878C19451E35781568192BC03952994C9D342E32E5FEB2E584C8A2553500364", "ct": "F195AFF4C077F69EA8342EF73018792976BB0583ED24FB3EE7FDB6CE0DD27DCACB9E2D67BB7F11DA4B73D480614B344025C62BFCD3B937D1119CBE5F251B41DC2C7DB26506490F19FDAA491F67841B7BA40B7EC337E3E822947650CECEE3EF3220CCA41905BFAE7CB1FFFD2EE2DEEEFBFB4FFF919E7133C52A04971012C966A0D44DD78B1C895807F92251EB6D46BD8954CB84EA0FEA6AA28D2D013EA4476C3B0C9307E88A4FC54617F518B8F96E87300AACC0C894E2BFF1A8E0BEDD57A17BD864DD75D715F4FA1FF0D0D18DCE5E148B6524AF0E4522387DE77178C7F04082B6F9D8F50C6340E3EE615915C78A2BE3C29D203E283AF39DC33C044C2CD6AD0F7CBEC824CDD07F37317A31686F8156DB03139013CE02CC12D274890B761EBB3A82FB0554E193601F573D797E53FFBDBBC398BEAEE826842B97919B6C72182C3D9CBC20384EDC246538D6FB5E60A30B38AA05BD62562B5E95FF1068B228FBD1E95356596E744AF1F4591FA70DCCCF79A3C3D8DE7271E66D2E63F09112EA22BC7903BCCACE07613F63699E500644ADB6C4B2FFDA5E0B9782D4C3C1FB40EF2EBBFBDE8A86F216F27F3A2961726B0FFACC51AAFA0B4137924476FD3833165A4941947FAD66147B1D5D355E6F89068342D83F0C14585AC1B488DD228F96FEA97EBDAB7D617DE2A5DBB82DE0D7BFB8E382EFB28AD400BC53CF250A2633E30658AC53ACC5DBAFF6FD9DE2936C0C0DAC6659FD41791250AAD2EAE82A6376A17AAB8702CBD33777AFBA56E08B9A7C579A27D6C58A69A69FF9375F435778E6832A72E80F8C414ACBA067609109425E468141B0412B587F3C97430B89DC0AC5D2800772987D371BC275B36EA7DEC9DD67B74524F1DA947A536492B80751672D87B109C90F2CA85BA14E22D3729C7BDB5E3E4F01A6EA621A424A402879E0D9E39BBBA902F4F50930FEAE22C1D78FFFF620E4E17CD3BAD527BF68FCB2594529658550AFB2A8774A33183BCC76209C2AC19522795FABE1E24E0D4AABAAA17C775649F14FF9B51C364077AC29A6DEABDB06F8E2FDAE312EBF9D8C9E127238FE5FE18FD3404628FE9B9353424FA4FC046AA8B5EAD2157EAD02C51CE50483EB40FD0486F943ECE6371ABA945DAE4C024D873E9A54E54CBCF0D04E9C91537621098E1D7014ACC1FE3577E0C7A65B57E61618345B9F6BB6C13DFA72374C56F51BE43DB6DA85E186A3C0EDA7510875A00046BB533DF79FF1DDC932A2FF49F6CB92B3F90F9DA06A5D3647690BF04AD77D97790E7BF2ED3B810D2DE688D8783BCF24B17331713F6A9FF46B4C81E45AF2D955F1611801450E23D7F004B533F5CCFB95E55ADFD6C17041B8C206A3BF28B980E7376727F82C540068638EBB103F6E2B8CA0217F49E38733B92A0ADC01FCE748A224D664C8EF70FD088DF19D41C7EF741F049C93C927A2545D99BDC39C6528202B6AD04A195497FD071937076DE7717F24B1C9C24A6B8143CD3E7527A435D7591DC88B73F6DA5113D4549160EACDA1BE79DB11277E34AB432A7629", "ss": "CE514D5D0B700EA35AC0E039D76FDB9A96433A4A7312016F063473575FD6CA7F", } test_mlkem_1024_1 = { "tcId": 51, "alg": crsyspqc.Kem.Alg.ML_KEM_1024, "ek": "D638C2BFCAB422956146C2905E534DE4111724AB575B4C85D24B1A5A49435BC4666903093B146E1DF25E80B5A6B7DB1F5C33714FACABA2265097204E8B639CC58BB97F238EE96B9307D4922F0941BAB07DD781792B603D989022998B8B8D690758724112736C8F80A3ECB458D08972A6E283502B8717A139E900C0E7D84284850CFD7020A9CC8165EC6B0E861329B96C89E389B85384BB57907A44CE0349A4E1FCC3A4422D3DC1254EEBC5150548D38CA1577C93C81977862596A430289EE733AF73917C0C565D5885699BC09CD2430EA866AEEB2BF396126CC3C60E27B1304129AA8C6785E997B4D3BDE2F47992D124DF0C0C4D59615E72871FD579F9547F741ACCE0413182C1669B9B7C6EF41480DC13BEA1210DBA59B4EAA9250ACE63A3B2047011ABF9C8F93B43A39A051BB00BB6031A7CEA9532D13BC1F86CE3EC301853B629FB5FEFB30E5A72CD6D2B5010A684248985AA502A1708800B166CD71B0EE96692E6C4329CD3B082EBA3D69B9F697C0491B255459C6F8B7611C2E725C2D62935C0C627DC7AC897818BD070AC34CEEA34415540CF36FB290D13284903CCA9015FAFA2B05678AF82E5B03A4C3F5DD0B9E12A93E8E77EFCF54E61F158753448C5260B207370FC71C148E0AD53138D076AC2486B12F1503961FCBEEB055CCFEC54074997411891C69B6645050693E3C5BA2C8BE55614BC7030959961F0D601EBA023B1BA66339B4D4A59858AD7CDE1A33C51482158016573CCA62E457DC0CAC80DDB6A3C27741013A6FFF1762152707BC08E24AC8F03E80B89F094A69003501358C9367F378C6935449A67985737AB5731CB9B63E7BDF770B731F60EDA121ED35195C2191EF037234F10B36554160D7A3949F99186154881D583475737B41A1EDF71AC755CA9E79A5A79C1C7BB064A391C11FD48B81E6ABE0CB39F5D8A2ACE203ECD863D5291434A5B410C5956CF7A08758C4CFF6B97F80072686C3F7AC234435C4089DB4670B93EE4597C4069A9DA434E02DA06573A7B4D33699FD880911757DEF731BB5B9954708036C1B073824D98924DF311874D77642D13846BE6A368C9817A291C0C21086EB0284B15CC3A7B30B3D1739193674CCB6687B6B8BDCC3C589882828855739AACFC94100B2435AE1B52D847CFE8111637B24EC957BF2FB442B509ACDE4085F7439BD3123692F539C513BF925C744326484D47504287A26F4218AD9C26BABB9A5B951E6A9209A5C69068DAABE1472716EB779AF7068DF4A979AC598D05C489BAA8A22150DC029C9B40634F9B743E4B70F7307743A82894A474C5E505D5F4BE5C4B119290BF8C81843D656804349AF96180CC05025330B0AB0A93DA8A5EE3807487E5CB53378B7C602F6685AC4DD918464B8FF3F283D13809267670DDF35A29ECA3020CA11D4A130108A232715ACA9323995C2FDCE6016FDACDEEC725C1AA5E41491EB7A1567450C776CB1DE1F2CD1C6B8D84862E98BBA1518999FAB46CDCC113DD50CB3C8B5AC6220005E61E0B4485FB9244FDF11F04B21F41B853F5AB986369BFA05469E15A3EB9B6293C750C2F64059FC90CB1ECA16F1A21E7675A5129C10823A83E15476D018415382ED5B89D70199FA7D6B76DC945926939F8573674C337F4551464246A9BC2A8FB45A48C2157CE9562BD25B8C85C6F41157CFD95AA22B9316C921A4133CA944318FF217D68268DFF37B6115AC8EDE07421250B49B82B3AC6376A4320D5387F9C24285B4069E9760E491C5709E6130EFC7F08437EE146CBA47A4870F9877ED50E27F86DA81A031B619F7E63A5D8F9BB12659BC70794F31381E9F6B4C401A7F5C06B9267CED3F44D5AFCB249121B626C354E60992D5C661A8B5AF20658AE727C68C08B32FAC1261B4170E845BBCC7E1E7C9FEA279C9E4417F8BBA65C36059128CA7F9940D5262069D1A6FE972D319094E3406B288A3432181C99191200073C93DC51E22708A81441BC373855793C6772BB3B8A1E3EF64D41E64818D46CC46CB579F089881C21887B92946BB592CC565A390EE8ECBCD3F059A9652DC66B09D7CB9B6CB839C98B33515875937C254009CDA438514211BE4E402F0C59B0A50732B07B4F90A7680778C0B5E82BB047883E82BE45563DBF4B41D08370E829257FCC25A91042B4C686BE4B16FE2543BA9727F74103C84FF9FB7FBE8D6C2FD113A67CBA8A847E0F683BB082ED3145E5B35058344B84", "dk": "D1E53E04A98171849532E455BFECC7944B536713A939A1C55266988D04885C023C6100746E49887B90966A50BF0DEA306076AA60A92F01CB2D75FA7BB3475977DC754A512A8C80840E0B34CEE362D4D810533A1F67B61F38081569B19D11777692745B0D835F93B028197A23B92972718894C3A824C257CA193318B21A176B0715EB321B7B49553D003122348F8C2BACD8358C819763C527405AFABBD9F0488BB44CCE83CC3B75251F5044D3F387702A1696F631F8C3AB3AD105892A136E6C2FDEF455D5C808E4EB03D212124BD9B77C89661F728A570699E88C4FC73837C22CB389BB9EBDE8083C1A493D10AD9DA283968819D5046E0B33BD52B0815D56BE3C963F126411AAC9BE21F954A4B7027396017D64B857CA60607C15DA13666A601DD4C64D0ACB92BBA4400AC54A795A1A1D20C9BA165C0BE07556F6C0DE87C7BC67C3EDA1298609B0445344AE409EDC139645801685FB49116BAF62DA4DA914BDDAE1C51137457FC32197E9866EF47A7864A4BE10475692A82DC12A7129A68F937D4C063960D899642661FB4C61DBB3A101423A88140B39E179AC35051E841327E70066515054D3A76C6271CE8A4A45447807E729C8940B037A8C6980B934FABFEEF904F5DC0AFFC84D80827851DCA2EA040DEAF36380D44ABE2956AC1780E64A1B31888CD46C52728B2894F620B4107224249922659402876565A25065F00D814A35A1092A6CF6BB1B5657981344F85A42B2259D4999BAFF4912849287A8913C02BCCE2628393063BFA95354A0AB782870BF26338FD63829CE1483A72922FD7C2C834AA760F534E909A02A5C2A57D02877105F769131BF365A86CB64B3B2847C7C7139536D0503988C518E920010E3889AD94BBF2B6AA7290A213B14216AAB86313687A6E7C542B7009A789F0F944A30E6824A7713994184D07BA15FA90F1E59CD6A505C5EC6C5D7DA709FCB37C0350C58719237583A27E2AE4285546BF85F7E37254061416533AEC36459CA1B002A193072F182D3865766DB9C0C3C07DA160AEC7ACA413287A1B624BB575FCC4A99633075524C45545345DA757C57E1CE86796BDCB44E09120DC9A80F82278BC037402B694EAD068CCB71AC01F39773122C9787A863CA73BF86354593632CCAB270DC0EF52404BEE6943203C46103673A5A490D46B7F254BB41FC7CE1B08005FA3E9F629D1102CEF1C89CF7402C730080AC7274DF6B592007BABA56777C39BB83455F89733B24C7785F685583FC79E7394F96B234D0AC6C21A65B0428506D460CC023BA2C618376A97AFAA3259A608B0A50517B134C38A48E91F75D91F20454AC37986313C8B05353C83AD5270C19C6C90ED1117D9752833BA0D3B817535BC862E57265C096EB710A25764FA2A9992E30BDEA4B00B9365EDE434F4750623D8592B22A678E381D48E63E89E90D96B76278D405F585993D143AA8DB903A2C7711C05019C27007E6B8076A3107D929DC664128445360574E8586945EA85769C7A73149223BCC0296AA481B6A86CF505BE98645374C1643403A8BFC7511BC1C1D4B61C1B7CCC1F81B9692CFAA02AFE184AFC40B17B82931F2856318AB0A6456AA72017FFE976F8AA2710FB24185E2C20EFCB19ED03B1125B168469DB479B26BF63C9D2752EBF818243543B9DA125525C1B976A8E5AC62F7269381A19566503BB9178C82F1C154C9BCA5B32E6C26A40187909601C91382A7AB928313A028A2749BCF22564E0422D919C169901621C40818891CFDC2368547076BB3A1C3DB420B625E12D00F43013E50F90DB194A1CBDA9DB7BB915BA027892085CBA0200528AEC2F567692860212A70DD0B2B901BA45515B182E65BABCB3AA5B65FA4999099B7373341A0A2B409C50866F794AE9CB00105E0BC76827AC7A3A7F2067713F60DE5A96C4C3B851838099300980C415EF741C3F1D0906D215BCCEB54FA420972CC954C0B43A0E31C4E9067C518BE7C8A2753B2C0A848A5E1D3BF5541B989846C6B499183ECA0ED59320EB5CAA8D577290CBA2118A457E07EDF38C93E307C821823DF8C0157F2BB2AAB12B55315D694BA0E5B51E59A2AB311B9797571E8F8C0809034B0C4C6F787C436376B9374021DEB2D09B97C1791AD88C1816D8A2E7F38742721BAD948CE95707DAF58BBF622C234C87542C98A95D89FD638C2BFCAB422956146C2905E534DE4111724AB575B4C85D24B1A5A49435BC4666903093B146E1DF25E80B5A6B7DB1F5C33714FACABA2265097204E8B639CC58BB97F238EE96B9307D4922F0941BAB07DD781792B603D989022998B8B8D690758724112736C8F80A3ECB458D08972A6E283502B8717A139E900C0E7D84284850CFD7020A9CC8165EC6B0E861329B96C89E389B85384BB57907A44CE0349A4E1FCC3A4422D3DC1254EEBC5150548D38CA1577C93C81977862596A430289EE733AF73917C0C565D5885699BC09CD2430EA866AEEB2BF396126CC3C60E27B1304129AA8C6785E997B4D3BDE2F47992D124DF0C0C4D59615E72871FD579F9547F741ACCE0413182C1669B9B7C6EF41480DC13BEA1210DBA59B4EAA9250ACE63A3B2047011ABF9C8F93B43A39A051BB00BB6031A7CEA9532D13BC1F86CE3EC301853B629FB5FEFB30E5A72CD6D2B5010A684248985AA502A1708800B166CD71B0EE96692E6C4329CD3B082EBA3D69B9F697C0491B255459C6F8B7611C2E725C2D62935C0C627DC7AC897818BD070AC34CEEA34415540CF36FB290D13284903CCA9015FAFA2B05678AF82E5B03A4C3F5DD0B9E12A93E8E77EFCF54E61F158753448C5260B207370FC71C148E0AD53138D076AC2486B12F1503961FCBEEB055CCFEC54074997411891C69B6645050693E3C5BA2C8BE55614BC7030959961F0D601EBA023B1BA66339B4D4A59858AD7CDE1A33C51482158016573CCA62E457DC0CAC80DDB6A3C27741013A6FFF1762152707BC08E24AC8F03E80B89F094A69003501358C9367F378C6935449A67985737AB5731CB9B63E7BDF770B731F60EDA121ED35195C2191EF037234F10B36554160D7A3949F99186154881D583475737B41A1EDF71AC755CA9E79A5A79C1C7BB064A391C11FD48B81E6ABE0CB39F5D8A2ACE203ECD863D5291434A5B410C5956CF7A08758C4CFF6B97F80072686C3F7AC234435C4089DB4670B93EE4597C4069A9DA434E02DA06573A7B4D33699FD880911757DEF731BB5B9954708036C1B073824D98924DF311874D77642D13846BE6A368C9817A291C0C21086EB0284B15CC3A7B30B3D1739193674CCB6687B6B8BDCC3C589882828855739AACFC94100B2435AE1B52D847CFE8111637B24EC957BF2FB442B509ACDE4085F7439BD3123692F539C513BF925C744326484D47504287A26F4218AD9C26BABB9A5B951E6A9209A5C69068DAABE1472716EB779AF7068DF4A979AC598D05C489BAA8A22150DC029C9B40634F9B743E4B70F7307743A82894A474C5E505D5F4BE5C4B119290BF8C81843D656804349AF96180CC05025330B0AB0A93DA8A5EE3807487E5CB53378B7C602F6685AC4DD918464B8FF3F283D13809267670DDF35A29ECA3020CA11D4A130108A232715ACA9323995C2FDCE6016FDACDEEC725C1AA5E41491EB7A1567450C776CB1DE1F2CD1C6B8D84862E98BBA1518999FAB46CDCC113DD50CB3C8B5AC6220005E61E0B4485FB9244FDF11F04B21F41B853F5AB986369BFA05469E15A3EB9B6293C750C2F64059FC90CB1ECA16F1A21E7675A5129C10823A83E15476D018415382ED5B89D70199FA7D6B76DC945926939F8573674C337F4551464246A9BC2A8FB45A48C2157CE9562BD25B8C85C6F41157CFD95AA22B9316C921A4133CA944318FF217D68268DFF37B6115AC8EDE07421250B49B82B3AC6376A4320D5387F9C24285B4069E9760E491C5709E6130EFC7F08437EE146CBA47A4870F9877ED50E27F86DA81A031B619F7E63A5D8F9BB12659BC70794F31381E9F6B4C401A7F5C06B9267CED3F44D5AFCB249121B626C354E60992D5C661A8B5AF20658AE727C68C08B32FAC1261B4170E845BBCC7E1E7C9FEA279C9E4417F8BBA65C36059128CA7F9940D5262069D1A6FE972D319094E3406B288A3432181C99191200073C93DC51E22708A81441BC373855793C6772BB3B8A1E3EF64D41E64818D46CC46CB579F089881C21887B92946BB592CC565A390EE8ECBCD3F059A9652DC66B09D7CB9B6CB839C98B33515875937C254009CDA438514211BE4E402F0C59B0A50732B07B4F90A7680778C0B5E82BB047883E82BE45563DBF4B41D08370E829257FCC25A91042B4C686BE4B16FE2543BA9727F74103C84FF9FB7FBE8D6C2FD113A67CBA8A847E0F683BB082ED3145E5B35058344B847DD2EBE9A9476CB73353C658DEC30C983537A4FF9B4682AE324DD365C2FE75477B4838280248F358379D14A3A45DB961FCCA5FA6A152965C426DFFE907750374", "m": "8FA6B817B59059DED3AA03A34120C35D0976A61AE9AAB8FB4C8F2EA7ECF9BFD4", "ct": "1BD35BA1B46FD80666E26DB8FE0993DD629564EEE362FBBE104B76C5940FD453A1B62FB0FAFF86D4EE70FB400FFB42FE55798F8E53D2E561F65FA11CBBF70CE9D09A34F76C65A1D5AA94624C2868BC6576E1B90F4C207AA2B5031F2124384716A4E33E92ABB8D0D25F1CE2BADEF559613E536B558FA59B18A0E167D30885B0608983AB6FA3A3EF0FC3DECC2C6B228D110590CAF3CD5B9F3A19778F53300B1EAA34F143E7633378765A58FD061C9BB4FA0F0F04BC506FDCEF0626A3D643D22A042C0D117C4C7065B344E5E9108980EF8DD4C5C399D0439CEAC55EEF16318F51145E43BC7D47F70A8350A26E8400B053BDAD1755E90A120917F9D2F39C4AC146B8BA54039F9467DC883046831F68C196EA5AFF38637CAB370B8FBCFE35290460B4F3D9279A94EC2B44BE16D5FA2DD8BFD6DC660EB4F4A857A66EC56E3B2A6A7552E80186CBAB463AD5B007990B12FE6A150324C643C3CAE28539553870F87C0CC9030DE98A0BA68DDDE908D0D6012EAFB1301CF2C2CCDF90ACC66C62CC792905E1F88B5C39A513002C1686FA04C3A6EC4B981CF770B2D87269E4D0892382A4666323D343FFA8E33EB204EA6EEFDC1051B6FC3BF5937D93C5D78DA9019567E582AD24E56F502A8756DA6170870F9AF94E4BC003370618BF43B64B35A6BA7C5054C01F78F61CF7786A2EE39BC81458F3CF6169B0EA6202BD081FA959D5AA3F4FE5AA3E5BD11740A54D7C5CDD7E3F2021D50A527A19D84BE2F8F1914B434C5697D74C2980DD1EE36BABAD7463675C2447D56C9D072E6029494EAFB6AF5DED5FA88B99D36B8FBBFB8FDEBA8BE760521B0C1CCFCECCFD03F64E4F5D5A877BBD8CD513FF4C9A170FB508448D51B73FAB69A612665CE6015938013C4B49B2F9AD6E5272BFFF57433B4C5594F8C4373303FE4F0324805A9D1C9B68CF938F1975486D56DB7F0FE42AE36978F62CBA712D2E25F9FF21FF14D6F4ECB9C5312E4332348D6E4F6229F9368FB4673B3E376C79ADB7ADE6E661CDB40E0F603467C438378089D932BBE19C691C79D3A31D0ABD2BC4D5685B8A0AF9125CADD01299A925685260EAD552DEFD28731D4372B2C87905025835D89B1A3247DE180FAD9DEF8878C39ED38A401F4672A8EAB9AE4CA10B91A15FD68B0C28000BABE328346594BCB9F5BAEA72E90D4E4A0B7E7D2778612CAC59FEDCC5964C4668DEA4A69A37AE9BBFC81D2B30FBFED965B5962D7BF504A34DA27E7DB30BC4551B1A4D86D4783E3066566E2F8010E554884A374F8D73625D845F572F81464E191259C75210643083394DCB6E9BA8CF68C0BE3ED9EEC4E7D1ABBF6CC54FAE9D0D2514560B3BD668D87984D709869E1C5484A4582A22E9CBEEE34A0A844110A5655E02BE41937411EF70CD1CF4C481AFE6C00595F11B4A844F0BEB1901F69BF15463E78455E3C55E9DED791D0F44B830B1EAE55267AD744B796530BF3B33D347EA9834CBC8C21C3DCC9C74F31F82C67B04F8B7A0727CEAF38C2C6590AE03301F59341053BC4FC0D514D62B34CD9F87206BC648688C8C3BF42E168D6A62B770E65D42F94CDA17215E54CD65C1680EE573CB645D716EA34E4EB9F282ED730BA88C90D0E2A1D076B2D80DB212629CBD6ADA957FDA6F5E7274B6D27E2742381D6439E09D075371F0B3978559E4AC77B86860173C37AA7A5604C6D8A8317554C53FC97E30F66C7DE579CFE5604D47EB079CC6BF397AA93D1D9A0E8D80EE448C16DA90D5FE8A3339F474DF4B24DB5C09AC528F56EFFF002CB0BB7333F3ABE04DB11781EC9F7BAF790BE8166BAB162AA3AB2B9281DFDD76849BD472833485C053A767EC2ACD5954277AFA92E3B0E5BC8A099A64B86FF2BEBA9632C786FA8048F09D899A1B03CF275A5C774DDC7AC12FED9F6D3ED5F543B1F268B00D397E4710C2A1959AF51B31B692BC04A70217C194AE21CD019E116AA4201BE6A50EAA82306DEBCB148A79734B2A3FB6884D66538B9A6A9EDF727CDC4F7ED5FC7683330069ADF4B2860C74F1F951B25F54DF0ADEB4C9DB1FDEADD01E4097544AD3BC38ACAD7D1FE7DFCAC76B61845CC0CD9B8526574CB6FE7D830CAAE6EEFD13A2863B8F8000784EFBE80BFB14DD13127E30E03236A8DC042D17E75AA9B8BAE87EE6D21A910BAEFF61328E5AA39E911F2B7A2FEDF3F3ADFDBA738F132DE872918E1988609A803E7390E2F689644F1EA82F36988F302D27DA", "ss": "F542730FEC64652A758EED71DCF85D4977D2C55787567BCE243EDFEA922EA52B", } for test in [test_mlkem_512_1, test_mlkem_768_1, test_mlkem_1024_1]: alg = test['alg'] print("tcId:", test['tcId'], crsyspqc.Kem.alg_name(alg)) ek = bytes.fromhex(test['ek']) dk = bytes.fromhex(test['dk']) # Encapsulate - use known random seed (``m``) ss, ct = crsyspqc.Kem.encaps(alg, ek, test['m']) print("ct=" + headtail(ct.hex(), 96)) print("ss =", ss.hex()) assert bytes.fromhex(test['ct']) == ct assert bytes.fromhex(test['ss']) == ss # Decapsulate ssd = crsyspqc.Kem.decaps(alg, ct, dk) print("ss'=", ssd.hex()) assert ss.hex() == ssd.hex() ################################################################################# def test_Dsa_sigVerify(): print("\nTesting DSA-sigVerify") # ML-DSA-sigVer-FIPS204-1_1_0_39.json test_ml_dsa_verify_1 = { "tcId": 1, "alg": crsyspqc.Dsa.Alg.ML_DSA_44, "pk": "96DB9EC00F0FBA0AA5D401A045778736B8310E6FDFB1351DF8342659842732C664D44AE0EFA591A97CEA3F52ECAE0CD058DCE789ED7E8BDB38E85E77880F0AF9C5133D12E9E0CC865068E311C99139553E7730C8A03104950C25220CABD458716B564CD41A7B742831EBD71B1C7EB0404446D7135203EE44D5AF99DF4758DD8EA6EB1997E7D46C8F7374EAB08034522CAEB411566801C65E78239C6580D27791EBEF9029A5A291D64B748E26D0C3E297CD1CA87DD546DAB4BB9E74734D5F506F72401B5490A83891C8CC6377693AD3F9ACAE6A05C65BA4B1FAC5955A36198CB0CDE4C70805C4ED3ECA5AF04CF3E7D01435954FFDBB0780BD1E62EABC675412168F05C81F6926A769293397BC34682F6F13039E6FC7AE0E9E8D97861C4AD0584C2D76F2A8418DCEC0F07DA34F85C0F74F212B8F94C414A04EB1FD1548E9EB94F233F9A0878DFA120F54790304E22E9FE81F6D949985128226538538EB53A32AC647BEDB768C695E6E301D733A525C796C78D5D251B1927FB7397DB29A505776BE942139924BC80435749FF75B3286F013E50F953B0BAFC5160EBAB30EA0A62728A765B9A317662BD59FC8C0618A3C535FB88C4E85F4779970817E8168B1E7DD736D5E00F3698A33737A2C587FE57E057000D16589A5810754E2D8021E6CB54B474DBD74372188E7752C2C0C5B3A293A0E17FDB89B4981FE6439E4F4CC179206AF565BBBEB0C6EC2E516C5EE216F9F769E0331300F636DE07869C13708B2C45EEE8B5DC222C26E234E826A971215D75C88845B435CA40B9132BE5D34A2AAB78FA16EC309B8FBB03B8EDA22C013A4E02046C3534E4CFAAC7DFE93B8AE6F448C27F42ECA0CF7D2B7096E90D9149C95F80ABDE8A113792AA016AE592996AE13FD6951207060D377F435EF13007E5E5544D0D0ABA9BF5C8F0F77C22CB4E0AA309A8703DB9A7A4221478D079A743F381EC70A48CEEC10A8CEE185177F5F75F4B3E40B051F863372CF1B19991195C865A810B8DBB2509CFACAADD3C4C2A77027D225D03DF53CEFABAAB70F459F96B036D9D3E1AD3687B05C513178CE8934B4718217BA984BAD5A78B3C7ED83D8F26A04C4C032D706814DD5D09310CB3B61C5D8BCE6753A58EDDDDCE37574BDEEE8EE430D3E9D4EAB124F359A194A55FBF899C60E0F2A7955320AB3A188972040DA61B8D889496324D52ECE2A13EC06291138ECFDE17D56BDFF8B9C971771D5074FA1300ACEE24E465781D8ADA07BB2AF2732B081125B56C8F37EF26FB435AE58E7722EF957D5D30D6FFA5ACAFEC3B8714DA1541EF59B1EADACE58CB48247268DAE5CA539413F77B38346E484FCEC6F92E57171A83013A245F1CA51BED348903608DD9B57BA37B3EDB5A8B0ED049CC9DFA39A65CFA214CFBBFEB797F824A2AD8CB113290D4DBB7D0FAAE9404F7F0401B2A43BC8B58D84A84D00BE4813BB152142E73E6F27449CE3899115CE5E5194ED0E2B1318139976076EA1022A92A5C12ACEA17543D4D152791B455B50149DF94A11D6CD8545E721433624F635F197E68C97E4CBA37B080F583427B342F87D0F8A9680D7F545C6E6E055D063F6EDA75C650D65858E7C30512AC90ED05C788C260B9CD90D61ED121FAD4867E65DEBBEC5C378294EA2A886055E615E7BED9DDAB758192D38220DB8EC382A903FBD24CA48C8C77D7D9DC4307A016E6D24412ABD90A37F637438D132A7C59C7AF67515AB4CAFAFFC416DA09A929C77F91153EF2FDA1D7A60BBB177F74B80352D4CBE69379A257D835063128ED6A1F7D40041A25BC07B0DC0DF7F84FDB96247D888BD8A4DFD48956DF70FECC3A1FA1E214173F94F30E0F1333A4CD35C6C83", "message": "068D4E554D563CC73421A55A4C04DF319F4936F73C7A7626FFE2B65C39AA6B171C4C83B6081B12B2FE07856B7A755210B133C16721D1F1894356705F083ACFB98D1FD09F14916461B057C92E04B97D7042BF970963F837ECEB98486D7CC309C8368925F8E595CF493D256058BEDD218CC4ED2312020643B318B634E4DAA28711B0880C2646415D65D19A0FA7AC4FA2207D230F04D5BA5042B06B3A43FBA1E44DCC0DA861FE9EAFD3F1F8CC5348F31F52F93086BFEF531E58E90AC5F5154F5E9DED589ACCA19C5003E2FE58F412394D75614F93593ED1A567D949FE4FA291D249ECDE8D956980A18D89C49094BBF8A1E7596786E7994B7C7AEE044C432ADAC7739313ECB421A6DDE8372CA4BA4C946B268D28296A04655DD893AE3C4668D8BA2E7FDD28271E2F0F83D18B4CF6240F292B4BB51CE4084750BC3A0AE3312AAF738423C8CA76BFB7DCA90C32B1552198E376E067F5DC5CDDF74953E7DEFAD81CB583E16E8E07850992419279C1FF91A4A41905BC4DE03254F2B2D0507F51F86E22CE3242FAC5B1E9322D4728314F90C799D339D669FBEAE8C5DB3440F0B837D969C4C852C72B77DDF06FB738C8F83027F3C108B72A6133EB20FA6D72A3A258E9650F2061768389A28A64389CE60AE2334DD7E248A29DE989263FD551CD0241280B9D42AA2B7DFED50AAB5414EB592BF54B3B74E4CA6387A8BA4CDF7559934DDE7823F611002D6FC2BCADAC2945A4D505B52FE41BE1B94B02AF43D89A3FBB83B7D499B8C05FE0242F56559E166637EB93E71F31DC4A227830E455F2255DC5175BC313613137BC25E60B2F3E59EA3058A2683560571647CA36CBF07D84C7305E94AF8946BED953C9477647241458432162DABA56BC5AC7E40AD13A8500049B2E2F43969D0B92325DBEF2BB1EFB529B7050F08220F660A22B4D95D9F03712BB02954376B0C99311E4FBB1B75E86147AE4C27198BB073172A6F360311D762D0E7651413375365DE2E8AC89526807968B7EB34F1E45890C44C9B8AC0DAC7CBE6E4D1ABEF512932D34E0B721C84BFB2A52010CADDCE47A28344653C7A26A3E9A0975D54D935997982C8F34996EBD5297905B164B468533439AAD178DAAC0BC687926DE1BE38B86684D53330F2715D64CD3FE875FD3B8C1E890B8D81AC2E5EC5F9F5CAE4509269517BAE904076DC3FB73C7DA72971F5BC5286BE84279A34152515BA0D323889E264695A6BA98E02CD0D2317C5B15364700728037E3306D2BBE7482E4343E962DEF23EFA9DE1FCE455F4F18AFA461B5D43690DE6A5078C115EF74C688DE407CE981D5DE11E96CD8DEDDD0AFA5455C9F84FD6025B1271702CD34D915B6FEAB160FF55E0B43E6B3355B4106815346F6EE052BC534F45071488D19C5C41FC719E55F24F69B3461CA493155752270A51C92F9F8DDD0E40A3A0690936D0E30E58BD064772770D9EFE7E2FBA93E2F5602DBFA28F5AAAA987E5D8694CF8A1C44C6F37085CB254C9F4588A3A3754F4190CFD51BAFB2D52456109C8AC3C6B562928B584BEACFFF2C1D8BACFD1A00BB3408204C4A311DA79C12DE3F84F743D84C43A2A45FAA5762DD190738574EE702959593CD9B13F90537EB02A34CAC193356E2FBE51C9651C8D5BC60433654929FB52AEC9D2B99BA4828BF3AB0722D1E3E5D3E8DE9ED9C2D8233BF66565C21C4719B74D16BEA7671E4CCE982491884873C12BC65FBC62E138695D6149D7D8732AA085335FA6A31FBC23953180123C359485CE4DE8ECCCDC5D16E3B9CE539AB38E5EBA50C71CCE321F14B31C88BFF82C232BC4E48B56D1D4F15C502DE8C2246F401DF1883E5F51596A49A4BAB1CE28AD34CC7BE2C2DAD17FD6E8A01876388BC3CF64DAA16D3CF89F1E97CF5CD6A8CDA174C6566485F3D41ACF6EB536FE6FE129968B637F6F9D738B3101E696F590EE9C2F9E886752225F32E44A4EE0C82990F52EC4FDC544ED4FFD3DB896D526C8650E4F7D509F551FEE9450A86CAF9AB133C7E70D5F5AAF3E19702DDD8740B6AFDB40E9D9920BE177F28E2F9CF35E5D6DDAB4F94D8502094EE7E189421757AE0E314406BA1D65763D156C0F68A9971F92B23535255EE7E3E20B073F0838F6E401F6C92412E11FA30FEA483568E4145626F9B238FB5994D76556F7C9B07550854AC4F38D0FBE1954FB208ECA364D4AD9D4C7A468CE41A8F573D8E22C360AD38EA48E82A3CDE91DCB62708AA44F18B047733DD493F40503CD78B1761D897BC575C4CDD2E694BE17A95BA87DC21F21A6F9F66B980B80A85C87651761D5927973D04299C5F602A6A30B49553C508C68E4EA871896FD4C180F9AC3D58D37C9510E9808FA3AF41C3E028D58E4238043205CE24F3B26A1018CDA8D8DE22405240BEF7CE57F80E94B3415BDB9987A26A59D8CF7EAA133B8CDE40789E3862821EBBC15D30AC92DC018478382E3F4851906BE03B6141FC139EEFA36033F9920DEB709A24EA180D4A9439107ABEB12A303E747230464EF3B9DFAC763EF7261512FE36EA596F87C6039C268954FADCC0142D9B86490B9144D5C90AACB11CAA711D8D0B567EC658CCC5BE7DC28A23BDC38B5E92E86943A31E55B5B0B13B4D84815EB1AC11BE681EA71505CAED29E6FA867B45F9369D0823CA9FCABE9D6E6ED18FABA7A884AA380885942FF18C0D42E813531F1F0CDC30280636574AC7EDB2D70791D83012F94DA59B52D666C50F5921E991AB5045756367DBBAA1D150D45B5BFBF500E62F2C79BFA3649570440CE2A807A81E2248ADCD0877075C8BB9F00A31C21A73A8B861CA07B4F4FE137DDB6F38455BC25B051E766E9EB947FA342DB4A177134BB4442803CA032340BF1C6CC1BF0290B96D9282440DCFB7D1BB2BCD2BF4B31A7F3F9A71C8FFC855DD492B4525707572C75F2268BCF652E5250D27CC1FE16D6C0441DC3631CAF0DBD54F7997F3F5C4F9884BAF9861B85C5B76CC3BB9DA9DA457E11F3AEA69FDBD77F884201852C9B161C60269C3384E8B3E2B4534EF41E85FF567CB60A4568AFBF10EE7E6EDF787A1AABB7DA13A930B2341C3917565EECC5EDF7117A0F3736DDE673DFCCF5B904FD0A0AB22BCA0C7D10D07BFD31135F239EEDE43773CC7284CCD781D690CA013E215D4C6679EDDAAA256AEDFC84040E5FBD1499DE23EA5249608490067421D80ECD00014F631C4838BC0821D605E3196CDDF5F878C8DE3E32ACBF82C21696B24730F3DF9D70DC45B58D62AC621D0EF8F346B69D367918F29CAD722BB8D1C59B687A3ED50ED650236B2C6181CB6ADBA4C8785487B1FF3C860602A5FD944772270F2E174DC1C77157DE789C62FF1EF5429B16633AF8C4C98FB8009C702E2E9C079F6090B0BD76BB2BB35D5C7B8EE496A282D42C304F1197AFEEC4B48CF324A52AE41B4795B17816C746B24C9074A8447C8D8FA4D3598012E7065238C44E01EE0FFDC123C351243227A775B051F89E021799028ED12492EC07EEA8B9E39FCE4CF704453E76CFED7F1C60C9663597F18FB045D8828B08F2452C37F3B0C03092F11DBB4853784E47F02B9D97C369BF240B9F68FA8690DC084F67BD7CCEB0190CB4243325699390E8AACC696E93485A02A906B3C9CCF4C7343324DBF460F914698A20D02D7C582ABF6935EF4DC51F2D1B6C1E75D329A32D8441AF8D84430A2E8A0A3E7DC063C6111ED9DD7CFA7918E3C0B91F0E8F732E9807E133E38D77048CD6205856A8DFD63A6A9DF8F1B1AB1EC8353CF488CFE04EE260D74D969E20BF07DB8F1809414E10B541DEEECE658F7F4587C2044C7ED00BFE29A994C9851809596C5E8120F0969A39897368CBDE788BF5A0C2BEA77A2B665CA0089FDB87AA28AAAACD46F185101846798E77E52CAC06C9752C73BDC2B416B340063108DD03C7F1589577D54201221480815B90DEB662E1117CEF4FAB813012A288F2A73498C7C51F569B8F9D1846546C1F3EF2D6C93C42BD65A1A4D8E747F41504FD88558E23BF84225A1AF91056C321B836E3755527A001583558584BF7796194AFE3DB680C9302B457FE694D9AE2CDF9F0C060B998C4F8D8E062212663DC20C36893F324BD128897AD1E1A2078F1BA568EBC28284CDA289308987A853AAFC2622EE23F45495CB618E8AD83C16801716AF75BD6263E4FA5A7E93C71732B613530DF7231EA5CB1B254E25667F27201DF8A0BA5F67FD091E450CC9C06FBA1987F509FF5D3378B7D00FDCBB6C812A07233E038130BAAC1D536A2B9BD676DAF7E0BAA791864A5F207AD1740C84507449E1E33F9B679BD42F87904ABC54F289451C610BE0CB0BEA63D96A1D04E933AD9D267F8E5FBBF759EC9A739C71AE388B97D55D4032EE9AC87042FB92C0886FA22301F9F4DF8A5FA35C93FA7B937B2D5F6B2BA5738B57AF971B5F19BE5F53ECE71607189E0DA3B63C49E998E186B62889015AE5AD6F85A93B9F069896C6A88CF4758132BC042FB951D814F834934F9EB4F5DF67EB48616848C31CCDC7F48F51421E2B30246B1D6868462E0FD7CD6C586DCE8D2518EBAB20A5A59DD96D98007FE8ECC6A1ECBC6C421AF8529768070DE59C8A65C774773E08BF17ED90AD3861BBDD9716E5B209E2D396029C56F46A3792364A12CE53DE16FFD279AACE900244B74F4601A0994430AF59B9A58B76108269E67D93F1F0B002DF38B029E3B83B8C3C8D136776D31E0FCA3C027F56BD4EAFFC5C620A1D3FD1CBB6BDD5BFA90E6CB1D80F63D9260DDECBF19AD2C3BB66BFB4F75A385069149C9F673974559F10AA9C00BEE61571460A34ACCB1FB9DE38052B1274CF54AB6D70BE25D42031428B971054B1FCC092D228C7AFE3BDD9D2C273876AB6E13620FE4EFC7E78E8990DB91769A5F27B52BF6FE2F3ABF053F969EE360E6E2DEA59F53D03D003BB3074C6D3B702DC26C809D0E1B45510D67424CE51B8AFECAE6DC5BCF4906EFB4B3374C5F3CA1F14224B219E23BCDBF2A74E85ABFF1C372FF66790F2CC242747672D8CBCA6FD5F5C1F23EB89E7A5543F5F91E11CD7D529D8F01BC352273F370DD4094478FC3A83886A5D8128F4284BB9B9B7310332FC50ABA589F72A86CABAA14BDFB1335F0EF7919513192881CF62E845491CE1E083ED863CA386F4CC199C848603F757119102D69912871F838D4F2B7DC343224E40A54337C3C462E491A31C339CB5D1FAE0AC896C6A2286C6244900056A856F35D0203CD4F237BE1B6E41BC984D44CD8D5596033379F26E7D79366E81DFD0254D3C6A7769432691E3E0035FD99F00FC93CBDFD690D2ACA0478A7FFA841A9E1ECD1A5B984AD7986C2B26D5E0193AF9FC74BA891FFD9E40A9D4B54F02B052B8B8C01D9AD29C74B61CEBDD75D07B8155978C2F4C3CD35F3C67EDF80D01F3834AA1F751616FD2852CC1F65C7F3A062DA1E2B64386FAF3AF0A218D6C58C836AC786A187CFE1D630CDA132A40EBDE80C9D446C143AE6CEE621DF56FC47BAC995601E13A0004DB74622565B0745D11A579E50818F11F378EB36A1C57728088718A888751905766D2ED38E07B3C20597E7568EF4CEC3721DE53719266D6C8AC43A0A1D0CEDC870D6832F55013FD8BFF46D1F21F1EC329135B5663D89DC099C83D4BDD063C662A719587B275009277412C0F53009E05F721A6DE37F84D1C941BA8F5E28A3FB70F99D2912416E4CFF1924EB1F532DC42BE1FD61DBE4C00FC03BA9D9645F124C6F321412F435D24CD3E642A37F550D632B1EEE7075132D951C915EE49E422341BC94401CB648D30A5262750979DC912F10381B87A0DEE0AF4EDA6BD73024BF58EFCC7010742DAB46A68F4F55C27C7F78689F195D9B130E3CA4C44A618F8999A1B83775E944F9BE3995B69AAF0B8573994BEB50D9D6778065B5B51A326730FD413E5AEB3605BB53B968EFC51B78B3F1BEF6A1A28CCAC80CA36D8BA4A8B327295AD21362FD446A3AEE681BA1D31AFDE15A5DCD59809BCF54A1583F9040A9CBD50AC2E0195A1E5F8C40324E4C1F6954D30DCC5E648821EC4AEB6D815CD0BA6D2CB43B0B27EDFBADB8C2558B7CD6AAC222A5005ABDD6800015FACE04F7D711D1DBAF14F6D19C09D3587A24F49847D708E065586EA2861C41BB1CA731B14427DDC6EDC353EF9B278B13A2D0CA284B2CBD2C8F591FB4E8CF9EF3049209271D8639345D3FB505039839851D5772251F564D15CE4F478D5C3AF6A2C85787D4AC986B2505D97E88428B7BD6D67BEFEF72675A8C66A5BF88AB3F1DCBC807807F6F1000FD36E49C69E2B3CB8DD7E2BC79F6CEAA58C6E6E4AD85A2099233514C1E0943B992E5E6AE1CC021735B53452AA4D1512D141599C328A2F6D3E4F15C8B561F2EC302879DCB23D2BFE29A1F979469870AFECEB76B3CDC464120B10A80DCA2BB82E2F7AEB1AFC01FE47F42661969D3A7DE65DE0F36E9021671B4376DDB08520248A3796B3C37FCD8FE05A06D535E0A789E8C12D2DEFB5F0C5E33E6AE78CE1584DC95B413D26233F148ACFA95E5504A6862A02BF09D2E980CB75BDD70394575F89B95BDADB67D28BA8CB001770816582BA42FE3FEB6B11A9A337A810B2CB0A14A1402AC3D8BFE8856AED2A1B7C8DB874856FA20DA8F99FB47D3399C4EC3C79D2E67CA428F5EAF15C50A7398A1F8FDD3DFB954D2B9DF19146681FAEC91B382DA37849AA59CAB309D29A40FF394007D32BFDB5FC19E0F11C91D56FDCFEBC8C9C4FE17992F2BADBF2F8AE2D1DBA8266B5441E6B56B8870E1D0A3C6534BCACB800B8FA82A0F64CF196546D8428FEFC59F60A2B88B6BD4597D18270DEE451305F7DD72C19137971E1CDD4289B4F59918DE821B6641C298F2CD10EFC12D819C6BFF0BDDEB98CE47AAD6F48B246E916A6CD9448F8AB10201D5B91B8FE8E27E129801B12B2F62725D6E1CCC785398521E5D09D23F3029AE1D1A3B305DF62C64774F5813868CFE743F0884A928DE1C4D061711BC4D69BD6ABB883E1993917AD207359A84909E693009473BFC9AD5265B23DED1D8D8339A11D3E8B1EFBCF7BB7AF51F8E4F29401BD7EFF9EFE78B91436D67EB015F1C7FF19584C3D4BC765929F92EB78DEE429E46352DEE58D9C92EE5B8A52848D6F0EA3282FDC0DD7F8549C638C3B9066149E895A0C202395F02FF56623359F63C91EDB23528C7D6D83F0837673D5BC92F812902AB64DAB4A31F6B5AC4991C77CCA0F3948CD8978A5C840A8B86A548BA5DC3FF8EBB16A730267A9ACCB3146AD2CA8EECBFE7A98D1F1FD42952A4F13F3DEC1E6F3F7BE706A960EB3E19E7A76E75D6AF7CB5E334C8BCF36B65C1C0182B54847274119A41724744CFE4A066707A75A5E96AC055C3B060200970FE2E4B79459B948A622D046F416FD2799394E8C66459840D396DB6F91EE491260982E219BE6389992CD4D3F9A322C8775ED294F15602F3D03809DCCF34C16F3616B79209E7215C38964ED95839CC07163CEBCA8E2AB7DD9B9CD94B0AAC1FE8063D0DC5BA48F5631960CFB923AE80A9831478EF1CC7AC43EC61DB0F5A3ABCF84F7287E8E34F2B9F1BF8922A6E944F769C2385C7A46F5A8E15F114D5D8016BAB8B3E5D73251CCD08DC1D4E6755C234F147B300B5E64836ACE5ACF5B057F7BC5A6FE7ECA39587399CD96C0FDB0C403B1BA16CDD946BDB9377E1E30A5EB9A674DBF85AA780DDE65E15477C8179B0189FF00BAF56CCD3A4B51778CA99F3AC71196AE5CFE39C3036CB0829A13920E30C327BD6A6DFC3015A9BDBF6E7B798FE87B6809D6485F28476A6DB7268276F80ABFF3053887B6301A6DF7BB27812D7023D705110C9CCD24C96045219D179D0D65E5409BEC9D66ED8C74A6A46D29898C8B0ACFC490DCDD4A5BDFA29F7542A4C11164E4B10DB97BF39C95EDE9E729046CFFBB6342D8AF724A964E54679002837A5E8DCD71958947EF4DA87402267499B04733A2F8BD034EDFD67A3A55A8C89B1097145E80D94BA0A2B32145278F49C4D0A3FD302C131B8EBC0EA7BD352BFB1092CF034BEB443CAD7760B5134CBF5D8693AF6551B85B6B14E3FFA3BD86C30057C76D058416DD7436F4B58B9827FE8E5FCB2D803682C37D98541A285F7B316202F8DC12DA1F28B414E5E81435F3C02E0C5F1EEFE9C5F933DA4724ADCBF1591E09EB7E58550BED7DBA17462FB69DC5BC02E51AB9993A4E8151321DC89DE3CC5B149EB1FBB0C3142718B72938474B66F810C2", "context": "C888E70AFA79ABB9FE4BC32124F5EE0AE2BA7542A8DA1AFCC87348125496761782B26AD8E7078B71C9931FD51802B056B0E799944EF1ED3261CF1286EB744C1D20DC23D54C9FF27C4FC433950C7BCC", "signature": "D4EED978EC079FBCFE2D0703EBD24EF5849DD30E7B403BC9F04CFCBAFC71C5E3ECF0E4E66C263A49AECB503DBDE395A3A2482286C3799C7D427BC3D21FE965D3E16D231330C773A62E72D33161069634B2C4BD2F1DBCD77E004F56F4E2ADD1ED394A96D97A021440A7675A3FB5D7987EA0AF7797B2C1B149B17C9B0B5FA368F3E050139D0068EF3C68BF39FA0D4EC26D4E5141791141A71C4DAE59CDD1098452B0F1E6668E73B1EE6ADCA834E3A003FA03224408AF34CB455B9F322737DF9FD62E8CEB62D18A95147B32DD6E1C5ACCC3FA8CCF138880562A1272DD37F1D972797F98F5039E4795FBB3064E336DF26E48A73E123CE5A4B28B97841ABEDA88183F6E225A3E5BCBAC7C4A6683BE88D22BE874DD0C0D4BEBA338AC938A1A33AF4D992FEB85A374C758490B1E6778B367E946BF04DD76E31D9E99E73D795E70B61109E846DC2D7F61B298756D361F3C92ADF14DC4876022B9845D982A1BDFF067EA2AA2C9F42EEB22FB3B56906BD171B20DD16BE346605C5FBFE703823A259AED2B2E5C51F014F2912A7B5998429BDDA4F650DAB1981C15E05325E36A47C8E6B83ACB3C16122704F10BA118C9B69382C1297B63746E76D603DF80CD17ED2D3B5E7935035D85DAF0EA1D1F6E9D565FAC4A0C84E0401F7C9170F01EEB5121978E5DBBBAAC5B6042FFB689158A91D38C02886391C45A6849219780C78144E443974FF159C56C51ABDC2E11855D95C71B9C331E77384AAD25078F8CF363708067C87949D9CA91295AA0DA7146C2654F54224F1429201FCD5922F6C76F7E323B70D15F724D3F219197CFE6682259E41A1AC8EA5C5DB00FAF78A3016469C134B3A19DEFCBB0FAC3980293F10083FB1952BE10BCB93252A4AFC5AF0F20E7C31314650B52D3A6BB6BBB56755A9352AD141CE2F53E0885626A5ABD5ABEE822CEAD80C86662CFC31F18E4F769E3C543354D24BE42C360E5236F92885C6780C246065A0A3DCB2727CE27B4CEFB63A405CB1C0736087C6C8CDE4AA8C61DB5BD26917B77799E06F061806890D029AA9FA159C91FC635A84AC218A4B0EA84368D7574956F7AB34688ACCB40FAD365A2807C55263D8BCEC0ED3900CB66755D5AB346019F9334659A074098F6C76CD607A43A80CF1D0F014A4C1E7315272D50DCBC117A770D48A17829DD3F4316B46E1A5283AEDFC4202E17C50A28AEC3DF5E8C1509D5D618BF6E44E6BE9022E97B63C67500454F616EC4034AF26DC8A59DB2C798C60E0C09ED5A0FD9534CD68FEA3CB0014F19142A59FA8E116C047F3E5B9AD693F1F777403EBBF20FF0A7413463DDFA252D355B96C1B540CFB2833CD82F640ED72A1A9E86725F5B3A0F94DC7FC8CB1052BCF8A57D1D1CD1313B2784FCB922C3E4DA304498B93E1973347F5317C07E6A529C6492EDF2FE52F42573A9F9CD9A9A436B860667A7B0247EE98B35067998DCA625405F81B936E6998EA889476691ECE165939B5326AC7BCCA4CD9640B84697EC899C2938A52375DAD170A7331108C865693D945615594372982FFA073BB65249140771B34EF711BE4B6BFCD25442A94D3689E7258DF11F81AC3B0C3D8CC3E406B9BBB7431F11455429A97591946BF6BFF1B74AF5F90F3AE2C8A53ED71A1CC47D8CE4716E0E068BCFA8A68159A6FE48BCF0B8ABD2D23B4DDB412C1C3563C803A27C6F8CC774C85620F25B3F8CFED86FE702A9762179A868FCB1D5FAA1DF01AC052D5256BC2A5001BFA4BD69B66AB47A082ABE3ECA932EBFCF6BC3DA31CDCFD88A31B2EB8584AA9D4761108C287584B6A06EBADB43A5F801D70FD2936B74A94B545AF3F8741E42B5D94EA5D2339A35755489635F32148AEA1766191664C8FA968FC6F737EBE3B40B9B1E524FD3E9A85D127FD0BEC85F5C26BF2A0420FC836219E7A3DA1D6179362CC2DBF4CF1F28107B1B27A16CEEE86123E23966C747A936B789FBA3D08DFA0F42B355F37DB02C8858D5E3F4C8EDD2AFB2E9B3ECAE5B157CC72021040459D0F483A13F90ADE7C06E67082DFAC6EF51521D5DB6EB15EB9A7833EE6182B7454B6760EDD1ED4F002D219E884E75113386433EC7B4937AE970465709747CD29B39FB7ACE6C8CC7AF528192621AE9D4C39A6E8C6AADF87D5AA28C1F21359C20AE01023C88D82F0FE9B274951B83792F30FE472FAC1D258ED608FD2260C39EF74331899070982C26BE6C4096D901154D7995D5AE8170E5E6755F01842B0C28160B625BCB6EF8DAD5E4E75B9A2D513FD4D2A71F60B37442764818FDA344281BA33A59BC1F65ACBDF28D4D01CF9E4768AA831D325892FF12AF79E99C10862CDF6E6CAF7B8AA44429EF4E3648475C2FC096070E7D383A63D673B31791B746EBC41D79F64297DE9FBF846CA71B0758FAEAF61F269CA8D50C965C526CFC60DB13A0BE0FEFADB09AE835388360D5226B46E08AA6AA49E6B5B52653CF62AE78F364A97E5523B0E643068B3BA7489DC014D18900573644E610C11CE60E3C40C63E9E0FFC200B1A91177BDAE345F8A0424D904F9CC32EBDF6438DA5032A2F515A39D70D5A971AE3FF1868CDE580749136F120C1BB610EC49077417CAE92C0D830FBA3169C6DEFCFBD6B77FDD3FD0E39F42446028A29314FCA35029CC01183F5EA262582E10206D54117FC4545D90EFA1F5C121FC773AB1CBE64C31675D4CA12E47975BA7348C8388A0CE1D91DCD59BDCD83426C425243DB8AA57983C18F93DBDCA3F7C96C32132D18E3CA73E1EBBF267ABA5A228E64BCBCD47500DE9A249ECE3AA890E38BADDE673E8FBD68DF49E1C983A67CDCCED70F7D11E7DED5D1FC28FDE58CD52CD04BC80E26B611AD4AA251AB1547704DC84273E20F8C8CA72D2398FBA90AAF749EB4342AB088FAB4E476B2B1901BD06C0B8962BE122ED63C12EDB6097CBF5D6262804CD6143E9D5371824FD507092F05A86F6A035C9BBEFC283627CF4D26FA6547BA12739F85353E575FC7CB06A2B0D7BFCF09801F517D1CE71462E3D9725E142338FE324D493362D1B6B9CBC5391D3B31715DAC2395FB9F0D9C6B8996A68178F730F9C7847B306E8E90B9DCF22AFC5E54257F8B58EC583E68ECEEF5522555981EC5A355B819BDD45510E338A79E94D46FB8454BFFEF4C2A8AD8BED8FDACC14BBF869DFB3B5BD4D4153648B01D5F91B9E606663A7B6C7BE643EB13C416DEB4D86A7ABF3929125F81AEC230F56B102D26F1419B33B217BB8DFC9E2D27AB7F92B51D34D2D5538AB4F66DD51EC7E406B1CB276FA2EAD6BA40774DC63CF2B955891EEB2FFB9E87A573E708E761D546674F62E91EFF10A918820325303B7DB0B4C0E4F10923343F445A848D93959B9EB1B3BACDD8ECF12435456E869397C7CAD6D7F10F1A2D50555968698A8CD2D7ECF2F60000000000000000000000000000000000000000000000000A1D2938", "testPassed": True, "reason": "valid signature and message - signature should verify successfully" } test_ml_dsa_verify_2 = { "tcId": 10, "alg": crsyspqc.Dsa.Alg.ML_DSA_44, "pk": "3A391D1F42050F9A2B2173FBAD21DC64A194159BFCC5069C79F009F5B57FCF1560946E2C4B795680CD95933810E820D1A37FBB7CC2B5D749677B194DAAAF21ECB6770F9AAD3795DEB678B95B6D8C56C2BA5B95E2537173C49ACC70E7C1514074E99D4EDAB0D82DAB664DC87E6CC6477104CD1BBB7DF718163EF81308424BA0F9964899D4B63CEABFCBE389E4081E72BFDC3802F0DC2691FCE674DFD1BF9704D2C5047466F387E841307F3EC8B220A7ADEA696C0F6CA1272E9925B3DEBAA8504274931E2305DFE0D563DC065938A57DBD4E8398CDF0821EFADC4C707889C56B38F4D887130841D6E3C52C529783971E005ECBB0DACF99474CCE81589130C77E323D69D9DBE3CD178BBA8D9F7937582C1E449CFDBCFE58D1AA5A8CDFBD8F1B4CDFE3994C1CD67708C50DCFE978E846F1BF3B517B51FE4BE34F95041F0CF0BFD0762AD92DF6EADA3C474509224E0807A0DD9084AA1D953BDEBCE97503C9635783491E60DF9991FB19C57B033C9D81B0F1BB984D00255801C5AAE99C63208D867C732626910E7CC4252F630857A24B3637DD151727FDDA2D83C77769BDD2DA9D742AC795C34AC7E0682529AEDED14E40C5116FEABDAB0102F0D081D46EB44AEE437325E05E905F656799D3D4A3D7E8681180C258253CF49620D7D8AFB0D56C6F57F3E250FBCEC30722BB15B583190B9F6EA118358F2689979B20F90D8D5BF0AFC191127FEEDA791BA9DCE11D751341513FC5C1831CF793682A0D17C4F3E996F8913510DEE9A0DD434718B6F64351EFE3A9C0A9E1FCBF6DF1CE1B0311E707D34FC3F58B2ED31398DEF178D79D2AB4A7BAC84353E0EBCF12D9D9791AA68CEE81F4B90009A70039E1B3F359506EB7FD60A51C326B0774876AC191C3E9B27CDA7F7431CEB57925318F6E59265AD418FAF816794200557D105C54D6FB23E70B00E9D6430F3E197F01ED5196B2405B02DB97E3F55F6AD0CD1A8CD0C9E36DE81AB09BCECCDE4C8CFC358D559B68A8ACEC79759B1AA23C9EEB8ACDBFD48B1FEA4889BD659873C103BE33D4DF4A2F7B55E8BF4BBF55EEF7C61A92651E8D26FF035EF9C9B852E99B9BC18BEC11119D0984C6F3AEAE2F732C02F1EBE0F7E080822CB5AA55F3850A6BF5995D579864679D86A07BBD60237E4D51C642B82AAADCE539DB555CAE9526B47F7213BE1B78926A8ABAB860F0DDE03031AAE0E167E9192BF87EA461C05DBD49F8E882BADD9126B629BCDC38E68F1C1DC93294A1A73A5C35670B89EC8EA5C8A988919F41D849DF2A3C78F0D00267CBF8400F6BB25BF9FE14F5A8E19400667894D6E0C7DBBE1B1D1DEF0AB56B2BD3E944855EC4406B4EAD80D7DEA82405936D92F7233FA464011AD7B77532906E12FA6F733FB2E33421A2DC42D40DB547F769DB747BBCF06CEDDAC6687AF558027C532302F7D173E6D7C166688A7E7BF4FADFD0C8AC509BD3F92E06CAC79610076E25929A5D2DE571724F112C9A7B79B3236D79724FBAE2CE05EE6D7A4C8E4D13459E71E1EB34BBD818ADBC8DF3A01E1F1FB4D6385F210E7CF466D2BCEE4D3B14DA5E5108ADE067A7E739C32BEAAB3C9D79E263CF3560F0B6263FC97DDE15C901AA3C598A0AA623FCF0039A61A5B1289AE43D50E286F42CE51FED19042D553310FCC60FFAE844816124E77A95C5220FCBDCC1A0A39D98BEB0140652A58A27842D1B8DAABE2DE742A96058A69431EF524663FE2105C178E3D219853ECD05F7E5648555562316061D960A1DAEF089FC99745CD3E4177AD13AFB84E9F7722AF0247621D48FFD59A6620E15DB73FECC28071FA32142AF60CCA3BE3B3A4CC70DB0DE61F46E2D50029B4602B6B8FB7A25639F1D11A6", "message": "B6", "context": "", "signature": "7E36B22EFB93E23BBC571AD64B222FF42D476CF289F025EBC53E3C2C407303FE96041AB744FF84DED14667207BB5B71FA8EFCE94815C43F8AA1AB6889E23BB9ABCFBC006E8A4F0F388BA4133F4E2632B36B39A25A29F01C1E4DB8DA23387C36C8DEF14B5D4A38D26D485BD065AC4CA1CF732F6D1BAAC751B5088D438C1D016404FB30F3301D32EC05056D80C61B52729B26EEE10020C3DB9F3AE7D78845EE607B059F97268AB45C19505E9D2CE8767E0E7CD5A69F94771F9AE223BE530B3D577E91F8C475B2B12D1A22C1FEBA2DBAB531EFC8529B0E6B0AAD411FD4644832D33C1D3D7177B9CCD0F3E4B25E8C5F26F3401CCED86388AF924AEDFBF05857EB3D38AA3BEB36FA87D4EE7DF7AC5DA559B5D77AAA2FFBFD80874D4BC7C57E30EFA31116CF4E21BC2ADE9D4DB4E3DF825A2BA48A59CD45E2AD9B4601EC4E44C38A23065A909782ED55763144BDB8ABFA110A8783AD1A340152A04A6EE33176556CA72E113BC6DE09AE2E42B216B5679CFCBFC965B888A3CCF543AB0851948239D46BE01F799D0871879163308D7A5337AFF0244B1262E4E4067669114DEB44938D5EF1FDE238D585C28DF9F4B6B1A1013F1889BD5170D8F1733E8748E09A00751EB8AA233586230DA6B6587110CFC81048A7F496F8415927B86DE332FD42BC1707837B662114DE0C05A75EF021FE9399EA004041AE4D1904A36283B714D9F28B1CBB3864C9B1D1F0F4F16E825BE0765CACA0F90688728F6D63105CCD6D1653F393C92D2C5EEFB9C85F6F097BBBF28E5FC70DCA553FF19897763E97921FA17C558C95C1DE6E67D8094CD88B5CD96203C29B6DEE09D9AD001FD0A9BBE060BC18A7569D591587AA75CBCEAF220D31FB5EF34DEF76BEF37F146B8AF356532DBDA29DF0F8D551677AECE628943923B1605E8D1A622D9348FAD9B2F7612B08858B0395FB5D81F25AA24462BA1C09EFD71FAFB999D559C002901F5DC932941C5BBD842C34B7B0074590C5D64291E40705CCC8CBF66F5C7DE4E64269842C2572874AA8B187A8BCBACFCF485F8E374ABBC3A2A2DAE0F30090FDD0BB8C736FB84F4E509B4F474EE3BBEBEC20DA377ACD0A766020A567F0A9522A20CC45287EAD4D898D145F666E787873024CDB532C4BB278681632C0DEF1142D4A8152809668D2420D17A86F28138A47E1F4EC66DE4B58EF297921DB9E9DD8E844D25C4272EA5C84B794420F7A27B455EC5F1E21F9D6F9B672D192EBE2F8D086FFF22718D1E49884BC327830B470DF1DDEE30C75C94C459ED73671A3AD11BEFF1066144B99DA1C2E13C1D77852FC084048F0D9FB3055588A6102DF66C6805B2FD370BE15B009FC2D8A537542B2469FA1D076406E08037A25593154CF7C1BAC63117BCDB97F2409DBCA7FA52D2657ED7BCEFAC083D056DD681B930179334E4CA4F813593FCB308AA6C069B3D51E9F925474295301B1EDDF8F437D4FA8F8299585BBFD0A649C3D39EEF03ECF691B32AD716DB06D784256E86055132E9F46A41C46E4D153C7CE51E21081FF63BCCA14D58937FD5A534D4FADE7BC1774D952884C3456EFB6404CC99BF5FA64B20095028F89B07F086BBE1DBC3E9A44E1C818FB64283BBF935D7C2D3D65E92FA3CE4208ECFD83F1D10127A201376E4273B8D2830F361CDE6D85CB789F35318B3F564CF33FDFC44B0BAF253F76995B29B06BA0C09DE8727E7D0A55F929922FAD7357C29BA082D898DCCC08D0173C831AB350CB624CDA8F34B72387C3DD06E944B68A972B72A3FB4692480EB6BCF4B371EF65B737B01AB98FD18B211379275F05459916EEBE900A352FF1CC97347D09C52ABF60E053EF28C1CB9C1BB792CEC4C840686FE2E32A5BDE1F0846BDA6410174AE93D5FAD50AC03232B75EDF1D1CD8C002DD2B2AF5645B77E1FBD5F667C5DC989F22CDE26F008F425D138135EEEBB66D1072138D116B4F71BDA694087AC683CE1BEF60733682C09AEB2B38C72C3B9115251FF582520F6292831B5FC290E5AF8678DA064CA93FF64F0973BBA5EB91F0D7B85CA51A68534EECC32E606F1061184380A85547EABEE64E9B3F2C6008A7B883A6F5BB637D4ED41B03C4F399A6F7D9432AAEFE224EDCCE7CF6CBEDD76958BD187B5E814A047848242D8E78BF28539137163A6FC750B9E51536CBE0D2AF243BD290B014DED7807532D236555CC4CD0F04EAE766504630E747B69EB98CCB07D410A835886052C3897FE945BBC7A911C2849BD64C7A590D9FC2AA45B6B404C4ACCB7F29AF0B77FFF848AE22FE2E8EDB260F65C21CBCFB08CDD7761D193BEBFEE648CFAAEE6F5257C82FA9ECDDEEA880CD478B5E0E659D9381941B6831D5D3D72E71900676131F400249AA847AA75A2EF2495D9C646CC58C25A19776261BAF0B86CD4C68171EBD790A3CF6766F28D8807617B9BCC513A2F968BE2DCD9BBE0EF28D954DFB256BEFB08E8F1B9A3160C9035A0E135449A4F5ADE4D8E23D089BABD646FADBE9912F0AA451291BD7DE1ABDF7A6D7FBE95D83DB3C480AAC72AA3732D112E2AC8D7F07FC31186608EA4E135683138A893D498FD82730A115801C88A50E1A100B995047C84B1BAC169D9BF9470187E35CDDC5CB60EA04CFD2AEAC4180033ACBD0B52FE822D898720DA82B8749B084660F28A03E361A217F3BCA4E98EEDCF35BCE11446A01C8619AFCA0478CF780C13660B42DFCEF9C8C71ADA9B9C2BE16B4B0CE5124196C229BCD78F59EC6207A46426F086AAF03AC972A7AC67E577576AEFEFD7FC06FC402975E7AC742A4DFC1FBE08122717BEF20025E0D25D86C309DED2A78BDD9584CD356A94504A270627FC38B4B4F0A1BC8B6FD35212DC4803D91545F46C371AC2F906D98636DFC7A7BAF8294446969C23EBD6C04C3ADA282E884683C1FBAA056106148F0E66CF749ACBC07FFBFDF537F1C71198F59225A22D729128F72D91F90C1BB24C112220AD495B40F73F7659A5F3510BC4A62647E25A97A567AEF174197BF2E0F972F164EDB0640506C9EDDAC43D257F8B79519D697981776CEA3D5518C618527861E58F150082C13E66DFA2B66C0FECB9A38BE270C4F13848A6026CBD7E4C63E25B62C0BCCDEFF780C11068F0E29FD081045DD48D8B3DADE0C0196483051B866FC52D9C236F7FBB9E0BB5FDD4A3AE5AD160441452C6E28CF909420ACB7FE9C37982F6785E909EC73A025248FF11A171CEC3D78DA126E59D02838C8184F2DB30DC5AD2C2AC841552FB36C5095300C1AF74E3BD55017F06DDACBA1D2A6C7B1F7C5ABD5E63B0A5040160FCD844916A0539FD88D2F0C6C3924F3D3834452C020D2248517C7E87AAABB0B2CECFE0E20B1521232E35364142454A62676E83A6C5C7CCD3E0E5F0F7020E0F1A20464B5B5D6DABACB5C9CCDAF7FC0C1E1F24283465848B8E939698B3C6C7D3DB0000000010283A4C", "testPassed": False, "reason": "modified message" } test_ml_dsa_verify_3 = { "tcId": 41, "alg": crsyspqc.Dsa.Alg.ML_DSA_65, "pk": "A096E7E9CAAF64870509FF78A00E66176DF731C8DE4A90C16376115D5C7E85A5A95156C045AD7D1F84E7C136349BD421D4CFE9BBB29D810B78E5936B8A642E8C3160EA6CDA114B7A0187050DAA37BBDBF01104926D96907D760608199B60CD00F50A6A923034D76C55CE14F397AA16CB9E081B127DE0CF5B1AFB9945A90F3470EA09846F15B62AA65522514BFDE7CFE433EAC5E142EF3AA469F66BE6E0C004E89E2FD97BD6DC105FDA42657BAF9A3538D4AA287714BAFE9C3555A2A5CBD44C976805232D8D314E9FE58884C04DD77DCFBDC72D0F50E13A68D8B10E1C1DA6D80EAAE335DA22F130419894E3D903D470162A87ECB81CA4A43FF158EB412E0A3A08E79117C3C3531E3084A0E686BDBBDD333B97297B1434EDA0CEBF70137CE45279FD16073916B17B313CC4400E422F1610E59C9D0B4B83176E4C9179A60CE7A9634375D69A995E3352AD2ABE5F928969211B6A517C827AAF078046FAC93441244778B3CBB0A840C5452480F4821190BE8DAA57CAB5963BEC8234A60C2F5111AC1E1C40B22D46672B69F2D012DB6C82D4CD65751474ADEC1D2894A563C20451009E29E89249D81F2A3088ECD4680CB400DA21B7865F304793D9D36262ACC4EC411B6C6971676565EAEFA121FB4CB7D903E5AD8073E8FD2B88E5933F337E0AA29E4896B00CB5D77082E8ECA7D5731759C060D1FC6D9474269CC400BB65543871A49BC487403A1314ECD3E5545D9A501B0A9CFF5C45A3C7F4F8F281A7C303E76B42BE694DAF4183A727D05EF8828E4DE8A65AE9D58BE88B54D25265A4E62B7F2DBD61D3DD2284C08892E6451EF1B692A1CC9F8D4608874144729B9935013349DA9E0A5BEDD1A2825AE734300FD80CD79DF4834F4836B28275378FEBCFB2FA2CE4C7330ED8C8B6AD06B15D669293354BFA00451A7E2B4FA95C0A068619EA8E8388688A9EBD720206BF66290ADB81C9733920C1224983DC4E519C47972D9C852407619B597B620069AA8684262B38BB9A101961A26180AE477645E2245BBB4AD5F6287919536483594FCCCBE2A124146043AF6B2BC6C9358230FBDF7E145BD79DDEB826250CACEAF5FAF626916A1CB25F97A48F1E373448885242C10166FC8995EFB3019C48B44E61860F4AAE215C3E01A03E56344A940827D01A714D37F17E73492CF825E79CDF63E723A0048FB4044F26984B2A857693ED7F30EA924691055F51FDF6E06B91956F3F99A79736E917E8E9C8EA730CDBC19722081EAA0BB40F40ECC1169A68DD761CF5DA6F71C668022D473B1C2957083AEE2FE7881779D48C06D684C185E5270E522984418277095576C03B119E23D51E224E118338E54E7A334D0177D83D126123B85089461974E59655C2F4AAC432E53DB9B9315B797C2C451F11481D173EE5E69D84FFC8302110A88F0BD807F32F68258E576318C6884715FD273ECA2ACD7C448314C7356E7DA7CE15AFF3565C2113F6E3C2088B4B6B0DF16802A6728A4A3E7F7555E8E67F48798361A66168F50670EA7798A2179CA44A1B3AB78149FFDA56EB1DDD463A354FA611B488E087D53DCFABCF34E6640C957631C1EEBEA222DF890F5417556290D484579E080EC0E9087C11532121EFB59C8313BE6997E4F9B56D7CD645A1020DAF194D09EA63723EF1CA68881FB0CC1F6F400332CE713675B559EFCF8DC56C33DFDE495A7558F233058D32EDA61A82B943AE4378668A2C4CE4EA2569CC7CEC1CC41CDCBDFC85134A0C602504797FD51AD751774B526730AAC9FC42BBF9BFD5A1731D2F69D5CE2048CB5DE537A6002A3ACDE27176A8213477A95CB37772ADE57F612FB59D35724C30E8E1F89679C39C60F6A3487A711BB4190D06682B044E6F65549B2D97BBA397343219776FF5552DC76710ECC4D67201F8DBD6963B06454A7860236F6F3B756F24EBF09999FED8919FFF5BF5C156A2CEBE45182B11BFDD96CA3F69C19782770D153941B36848AAC65BFF9607B619045B07C5032A43A708A8AD6ADB9EB02C52D15F6EEE34CFD50E76B746D85EF09D8A6B0CBE958B57E0B6CDB2A3BD4708852CEC9D03554A1438AC78E8F62B1075D73249BDE1C3ECF1783915A230F4E7552682F0B7A7F67320E35856BAFBDC6D239D32E310BEA33BCE42A43CEA0113F16C5330BF8F4603DB1F7A05C0BCE0A4ABA85051494B87CE4EDE9CFE74657186BD4C683DFC1474B86CADE134AA378F574E59D64CA7FE8C933F1043E6B5E2AE93C4DE0B29EC258BF1FE031E92E35ACB3A9ECED8E499FD6A4470767EACCC1FCF16EDD8F0DFA8B81CD6470E67C6054E3B2D00F5A392204B11A64F9EDE4332E3EEDE2109FEF3427E140763301D7A26C5383B83F8DF1500600DB89D6FA44DA3B0960779E076D290F30D00C52AEA157A626D45D185D95BC1BF91F38959E16A4DBA168EE1DE42501634FE573A7E2302F526633F55C5859DAC92562B80C48C01DB0646DF78EB7509B519508D7DEDEDA0C2788FE67C41144D5AE51C0A3E422177CFB07F91032F143E51780F4678B87D3CFA2C4D0BE6E359F4D3F8F329ED5DB483E984D438B316D2FB75225DC9CF5B8E742018EEA610D2CF318CA200F7CB0885D810BDB2291CC071AD8521D396ADAAAD45FAEB66651F9FF3803F12F557B292208A14A71CA6047A68EB2CFB937A50FAF2CF8B3C3B4A86946B6B53AB761D5A393EC33BAF882A5F0C409F3A2B8EFB17E4958F81A5A256E511AF624795789D2410220EC423ED8EC8FB3B4FA1207F6E76D271FB8C4619CF18F2C5E9", "message": "1A794EA75A46D8E1497EEB7B2A0AD74A14628A9D6D7783CD765297629CF67E336E227BE382D496C402A00B7E1BF8C90CEB9F520EBACC6B955CD17BF00ADB8254FD0673F316C3EA6771456AD90CE09FF143A23D1F4A7B3AE21692A66D3B08096D7A185FBAE90CAF29BE9D8AF5AE8228033EB6F81448FC6C5CC15D00C6EDA904FC3A195B34E4DDA73BB7861BB7D8FC3F165894164004", "context": "", "signature": "0AC0723A1728C976D00E243BD443246AC09122C5BA892738644E8FF5FAC5AD04E3075F9E40A3B44845B6DA5EE1152A973F5C4A849DDDD88FFA3B66032D4DA35CBC4FD779FB6575B740A6CD0E21E8C4272944E69FB8A7DB389DC8ACE20543029A2524D67054F0C9BBA745545288863274AAC7C9E471910C5AA8D1FC52256EBE319666F7F28E77DA4BBA8B18947779C6D24106897876FE393FABC982A92617FAE2C02F7E4291E39FBFB4E61D31A323E5D99504B38275D15627B0694094ECB38B50535F10221BC7BFE0D23FB95774A936E23E5754B317CBF0ABB16369F5CBFF2E8C35CD6A1565595B2EE4C0845993D8DB5CC72934B5DA4F87F416F37EE826BC6B98094C82AA406B2CA31DCE5C0A88FF827AC5FB456BDA8D44328564EFC56179028FAAED02BDA6A970B8BC296DF97CF78A8A442DDCE6541FAC922F8CC4459B004B16FD53EC602A0F80B6A9F740EE29723BD3C25E7F1DB9F7EB5487AF508CE4414B52893DE2B05A53128D000A550B89D68FADE3AE88A9D976EC47127D34DF0AA2808D8C13DDF5BE7BE06AC282F1B2559183D1C49B0D64C5889230D6A4FB94134F5CDED7425E0A6F87F50B43C9330BFD4B47C1C809E4374266E6EEEEBF31285F277B3D22ECB66A1D6E21B4B20D0AFEBA5F3C34E0A6E77013B4FFD31FEFA61B37B30052F9553BD67C4852CEEB0AE59BE96680D3F2281BE3206F2736569CC9814064DAF0AD47A8098185C1DF5942825201507D4F7F6E8D501A8B135CDD4612FEEAC35C258864E682C49936CB86EA292E3C3FF1CCAE7B3BACF0C706FDAF06B7AC2B73D7B1B4A02AC28940D561D85AB5D847F403C5C90FA2C2026E951311BEEE2BE63CCB941E1F6DF711961BC114BEE702393DF83DF277FA007563BEFC799EC65F89076EB474BB7413E2E57188E4B88D8DA744F34618DBD269F278D85D31D1D9C23A37A8935696C48BFFED75B417A24C2DF4BA3A75FC5FCFF4EE31D22CF490B039E4795107B653B527C476A3534A0822748CDB11D6D3BB2ABDF72AB3416D907A92B2610058F5AD539ECB9F70576A25E3C34F312C4C7D2381C51768683F7F2946B81AA5CDD8077269500F8903F3A1292FE4A406F079B5AC19B4A277A214B8AA0360997B1AD34255672BF0C08722EC4EAFB712CCDC21BC67FECAD8F1ADD85A238E213538CD1173326620B28CCC692C343D4B9A95F678FD1EE773848191902EF084129944A91FBDBBA025134A4CDBEB4CD738031A5D05CCA02FAE6E1234DE4D59E401EEF0E2576123750C55FA876EC4C71CE8FFBDE7611152D4C83DD816F851876D57C4F2C83C0A3C0EA7955A5A3A56AB144507AA7975F54B8AD65AC07DBA8FC7A652BDA6518583E7A3DB2B5D2839B64B85860E4D3FE7E72722E77372CA969E2E808718AD7DC92CE8928E70FD935D0D6C448E9182038CAC6A81A0F1E94A87799CFDFF72BC83EFC2A2CA79669C1FC0E767F31E8C73315A0804C0B2DD4C02E9522065FD46CB765CE4AAEB433E8A62A79F49D7ABC143C39FA7D7F5850D25F3EEE56060449FDA61C9216CD06178DDB187D2A6014258C28243825B6EF26ED9230F0145573ECA59DCF7D34B9338BFCBEF00741DD2A2E72E55C11FFCA344C67CF868B865E3E828EC01F368C1E8F27BC46470FD8855D4529B1EFE1661AC8D05C3DDB399E81D8ACDCF97869410679649E144DC3C0FCC7F8C2FD2F47BDBFFA91496F7520420EAFD47B15E609CDDA228517550DE04ED4EB1FFF49EF901957FBDBE372046131C2E69A1C77C20F3856C0531A3BC46923E2E228C37D9307B209CD4C0CD775500A273046C0F0E6BDADFEC7AD77E51E5846FBA293AF65B9D9DF218EDFE42F5EA97010D9A36EFA74724DAA2F9452CC64DE9AFF06CDF41439B64A1620717B67E2EBC16ED3E8F14234B7D2A8F73B1FA5A8D34ACEAFB2E0259329DDC4A4543F04CF6474F565B3FA29CBBBD8342A9FB248FBF58065A694C93DD319173D5A5218C6EE54CF582B4F4A9C7DD40098CEBD29C2E9FAA0303CB54057C4DB36C2C7B78618AB54E2789462FF292A50102074E71D37AC57F42D8E21DBEA466E52B2CF880F5246964DD75962F087E4882098EEED91BD24D3478B1BC524E32D6AEEB57EC3B9DFDF612237EDBF302EF6AF9E5AC378ACB98D3B9DFDCD6D98B46C61AB6B9F20DFE105FA1600E294EDC0B4D26C58CACAE2280253766B8B8645388F715D61628D0C0755805762D7AD6E649165E927293B89F896542837554A6AA9F6C5FF2DB1A12B3CF94C711196E952CDB47E9BD11FC84548D568E9434A29DCCDB9DD8405B36C02094E886D31A99FF6F301A712B4C09CF4D978375C5C604D70B56FACC81CD1A0469BEB852467DBD0041F2FCFE0EB01032A6F60AC5B7EF7343C9FFF6B489884B92A862CF3F91E9D1FA3F4347908B7C5EDEAB0A37ABB29A4DEB7A8B5EF987906A0EFD246D002BF456AC2FB275BBE667C0187CFF2D9DFB77DDFF90AAB1BBA65408DD3D21EEF4AA97B28C1080ED64D0D6347003199FE5FAC805A4E37A418D2DE34B69F4F5CC011DFCF91E028AE47AD6F9FB98F64F2A287CF2F8DFD955F3E6561D485B2C8CA84A80E8ADF889E26F887EBBB642D0C6C6FAE79D051BB514B5C54E653F04381DB6C7F9C0F1FC6816E8B64B72E4EB98D0CE39034C7B23A200618C164644771131EA9B90F7E36887552B27AC150D68F9503EEF488EB576072EF8CDDD3A9EF1FCE052043B7562F628FE62682336961D29D6B4570A93ACDF8001225A19C116EB72DDC359241DA30DE2D7F59A36D62A0DD4283AD111C3BE8A617ED06149CABBEB4C044C1306664F03D6AD801B2D31B772AAD034ADAC958C45C488258047C07C5D74F2C41D1FEF349089601D448AECB307738007316D188C8275C3038CEC8C613FA0492011BF574F285C6E143A84EE4BB855294356B1AD1050D577ADF5215969F45242647FFFE698752BF47B5F8408B797C1B24E64DDBFBEBC5FA26AAFF670ECA8368471EE430D577F019896CD7441C8A2841A7FA449019A8F3EE668CA82DEA98BF2C82A6FC70A117DFA212AAAA4F9E471F8C3C15398D70C4CEAB3461CB6D1BBDE016C9DA9441855C204C99CF1F276CD3439F98CEB1CAA4C897596BFCE14FCE4170E082127629F788A113CB8E42860DD1510280757ED023AA23670780CC57AB62E51AB50A3ED949FE69307AE7D70BBC18BF79A3145796B40A451FC60A8152EE23D9DA848E0C469FC954BCE1E0B47441003883EC1A97F6E01BE3DC8A92C4228E817392E1E12047431EF342F78212EFCDE955104609104F6FBDEE4AF93F50EBEA4C79BC7FF2451EBA312BEBA7E44281E835CD6AA6E7B61BA4B23FCD083C71F6A226E9C7B59D8CC58D62B6291286966C3669D579657A8189199184C312108D5E5A5C0986DF3CE1B22C9167705A4C7777F36274FCFB0489FE3F314BC0647170FACD40396E20C60950C710A031983596802646A64EFFE11FD6B9410B9D99685B5CEC8BD6EC3B88683A814DB36098383D7991BEBE997CDCCDD46AE7D662DE712C75D629442249AEA5C6365ECD07536EFBDB16E7C9FB696B72E10880A269684974163F0CA8EB0D5825A9B1C5BFEB9CFA9BD9E8DD930CD82A19223622288D5B427D47918258A05BD81B5E35815D637AD5316C039FE6413BD54F7DF4B655FDA9EB237581E2D83A5FBE2450E71A2CE0AAF7F41FEDCCEC74F2E3A25FF08B51B85E74ADA065EC4E5473BB60F34353D687862B5C4D9BDDB59968BA210C2A10FF31D2B560FB271AC6D7EE21D86CDA412AE485E00FC862A46E3C97474F5F0DB37084D18015775840187724800E7E00B19DBC84FF82BF299BB67A040A7621E3110E0835AEF51DF5D0B82401A158ACD8647A4E79FDE949A98B55ACFC20128E5DD0B95410C351FA59F4219BBA87025BD9E4E7DE9BD55E3848C741E3E0DF0F5014BB786CB9338099E820A6BA41113F7B488E05F79CE31EA17EEAC55FBDAD55DDD81944189C237E4709EA3915CB8DB27304281633B8D13AE8BA08743FFFB7D13D83F206BA79CD1B0A752B13D0E8ED28EFA757B6C337351386E5120DEF2A2CD5858ED13D62E46A97C256DA665F4D0FF8584D06E330DCC0C03687EA21AC3753AE009CE8B5F344F8A46D1B494E985755329BB94E87B874CFDB3D23000F1298243EEA5A6F94B48540AB165AC055B5498E00DC7917FAB77CFD0429DF97145E2D859A65DEBB4088194B4449FD213FF7DBC2A1FB8AA45E82D3C2641676C54AD791C4DB2AD4B81C7545426C8C78C1CB94CCD8E256BB1AA0CD82477B8414C89418D3737FA5D5598FCF21D98E51EEB4244688570BD7D3D95893B0D4D08874458EC7E26CC10EB8FA8D06E69CEBE05F5BCC8964EADD4E14E113C011589C77ABAB9484DA1E5843B6DCA9FA626FD08BBB1EB49CB9E4737B462F6F42B3714F41FE3A8F858BFFF5CC84EF522DC8344D0ECE442B74D3D15D079E22DB94630E75DA342BF6E8BC0602EAD26C0C024B07F08A15F355E7F0E33D24046F99009DC7CB6DE5E1BB0820931AD12B62C34030D8C0AD01AEBB8A81AB751407A654755C16827B31BD03DDEE724DC8F8545EAADD01D404F5C7AD1C2369A80A46F760476F496D661411A8F4CF6937BA9479D462B47172F4E72C44771B00C28396382921D24728297BC0B1135557882B4C6F7054D4E65F600000000000000000000000000000000000000000005080E141D22", "testPassed": False, "reason": "modified signature - commitment" } test_ml_dsa_verify_4 = { "tcId": 62, "alg": crsyspqc.Dsa.Alg.ML_DSA_87, "pk": "44770F1D9EDBAEED88B368A9D58D98922496A74798C63A865F22CBF87045AAD46CAA4581069E1AD7EC00EBA6E50A22E2BD8966C34547977D5AE4557F60171C466BE38579C84DFE98F03ABE80631D6A48EF589C6424FEBBD5A69EBFCBE20D5091B19AE4D06490B56D2E60139EE47A5019C6B8A069AF17A5507E3E226CD9C348D2FF45E024A5E082ABFECB44B89EC3E4E1707F5E9DA916DA6A198D0EBFDB344ADDCF1C3A4F359E554A8C4D572B1EDD6EDEE616828C239277F10BD7C2791398FD928044E72B851009E9186FB81907553AAB59668D03539A47DB3CECCC3BF51CC698E9B18A2ADE60172E7C071DC48E6D38133B6A30B09A08EA56B33865DF784CED745AF0B7A0F7F5130854FFE66335DCF24ED530247C218F2BB794C36033D74DC7230ED6EADBA4688A7136A2FA3B33EFCAF20A2987E8DDFCECD9840B83B0A59955B92DE6130CF013F440E4CD6B391E8006E995A8F5ED6DF353BF06A48EB24D75E57A39592847169D5EC2050BC487151A58F14DFE81A3D396310FC64E2B2D0D484D7CBD69B904009301327F09D5C678A585337CD36437ABC186040C655A95B869837E9E7E3EA9F72C28046287B019E425695C911269084CBB2257587FB8C9EFA6C293E98F496D8F4033FDE4E91B141CBF1660834F9DFB221BD77475DEA58327BFC49F40BE04B9D55C03D17E5CC765E879DD29C94408AFD2994C51656F357056B84F6A4EB3CEE4797B1A4C79F3EF32BE5180DD0C7E7274E7A5BD5DC0469D50F6BA4E77487650A6D87313BDBFECDB30443FABACA9DC5E9DC71550D11FB19DF8E88F85E49E58336D034581D2C6F584E5B279D19792B3ECD8DF9D94DF077463275281BB984E11741259F019646E03A119B3EB5BDE2B4F76DA6A775B41C7BDE649AB357082646D059611178CB5B6C11235D88FE5FE7707C4503538EAD225DE75DE04B54FB40F6C91EE281ED5D0E1C50E782BD549F06B4A3B12F94B4FDDC81D35B1C4C4CA33AEF0E77D60A75F50B417461B657EEE73CDD435E64DDC55213F0314462FEA1D7A93FD1ADC55AC2CF5C370FA6142F131F4942A06F2FA1E2AE9FCA6E7F88ACD16D6635A3240A6676F20D4B93118B78BC8293527F55896F842D2E0F7692DBF96DC8E91F058A24628B3873B8ED835DB5AE6FC3CE5008E6D9F1A2356309292C41AE67D7A781D6E2B54741DD27E3FEA402941DCCF9385D08B932BFA680D20A8724B7F533D437C771E6570E5F627C0F3E83F250B781C5F8F1DD74FF9A95CE79DAC3A59D324F5201FB191CB5224AC38F7FD68C276D2E179B19E1ECDC0A7A9301DF05A747DA7F6A788FE92C2F51A4468EB0BED502B0646E47C6C6CD949BD64324637A9B781FAC7F1020F132D2C00CE23B0375C111E0D00513E99013460C5181AF055ABDFAD63A6A495BB7815B84093D1826D8A906F6E1D27F0B3B51B800B9C86F06710ECFFDDA849468929C3F2E631834EACB4D89B45DBEC893129F0FF3E0FD63B0A10EA8FDF3AC92465C3FCD7E1177F7C731A3BA565818FE64F2AA5E436110CB10DEC83CBA9AD32A6FD431C29E6328A49372BBF91C5CD5088F4830B1BCECC540108188AF28D93A8FDC61EFC212611528EA666504AB66FD2F18F9203EF4BEE8126174D832A5DBCFBA4A5127A75B5D0682C4D93F8BD134556A8AD4F34DF5974FCDB2FD2C4BFFE3799159B28F3B4DB870636BE139CAD891656CFC42C6F9128A538BCF8DC17E9A98DB563AE19A769E25825EE034A4EDDF4EAF9EBEA7B5E711A9EA0A8F1D84B432F60C27C96366998223DEE7F8191828979948CAF2434E7186070DA40DDB9DC15A90CD03CEB95B53C47515E90FE549BE69381B9FDF342C05EC0F0EDA12D2D1AEE2118E61FCACA7E1FF0402F43EBDE9A51809936C1B6D3F1DDE32DF96135246232F46924AB36FD0D2952DE42FB31F32DD1BBBB5538FA5658315F2AF59029BDB28A4DAABBFF0AF132F767312D94485F157C0124DEFEAC2BBADA85AECF8F9864487EA1FFB9D0E90A3A1D4FBC5BA9F2D343DB12538DDDC86614DAF8477A97A7265DFEA4B63F01995DC9C984F1D3A354BD8C5164E511182D49265E3125A112203FD5CB2D770A07E57DDD85A4C4AE1D2E175FEDA9D625638999AC1A41C0400C509364CF86F7674F3BB65942A47BF1E079C453C50DC6548E5528C2086261417E076DC2F06E098DA8565963DD43A233644CC8B5C8CF8206F25C6A55A180C19DC6E63B97F745EBFF03881ECC081B619921296DE55B0229110FF2ED05181E04BD9DE0CF2DB0EDBCE1B6BAC61C5E9937AA8962EF2B1D59C80BA03FE04F25A457FF2A9A54C19E333CDF47925CCD2F2C44097977BA2C7B60DA954D136BCDA7329ED03CE1E5D8A9F3F7DBF3553836282574FB55E5108A1B595218A7F8CF74F8C0F04B0AD0E62A26F31E991B20E138A611DABCBC9AAFB1938CC5F26F2512D75C80A108B8EEAAFF5C9D756E278FD3951AC4CBA4CD8F5ABF6B4FB028501BD279DCA3DF285BD9B84187A8017ED8B51787F22E196E36A10615DCFBDC16C79A16FD9ED7AAC886061EC5A89B800319930DE878887733825946BF3EE97CC9E5B1BFB1A5A52CBC6FFED62E6B9C31D16C4CFDEFC2664BB2E2F4215F549824C5B340F775462E5BC5697AE134B0101E5E7B8FE489D0B4AD305C168C9026EB9DDE5371A966FAEA8B63ADD146A084209F1EA637A0DD92311827AE2FCF57005040ADE72FBEBF622E1459EFB5291659BE699A53C8E342EDA108E15281F5BC05A23EE765219F16D371CF83BB47266934BD27AB4B4003033DCD0535A87BFF0DD1A22624B603A0466F280ECF02E46F0EC8E2BDBE3636E89F9A48A359C729FDCC8AB8309C56E5B7FEACA1DF254BDAAA45CE3390C5E7C958DEB7A6C9A3C2AC17897ABCAAF4029CB7CE5BD539C940FD76E051BC287ACBBD06F47C0F74C7A60B5A81E0965ADB557C0FC6292FB149027DE21B0D9858D23EB7AB807B7789BE38AFA0A23B84DEA965B16A14F3C447B4121836F2A926164B34C2D76901023506738A7078BC6A4CFE3743EBD4FBDDEC6AA96DC71D7C65D8973CBDCBD70FD82C94E07CFD4EA556B959E1354BB3DADDC5013276433C8D7DAB0FA2ED4CB8050941724305F3EB92CBDF1D10511C5AAEF66F89107E4999293D9DCFB4EE627203715C50EC1EA865F4AC7A825718E4A945087B1762F73215D138FE0F264CBE0B0B894950D4FBAA637CA774891F7EBFE8AB9785D957B404C97670570554B6D93F41E387DED3C20C5C4D7C9B72BDDFBFCAD699DFCE5DE3753365A65E411E6D60758304AE79C229F70A088CEB833E2DDB4F534C6CD12C1DDC1F2993764A8C43D3F49AF28BBF9BEC140445BFA742C529EA4DCE643752271B5AD49DDB980B8DEA72493F8F8DFEC145B1CB48C7D2008966BF6151C51B03BD48B3FA09E2A04DE8F822D4180F9317E03C3421EBFBD44FD382EB76E11D65E135A9B6203D704147EFD97B636E55F671526A4994D9D1ECCB44415150A7927829C158CDE29494359F4202CA40B2E6208155DB81AFE7A4F3A2EB8011D223846B055A323B8B5687EA23651507D99B8700CFE7027E4DD9BB0A254758C1C1FEDB43845972F49B30B683804F1A9C80016D7A8B692F22F66594D25A43547B482E709C5F7917DF7D227A6E3BE2ADD57E15E0123E9BB302FEF95091BE65DC4DD82E2A0FC3B4D0DAEA48", "message": "80458BD14FCD647F66EFF8CFB3174D2FAFB1FD62503A9480BE8253EFD887348D5AE726ABD6FCA32F122140A684AF762701CA32296357A1A6F161CEF3FC76A1A6967C7E293E4FF9E1DA61B9F1E085E28C754F66792ECA0AD81164FACFDE7D91CC13202B663BEB76674460F36E30B20AEB31AC708D43B4C7C2E3B914B5B73D42CDD0EAA4EB711338E6DDA92EF58CEE922519B20D214B61B6B80C9D7973D154107256805CC2D8249D3ECDBCEFF96DD35F5D2DE609C8B0984E2CAD7D0F0F5106A2CCA29BC8EC4BC00C237ABDBA9A8E63351BACCB797420B30E1F6CA783E44818FC87567D5DA2EF0B29A75A2A7BBEB8BBD4306257274E8DF849FF3EB8F77467674DF57C725563939873D31A076D6AB34DD7641CEB4C960D78F9ACE0F13B63DF43AEC7952E0B8F20F11BAEED35C787A52AF0791BD7B8162EE32488027654AF466108E18E1295A4C6F23CD4017A793200FB2235A081C4E8253DDA2AD3D2825CC61C296767C883C75F91FBE0BFDD53090DF75A84D31ACC6FC970AA11DAF535C2D3FBB25583872A5B80F5506CF08D58CF4FB41F089455587972ADEE912303BDB0FDEC6E17ADA3BD2D00EFDA2B943E1CB702CD1598A532AE411360F841B52A4A5B21E4AA0D455A9D654CC53B42976BD96AEEA3BC6E5FDF94A8F9B3724B080AF33B3172976DA80B5BBE3C757739DBA7F485AB004BA8667CCDB8525318A019D9DAC3FF16EA8CF1856B3A4C23EA2D97E6FB12548B25E2CDF2521CFE89F31445A7E226A20F20D7BA4911D0E3199AB998CC4245675E48FB007CD21FEDA5D503564E53E6DC83F9DA2C63709C87255FA01240C1D48D4962998EBEA99CE94D3A2BE599F642BAADF95AA0CF8FCAF7D6BAAA18BC6D28D0BB9D4C900E94D6DD99A9BC2E687241CF775C7F68918F2A96F3A7229487359209699358DBC6BA172C62EB2FF926BD9EF84F314E4E7691631378134A25C138C9C9A3E2EB076B9001C6ABF6FAF5A3A2A93DCCE3CD50FF35EC549AC46CC780C2235CE1D29CD0FB6BDC1C814D8463E6FED8E4DBCAE7E495AA9B3FB3E67248AD83143059E0F47B878508B4C762FB9B759F3B0D0C194B94F37C3DD64D2355031FA47E7CE8FA02220CE4FD265FDA60D280E96308EA92EC2B00FC2A5C03005F85AB678F28347B84D8A826A0F8444B911DD840D7ADA8006BAECCB2F86DD2AB48ACDD4272F0F8381357970B095541B8DEF96AFD074BAD3CC71D58876047D31CE4B17CE1B12245FB1BDF8C84EA6F1EC3362DFACC89B75DC48E8E64B7EC13189FDC817B281977E5D8C6F4B464103BCB2BD5449B79E6B09D60DA955997FB0BEFD0439CBFB69BF308D1A6E17D2717375AE7265FC2DCE35C3B9C37171C22498CBA431BCC9B6A22F28B97217ED5224CD577F6B8A324B54E0B9CDF06E2A8278B2A507C03C9FC8F2D128A4A1511E7803B417FE03EA74C9A09BD0C185CC97DAD3CA0A908FF1164CBB5B59D053D2D735B23F8A88490E5C73532508E6794B245CB18C877886C0B79E4C60FC506DC7FEA9725A1CAA1949576B429161378F62ADB7BBC7A8528C498FDEE9A3D1A0699F04B46C98492702D01469DF03C2169F91322E0165FF727C6B31CB711F8A2DB3367F14A7F0D8C190AF1DAB3A24BDBE1500EE63C194D6D8A3BCB53559E9C6107B4E9E9CC1D7178E0503B2D84E932F21A09BA54730056C41D330FBBF8EDDC553875C3E59566E49CA482E693DD6AA199F6C34132F3D4D7CB997E4FB1BA16FBC6E31998268329B65B3BAE284BCBF0426CE5C9D1F3B4C06ED19C470E4CC1204ACDCDB28420D78763C8B7F5F261A57312A8CA11D104E3C879683970ADE6F26D512D10CEBEDE990D7EB7CDB5BC2D28A841492D00B9134D5A9C8C911D2D553E307E73231A0AE6BD40A984241F5F7F540A8567C5EB1770E174481AB57B1F4291A3D72D351038AE0F063545719A8896755108B060BFF8155EB3845BC81AEDF2861A1FADB6D4D15CBBE627BE01752465D01134A36EA55CB1508D02076DF39437C536BA950058A7AAF57655BD7048A260BAF14F5D51B32941AF1F055D7EC7D310A39707A4D5DE571F6E865797E60CD055EB80CE400437CFCDDA9073577816304C0D3CC9419E8DE189325394208003D123777E74AF13E14D6CD9A631B767897303A6D79BB82F47D45F30E22151A4A8730C48DBE1EB19D724A9F4F88973ED116B54A438C9F4101AFE586A8E86388A416562191FC8D2DE183C6FCBABD22DA03FEEB61AAC93090B8D2B10AEBF045547F055C72629B2DBC885003842D4813C2AAC186EE4CD28DF098B8CCCFA9058DF507E444CE8FDDAB9ADD284428B9C95975926A1069F54D48B3C3DC401E260AE4CC88BD4D76CDA62CCB3B7C3B859651CCD8D6F2CA9DD206B2555B0274BC98E70718BDDA7A769220685CF7E270A79293B64888D9053D139296F333EFA725F324ADBC13DE294C9A45A1DC2FDE206909E635023867D136932AE6D72704CC440C982B285B7A8DD7A5FEA06A1F9867FA79CE080023B3CE2E5D0926A1A5CF4B4ABFC17487D8AA2701E668B606963E4FC9DC8CA6624F7C05812003D2828C74305BF546985F6234872020577C3934FE222F8BA325D62B30814810D6CC5FDA576962A1EAF4B86DCB7CF262C1A2D0C42657EC53ACE9E5D6D236EA0EF62ADF36F9F1D328306F9CDA85DC65990CB8522A804E4BB5F349CC2A81A30177DF4E3A3105FF2B23CD5102621DEFAD69047779E3BEB94D205BD5261525908942D1AACA23357A00769C10E3DD7E978B296EE1CB1AE5D31299617FBB1675B744A13E8109A9090C5ADF826FB6D152BEA006FBABDC6A41B7C3DB43C33F804992E652E2368C1EAE86C53B4C1CD2A9BE666CA0FFF4A95C1A26E7CA9FB82FCE4796EC55196537BF6F900B94F7E691398253936391872735F7FFC829E5FBBEBA1BCD21DD46550D41C9FE28273A915BD240CDB64E723B8B697432BA26B6F1AD87C7463653B8E20738A2059F2CE0AB68A2167F1B937386004210DACF4D8DBF57691B18D2A33362416C6139C4728DAC44337037D60E5AB8A099E969B60A4E686276882CC924DEE8D9FC8D764C241FE9BBC6D50DA5E035DF85D44DB18C1D6ECED2AD5DE46C3973194126281BEDE09CEE4B758714C92105B06AE4563C4E200F02186B56E9026B6F32EBAE3EBBA0A0C3EC108BD19B1F773A3996605FCB7C5EC77FD1D8BCA1CCAD7A2D00968C035AAC20BABFC29B159FE0DAC51D13968C887FD977A19957C15B83AEABA1718BEA3C474D2CECD83B45D6790939AA18257B591B9E9C80C84AA7C90D92FB18618EA92A74ED328EEF98170C6A3FFC3120DEFE7EC70D202AA66F2989DC0C74FF37A006654A6A7906A432563BB932FFF1C483D5828232C877E3F394EDF3E6B135D3C03F5A21B0C5065170A18F75041E4B4D2D609D4248CF76FA38160F70CA8745C1DB4FC77E3D1F351117DB41A9B2A00A0305A88B2C73111397BD9740F5D62E2CC25B42250E2140F5A89D10536C673481890BE59EE759A103F04DF8CF32B7C2217B37A8EE443915E8949FD4DD870151808CCA08B7F799547B49965E1409E5957D6A9764CDE7B15B81C3ED384BC4EAAA5E61F2A4C8353CC8DFF590AFAFBAD9C5CCDB99B8216FC38331923DF4B0794A0BE94618FDDFB2611722C8D4817AE2FDBFC89DA195D0D3E0676FD257394C6F81A4771B929D7AA2637E616A9C01D7236588CB8A64422DC1277BD383904320D281BECAABB4E07BB94A2CDFCF56F84FC3EB0025880BCE2E5C502BFC1E56B4CF434DC862DBC5C2238B10D758829E7DFD139A3A386F966E9AE49A906DD86B9C9092BF7E4D541BE9FE236FBBF6A6B2C8ECBE0457AAE7578EB18B2C7EC5C3E59337078E0B5B8B3C017B35218FEE47F9B7535064537B92941E9E0AF97955871F1FB35DF3E06E062951117FFA3F05E589AB047205D4D3A8F13AE7EC1174DC4D717574277577F30E39693547FC6CDD8C0ABF7FC5C6D70C833738D5F6EEA77F5E991DECC7CB00A50960CB5902581AD1C721D69380D3655B5E4D3F282A8163C9826B9D52DE33FF529E30432B123549B25F53575AB839DAEBEBEC10C71D9ED55C9BED8E4C1A7A352E8C8ECD5BCF41476F044CB6FFDDFFB710A7B7DD03528BE15B9C027C59A44E0F1653255A6F4A72A3B8FF6342FEEA716F0847229A29808853D6EE07DE630A36D2574B91713CF7FE3331D15D9BA652DF537A75769076955AA7C462525D8DB475168B09A5CE3DEBD48EE7A93F84384CB6294B8592E820C1EBFD19DF5D1186D5DC616595D85C8C1AE90D5DA762529274872173D9335A25DABC636621E926E9222649FBC1F8CF6E39F27EEFB8C2ED35422F02F64633AD2FD8335E6546968E99C8C6108497A4B1778D67B7765332593911BA0CA082EFAF32BAE1A073704CD5F178D21211FBFEEF5ECF95E5F576680188B6DEA21C88076BDAD80C8386F3810D635D3DEE54BB0007C3D684B7FECA874F3E68A4048DB0232F5736DD2203C2B5D38784A07CC5967A2CBB5C624FA76EA2B7FA10464CD7089213D9F374DED7CB6426163C169172816F84B57B0D1FC3FD12DC05A4ED77E8DC0F9E16130E251B2F97C87C264CCA3AB85CE7982F18E696B836D828900E7F83E05C53065149DF68F7A3CE61A3D7FAD54B7C14247168353F05EF6FF2671CCEFDF96C54211205B6CC8158F06447FC7618294F356F0C78F0447D750C080650C1E818165E29F0141470EB10AD61ACB2A411F776432904E71457964445368691DD2ECA9D26FC1E7D9E6C683A4610D08688B2AB92A9E37F8C853F126C978E808CBB21217DF825755FB49159C2B58A2626C42DC2C5B341C30E9CB2C29C5BC30EE82F1DC47C4794B45B785ED46CE21C4F57DB6E3F9676AFAA8F9D7902BC80FDBE990E4BDEF4E1F194F3C439655DC160779F6F438A0A5C0D23FE12A66DDC888894EDBCA5DD59ABAEAB55689BA3AAADBD360B458B3515DB6B4EDBA57AA38D470D8F67D4130B076BCD2A946965659AE8C978B633B4DA07E068F0B7BD4926C64304BADE368C64166369B02F93158EDC22FC14CC40E68201DBB5F448297E712BECBDB9E8319896FD95B9ACC5B6B5CDD4B12A262E6503840CECFC66CD8A09C0003F76D550FA3FF6592A89CFD4F37EFE42837E41F97EA092C21EB42837E1B187558E9034B4F841530313A4DF07D5A2C10524588F015F5EA0742BDDA25D4309FDF9819577B484129B027FA1481F14BEAFB1016B31DFAB08FAF654C8C79343D2B45BC3F3C67563D27066382A1A5A54F53CE370E6200765B1ED481ADB970478C33C8A0BAD1451A210A73172A791985115D1EBCD4066705CB008D84568960B03F30DC9C26B6026E10A33E7668CC76E9A32B0A0E69AF7869CFEF56BC3F55BE5F81DBE3A162BDB11B6B886B4D7037F522BCCDDA15E8E18B22D23F59D8D26EF67BF1AEAD5EEF33B67E40F3EFF5D24AA929C8292A36D1AF0D2E39D2D4183BF20F5B7D3D981961BD4BE703ACC4F610C5F5A65895CAE1C974B989C70E1C3B1BB92A05EA00BAC7F101BF920AF4AB8B38D53D550EF0D266F7F95B3805891A205056DCAF37FDCC4D1A03972BFBC1DA25ADBF12E12E6C91F7696202B64ED5CB882CBA53E419584A4BB76CC19FE83BC8FAB0A90ED11246DBA43BF507824883B9DCA37F66C3BC8ACEBB9025280A10CCED70E44B3A07B26F08937E106FE814DB70E076D26CD5ACAC46EAB1C0401ADA59B4AADD1C5EB96330AE0F5413700275807CD1400364C477CB8C42059D38607F5DA7EF12E56890ADB1E3DA96E3A039EF4B88E921BF788149C79046AC0B6A460A45F3F54D5F4EFD6A9D91B884AD8C0711394D70E443A67253F44E61E2D22E3E69688723EBB2733CBB6D2DC832CB7597287219DB49D4AE9268DEA8C09C096A9765C383FA44B47A2B14974493D50F51FBB4EB6A4D6A9402EC62CCD765DD88D4FF0102D783C62A8393C0836F4BC0115E4044864870096C993D474924C8473BAE84E304A5344F9582FD5C74B904D2493686941FA08C0CB704A63627194827DF077A874195F798F35FE51355280E12D06560924BA74EB536C678FC3D27AF7B95528482CCD537AAC9D23C6D56C3D32F00E35ED794DE796489465C793FC06A2FCD3CD628580EF52F3CF570C40CD8FC933FB8BCA7577CB76B7ADD91C10474A03A974846535712E7BD8AB5544C49F4411A0861EDE0FA017814902D3B40CC80E59042BAB94DF305F42D98B7A8CF914799B61D5D41E905E2F450963A584B4080753385E594E3AA5F784A4AF3C3EF510E4EE8797CC041B36A76D79D63AD6B4F3F205BA7FADEDF301232DE9EF5537BBA92B343A6A78B61DB1C2D63C4C5F5DC3D173F9E6E7D820552F49004DD9B5DE1CE3A9C933FEB828EDD8FD829FF30D3C1170F7AFCD621B65626F32E283669F0B3452D9398870DEBB71315C025D3A8F8811DC76DCE4FA30E62D323A02BA296A49DB4ACD1F8B1F18885DDC99FE4848A7AC71ED1BFDA06A5601625458A0F92C981B3FA44AF4D6F1752DCA17473AFBA33A75D3333F524499EE264FA400F04CE2AFA517959182BE8ADFA14F60879E9095A573449583A8C1BFB0C136F97FB692B49E51A5E7D091168F1B66DC0102056B152FBF5AA3B4DB34458CE836B801C9E1ABA24165E2A3B054F0170970B7FE4E97F78938C351624505F434599825913D888C1ECA5FA9FCE45DF310BCF8BADF78AF150DD7E59A56007601EB52C701A365BD0FB440209D63A5CF7ED32961D846F1570B5B4B8B4E4D4CCC4F67B34FBC53311C72953FBC26740A50991632D7124FDDB53B0F1A32BFE8424F7066A497C44ED5A1AA4BB1B60C2C66259DFB73909CBD22F3FF778E91F4DB58245B4BE88C99985C1CB6CF944533DD3CC9911F1E181CAD9B58E34E30105B9C713E90E59348F60734AC13804E280616323F97EA2E6619E919FE84DE83DE446F9CF4F79A6B761CD4A3CF7537F1269C2027771C748FE88168D8FC6BA01D99C6B9E404B6DA582D9D5EB417C2AFDEF2E5859EA2684A98287443CF4FC808C4C0EC766F542AD6AC3AC29FC1B4ACF43C50B890F530710A10361E1EEB63051ABD5F03611C0F009783DAB60FAC7880A6375FB6D46A7557D82208757FEBBEB1623A7F18425AE453E33523165D08930285A5F9CDACC54F89C5A15E456FF235BAAA37BEA2AF0E26A0050C7C23F44B0926776867A5A658F910ED1E1678FAF9506F592761562F0A7AFD4BA02695D62CA7EC1A594EC0518EE20B9DEDAD1A0B72403B925250AC37138FB628C924886486FE9A3821EB3B24F2B1A9C39879BEC0A3C670388B1CD4B6E01E059463B30338A594079C7DBDC1E278C6BF27178C45191429EBCC6D3DF88E8B07F5F3DDB3EBA1D8B15FED92C2EA8F82DD6683AB5FCEE611D3485F54DBEA05719A5F584D54CFEF5A6A86D66256FC6C79409857337A28EA503348AD93360C5F97C2348F2F63C02B24AA0DD44A1F195A70EB95612B81C7B6298EBC0D7FF489583EC0F58BB16D581EA1C3D8FB3042791C40C8922C9E3B208D4DF5FC777271FEFDA54E26C32B6A23131833AC5C0F05BC16062E8F6EF22EA6559420F5D47060425E2FD800EC688F3AD037945B3490B4AE43DA6CE7B4D01ED5A63A8F42664A5AA763783D00AD598682EDE35F8DC7D4D0D4D687303F17C3BA9B20756A72EB7D1E3FB55C2015658B25840984AB7F6B3F5B00AD6ABF847A0003838DA29BD2DD90079952BABD22E57E3F961BBA3F1B57383DBC583802E30670EA727F1593A521313E48AFF2A798FBA348B05DC5F5647282A91147BD140BD8A79C0A53B8C63E3E8D5C011EB19DF05985796C43EB9A927B3E2B4543C2328D425CFA4DF3011E651F8C9BE86870A29DC7ECD38A4A6668D2F58F0B621DD5BACA75B481B15F65DD2D0FB3C2ACBE802186A0391B0E9CA841D40E59A3D02E2E18E2394A7889F742D6E2EB60328C3A772C995F398036B7F414EE4E79043648C89D32300D13DB2970B0207FD2F2A196804D028FFC98CB5058EF5D1591FAA77356C5EE11C91C8779AC95E7F4E09FA7413A803920778D0EA6AF0B4C849D77BF68A5110F7A43DC16C97D8A0D0B4F6A6BA573EA9D51635C84663021EDEFD60503B991276F4C351B3BC7D1AC8CFBE34ED89CEB228991215090145D44957FA3E8660A85F05A17F756C80D8BCEA1F370E1BAC59191D83C0F89A9EB4F66930D18B796739FFDED9E147A2EC36E992ADB3BDF7AF051AE373A6C05F8639E6E82261A3696A699DDD2EBD20C73D8CC3441F7ED4859C18CBD33BF6E205162E9BFAA9842FB07A081181385A107AD956DA56ABD78D2133906C51111D727BEBD6373F38F91E17E36E1BADA00815086ADDF1AD72CEDB4E6DD4F4C79B131E95B6B18A4E627B58CA034C258625FBF62857076530B3282D76249ABA90C4216308F540A997306D10CF0DA4D6A04400E82865B8E9FF1B14D56048BABB734B656ED9ED6A870D235BE04107804588887631E00D05F632FB51737C4DCDF211AE1750522D5F1675E1F52E5BEBE4508F91232D3BCB6A8B9CB89B3803E0680351B7CB255710D6ACB6B1FC4B99A1AFCE345453E5501FAADCD46F6129D915C8722C8FCF0ABA18A5E277734CE5A83EFAFDE2754ECB53959221C2853EFCF24D1F0297A58A939E91448220A67BE2406C62126B5377F9175F18B7226E9CFE9AC589F2568D520B516550596E652B6B4CB4905E84D8C27C40768FEAB0DBF9EFEAB2E74C11C797D1CBE6EA2DCFB76FA749C9921B5E86B082119BBAED5E1DF23C932011DD0C7534DFD0EFE5345BD317FA63ED07A3178C10FC8FF4C146A767C0B01B4501E7B2D394516CAAA76F834077D3E161551ECE0D819407C3B0A1C6A18A785E6874D2A7F95CB80CD5B0992018BF409688E831DF1E198F18A8E00E8CA0271C44C88843800D5BCA93343CE79D9A3CE8D23C42EDBECE40E6ABF5DF02C3EFED49BD4D335D00917CD975A6002004C485F8AAA3FE79E9E46A782689D5FDE6D170935441AC2292E78BD0B62CD22946666F81F2C6D33383428B6970C6458C62330548CF4686744577BE7ED782BC754DDB3E6B153730EC193FDADBB6F2995166625272A1200484D285B822B3ED735E1E415B0A17ACEFB4A5A768D3CB58F9FE9A726C4AE0DAB6A9E5551704ECD5948213A634AFF034C3D3AD334C58CAEAD9E989A4F84770870452F14C3EDA7F9CE7F1FF33BEA44283A292BADCD1E52CA7F6242F96A1D4C793B5D24A763393C67DB07E1879FFC00E09802B78C0DB25594FC924E005582F1B006AFFF3CCAEC2AE1B5395022A34F5CCD62988C6BCD43293A89EF939E1AF1A13B3A94D6ECB96379146E74CF36FCEF74802068F1F6CE2C44DD9CB8903400996684705D1227DF8D26549F4A981220C5E32A239427717611884CCCB669EFB8086EF686F00CD019982447EA6818567911840698584C7F8FFD747D2D3BC003C500CCA7A10123A4DC8B826013A77EFA9EB5888CBA3EF084B01FF7BA94D96BAC0837FF5962B71BF1AE4E4598ECFC8F87A8195698D7C84BB46A2F5EBCF2C1F312146F6C933F1703E55E5054F5F35AA40ECCFA8C87FB800B64DB2E70669C6A51F34438E3810B5C8234A14218E33D26E2DA95FB2744C5375B07F067FFB15BB5376743821CE6353A09F44F51CF46880BCCDAEFCC2BD3D19585611F18CB0540D1866098A0EF09F1C2A6B1DEF8EA5A987A10CB7D4082E215D018229C1EB8DBFBD8FD39BC57C0A8C74A1B72BE31B3E9C8217FD7F4C6EE3E0B42C86949B6440D4554F382E2A27C084215825B8E9E24DE3951E8D02BFE30EF5BDFDC386012BE49A59A00E31FED4BA", "context": "", "signature": "4C8C2FA8073AF0CCC603729E60445F04012322685C6914605D23D028683732A010711CD2E75DB52D7FBF9080CD96F171EC9EAAC0C02C9ABF4AF8CDB472BF86DCFED0A333EA7DD0D4E242839B513F87E732501E2886D8E30D7CD157EEBE708F3762222FECA920061D2B26F0D678CA4B2EC221D4AF5B19A881D4A4D8089DBB1690B6530EB5F0673D8E05229BA6EC53A854A54C9E3486586A96A1A139805C0E261DE1FBE6F41038DF27B8BBCD6DF735ED6F40F5ED015483E00AEF33FE555712690C18BD851F9E8A2CA18F4DE543B68EC67E590BC1558E7A883794BEA8EC1CF1F4BD4B109E7853C7080858ED5897E321210E5FECF803BCB59BB251F579FBD1FCAE2BBC0B12A196E6F320596DAD871AF97EF11E2E7CDCE056ACE48A9791F5D8A490DAE6764FBBE0E95CBC852610ACC87BF9859B3A311D4B89C4B6D03276E668F102DD374D05FC7DDB49C3D129EB41B4D19B14BC24C203D5264F7A85A5BE9A58C28B58C4205A2B9D60D80958F5E93E66EEC31FEBFA819FF4312301EDB89F02107C615E290959180BCEE1EFDCAC71F307D5165B1C876990649FC484E7EB0B9A8987A9EE0A4140F38A5872AC2F8F9439BC3FC6A9E56F2F93CFDAD5C28EA8B08810EEDEA824661521F494148DB1B7C6671E2398CA00E9FAE81447D632890D39713CFC982C58D666583CC7DE230BF7BEE50CEB382B40F191538D0CBA3C63D2B866F2D5F219FF2E7D902A2D88C2286FB5F7565E67DEA1E461F8F68CD536C15190BA4A434AF1D5E2722D9C5C3FF05378759448B01AF5A0A735411C61F1DE4E95FCD062CFFD058A107ED5068D7F3EA4B0A06BD9B51DE240ECA43A71B4344AE54F365E4DEB20CC9440212076B26F56D0D45FDEAE45C923333702641D48A9023C883B15BCEAF304473CA9CF7846F63E6AB74A2731D86E9EB2683E1911B6EE703BD07440F6123A313B95D55796B08A24B43C240A0059DCE4B466F05149470C7F658725AC5913820B4B87AF20677B7BBCD8CF5F36339D8AB4B7CFD89D921E3FB4D5F74B361C650F406DC59367DB82FE4CC69888CADC19414D950D74FF8F7C37930FFAAD46F532EC982C0B9EC5CD2CB4C6DBD2EDB1C7CB5E68C304CB4AD7A280960C14BBF036FC6FD81CB19C92E3B227827E79269645695B61672ECA78697767FAF727930325E67E78558B4E5C8EC4AEC1B0BABD87F624E02E4BBBC4C23349079D2B897463137134A57C32CA6073D2F1C9302DDA9A804934208CA9E2FF452FFA1A1528CAB49CC7B01BFD042B6E7E1C05A3ABA9036536ADBE203E7CF5108606C5F1E1F7A870F33D92C68EB75B506D0AF7F74466FEB1CE2C9FB733368C0D5EC2629791DA1DC8521515F7FF4461FC1F28CC2CA8F19EEB4E7A0309BD85B1E9FF972C912D9F05D6B47C82E39C44ABE0A7B03D52159CFD90142CE7D709E5852E7D75D5A974DCF824CBAAD17E3817C81BD6673898FC4BB627079C47320592BB6EE258B0952AFE18035D100EBD749353C9CBBA4AD4A336AD82B7B2745CC1059D65AAF8A6984EB1FEA3F35C86830327C62D1A5BEA9307E91C58F46D8908EF8E3FDBAE82E5795236F84EAAA318D3852E950D3D65974EBE0C00E8CA2DDF537E9EFD1CA6E2719187CB0BA37C55C2B4825A841DB34EC4D667C18EBB2035805679C415E576A75DAE6C4E913A03BA5CE8DF9D93F95C6076351A6D1943B0EB2571BBA8B9ADE3F095362C6F22B7510C5E86F9BAA03E891BB361D957998070C9B82507931A2EB6DFF9E73D8B9B9B5D27CD44E0FC734CF99E3C7314DD4634E65640650E9811C26A155BD85DE990A49E932059B58C04D24CA1F8B7A6E1DDFEA8DCF4338FC81FCB93C2528A0C008F8C44DFB2A8D5242C0F83336A8FC47224F821981E70622F94BAC51357E968396D512368DDFBB684487569465981986D0D96004622A1A500D16BBC248CB9C157F5CDD3E27EBAA03A423FFD0201B3F5BB36C7E916DECF74723917E0C80ADF8F2205E2A3A4E9AA1B5A1FE37046297E90A43A4A9A893AC9F147EF23EFBBF9F5EDD59089C66C495EF45A9FC5F1BA617E0769D0495E89892A5FB7B3BD51C6434EC960E80F9B2C24F38BEE9A66201F4849FD845406FDBCEF787000836EAE813325CEC19602BA86F3537E74BE7D8FB48F5729676BBDD8227CCAC36A4C7F906DE516D0844618E6EE9E80965FB0DC411BADF5760AB828058E32DF1CC9DD5BBA22DEEF386039D25A0929C3C57EF2BF6455B1C0C1B3CD1AFE33382DCBAB3D8372ADD735B3EA134885FF181CC30CAE6E1364E4D5A9281E503B94EF9D73FDEE92B0A333DF30646853CC3887771F9C5B5D2FE3BCACDBFECCB32964652B61CD98F9EA5A7DB60139E10FE9D6C3F792B84BD682C5116FE4271EDF08F58629AA211E40A4D7009D6B643FF4E4DB8F989D435CEA67C599F8AD3933072E905265BBDF6A6FB26192292738FD86499856FE98B4EE452A0102283063940F92F236B3D683A531B805F200C5F69503C028B84A0718EE7F74E27032A4F79717F73E53DD633C616C9FCBD1C6C6D35A248DBE3313969BFAF51E3E6D902FB12F08FEC94731BE4F120039C785F3DDF549A403EA990DFE7064014E516E52A799B37F14F93399E19B40D4CD374C20693F6AF61109987767BE8C6356394D245E4C88B8D92076B5764D4AA4ED8D5C158CF92DD764BF17A381314D7ACE9E69C3AFDA5E333EC7CFA149AF78D91BE2F94552F2DF99D2989E14F55B13E0F6DC761CF555FB4C22E2BA404A916C47618187D53CC199F298C31302450EB746D0B72052EC7284C6E24B6BF2B6AA6F619F3334DF1C68BA5789121A1D076F0C6511C5229A3B5CEE45D536352FFADA5061224578ABD899B2EE97E3A0E28D72A1F20ED10D21EECC6F649BB8EB3D1016D2DDE21E346EF2BA733F7039FD887FC9DDECE9A981F4A95AB5E4B9B8B0721D8C5CEDEAFB88CA708C2EEA43C1A858F76B09E2A6D7590B80275CEC2BFD41FA239BAC571C57A809927082D783B82DCD4DD693DBFFEFF08919854D8233D304D3C7E4302EB96BB409C6C6C9128775DA3A76CF6548B7A7D5CCD7CAC00183CED80412A27D8722FCA2891B915495A134B4FB8E0A8B06199393D46D19020471C7826AD7DE3104182645BA8B05AD6017255B8D8B9B6B82E2DFE68E3CFCABC02ADDCF034D93926700940B9715DB3B33BC4C451D2CC1E157DF5A74246A0D38BE165BF276AB6AFB13AA68FC9DB9371B9F365401FEA0A8B149C09E4C2E4682656794A57C1D6EA1811965F9E49897AE7B12B5BAFFABFD449E8BCF1199A8265C18C1AFBDBA40CB32888BE0F53A6DA7D10E37FFCE3D970DEEBE0329DFD37F5883D5D1FAF51A841A78ED51E57A4E38AE45C336F02349D2F1017282E7836135C0B0175F3D827AB197D95F88217FAB89423E6B0D034B6C1586EA82B31643B29117ED87DB658513860BD604F13EE0D8B9BB04337BD221FCE235A81972FE944BC2FE6770A696EDC1864D870B35E694DBB24F3AD59CC6958842240CCDD3E105A264CA0E93288A1A32A9F727181BF752705BC6F3323F06B0F60B655EDC756ABB0760DC976B99D2B924A4D250004E642F033F36777EEE3A7A4FF30FAAF1DD1D9DBE16EFB703E3381C7260128A8F6F0FD80D25ADEC8FEB6E327BF5F6587AF87D55B30F3F66585A43F0892E1C458C9E4E54A7D56DC1E1A6EF9F02AB1BD9318B70B05608EB3493696BFE2FDA0CA0BE113FA153D70877AE1C615F3EFA36BFE70F782A39F7F8C722C9CE7BE9D2E40B2C6D2B948527F730B2E34CC34513775278628762BD07809A4570F36B12C4E55860D252F3C9BEF60701B60081A99BAB8D96DAFB8A83C203DD500A3CCFB7A10989294935DB3576CBADC0AD20F294063EC29B397FE23C0CDA01E428DB03A6AFE29201ABA3D0E7592E9E7FBFF5D456FCE25894F20D712B9413AD4F42FA5EE6C6FA3805DD287A6DF339934A70B095712BA8E05030F131AA2B17B8E6C15488EC3DB9074917F85CABCCAA808657C8D427509F134C70F2E4BB7071285B8860FC01A24046319FE39EAE714EC4C7BC37892F8449268D511CCF71C554E0FBBC3E62D183BDFA1083AACA777A053DB0F988C083E30974D9FA418F6A8BC082306C826F290C77E7BC6B054D2DEF8E96C1B4AB82F546266FD2E9475E390E1EEB8643CA9FAAF306719C65F34CE5F6F200ECE93E82CC46093912A70A8133B5C9B81A260220EC8CD2F7FE5F336D38FFA185411AF9AFB25E9A74797AF9172B0D245DCBB090846510B066B302AF5DA189477FB856B3F3EC07EE7C61805945D74A27DF5AB6530BB73E1838D96ED88331F24D7AC5E1F0E39C06B26BA971BDEBA09A70C108E2D38DCD08B51943BCD523E4AB22BFDCFA1243D943494FDD4DC9970445FE229556F08BECFD1CEBA156BCC8341CD902D892D6993E78FA261D20C2F8312CF15200D700967A0B7E724BFC4D4092A9C505CF347E75E77E68ACBD345CFD8A06EA954F7C8F6277DCD32C079B33A65572962E5A4E3468F50E71E09481021C59C3E485F225C27521D9DEC5A5F7C28492BFB1DC85362B2AE7CDB30E484C2A7CE48C467D389263AF3B96E4260E01A0D688065266486FC0953E62A75452D2DB4352C179B0BC7218D7FC3CB5F252980568C557BBDF8F9AA9396B1954472BE36A6F99689C06DBFEC94EE9FE78665378B4634BBF503D319EDCE3152379DA383911A5764E732F8B44EB3F8B4F9193C53769C3FAF2C1013E769A33832753674DE341422D2CF7F7E1B4443A2E6C92A914536BE69B16CE96B55C21BFB2520A8B03A424260A1E0CF653EB41072AA13E2D26E5CA9717B6EBEF1C40978AFB5DA6A431B25D9F137A3A8CC027D1A878EE78C25257FA9008A61EB664F0B6D3216DC639942FB834F512F3A84C8045F4B7AB98E59A322A68958BF410E04E6551BBA375F1D60BA54B60D259EBEFC1492AF572007B30D171E3904E003F731086714FEFB98ED59154494CFD97D836AA57B33606DDC43D5250D8AC43A5D9654C2764FCC31B0E73F6E4AB11AFF8A49A38557820A61C10104A93CA1A3CDA296887055BE23B13330CCE6BE87BD37F7FE88ED75BD8CD7A41B187F1A42D685BC2AFBF0833246DFB300BA5984FBD90EB73B3C30DD800DCB6F81CA80F4040B3BB7B4D9F7FB4AA99820DF236AE7273E115C3B1AF4CFFB1C623B1B11BE7E5274E8EA3D0D731AEF0810E06AFEEF6AAB7D36687F84FA3BFB7BE1BD6B5FDF928D32B2E0A3B6F7D48E5F4C7861BBEC7213F152EAA944E63E273865FB96A32C37E5C9225D54370CB02092F0DAC1BFB5C8987DE5A957A871AEC74F78B9278F45C5061A7195ABA1D2FC705F13D17D43916E642552563FFD54226742BD2EC8CF55F49BBFADA65FA29654715F82449668EE0BAE3C495D236DCF7EF4B82DEF095D72F4676B706B4B629FC1B6A4008438BAD7624A1722E75D922B93F55CA7995350A372CC53F2CA41049141C0CFF16741B267EEE04326F05414B0A807C01034593C6338A57BF0A967F3AA19341BD9D28BA6E519A708B52277DF3CA805648974333F7E782DF44FEB6B84B71B6692ACCBE4F6F0A4DD570B5C543261DBF9DA88682B3AAD7939E4842567C624F9E57EB57AD2D2D96EDE3D359F5665C6CEA90FA371D3B74CB8F73A9D7345ED2F2827F7582268AF46A83EB10043B08C1FC75DFD5A70C887147487B13B8408DE74DBA3C397FDCDC589794628B0077B3FE11C5F616B2919DC25C52DB8E8608C640F7FCE8A6905DDCBDAA6B3941A1FA056C6A135D6B1AB9172B29C8A41DAB15922A5ED70A305921AEC9A2D66E8CCD87F132816515D2783195A1D8A16EE3999F9D43D13F88254DEFF65A283A4F810D706C759C543AAD8E8DE9CEA6011F8276F62AB4CD7E46D9E5D436B7340D2938DE1090EB4648A0552EA4B169E0B1AAC17C49186A730FC4099AB5EC8D43C765D4D5F475FEEAE245BDC3E2AB01F0DE8BDAD4C5568A9E84328D964857AA15521E9AEA1D0D4F13E117E67D182F0547AB2350544BB5F89B5762CC4AB236E8ED34D9E7E128E9FD52E5D14B984F2B6876878A9447271C0FB3F4CEAEEE967DB0F36E35B8ADDA7B607FE97A857A2D817D2B7C2409887E823D0FC42F9144B8B7FEFD2C3FB91A0B102D00F8A21DA4B5FB148811AFA620015138384BD71BC68563F204D01C497EB9179C46C639A04A4716143D7B7F8B4C6EACF154F0BA1CBA35468C9E6505A234F929891E9407D7621E8655377DCC048D8F8EAE3D3727F1FB7A68587A943C69E1DA38117EAB1557C8E22C680FE2ED48275A1D06DA1A8D708437C95C8E58AD5D72BA9FF3F520C49F02FDE0EE2BBCD20281EFCB9FF56AB93062DDDC86FDE6938E39C9F07DCF738D7FB9A73662F156B3B6C31E2CA8A1D614DDE6CFF9F99A93FB443C672BF6D27891B42F1B8E60AAED839150EDDEC903BA64689384197AA8BBB36C2C959BE5054F1260BD03029E24A93250A8064F524E9CADA122314A4D797DCBD0D3F2F5255D99B7E8506F8CDE1F27353753838D95A0F02F596A9495B0C8EA2C565B8CB7C4CEE1F80B3D4A4B6B76D401166268848C9AE6F30000000000000000000000000B10141E262F363E", "testPassed": False, "reason": "modified signature - hint" } # SLH-DSA-sigVer-FIPS205-1_1_0_38.json test_shldsa_verify_1 = { "tcId": 98, "alg": crsyspqc.Dsa.Alg.SLH_DSA_SHAKE_128F, "pk": "DC920B10D5FB36CA196BDC86A674AAA41F22290BFAE9687F1379098C004C6815", "message": "A5", "context": "", "signature": "D9A823396F13EF482DD029398FE55651FE77422032596A89D75DD7893688D31BB3EE1CAE46BD11CA14A5689195464B93B7EB96224E0559C444A0319C65781D72DB96BFBDDF8B9592BC20D41EDF55FED553714DC33814BD2F1C89AEC8AE58DDD1909D4711432FC56B513E399EA1DB65555943B5D3FDB57341F00376CD3B102B69550D5711040D1E5CC490459BBCC52A27B9FA1C5850542B6C1CC61855E88ACC59C8F64CCFAD1169CB0BC9C9AF1F849DB8F0585DB0BA11DDF0480F456858D93E6E0A93C4602A938EC446D8D8F3B4D03DA4256B52AF0797EAD6BA384C607E5E3B0D91FD6DBE95F8C89191AAE77D60B3675E658D0AF7D6231B26A242D224B411221A659FFE6455FE01E855C5727F0F7C5E0BC33AE6A1B00E077086ADB0358CDC77DAC541705FE060CD549F3AD39D75F821B90324413F563B522C09C6D6DB252AC8B7DA1AA76F75BCDB47D4B72EBEB6B1CD37C61CD79298A2825D39AEC457903E4956A692CE5A267172D43F43EA6D6F845BFF6CD75686C700A0AFC7455D0C3DBB372FDE52E3C9F2DA2350517D7C56E7796268395AE2BDF5DB463BBF755671BB169C3B012D2D3F18E6E4AEC5E7F07B7945BADAFBC59E779B6F584B6E1496F953F8A10D797B366CC9AEE4D5E9B0A014557D7DC7176080ECD6B33010EB4C22D189E11293E53B88A032D5737CF165525241563EA35F1200855EAF7179A9E8D253598AADADDAAD009C1FB966E761013C1BA4978BB4A4951F62F9B7B945E18FAD938E7089582C6453B6AA4F37FF3DB5F4371FE53EF718A00634758D7FD1F109A47DF923FF5A316114C3E2D35C9D81792F85868B13D4C0D46221CD7B7CF43B10CD0E9AB9FA48C3E505F9C7B88E5F5F3631AAF10A2C4C34820132C35902082D160B06E272247E19A0CC97E3847ECCB37FB795685FF2DD90C39BAC5B1886B30C0C87D013973140C11C43ADE6A8640CEBF02074A99EB6C37AB204F2325FCA8D069B7AEFA197ED736FEF3CADD2D1F3AD62FD0320DD66CDE6B7236715BF626BC923DE5BC1A78F78C0BB0B9697DBA73003FAAE0AB0B1002AC2D6B69891045C924F433FC682BF84242D1FAFD8B6FFD1DED1049AC38D9D48411BDF4C1F6C6F3F44AFF6300171CA89E37DF050185085C8AC068809A5EDC9DB9E5EF57F02C7DCC89C51EDEDB82810AD35397192D154765A962D0169EC20AA3D338DA6AE9E9337D01C6478F099F424D8EBD02EE4E2E1EBCD238C90F5BFF5FE9A32D2D0F356561E0DA833F610624F5DCDACC423CA9E65A19FFF339E06F7CD2FF72637193E83125FB997510604EAC66FD48C3A3396FED063A9F20512E457A103C171DF1174ECAF06BDB58F587862574A4119B3C32AFE11093A5EFC9CEC6BF924C3D3F228FE32B56D54A7ADA153AA043FADC6F39F13975B68B2EA3DBBA34E5A99E48EC7A95E67DB1AB9EABAC42536D849344FC6498B356A37E0B99BDB279D198FE1785C81AF41E1A6DE715E63569930E599A87638C05B1445E30D8E2F47B4DD752865A59D7F83FD195B0BF489A2B8DA15220931BB578E98549F1503CD18B46CC1C65E539FED1254B9A39D43C25B1A1B0A093FE0E79CF5B5E38DFF2F5368CB656DC8D3FB8D2E06EADC3FD1A7A887508D6DB6977FEF8A97DF84DA9A6216E21921157938D32D6D2F14BD78F1465A741C67CD1BBD008792928396FF9346F72122AB3D88E169C8254996F74E0D111ACF44558BF314D36DF52DF8697B34D7FBFC59B44F121E084983FCC2F2713D4B2279B6CD0567B63890707AABEDDDE0CA14CE3ABEB3DFBB00CEC6942B1A9918E24A7A3ED5C0F67EA6B2B48FC8D542E52CDE7E8D42F615D2C867E1024748E3B62AA443DF640AD7E903810A48A7A40AC4A536D37D92DE3E27397F70D5D350A6089C4AF6710BC05DC0373EF3A8C49313D87602CA992BD74E94B8E0AB3878E2AEE453CC52345D4041C1E783D4459A2AD5051A00B6DCF56084B620B8384D0C8A34F0D3A178CCF64E0D8915A6D2A9F7068BBD4B2E503688281E67E8E69925BE44B25C6383F294924FE896D4DEB5A354F3ACD79C3C8C5D52A5DA47F08E3220A21EAF79C1D32353249AE7E2F2162E7668C95968EE14B3E7BCF2E5A0BE4D2B5F8B334776EE19C885F095884C48BD5629E5538CAAE6BDF3753CD4B3B8987C1FFBAA6AFFEE8866AA85EEFE276158B438AAE3F7080C4C874F1DBED6E4412D94E24DC646C68E6F66A90D01CB25922B1D62FE9AEA7C70D9E3A6A58B202DA8790A0CAEA2095ED7D572885518BE3D2A11037E80155648192D7B74438C4D383AFA79C9B6BD9E6AB139CD34FE46F1E5C07C60E88E4A5074FC52676A23161394AF15FD9F036062B813BDE74FEE08A3780254B393DF26DC92C14293E137EDF2A5EB3F4EC01F34CFF4EA7F32A9BF272CFEAB3D47F3C1780221A863A540D42ADAEF1BC32AE40C3BB795A0224C34BB54633A96E31CDF6431E3B237F1EBE2600FA16B27366B630778662A25C324E61791950F0ADCF1233005B30E558893E1298941E89C5543F377A62CED826F87AFC0D360231A6B05F3C940314290ADD555B6121BCA453852019A036B532C8A9D0E756D02F8E87BF946B528E22C79FBF0CBB59EA9E69758A1B2DF2FA3A4460CD40A4D214FA72BB928AC24E8719D3DD7EE61551B99D5E831991D2F529D859CD85FCC3D8D39D6F7FB59A1FCE9478CF564177A7B7A09E9AB1D6F3357C52936CE25F561FB1C0FC02ECCAC010E6A9F07BCBA305C027DDAFBB64866E423CDB8CCC896EE0E684B530CA6D3F3B13367E1E9634A1B2AA8E6C0745BB6233F46A5B7E1C6EE4BCD099AF89ECDA09F6D4AC4CA58462502A765DF1B934470C0397E07978FA129551DE5B1784091735092A0ACF92ECD4D91D8034AA182B4B733DCB56E72BBBBEE6098DB35781A25710F77436911A75A000C1B8672CC1A8559A7B9AC7DB487AED6F7D31BD9E80CBDE6B306E28E69F4544C6F7FD28551D9DFCDAD37E3741FD5BBC85E3B362E957411BF8E4F67A88506CD5392FB317BC26128D512CB017AFFBEC18B96C29F0EDE0A25EA06BFBFE1F01ADBFA469AC4346CF1366A1D2DE9E6EA6E5AECEF7321D05F050F067154C0500E8D6CA58D353FD60073C36D4704BE9588620AF05A2989EA22FC84BCA5DFA45F5ED96D30CE2AD2F879A24F898237D43896A3006265DF2B22169E92FF8DBAE944CF1F1EF04B2E928846FA294BA5E6F97EB8D9ACE825B8E2E06A95BD9FEAD302C235F0895F4A2277CD6007E09CD15839EA4E88A96FBA94977A2397AAB41E6D1060C3FAD7AAA537ADD4B713F7BB153722EB5019768DAE6C533ADA9AF2A2BF46BF226559C94BBFFB126953FC3E7B97AC891AD7003B88FF9ECF9F088060D8CC0F53985A43A7386BD970CEF745D67B79B4EC89CF333A1B6425F26F77879ABA9E65C505E2F4242B29BAE783D921F70D1FA4353007F0E45F6B54B17CBB24A272E8B26C6508A0F848B1D3B2CA007D00C75A2C44257057B16E6B60FAAE4420B0BA8E641E33886573709B826CC11DF8BA295C037E88BA63E49D22785436F3DAC848D258B8CFA66F468236DE0E9AC2B6D0D10D802752B89684BA7A5F99DA5062AE2E62934D1E62E2812FBD97E7B06239D90A6BBA05237175F996137DFDDFD85070A1B79CD569386CEA457E3422FC21C1E37BC63DFDF93783AB3BC7F4A44987296535E3F0B1C1554374C0A4B42B04D4A1B665E1EF79AD2A66B8F3A79E5DAB23A009AE40F5F8C6DD7F8DD7D4497C4FB5B886ED42CEB04573AF109938978C937016C787190078EAC88234ED0B3BDA39E5A95E210508C86183B840BB6E485EFCC142B4F296481AAE917728350B3958EA7B31228248608BBCA1281AC28C969FE291AD4434813DFCAC941DFF9AAEE1907C883930EDE72374D129DEF0671B3DF9424FC33131B9A08946B03970D553AF1F89F1B7AB4EE3C470BB2298007584FBFDB91316107AEABC5D8A8A7A068DA37D0AA7801572A840B3F161B027CB18552AAB39D55FFDC6046A55C9E67DBBD710D123E9ECF7EBCEBA29C6F49880CE07A692E4C5AC0D99CD5F97CBD0EC714F3F2666C9512D3BC055BD69B06851C7EFA30FDFB0D21B56AEC8D34D53667343BB2DBA7E393C93F9E4BCD4F0D8DE0B4F852A34C808B6A6BD202A02BC52B6139AD891E3FEB667DCCEEB6F98EDC0BA030AC9CCDF994EE8809C97154EBD22C5CF0D6A4998D03D68EE44D7EC518F6AA0A3C877F2FD4D6CFF965BB069CEB8469F196632F6B3E39FEAF29619D774C08D93489886D3076A2BA4C625D8843FE2C7052C7DE4EBE1D0EDA59E971FCC42317D940210649561480734AD0049E3968E55462DE971122828BD9B0FEB65FA4BE0078DCF6852900E7325630EA06C84E2C786F997B0A1DB5D0461DCA8122677334F4797DE776A7BD6A160E5CAB09306FF22302990BC65B1ACEFC2380D89D290C2CBB5115A048A977B18D5D8F3AB7F099529988681791F5F29F1CA72EC129109A44C59EC2449902E58240F3313F8D531FB89494D8CBE36CF9E67EE781445DD00F400AEB7B4CCDDB6ACC83E747480B964B09D349D177B37BF0FC3F4A100D7C0F2DC962332E0B23869DDDF08BC657245760B71D01D6EF6E23092B845AFAFC6545691091415098DD51D1E799145EDF15F4DDFF9B489B7E899EA944A69150834B76313E182B6DF33C104DA2F88CE9515806B93908DE18161BD019B1BBEC671E7D9349BBCF98AB430D87EB6F6A5DD168D2C2AC2C2F6DFAD3B6DEEB1B3DD87FF3AFE6E923509EB3EABA56C9E0BE0D8A99B376BCF1288E1DAED8D16451D429B9072241386AD5C7283D15E3CB76C22E326F03346A77B2F18ADBC88010A61F7643B409E5986C0B606ABBBB60B295B9929997355D6DF20F8F73D2D6709E941352EDB538A16FB59E899BCC8AEB5DFE15FF0DC1457F3916231AEE3B067282D72B0BFEF90860285386B76B1B303FBE2AEC22062B3802952DB5798281B2311C33322CC05A7AEC2D03933AF13BF37E817540C9D5B095DEED4D524F2F4FC7CFF707F2710826A7A681E4041FAD359127BC84C907CAB8539927FBB5CFFA8B9245CD59AF7772282B44AB6A5CAA485226274D4AA1E1D59C8FB9A43A3F29C0D64FDAC1420E4B46D069FC408288DCC757E8CE3E10F0F0DD0CC7BC9016EC776DFB75E11CEC6E6B452B5E3FC5E65F4D6A4B2001BE4983B3644B44F38960418AF98352F410C41BEA460F1F669230457B27E86A164EABA842C4E70628A987F352B66526F974854DBAD3A9FA01E09793BD1DABF1852669336B0F781F306650850B7CD180B7F4A931D0F1336BC5B429CED546D301845DDDACAF1C689C8D42B031918A1049EF0BCB18A516EBE58243636BC6EBF5D69F9C62C5EBC440A8F8C86FA2F50E0FDD9B098C9AE04579B1F29C3B16359D40B3B3EA3E3636692D8E0D8A9B119269A782A867D9C5D1FD040C9F0A92BD289FA83A7885E4742B63377F44321E58DF910FE1D7FA53B14D1971DD922E00E92D3F3BAD0707AB7571BF3889C5B1B55638E6B403DEB34E75D7371BB057B84E46A41D3221FB05AD5A1EA1DFE5312E9F527DC448A503EBCB98D56D7312CDC6002E3E026B633B43902E7B73E85C76E151CA87904DC4BF05C9AB2ECB6EC8AE86B9536D66EB311C1A11DC7842D58069C61902A0E2BDC712EA43A73EFEFCD175395070552248C2516CB9F35091481B8A6CB873DEF9B84E38C245EAD75B8D71A60AE476DC6251EC706A9892752A452EC2F47F9EA2A37275B9F225A077A4F8A77D37024CC7BDEB833483371DD72B3335D7F1E94E98D118CE5D575A1B14062B2A75167AF30C2CEB3226929DF9FF86919F5BC30EEFF7A9E39A4A183CEE71E826E8D2AEC8F3191D78C20F2A32B7F5593B4CB434476324330F96D8023481208714FBA0B7783D9A05D14DCCF2C5C9505EBC86E6348E8E631B2D9EF987103423C47B1191055A0494414BCC6BF0278937AEA5BD13838F3E7643FA7BAA381F1F8B24F0326658B1254F732D74B86D29949618B1DF7018CA0C3F189FCC8BD0A442D47A97DA8CEF514777CB15889750C1D0DBDFD97F9530333D1D3E548FC2DB01F93E8CC4592D6CCD41128DBCE447BE8EDF74C80FFE950CB3E861418CB3EE4E8BBB2CFF81552C89558C1AFBB577F8C1120B71AD6B77E9190F188AF40F6D3D191D8D6B325C0D17BC99CE6297352EAAF07DCE6316C96D8689978D8335C1B09E85FBE93B7BCA1178FC10872CDA846DAF333BA35031E1B38FD1EBD7F66169E01774C9D594004C8F5A6D9EAD688635C8C90B0ECFC398FE7060148B3AAFADA9ECA17605C839EBC34CDD4A3D2753D7034BE87AFAEA79F7C8D553E49EAD3211690148E1058D4990ADA24C12D24BFE756D9A4F2BB470956EEEF3409C0B0FAFABDB70FD2ECC305EFB2E81A3039C6D94426E7649340B1E772DFBF415DC40AE903F9FFDF554F7370AC5D1339E8EE397F2463A5C16D3FFFAEA3940EC67378A88792B033C68309ADC9ABD70CFEE12A32AD3E40839157E29F91C29DD9805DEC5724AEC4294A6D707860B78828CE2F129A74FC0522DDF6E125AB0CE272BE7EC06BCCDB870DF4B18AEFD329C8768D58451118AE3C60133B1C1F368DF6072CFD96C87C63C867F7076573A5C88B28C802BB208AF3B80FD467BFCACF7DB44BBF6707FDF23E4BDEE45EABFC97C061B467EA1C4008DC46F8E11FE06833562D31D1191BC6A4651E9A091E7EB174B7164AA8E26674662B471AD58FE4D1D2FCD216FEB08A0FF28DE6CD5E1688CCF55E26E029E7F21FB55C8F6667B52C2CFB92608D45BD56A01DDD30F8F70C58FE8C0D140D2235332A7A55D881AB00E5A7FDE2732DCC72BF43860F1D21F40C606AA2F03C6211284F53DCCC1524160AD100BEB9D9F4165944B8356A667A2D0A2FF3F4EF65E3418D2EEBDF6F2999656B1C1761538F464456C16DED81F85B83C0C3D84908D90B8987703BA63F6E09DEDAAFDBD010A784CB89291922A61DF0CC00E5CAD65591212BFA75CCF3B79D9CCBA9E6F9D5B4A89AC0657857E8B9E8AA2ADFB3725E751AD8CA186B8022B111950F10C5761F554EF08457E6788A9AC99DF20F9D2B91A33F1E772E334AB2AE2B1FD8F710298B53201C48F3C9AA75E0F534A78A73F8E23EB626F444732588CDDDA60F5C8B1F47BFA664AE02B61F558A160F5342603EED61773D0AC77D777A5093FFF73EE9079B8869227F9E7DF6E37DDCE71DCB2BA16C3797F9895CC55EA5205FAB48BD6B2F6F3B6C80BD9330445054DBF606F530A075BBD9EAF175F3DCC55A798C9B906773D9BA8F2A8E01DD977E3672D2CA8A01D9323E5AA564FB523F250A3615C484E04AFC43CC74456392F36F96FCF2ED97F27E6BFA3CD5E89F6E6C3383016ECE8E999B8CE03089ADFD414F10B6B0791CFBDAD0AD3265B28C8BC3BEC45EE5AA178ECC80F87BAAF4F4DEE759D207A296A97D7CC99991F722597B4214796862841F213D1E31732D3019920247C323CC31652035E7EE895ABC3DEFFBB36AFCEEECD8A8776AA75C0817EAFEF2A9158CA4074CF037CC2165C21BD93FD001EC1594360B4787D17B7E44EB0456C6FB452306711AC8CF537B63E576CE1F3C85EFAFDF7DAF9CB65AA798629972E5A1C6A5D4AF541D50AEA11852F960DE7343C2C76ADA2B77991C50B2A6ECF654AB891DC3F8EB644691F4890381C3B7D89B3D4FAC8521B57253424B7019CB08253036A05C4DEDC6619E1FD29B491CBAD13DA827A4BAEFBE9D62C82E10323B3B5ADCBD8D24AC14EA387BF703B03B4830984F164FCCA399CA0B9E8D42BC2DE9326E052F8A6EEE64BBD04153A75CA9BEC1DCE56C87B7BE762F4435857EB1A94E4403FFC57FAA71B68B3FA5E82B569F2A621A904FEB007DD388DF152710AFA0F628F230B70CF307D33BA60E638BF0F6C4798E917FDB0734C188C2FEA8C8CA46B26E95707381E62EB756DA403815046671CCCB0C08BF3A084A1FB3FF6D73D2219B4784CB46D4C722D4A5DAA56D53F609D7E62782256DB6D6947789E4376B6ABC80142FC4F3FECCD15DA8A06F9ACFEBF43745E1397AE5C51612FBFE27A2A943021E70A94A13B5398D68434BAF7998DF78F78D367BA67CB2E51A08BF95A8D71624151FEFE69B65BDDB0EF9ECE62778272EEE7E7C74AAA075B5361389CF0C01106539D3B28C79EAE12086C8C4D14A0371D56B6B97ECE0447E69EBE1649DF1E96F049D4E5EE16C2464F5BFF58DDA12BBE64ACA14DE63BE84EA64B2CF66DF8C695F2E4CBD8EBAD8BA4168015191872DC89BDFC43E9B17F4A56C3DA1614C0C68065FF8A25835B848FF88A44E5C5A2AF321DC1C7C980B57FD1FEE26C916A398658AC8A6FF908F4B32B18A4C9A9F0C7631187569B7655D28D6B5307B70A19276F01C048E2D36BE301EE7950C7E7C4AEF96E7CE1C9E466462ACDC20CEAADAAFA2358DF73B8B5A3CAC4C848722E1E7A6746039DDB487001CEB3FC38E9ED3B59D35663B01A87CF6BE1B34440387017C1AA962EE363926E2998F6407A23A5193AE71C6C2BFAE52C169FD954E59407D31CD22B70CEA33EC136EEFE9AB35FD3C0F7201BAF1DF1BA4467E11B23B8904A0050D2292EEC3DB42B35003438492E50677F73D7F32F3E06369E68D7527EE07F5063E6C78072F8666B3547FE252A64AC964558663CF7843B05403B7CBD51D8EB9A4EFF5B1B70BD8CA7105202091E13D22812F3A89D0DFD5957A70652CAD91D979F7A5D6CE43FA9EA221E518A8C3889E54F8C04CBE2EF4171A673C8D3F95BABB80CC5FEAF0797A5BC9948298B57B0E3BB377C1E29C2AC8804E747D19BEAA6DBE42E2689574F17F67EE8F1FE85BB6FA8C6BC2A173193BC1B158A2580E5A7DC71E2965996454C9400D2431BCA2AEF1EA4BB89F9209CF0C92A6CA0809D980C6605B68ADFD28EE3027AD8DEE4AAF856A1CFFE75CB347A8C4FAB1555E8A72DC2FBCCB8175E9D73DE8DE4AE271E90C2AC48F3DBD353F619AB3A0BF8A81D3C43CD736D1C77B792475F23D734D33943C7D2CF1E3D92491F026026E1300B1622BCDA54E6A71C2474B68BE624F3CD579D0354E07D726191E89BBE3FCD160B39B0D31780BB4B8F9F3F3BD67FC404D6EC3E9588605A7CE134D71105C5BD14292FA9C16806A0EE23A79973F429A96221AD39B5C35DB0C8A8F7398CE7B2F4879FA527750E0D46924B2A88F0CA5DB8FBBD551CE2485F70208835E8A136CFABD253A0AA7CA92E7302785D3A42CB88613748EABFF9335D9EFA33919BA74027596ABA4A12932402CE37587FE646EBDDA82404BBE6EAB0D32036D622FE588DE52BF61A95A5D5735ED2D7A3F51753DFE18768A213CAE42A93F01A54C43B2386B1A13B19FB97B1553C89AA46A7EC8A2F5B76EDE278F572D3D4D73FEF8D518371B8A4F832C878479DC96B1C1C027C80CBED2E80A41216010AF5F4E58BD002B02BC31F21C0830455D03C9DEF4A9AB4BBBB00D38FB115D9C0B28B6D35EFCC05FD3D695FE0E3B7B18283A69ACB15630659155F6498826DD3A9BD80FFA719887AC9719F20D6A04D1E347321DAF1030ACAC0EB13D093AB1C36B35ED6875FA2119FBC0824422F1BF13C8E1370B0F63D4A6E2A65ED979A3D1F5EE7C705D248BFF36A4C2869221E8EADA7CD9A62825AF6F8FC11C80C0FB64B0A30995D3CE858257B7A973977C5E7F51662A4F5B42EBDDC63FA61E308484ADC881A0806C8B55B6D54492FC582393532C870BC6495A7610D66C5049FDD4EF20D7CD5B0DA34B3ED09729A8F6BEFAF1F4E312FB66C6D9D5A85694EA38A940AFD0DC0B580700B577B0859E51CC25878BC7AE2EDB00119150C5C3403EAB5290B1EB969044A3E2888DB5AD6027910A65747403157FCEE7F82D8C10061B02AC7982C0F8F951CE73FBDEFCA8D67C9582BF8DFE5AA64BF2737886693699CC500C8DC1E8778F9749417EE7DC6BABFE056999EC9E6C72A95E60214491D7C64CFB19829B8C750208752B2C7CAC9BDFD1CD050046D04294754FC2B1AC6E6EF3F8F8F9CF74992D377D761504895F296576F1F410BADF757E8DB04936B4034CCE6F268F9AACF2CBB4F986ECE7C28A905092FD3D4A57FF97C1794E4D2EB82EAD8E17A9A430868E20071F88AEA20524E53859B509336DC89C4DAEB17FCF3A1D33772293CDC85C05E9986EB577F340EA9B5A7897B5459B3D0AEDD84887F7A18EF1D66EF26F0EB52EFA43BA1B2E3C0B570D856D6421103C6D9F0ABC98975AE5C136F1919FDE90B89173F41B420DAF4580402E387C211CFA089650EF9445768EC3BD787D4D9C0DD9B4812D5B1A7277C6A35056BE8210F2E39565A2EF08F8A708BF400834BCE08101762BDE1E9C8C8A58183E7E7160D88DE87BD6EF975223CF7CED793C1C77810831EF49CBD96CA6932F810812E7F847A169529B6A3CCC30FC68BA9FF975E68C8E98B53353BE54C4AD75297DEFACFB56D9148FD368EC36CD0DD547EADF22DFB5928FFCAFDFE1640D97BCF3C23B2E3352D55F2281AE3E64139012D449AAD45F07635D255D127B1C02FB09E211B192926B52E43FB2844EED6359A6D71F8270035B946771E3605DF6B4925A97E8639217721ED48D5B5FFE675FB833E010E026AFE78800A0DB13073542C4596CC82075C6B65776287535244D6CB5C06BB133EB264AD1C36AB0F586FC5D092267C7A64A7936337D0333995EC354E80F8EC7CA05943224C6E56873B2A2CEB57F3714F937037EC7C5749B00E4C5D58B97B7DF52A9470CA816A20B2553DB8CB143658D86F00D3D14DA6AFA799486C521919868BDAAB81BDF44A4BBCC17CF961F7653A93961E918D677E001FFB2E24865EF08394C3F2A8AB64B31D604032159CE3E49A2EE3BD565821DB37BFAC09CE181A7D0BBED46CF1C9310A9152B512D0C2A74D1349EACBFD2C984546CB190851ABEC08919FF407304033D0A92D34ABB8D7D52DF86AF07D86E17BE950DF82FB3051FEF82BBB54F5C21B941E2C8E3AAAEC8A3BB9848EAB425779A6AE138DBD450DC1FE040C1C4BADE46B7D3D98D10795EDC0C510ED21A8FA5029595D44C77736F780D018110EEAD1E4D1FB2D66C2EF4695C899A9D658E8C74840F99F3899B7C3627DE9FD43F0C174C159F1B434436E6AE5BFFA2F86559452308CEA81ED08841DA3DCE69F428FB77F06F81CF330B29BE11EBE6F891D14185774E1184FCF522E66C4358BC3420E1E66C2F9DA380CB4CCBF2EA1D6D5894C77026BB15FE8193C123C3521AFCB12E3A5FBFD21324C7533BEF0D865DBCA593D04349E52E390D8026DF119EC8CE34EE0A1A2FC83BF7A5EF53CE72EC1D211E3B671026F781D89C2695F2D9D3F262BD679861216543850BE1C0DB02818824D3B490E8246272DB317E96749471CB47DE732A15DF843ED7F08D775C4DABF825A3305DFE5007E6470EC550F309BCB9776EFB6A69A9490202F85198B6C0279DB141888010D92EA870FE8D2E1FF27ADAA94FE3285495D75905FD430E071CAEAF0BF9833FEBC7F01D90BAC6DC2C4E9582D23CBEE9CA0196682E9CD659F7832FC84B970167D644B8AF9C9FA426A576B5C2864334C830E2A7957E7B9FD59FD87A33B35E830626A79724BA344D07D141C293D94E1F5946F4C5566EFBE07F5849982B29D004BC276CDF62FD4272EB0DC0D242FA910CEA0A67AD241BEE0A554F2DE2AEBCD54D7AFC7B91D89598D2097F70AE210B3C5B65F8C3F83F58798A060FE711DF77D888480E686EA6BC7E42AAF4DF7546B5981FFA262FA53D267A72818D9677384457D16EE7D52D71AE647B44115C6F3AFC9A24F3E64B09673BBC0B98D74816064D682B4FFD257F4940027A873C048C553452127E20064C4440D4F42EF161449793A191FB21862E2F2B43B0BEF2EEE014BE9EFB63E77C1735E8228C6B7D3532FAF1926A723C04B4FC941500FD325BB16DCDBE021671502732FFD71A69D260511ABBF811A9208EAE62B639EBE641B8C1A0E0787D1FC107F6B0DA7F1E692E543409A59538B2B67699AC4D0705E26C375906B0912E5A85C582F4F3E41B2F565131C811DC496DEF99F7FE2ABA5ADD4A9D3859FD45A91AF1C4BDEE503A7BC4AC549C285F9C74362A359E74DDC73B36199407BA597F5CDBAF40D184EE78769BFECEE9CD56DCD4FD7171E083D30FD39C8D5D6810E03922C3586A2F90BC9FAB96623A19B4A97E920088E0CC94429C0CCC93E1FFE1408AB11A30DAC5377CF65ED70E7D0406F8C32DD1C61F038A04ED763EB5FFC76E27574CD0791AE1163E522D094989E82CECF4D8EF4A0297470A34F2C97AB04D69A1B307D824F55CF0B6D90B8F05660E2BFC13899C807994B0A5AA743836F57F969FB987CBD044043551D172CE89990AD0D3226D05F3F8031C0A26302C24A35F9FFB3515C975EF426F8BD065B6AF3184BEA309B8EE438575DE0F0DE855868BA79BB8B28A7CE924ED65A40AEBB445B7A34368838FFFED7895D55E6E7633D3B0C2997C3776329547C65627EC128267D4E5E12AA1E929481FC4FD9514F9E94BDE47D49202746CA18BECA1AAE7F0B56140C810B21BAC10F1BCFA4B7F96127BB5D071B90A649D0BBC5FFEC098666524AAB20A8E07BCDAF753EE5133F9CEA62D797DA557C55CCEFB772B4E624C1314F1CE2501C3D2ED6CD5ABB27DDDB5A3BBCB4E6478DBCD4EF0AB12224EA110A1A1629C54FF93EE82110C404F254462BCD89532880CAD951755341938EC06A62E59D216A7A7D408B2B02F0E2F96F8B94B4DBF591C43538F2381FA2A0B7EC7160156210C4CB2F052549154F7E4C85BE4E8F1EDA054B9B49C4BACBDE9F277088189D75134554BBEF871F87891BC0D4EB823AB50C7398A8AAA9FE950BBF61D6EE44840A1ACA3BD87BA245D2E6BDFF1DC93AEDB5AD19B8A78061C614DD7633D24F9255EE388741D7132E95C5E4213D008CD23FEF6B1FE70F10F8B23082929373B5DFEDE84D05854F18E2CAE575087DD5F49C473BB577AAEBC919F87186F2DA7B9BF06A0E8E50DA527E773F0998273F96BFB63C8DE3CBE3E3DBF62E67A4AF01F9FC35332AEF92C63C0DD258D72D6D6228C0B469639BC483988B48A8769FEB426BBBE1907530B5883E14EC8068B9642D697E65D52B8B736DCEA555DA1CBBE2B0408D3FB3C8B0975A0BFA74FB79091381AD7735158A7AFD9731FB5E0DC0B892EF00BA2DCE1542A4EBE32F73A6A61234D9BBE70A2939D70FD67BF03BB7EB597840377D91F7020B3A9DC5193795E772B5BF3F35EA46F1F33BA30667D16BBD4670CFFA03E6D5D04777378F2937BFCD139BB95F703B9B3E0565A22DFA97E7959D1EB16E6D923E24377D664484856888E78D4BD67F40801F32EDCE08880B76FE5EF32B2DE2FB8B6242A5A55BC3F152D01560F55AA229BAC874C1FCB906B44D9199C28054A3383290B7C02CE64056EDF06084281111DF1ABEA5139BD1340D8D556863C0374C34627E4233BA4EA7D0F670C6DF22CE4FFF1AEC8E6974AF69813444420CB6553016A16D717D4C0D19C284E80404776494BC52E9E961FBE10AD024E15F7455F8B63C0507B3D275601E723528A42F73D452A3C47ADF4319FFDFC89FCCBA906ADE92DD99EFDB54977B3D73324468203F396525FE62D9C9B9CAA891F8AE9C5A384906C722038C08C6FD783C4E89194F99A260271D7029916250BB9B44D8AAD3F7F0B427E97F3ED154284CF1A3A902A89DCF5CB35BE10424FACE1E0FC1FF8FC9E47A61FB42F8F22924BABF61B9FBF00C673203ED3D10B74EDDF308886913FEDA3F2AB70CA37DFA53E4C61AE102914412EE5C2394CAD490ABEF612A2B5B8B8B46DF63A02D549B0632D18726AB2746C964383B9CE9C0A2E0E4576DB9F494A02C92EE4C7C7FAB3D023E65DAA32A65CE1FD5B063ABAC752A667B8C46134A343604375B4D72A8DCEB98FD4054BE5723C686477D8C0A64A21B86E520CE806AD66B0635F0EE13146E011557E33D0E0FC3DA1A4118C763C0B197480F20BB21C22A16892DB7FC4EFD71138944696AF4905AA40AA2ACCAB8501874085C113ECF9476C739915F7519BC4F3190CF18E2CBA66EDB0173B3F990874DBD1DA8307C09E6C4461B24709E77C8594434676E59A3F02F0E4923A039219B491515C23FBC69ED0237A4BC654A2DB89F7F5A6A8921D4DD397B18D4B89CA7F0B27BFF160D401A361CD9AD71C4EA11A7E0CDD69315EC5168F67D711EE727EB6E45D35C2D5B0862193B59E971149A2AB8E2CD72710820FB64EDDDE0117D7C714BEE670A40F083C35F72A9F330DA0ABD07654A6D380F858C8D061694BE10A939B34A4A56B241219056280982FEC832ADA9C5D422D0CDEB3532F9C292FAC3FA39D358D6C7D66EC5568DCC69C5F20C130B50B91E4563E2020FAA457FEDEB08F6E25CFED21055CD6EDC7A78453F33DA501EF535B65B67CB8493FD426A2A5062FD01389FDE98622DFC68E304ECF1E42C62111CD6734408D7AA216F5ED6A764214549992A29225CE66829F04996C3B4C4F64D99FF44C0EE0E045E5D038A121252797EFD52690A0766077CE0A713F1BFEE779492B482BB07EFF89F8A7B7A6D98F29A57B1D00D4AF12468CB60D8397562DB59FC7BC97B996AFD3B46D04D5A39D8A00A722EA902C5004C535B7BC031CC82A06AD4DADAB9E5E95AF07DC8DE5CA9241BAAB8ECAF99F037262636E56F85A5AE2D888440DC5AAFD1F3FD649E283B0500CD3B7048E0FA47D1E0A105BDA6553BD3F6A1270155B8E29534438155446E4B88866EA599F3267891447878E947C7D53A66FBB4DC21B19F513C37ABF9171D7C97BD5A9292B0CB523FDA66D61FA7D349B4678E366293233C9E415539B82AD9FBEBC7F7D13102831CE172F7C9E944CADAA776214E384C1A2619910F479374AB52F79FFDCBF06AE4D7354859DD841501EC2EEF43731DA1772D96D75D5E0423B7FEC25114E43AC715FE2BD8D13F602A6032F93707F07B5C3B9D7C35EEC7E8371353EA9E62C4A9956C02CD6D1EEB2B9C898A81F8DCA1348319EE2F6AF5AE55FA9A286DFA38A6C1B9C03BF71E74B01A0B2FE83F4FACAC33853D78839762BCFFF856B09F51E2B40BEF9B6FB0A81CE0C67E5E26B6743561D69283D7AEF41B1670DA1FDC31F26F51059B55F19562238C1ADE312CCCDCF84E8D518B92BB2826F7D90CEB85C2E5DCC4773898CFD005EE379D845232BC38196CD76D61C810ECD27CE7A852BE9D7C3ED9913B80F42A441D624443C0E39643B83D2426E8C07065D18A4992F39E08F21BAFB154C85E2728152E2D9FF78E7057338BA0132DD617403B5D412950112602A17C7DB5D3DA15754E33C3B25A475024E19249C040C8E7B86E509D742956AF716D176E34ED609E3ED92706B476F3E4304A48212761CB557E83519C8D872129FF8530876870F32C29551B9DF1738D3B9588C86BB07AB731472CAB5934682E7F3C1F61C936767EA98B336CA2A112B760931052B13264D7E63919B2623A2283A3709962C0E2461B143D4D3516F13F2746B038E7B1BFF5FECF37D9C7276D7679C806C94E54B2492C781DEA73FDEB8302A910DFFEB56B0A030771405A6F3A268889472A7E94001379622A1C77D3841B3194BC0126CFB529E93B82DCB7AD88AD6A7CC3D66FA0153F32C4022336DEB4E6666100D1D1A9E5A2AE58594D5C78EC814E8C70115255761BE2E129989DADBA468E7D1B10AE728C98AEA2F198F6E390C45EA517DEC917F529609AA94ADE6077C651FAED482AA8777CE75272EE0D106D854EBDEB0040EBA01883A5680A5A54D20BB774AC831203FA76E9D60B17222A212948C12F450D19C82C6482101ADFCEEB7C74B8BA08359E1FC629692A9AD9008CBEAA800B27B94822EBCF3847303A9110D58A3600AD9A6546BA6EDB40B5884B123D6470743CCF3D62E3EF9EBED0440848E9FCB3F5B8870E15BDF0FC929D96C26548F7BDAAB4F75E0CF4F435A5D243D0BF8C9199F49F9BAC659B9270FD388A5A7B0F3E00AC624A5461E77E6456981465696152F10822E42A7668E1876F101B52AFD84E2D5DBC420226B40BF657453151B646A68F94E66BD6E61FD03AE2D3A991E7C45B721DA59F426A18D9D77E18F97BD0CB418B60B36BE8BE09B8D746304E9675C434C1F7CEBAB2D77FEBE1122A2FBA24FBED9E7CCC483E4422F5F43F3057600B84032A124772C952B29A929082FE9C1B1E12B774B4842D5501D848DEE1DF8865FED115A56E9FB846B6F2C24296CF388621999FBE4919C0D83E743703B44CABA13ECE58ADE04EF95DAB0D579D4F6FC14533C54848DE786B77CCBFDC9150FCE98D45C6ABDD36048D5A5BD93ADA5FB60EB3B4E6BDC2DDEF9A59EA84415DEFEFD13117C6C43C23D8AE4F43AEF9C5CD77CC3D96248D81132F454C51731F01892BE44C9DDAA2E19078A72B9E161C38BA8BA648653A71A609416DF6A0842ADADBBEC910B12839C7605E30FFD389CD86964C8803A711E7A16AB90693A6BDEA4DC7976E6427CAA1D954835988A4306A44D158BED7FFA2A6AD4862F5F47143B98E104390B549269A88D49E1CDB70B42BC7B5CE6EFC3DCC1DEA82399692C9FE9D438342852A06E0D16AB705E675ABCF1044105C2D993B8F55FAD44FAE3F1988317004E9E18BC5751883B8E06FE7AE965FD7F5DE0651974D0EFE5DD5F4958A2C9561CAD6142A4E6C4D95B956C732EB5DE7589A400DDF83D224B25B393940F54EA9B31CE236393F1041BE984718802553AAA9F2B5852DBF4C151C5EA4FE1DC6D56F5A4CF35556B4274F2B1638337E74834DA462FC0FE91E191154F44833E4220671F1283A544590503C86EFB2A22948A5C1667FA2508943F57953E1285C8D80820213F2828C0FB09DE6A4812FBE10E83F0987A19A1C0A2E3841D2CCD81DD391F48DA96C1811E1050056D459610F8C0580B1B041B8F508848E2CE06876BC9DFFF38BAE90EB9E7B8EB84C1CEE59EDFC7B46122F2B0DD750E1F687C02162E2CA58F09EEECBD85D624928B28A7466DF110E610E2DD55D9AABA95A9FC61C1D25490F95B4AA045E49F3B97D08512A021B7AD2782D4A6BC808857398D05EEF7ED1889694F02AFC156B24D3D49F91DABD4FC4C3C4DAF9AE60FD8438A02FDF533098337772D4EA777224707CF4A38F7BCA9332DBF58A4006908E523755EE54AA2B7F4F0728195C6B69C586CA892661509152317EF1EF16170187EAB8032E3189976FD5212BBA9D3EFF6E914DC0AF8C600596F155AE6654CA1969F88AAE1E88E1E555A1BBD9D45473E23B3DB2D6C5B4FB30831DDD27BDC2C55453FA989EF16618DAC4C641171FB159769EFC550104CCE2A23C1F66D41C96CBB87E71DA482B346009B2592A25DF6A466DE923B40461C5CFFD811413EEB5B2E542E53D7A81AFCED87437F925FD9B0A808B98732E2D373A68B468E1F3ADA4B2E100864A4083C7ACFB8272B317E6AE880F788A1313343138483F1B5D8182653F4539E88C3896B991220C37712B22C4705A7A4A959322F3BAE166CEC59F86D69AB13FC016A128D5EA371AA3D4C96ECCBE08CA57194ADB075D21CD713397789B6AE144A0DCF07EE8CCA7D35E352AEAEFB8BB5821A9112F07B2711B14093CEEA8B5C741ABA8B2436A0B5B4A95E27D4500669CFFD3674582897D1028BCCD4C40530333E85FFC74DA933310205513DCD03D548287D6F96210CF710D1122875702330295FCED0CBDDAC00BAAE00CE339D9A74C9F56796768DC72F9659D454310E40745118EC70C97E0FB59B11191C6D2B3C9CF097068FB91A8330076606647A6D26750EBBD5718DB8FC025D1D4317F114318CE130B4B651F23B692BBBE868C186062DD3E6ED81A2B9C2F703F0BE95129BB9D622D7CEF24B79C2F0A72FCA0E2009FBCE491C54C55942B2CCBA4C9AB682E0DA76FE4702B77E08DD4F0A770180DF56B2F60EDE0647138AFAD9A7DFAC6AA306616158EFB04A70E3580C3A938F1399719D73D6E311F5E9BBBD9546DBB394ECFDA4C4E7F6B3FB7A19B30D782F212E8588B45AAAD15C46BF5EBE26B88DBB4039594A6381AE325EB402750BFCC9198B7FFB4799E44810D960B424DAEEB03E857F4740B215BB8982E00B314780011FDA28C401DC64515B20F55F2660470E5AA162CDC75938C15C16A16ED494AD1EC02EB5B267FFC71F591CE2B836FD4FC32A1987B556210C58E0FB46A27B594443F9561302E42D7D6EBD877A47C7F221BE033B7A8C3B1BE786730032C11C75B5CFBF9A91FF70709207BD69EB6DA55AC39C2C6123035794003C11583EFBD082F4965AE1C200D39969F379F0822FAAF354EF838AD581A2221101F2B62175099AA1F06BEFAA1BDAECA4D7C30689A86BB823390E070B4FA0CAAC353E34CBFB5771DBDEB2621A28C96FB9D84BD30A1ABF027996C537BBE6ECAB8168F1DB5FE7682A233A6E48DB3CED47836A753BF546007F7BD6848F51C49091C6EDCF632FDB492BDD5472A70F3BFC1714D9050F151F0A1205988FD5E9D661159C5206A0A82EED70BE202A0FB7DCED1BEC9F8E41A5B3825C1717F76FC0564AF0342AF94557BCB2E570D9CA728479CC54CC0D7C33489AEA22FB2E1C652B12B8A10899499A7CA56DD8A32630F788E754081BB733BEFAB26CFB0A4E2A96294E24BCF62385A94A732B2E181CA0D0B4D73608D245C70B9884F25B891AF570F2E8ADB4AC1F8F23590A8065F8D7FF9FB3373304AAAD80CFAF600FA8DD3A60A734BBAF91EE0BD8D73841EBE4ED7492066D3B61FB0FB9BEED7C5B97D14431A6CC08FDBE6F934400E50962E64B52E1EA802AC48B0F957AAC674AA2F78C71680DCE2CBC9356F2850E7BF1F69B84AE7C778F05D22E1690BCEA11785AA320F1AD9371D2A9167C191E4F1D10387AE18FE1E1F13CC056C2A6358C853BF9D53B1545305A9569375EA178ADAA331A2025DBD527052FC920FD2024272078FBB7CDF37E8A4400C59E933C681F1EF8465B051535A29D99E0ED87A62977F6E0266C07329BD6C5E504C3CC874F04ED56D40CEFEF9352C12C5D65E7101635E9056511B04668BA7414F1DD96C4BF0945145A982A08406B9CC800CD03B524C69ECA49AABE55421D35F1B95B0814E652949732E75F47B05A2BF833A16FDF73DA29413B1F0C7FE63203F678193DDAD2834FFA9C5209E73CE206591C4B7100605C24A5F0571FDFCC0F723E45A7B9978664F82E51772389106FED2B371BA249525311ADF4F1685FC8F83620B539C8F5BF51F71BD9AA7A9D453B61C5D03ADDA3619901A57DA4000CF3B474684D39AD32A34C8A086E762A9DA9DACB267DF8C14023CE3A101EB43FB61C505988A7BB73BD31A9BD08E6A9C849E9FF5DA1D4D83F11E8459FB3A9E18264894814255A0B14A169BF9256EC1DECBC7130F2C6D6B60D9FF760F952DD7E352891A1BA1FBCB16CAFAA1CEE3A162C8090EEBC1E2A2766B7401BFCC5AE357FB77C2C1F4F79101006FF8C1EC77B28BB7DD93A4E53255CC5E09CC208976F9DF938B82392E49BC30311BDC1B4AF045D7BB004B493147A3F17B2D53627E3968EF5824425C07D526D0395067C42DFEB231BFDAF9E144A481825CFA386781E6A81917C5C8575FA64967F084A0070A31697C9FD7E50E70B29D0A0F0EEC647F4BAA9CBE748C38BFC8D6F9E754981B3E594E2069CC369BD3920ECF2C939718597EAFF9B724E9AA50C4AB2AF38BA0D8AA097E5C0E703559F3883347DFE02EF4593F4F757E4A2A5B5E158714F8EBE8792DE9196A8FD380E96C5D71FE32989429B896BE3F8E630ABA89F50DA7FFC1FFA17426FCC15C35D815A81D25C7636EFB467B9F02F03EFCC13EC347F8D878373B7F4B84452BC4833CDFDA0BE72C6DB1639AC5C03A2D4755FD2E7385B5F2155D222D2E000A7D15BFFFF1CD5360D6433E92E5AC35A317D651C3B32C8BFC46D1E10FE8630D0BEEDFA0E279ABADFC483D93E44CD0ADC9B4D00A62812327D87D53D0DBFD7BDEB54F405908F4D6E2B72CBF02AD175ED9C91A32D26094CCE2015371DBCA205F0B9DED0AA480F75F617CEBFF508CC3D1194EBD4364509A76AE191996E559C16D25F729FBE10B77406F07A7214DE60331FD86684612CEFCEB6AD40AE6014DC453324909A82D5D94DCFEA267781756BA642133E66395E26689DB35A69918F57F52F6F0354B09C7CFB6486381772D2F1D3E2B74EB6D2D51FA95FFADABA1305FDFC4A1794CA25EBF37576DBEE1FFDFA21A4B81256678AC4FA88C1270539B5EAA18A94D768A3D6243DCF4C4CBA018CC34C351B1E1D5D55D03F7E37887065535CDD72B6A5AE1547393B4C083AB803B594808B11ED8EEF6472DBB399D36E1175B0C69FB92C67B66E34B693DB315F694F26F19F93FFE93C1F641FB79AE2C19ED9CE68FCD69F4B6382DF09443B4A93DC3BF628EDE5993DA169DFB2757707E1AA8627282587DA151E39A375F5ACD6B0BE618B8CC47FD6A98C93227E1CF93A7C9C0E4772091B97BEB17DF6EBEC60C9116E11D11D23DC3209D504AE3325233954603CA08DC0557BB80AD372FDD98F5F6A387424AFAF50DD7D4CE340EC2F2F9BB4904DB24F6F72371F5677DF30AF4C8BE2B9A92DE0A0BED322360083ECA93525E7CDCB02CE5E0C75CA84214136F565AEE01EF4B5346A00906ED91A2B701B380155B172AA4A445C0017C91D9B996CEA8E4C8795481A887AFE7C4CBADBC033C028BEEEC5B462A59EFB97BB8F957BE27EE04F870099645DBE82C56855CC410C9FDE0E41A542036293A66A651788B56F4C9616F56FE68048BAE9CB917D09FA553E05D1D38CD8C4947EDE8612F63A0FC6BDC92EAC474AE1FF8DC951A34389E76FA57090D94C4EB7378046729CE6E67453117E2B781329ABD28FCF25D027CF431B07DA65EDCDFE70BA942C47C1D529D4A30830173ADD45C7E875CEEC579055050C7A9AB718C777FD80D251FEDFCDEFB2B4F5D442C28723C70CDE5407EE0F3073C6B15A7B5A708BBABE843C23973F5AAD96BC9759BE30A1403860CBBAC8A588D60AC59FC396656C7058E23B35F6F7C593A0E78E2277ECD7546B7B934D4A1393B5D7C03C974F9A60F1E605C8EA79505F6DF2415DE2214811F1614EF6702C2F82C4181E079F1F283CEAD0340C29AF7528FE9F1199224BC3264C7350D68A20631DF95F4794CCEE3AA86C859AE17ED81C78D2DA3BD50D7710F03C524FF5D850A5C46EBD784EDEFB75A99FC687FF7656CBEC2B6643D8BAED338F2632ABEBE8356E838E2BCD51E9F1EEEFBA1C9E26B8A4D1AE703A0D798CB1D866470686DEE3132C2B905C4D77C90CB067BCCFADAF7F778E7986C04407F0DF74BBB66DAFADC2619E69227F197D13A5DA20743F168C978FF3CA68571DCA47FF59B23BBC8FB905CC39DAB12442A09C4B25BFA182511087BA760A1719A9756943935709580A27D6E5A0DC0EF74CC330356334AEB8FD289A9EB0415ABC9FEDAF57CBA1E4C85A9B30D497AC84AFB780C74C1E140AA9DA9ED397A906613B84E0BB5D3545A7942F8A760BD8BFE3E1F32EA644CA2B503E1B2A9B4F460329DF30B68A3689F44D66E1775E2610BBBF606E48E06DECFA1DA184FFB230707FF733B6315EF1E5FFA72316899EEB7617484609107BEC8D880F4DCD398E38216E30CDFDDD7EE6C3565364C9B6210D6618D4136CFC308BC40F6B45B44CB92A9C13352971234148E70A4034BF583048D360B439C48B6166231510459D5543CBF79B034EF00D13F47D8B87AF9C301D087235EF933BCAFF464DE481096FE76A033CF5A8D5786C12E021FEF3A91A7DAD43EA79F376D9B9D24862E05932CD91A906376A12BA926EA28587C76C77F352A8C0D78E7F00626D0EF9181DAB153A4465EE9BCB63D631DF4F7606042FCC6CC5AAB0C4908110481E789DEE1CB57D25CE8649774CF3964B1E66B25C087AF663119EA1E35549C48D9CA06503582533D0FAE1B2C66AA09137BC79B17F377F2CD755BED85648FDC709B32582A95CCC0017BFBECB60F635CD94BDC48E6865076206E4D654255AFF6ACAD669FB3E7649C2265FED22FA7D4AB32344C229543025D67CE1E3D13F14951AFDDCA0C1601AEC8BD15B70341DF82EC8806754DA68373060E107FE3933D990A54713991B642C7447C3F46C9C1899D3F010B24FAB433FBBF4DE60841C7C0A9BAEA5386CEAE912F8BE7E7AFF436BAABD5CDD4B53783C5AB68A09C042EFAEFD7558E22019D7D09BF3D9C1C3A9E1112345866124770343C01AF29731FA0F783101A281E0C0F875256ECDECD654F43A2C6986C460238775D27A153CC6B6B440F7B924DBDFDD13DFE25852AE8E3ED848A8126D312E805FAB4C7E25C32CB3BA5913616BD1DAA8D9CF56AC56CDB39EAC91091E3DA57D3E225583BD3F380118D7CC8ABC91288C2232EBB871EB5941FA2E41825593166155E4BB4382FC22392C14EF895B81132E6E6144F1935834BFC2CF736FA38347EFED9E218C87174A32EC57A9816A6B79B064DC9674F8295A066556B35FA87F3445D917C72EBC1E9AC82EB5FF63469A7C2037AEF360D4F7232A7E6479C6EC9F2913FEE31C203F528DBD274C0F41F899FCD776F92E3D141B5333E587CDAB2CED503EE89DE2CD182C5EE91E073DEEED790DEC704A43B22EA7163041B41BC622954CA919CD094ECB9A3CF86996E4FC55A2FCD382AE8953C7DDF6F6AB71E5814E79C3F9090383BA156F0E9732921D87A63B06D3676D19ED54890B371785CA89C59A6BAFA206DFE4F098AAB716F777AA050258D6CF31C9567BCFBA9D137A62A2CDBA3965D3AB6932D32639AA8AE011D288FB66FA70CF63C63937E22CC156FC3ABDBEECBD738F05A66AB6D95B545170043D95F7DEFA99BC193D8E01A7E29A6717483B811C9E18C02BD2EBDBC7A2DBEB03B13EFD72E84F33A8B3AFE168B5C25F3096DA2090E85AE66B38FA0E58779D7C4393C234EC923EED783CC62C1A230EEDE1E41C19D8EDB09B3791EC441D588EE9F8513EF5DFDE36ED01A2625921559F340FF4463F9D259A478F7F428EFAE64EF8DBAA1A4885FE1D7835AB9546FE6A8E4177CC910F0FDA77042BC0F1611A63562789B3181A9DBD1E2DC15D174E61B719630AE39FFA941A6D0A397F012DB4BB76C016BF2F5B94BF41E82BA46D30AF3BD937621BE40B846EF12573323FC3B0F9709823404725398F4C1BB3E472606CFB3A271263CFFF778BDA064BD5C7ACF4F753A881FC91AA8BC2A794F4261C273CDCC7E1CF6A364D437F9D0DA4D1473244E92F18967796AA086BE27880662AB2764CCA471D1849A92D2A80CF9844AF8C07DA22B948DF6E8903330A3900F62AA726454ACEF5B5E80A4A9E1BCF7F388BBF0F3B4FF6DEB4E7C88B51D6B4D46A9374D6679CBA32980707EAA53FD29A70608E7F167A5436C942234C375AFDE7DADE5BD5EBD82CAF11DE5271A8DF095EE9F0BE4ED3F0216E0FBEF4B37890924231A6AE4C32795D84386994FD79E919445D9E4A6475B3DC493F103DFB710F25F0DC2B2E7E6899C7A0D380687157B4120B89F98D4727AC7CFFABD0BC572E137D2072C3B736C2A4B1ABF569DB4595223E38D91AA2C2873A0DF4ABA7B93C6DFC459100D5D3FD69D544F427987DE4295361D6971B9A1CAD7ECA9B9D626F65C09C8EC973614D1F6BF20A754AC5BFB04473B0F9934D530FC5998E1A07D2045DA9C7CC5819C5A768313E56F2FF27C4B1C54C8B47D472C8A5DC1093568D3AC30721E906B0FFC0BC8504738097227DFA226020C5BE49A0FB7BC8BFB46430133E6380045480672FB6379C687A62D660E822500DE2FDB0ECA7AB7CC2FDDB7FA0188E745EB86CAB6408AF06DCCE0FD068554FF654C772B0CCAB1E95586D385751514195203462734222D4254B4CB3B8DE3B8EE0D7C2C91BDB24BD50799690CDBB5C5881DC99294FB29AA65057A9C89F422AFC62E49BFF5DC8958B14F00300B969E4FF25CFAA99D280A8D851AF140CA3A174633B27A781CA49357322CBF298B3AF534CEA6C8D40BE18D4004719DC043135FA0E1B115E56956A37F07DA8264CE64A4A4B59A5362CDD70F11FE71455D18F275626011E0721FF8EBD673102D3DA599992AEA6902A50E59B8FF16E7D3BA9618A0D0DF189E837DEC83A875FB6E041629744A4FFB446ED5A1FF2B464E8B1D7979BB441417A8B50788C0D01B43F9F290FF69D479D993B08BB7C1AEC648617D582E09ED023311D51E21D0F25DC849B3D8166CB9FBE185AD45DFD06AEDF5955E116DE35D317A35A348C19B3E3F523B7B7A90FBED39BE377251457BDDF6F148C1B2F7FB4127D4F9A50EBD5560CAF588367587450396308ED09360D834BBD73C49B16A88D7D68463BE078777F3BE5C0E5268E54612CA36F7B458228E824F5BC01FC210FCC474C20F60DFDE4C67E6FB3E4790EA1B740D5FA6D35B48C4CDAC173E1D6762325792D20", "testPassed": True, "reason": "valid signature and message - signature should verify successfully" } test_shldsa_verify_2 = { "tcId": 12, "alg": crsyspqc.Dsa.Alg.SLH_DSA_SHA2_128F, "pk": "7142EFCED1DB5F220192D205CB09925886D605FF05EC93D33F993E66450B3197", "message": "2A2C684DD5F45BF1463009E43100B23DB080C321B61771F6BFAD8DF3DCD391D1E4EB428D13428048D37A6DF2EABC30D7FEAA13D9CCA9A26DBA7B8F563D2E6BB422F3A162D7B1E7C45990CB59852B724F03CA224888B4C4854D1A3FFB06DAD99FD4F31D5C0B34A220F29B8D912FF087F976963016CD40A74050AC967AD2DA5FE722FB490C24E9E534E1EF892FF41532E49411D566C1FB9B1EFF4245F16983107CCB82A662D41B0A4CFCF212685EA782959EFFFDE3562A69C95E1D282F35E227F358E7D777AAD1E391F42B912BC4F93B27717BD390776963A2F95133B7ADFF788D1DD7629ACFF311718F754CB9CD631A92D5D52EAD6F44CBBA81A66BBC42730641E55E8FDF8B11FDA02943D54224E548650D762BB4405DECACB7EEACCC933AB565B7709E16C82808018A6F0B5BF182A92D72FFF6F8D9BEB1847457089413870F349FC7C4CD12BB64046E0473F2E26004BF83BF54A36F542C7C3EB1D12D2C7706FD61EEBCF6412CEDC7A2654C053BEF354684350C198571235BBD06FAFF830669BB0AAEE218A689F48FD9D91492B0E98338B15433963210AC4406638036BCC6A1B6F7FCEEBE28E79BB8CB3F2A31B529BF3D3DB6C624BD61B8F96D0AFF4242C0CF040BC9BB6F27C0EF7779F1F8EA09194F05A5C2F78BCAAC80B36C167E175F14A9C42A344A042F64FF344291D03D14240FEC225E56EC84F93855CEEAD427F431094A2E0C0F18057164FBAE7B8502024F9D403D7349685ED8D0394C4F769360AEB0C794D38CB2654C5F6BC7B4C4553285A5447E34D5A5F99D1DBBBF746464DC2BB073D1B787A7931C75121842057B9490AEB1B453BF1121817F1B7A20CFDB5E78ADCC3059E6E13659973D46F72678B997DC8E50C3DD8AF8E1CCB798BE012B59BC0A3FBBBE13701FFE7591DDB7F2EE3918DA7C4B299769B8698B44C905DFACEB75F539E66090941327B7E72C95F4842596BD786BEDA04FF5F0A04C522798D7E6A227D23C1885F7904669EC788D5958B5DE6B62DCC54F134731516B5821DA7D13307486EEA96291F99A3DBA00E881475CF86D2DA4AC075B28157B9EAA7E91CE0069D4F9D4B551230B100EE4207829C3D0FCEAE9F0DAE6E82A493B3FCC6EA1077E5E3229AB524346E25D088B9431A46455480D4B86102D3393804B18FC3380139BA316C5DC7E0BDE4770FA1D0E7A68766137734D823DAA95230FA8B7308BB7DC7A1605FCA7069CC8968F8831A650423B377CA3B310FB2AA1A0BECC7947A16DD0A2A06D51B59FF205EB8349ACDE4B53F089EF599E5B597DE867BB9C9A0C884CDF3B667CF941CC2B901AFF0D8DE4915C3C58D8019381A9371E9AAF1DE0300C05F9112E3D3A87ABC88B82DB4793781797849CCDA611815D0D79A104A50957AD6B629286A57C16F909FEEA83F08F23D8233FB8748E9C6E977FB6AA543491AAB20E736A6B6B9C5650F92B6915A90013B8CED59650BC6520D6CDFE22FBCD0F24731493840447F1AEB98F75D9AF723C96A2B177645805BE469277B25D1A55E6C6D3DADB513FA3C52F322E9B0E03F898882B1978E293E2FF4F66D327C97724DD549E79D247FA67AF1A940B475854241ABA402981F7AA843FA522D6B9EFBD593B7986EF331DB2D8B2AC102266D38821251FC2E523B39E6344D2968520AC14C03DFBDFCF7A7944DD9F63DC205BEE57D62A4383CDAFFA541A49006978FA523C8ECD6C11BEAAB265A9EC72DF77CEE764AD4A91D75D3BE12C4EB98982DF22304F7FDBAB08BF9BA16801A0BFAFDB490DA4CBE08CA84AD1183AD52BAD5F13B406689B4E298572B34439F3DCA87575B758FC199C37E58ACC9EA8611EBB04D59544A91634663345264102C51775E8797958912F82F5585E1D9C02826EACB4B60A5069C422EFCE48877F0EF5950227CF20170DD2720E26FE09CC0602AFBBC4353698C83E440991862A043EA9F3612A239FB13E33E1EB4FD38FAECEB376F84CC5280156C026C7805E4BEEBEC1E1B5ACD77F7CFBFC81EC378D58EF06C567DC75E8C61F5FA039AA9F9BADBF201879A7C29673368FEBE113E587A2906AC6632D1E6B073769A44C200D0F67DD0F6774D91EC3B569F386487C1F30C3ABC047B90778BC2694F2976B77FF66BCD7680143A93363D823CDDBEA4500F9CED51C4C87CAE7D0DE5210A73DF6E68345DDCB4876EE05DFF74811A0D8570F373C2F8D51FB45448820DFF048892AABEAC4A633F97C3C285C261791CB5207AFCF9A99D2E8E0AB2979D748859F4B2CF7891364A88726A9D00E176EFD24BE1BD1A57E3B7480B3BF4E6D2E5AA34D4B40CB243B4FE723AD2E0A0F1985A82F1857D37A96D0E0165033D8FA8856B631B9EA94BF9E167B929667765E51C5B38CBAD7C3E48C5C38DF00693AB7E17D8A248C5CD4CD126207DC3B5FD7CEB0E0808BEABA78137B438E8DB8A622A5F3B7F16D35263FD1509E4732EB3E271AEAF085220F2E6FD3EAC04BCC2E256B5994F21B6379C1BE36038FB95A8E62D4C60FBCB323FFB7980F1A6B2FF45C43610AF8D595BF0537D69D1485DAA73D8A3F19B4A80F8F2F632F2AB2219A505FD3BBDD37F7E4CD7C886E1F4CE3872EE14A30B4BC8EC718219801DCA31148735623809BB4BBF26D3EFBA87CC130283140D23CFA95F073E06E7099296523C925052F4F7514C7011D45C5A52F6F3589BAC267FF6C374DA3A6989563B6D83733E42B18B24AEAEB993F3F734838960B76D12671619807F43DB77A3A60AD0740908DFE3C3BE507B02C2400066174041EE1F8436AF669C4322067FDB9FB170F9946A0E74C577804B93B1DDB26CA285C3B7076516F464DE078D956B43F9F43CE074ACB2FBDAF759533678AB7D7E29E88D5A79DFDC91E5964755E97C2ECAB6C44F3F4BDC553FD03D86E4070C9ABC33F109B425FABE437C2C50F1E2CC188E3D5A331357A16F23ACA345281348CE36982A21F1FA5C14E9D7A6E0BB0FF1E31565AA2CC54322D655E2F4104AE495EA5CE750F3C5E17E285A1F76363E075227BCFE29CDFDA5A5878BE0036012B634601DD4F80D27BED14F2397C26ADABEC6695316C68F54A3BF44E478A2A73091C02C8A50F50460A53E837D7E61BCEA9A003E9743F1E2D2CEB102D958B256425ECD8554BD04DAFD5DAD54F9A94E05B698ADA6DEF5060E2714D98F2BE2521DFA383CCB8428459830DF339D4228F7BC4DECE53B66BC9E7F2A51BD9A4535BA20EAEF7DE1659BF2ABC414636D74205FD4AF2EC4D6034CFD7829A25786C409AC944CA7BD91FD96EB12C2F8786424B81181D871A3F1D9F6C8A8816B8850AEB5944C78882595A238464320AEDCCBE57EE3B1F3063C6846252C723D5FDA43EA0BC19FC46DD3086A148814D9EA17066905F85BBF726C605558AA5B909FAA3A5D203D47B545C1EDDA93245F7691B0F070CD01E78A3764275376D5964BBDAB9E640EB69ADA97D37AED82831399BFE73AFEF6093C2E1E3903BB17DF88B0BF706DA6BE0F6DCCBFE68A093FF5C34B1F3F230F9645CC1B424C736C734AC111DCAAE355CE32D8D2E6C134B2148E7A919586F5D8F1656B92C63BD996E2448DF498AE97BA9768C215181464F1E882472BE365B1013F59B064557ABE9047F0F75BB32D346BBA5DF746883532A1D9B10D74CC2187E9904111DD0A42088EBF5A5A5AC64EB2E607135D6B4F41424136CAB66DF96DFAA24BCD9A66034B7F07C94697DA86797C802F06E2B6C3D3A73AA715188949C1D55724D0D432CED1FCE9DA213EF67BF9665F43F03FDEB51F732000694800354928F83D13C3ECC8C0805ED5A7D646F3A793FF255DD272CA026AF8CD9CF35F30D291A06832AE1FE88BAD267309E1201830CCF3B878D2C6F9912ADB23BC7875E70358B6C7EE87B0AB4C67F814DC03F4ED9EA53612EA529989699EEFE3495C4083C1F286FECECEBD76DFEE1B026C2098811E248FFD0C47D98A578586ABFE9089577A6445648513122EA2325AB3ECE11EF03AEE73D2B3CAF817571C11D0ED6FB92A91F7F37B20C36F91F743C7F45F30966966740BA7CB2B5F6DEF6627E4A509626A36A9E4735A756446863EFE1328D78D8F00B6EA4FC9EFD4866B4DF08509E5D0F556E0CBDCBF972050B3C5979FA1CABBDFFB31DA75FEC95B0286A41A7AC6181C1DDEAFDDE4A778C0DB3CE90914E26B2A85C8C6AD2603BF9524C5735570726D39CCEA7A0ADC4084A69857EE3583EE1075EC149CD80FE4F697E97C2E695E1128B9627CF73568474F12A0C6821CAB9901432EC166993BCFA6C41FE2421B63256D2A7489CE95314F4742BDC8A7B6A9167A3B87819EBB3B9D4331023874AF99FCEB587D3B2325C488D4BD8CA2368EF0B8FC9481EC085E8DEA65A7AF831E160CC3F4E457A86FA5AB0C178FE01CA5A134E2B4104E81738EE13300ECE0DE21DC18C4DA22437B61B4C94B15F56AF9918EC74675C16F26DAE6E6386FB96D38F0B101828981AB6CE7BAB42347296869C740FC6E15D18F236E9246858F3B2625D810647E5F323A9DFCDD17F4F4CDC9116C757385EF3549552F60B4C41F984A0FBFB8E1103AC4DF3AC6EBA36F26BE941356561DC93AD5DEC920AF333E7D0179903C4EB388E12F777A4EBE5BCE0E7A04629F21C59938765E6341D23FB24F2DE922A9A1D93B2123452BFF464F9939209B5061725C663423421589D4BC264B66C08E4794EEA9DA65E4FB97F9BC7A9BD847FE088B290FAC30C7884BA391062EDD25ABC0DB61812E93DB8A820896FBBB9DC91AEADB0371128169B9160D3DB5E076F42EF5680854F332D90BFC3B9115E9ED958969818D130C1B03C93064B3F7AFD7C6231E70D9412722AC67FE1F8C265A9A1DD9F4ED8DB69A12AFCEA92F779F9AC72B8851EBAFF7B79A76E7382725BBE9BCF8A8045ECEDB50181ECE7880DB9E09E48F23CB75E343421228B3B8DDCEB8D1285F84BD818429EAF6FE353EF209E05E3FC506D006D43941B6398878A9C24E5D4DB0826139CDDEEB5F2AAFAF24F97B9AA16D7B2C2BF691AAC0CE8B507F8915969D6A286DA481CBBAE122C6A88EFA103199F801CF58EBB7662E36F2F578B01E25D33E99353B0592A33CD407E36CBFE1B3B3F4109DAEE8C536AF53734724F88EF906235860ADC435AA85A0B82E2266C9917E27FE07A924492B9F470960B02853F5022A4A26515FDBB20BB9B1F814648DA8C4237F78ED91135059B9C0898631544798DC92A01F8DC4EDA0EB98CC74A2D56FC08FA2147FECC194DA59B4264D7C9DA486369AF9C44E386647EF65AF35FDAA1DD00DF613D5DA8E33C666FE47F40CDD069ACEBA2EB0A57DB6A387FEFE2087FBC8A1B8231A83287330655BAF4204DBEE36ED963721B64BC60328793C591AE39F65A90323E233BAACC1F0707A86B8963FDFD109E1BFEDA4CBC59A66D52FEA73A0DFE257E844BBCF30CF5624D682116079FDA926CCCBC371BD8147EFA17489F2E6D6F29BF72293D9069DC5A531AB2613A54BEB5F22D14AA36BD97A7C2DB25D067497C00C95C6BC554CCBF8076F2F5B280D65A20E8AFE8AA6D39852A377E094FE9534D48CD33379575A664DAD781E3BCE8CE26CC2B0F24B491493301F1E06CB9A797015AAFDD81A6A286300C647AF4A03A770BA338B1E7EBAEFC264EDADA1BA6B3C955CC211E33F3725E7D13FBD2B1B8980DDB0D871F83FC632378E3D1F3051F992CDF16338CAE168492C2BBAD4B0F27E0F742E0FAB4D293DF8858CF34B886351A2B5E0BFA92B0DAEDD6C15AB26285BCF3AD9B5828204AF837D9A8E3669BEC46ED751E330703D57C506B0045AC0A6D886CBF6B21FE73AA385E650ECF0E0045EE1B6E641FEBF17B5FCF9ACCD358A95E45A9B7E3AC8907B5519509248262A4161C3E59EE0A4F163F4F6BF529B4C53F4183E87073251C84470979B4352A41E654F84E91139A2C46B61CDC0030D1112E05CA336568B79C65AD52F41A5106321B4F9BC63AE3CA0A75E851280F8BCAD63B24CBBA684591811B33315B1E101597DE2C67CA070C36F9BF3379F6EAD3CF970970042FE8E45E831AA2D371DC8A3EEEDF3CFBDE23D3473F54B39FC7C9AB24EFA40EE65CFFF4D3D90B8A9E4E4C8AAD5EFB42A20FC273A6EFCD0324BCBE6A0EB8F120FC8AE93931814BBD52C9C3144379705E31D763160FA099CF9631761F975D5461638F041EBC2C1A0626D21440BE63349BDB56C7631A55AF00A9A5664C87718F660A827877144CB4F93B7E6BBFA04274FD7DFE9127C45FE3DC07186A712655849191B5833361B2996D7E8CC2FE31B71913178DA20C03211C8EB6D929ADB93386FD7C9C76BA568C8A200A9449E0ED9AB631C624A5AC53012E076FDAC0EBD2A402C76DB098E7E8DF38BC39F60D32298B6876C5FC52BBFBF3AE14845E998E49C31618C7726C55107B2D18DFA09F0115B366096909AFE9BCC93AD906A86315F8185DD9F823E58F94D17F74E50E8435CDB4BDE77392A7A69D0E3BAC01012790F0122764D66DB6D39AD99B10AF4CF7F7753BDB2E3953281F7C3346AEF77F6830E22FC1DD05FA71A8E2F73A9BB224D9E4BD322C6A3209C0B1EF2D5E471599CAD5754E348931B52AA1A50D37F904174CDB7A5C48C255DE7E16B8F292309B17B61AF03FB3FEFF534005F48148B12078A4815DFA5ECBB3BB15284C34DC71BA1E22EEBE5772A999AAD6D828FB7D6A07CB4A95644C4FBE05747262E84CA8D62C690172EB4F7D6B0E08CEACB86440261DFD75F50A09DABB910D3E3BC380B168568E3D69219B677CC1559F3F08E0CB43B035E39AB5FF6569D2230D53CC3EC0AD48D78C84A8F15B01982AF57073ADDE9E610A7A832EF93FE313E55A7D9C00A7B7C512ECE77E2D4E2BB91194F4E2784F2CA0AA5373F686C034BF0BB1F61C14122C1FD8E8C2D97F48B47E700AEE2EFEEEC5DB7791AF2CC78FAED5C667C7E2CC9CC3FFC2F3D13E2AA332597F3B853495FB26D393C3B9D812EE13A926ED7DB1A234B9F63F842925C1599E306AC11BDA38D5C34418691686920284EB189397C9D49C1A9B15BE0A583F3E3CAA494BDA96DA2C3CBEB7524DBCCFCFB549DD6963FE04E87C4457F50675937A966626E655474C61557C919BB250E072911C339DD3D6A562919E9326F72FA9CE5969A22E2E61EBE8E7B03F096196870F6B4F25AF43EDE338955447403033119485F331395F4CC1B6CB778BB60E3AB7D9DFC45A09C42EC18BA2027AF017B66072674D43196F66D4C559E9DE0479863A0F455FF791A679E2C90CA19F34111AA0AA7C043D494AFD39D6550082A6F8CD2D42368C0BB861DC77A4978D17A93D29C5DB8FD6D2A6C9719C5117586D1D1D7956234BDD5DD7F630814EAA06BAE64E512EC31DA01F4EF1781F946302E8E22B21AB517365FA6CEDE37CAF24C41EE905FF53003A993FC9CBC98946494BBA73DFA513C9EFBFE6A251695C5D6AEA187BBE69DF1D75C8883EEB9B1159074CD54A40E69A3C3FDD52E41DC9C8C2D72A64DC2391921E95FA5A79E252A641A4046B1A2C3487CFC73B0C51877418D0426B9192DDB65D7367027EC8B662784B2FDA59369A0B2E68BD42938105FA2114C210DB5B9ED51CFE3A05255A9D45115ABD114CA988DBE01EC62F68F9B498798D5C1C0DC7BC355D7B83E2127A29F498253B471A7E887D30CFD79891FB519FE04C804F4F356A4CA2D790D427B8ABB8B7582BB99894E5FADCAC5177135F0CED4FAA9BBD33E04CC3DFD3DBFF78652A8147EBF89EE9A0497B0AB42F9CF949207ED60839513AF2A4AFF6145AE210EFAE0C484AC134DDE3F689FBD5B0D88F42D739B5ECEE277172CC0820D581DF2A4551BA8CBFDFD083D66AC52FABC307FBC48477F3842762AA3BCC271B440B47A82534BEDCAC9C14BACBBEDD4E98623E99E74C2B1D2A055F032E6629D4999C41B3B85E92E95DEE48EFA2A1F9E32B901064A0C0B785BE0007B71E1BCBF48CB65CC4A208DFA9C6DE5A9FD2EA1D31BD7D1FFA5BB58AF661E3BB970858C8B78E1BD9BFD3B6614A8B6C1A2BB718697A980F10E6D35A0F66762F7B03526A16E00A11B83B64B640CD64F3556B1C0125DCE70E021E38D2C947563E761484C53EE0D7362CDCF450899A2E49B99CA166A4EC44FFC9914AEE1636EEAD8CED516F161D90F6D1C1EE6ADBB0A04D0D4F09B7F5E32BC7839AE3CED7A9F71A47D00129E83B98C2549649D0B4C799AC5F22980E51357D8D1639AAAFE0E48D1B92A231755DFF6FA55E5BED727042012E4AC3B365C58ABD78455F2858E0F71E4109BA13B5F5E47013875D980FAEC2ED3F918AA7FE2697D5A5572759CE12F702F76A9B355D8192B8F1C2D9FC9B2F15A09E2D3B4FE2EE88DD3F189548AED633EC83F8C8244F611A7BE06D968604D6EE3AA0D63001FF7AFABF8EEB9778FD73268749DDD38969B576CE2F3BC9DDAE17C8D69192BCD55E7CC9568131D9C6304AB6AA4B449ECCAD7FCC5CAB8E7EC9D17CF168B1C8C3B31E72CCE7AA80083611225DAE049B5A9F7F799F5446DA472A6474D78968EBE88DF9BB45A5E41D464CD31237F3B8E23DA80659549955BC6E6417B005F0CDDB4849151591414360F9D313F411B43F5FDA6964A465B034FEA38AFD8906DDF15941E4C77652934CA24D6B0A8998F9476BEE1E8DF64A0EC010BF68A9DDE491CC035CABEE58202D7D6860AFB326C1F4674C68E11BD2E04E052F3DE8A3D0FBAC510092CB7DFF45AF4D09F06E45503EFEF86239A48935915ECEDAAB34076E366ED6A5FFF124B956A0F1F117AC30AF28B0634556D93ED15151F2B685D3A037A164B6211D6D00A2434F3C7876DB86841554AD4B6BA8D2EC8FF31200946809931967CD9D314603D6FCCFEE29C6CEC56351861F8E66B99E6E02E7672143FC71317803463B3ED80A34E214040917D4D3F71556FD059981965FA20B763B7AE6EA00D805FD9AC6DAB94E8CB810FD19417A7822E2082EFD4A37769D0D16F82697EDF3111D4A914DF6DA1D84FA4FD0F8336DB9049CD368D9FC1E23964A90A0F83E48DC89083086FA7F14F64AE22B1C6DCDC12DAD0F376F7377FB42A4451061EC25FFB016BD9EB9611AC83C0B46DFD53FC269A7AC7DC5F8EE5F9928C192A1C3BB203D2AB76BDFD6746DAB730726CE0D9FBDD54509CB81294FB61BF69413270D8DCF62DA547F92140872722EA714AE09552E3BE89F2E931DFA91A94980E749E79C5287B62F243BDBA574749CE97CBBF8009BDDDDFAC35F158592FE8F5A38897C0E5CAA620DAFA4330B36ACFF4419B0F92003810963574346B59465D45746115174B8B59A75DBFC82A540353E0915AAEB6756D66C8AFE34C4F6203E093149734074B614EE041750F76F0B08971C3A66F39E971ECB87860789A6BAB1C5D36B8EADD851787009488286225DF29187DB7EA8E51175BFF74C92ED261E37879D7255629D8F739AE24C051357151819742EA7DD414F3828CE2B3C4BEB5BBD0E5BDA9B3A7767C02FB8BFF71E3943EB34987E49E42C936139ACCCC95EBE2C5ADA6A3F564349B097BD12D370A289E5F5978AFB774535284DB21DE5EA0F25D303296280032EDB752F0FC47F0C7A457E1F97DCEE31C155BC5B6E6D31B879C05C3D1F4EB621A87DD186BBBDCD029196BBE4D65FAB6B62F251E0832980006131EDDDC610A2352A547F4348512413364084EE6E93EA679E224DC183E07527C01AD8E0D0034215842A78C0C6498EAFB4D5C1F951401A3A12BEE109262760A215468CD601D8E8F739D62F89CDFC257F2B73E8E3828B6D4DF0D9B8B8FB7CECB3B345BDECC8BA239DB94384BF8D0B13CA77DC8512DB13E8D33255902575A13BBE95BC94E1C79C5CB186C3F76A5EA0A281FE2D5A363A817048278589256BA961B0AEE35F308C12F8D113C0944B5B0F58BC7AFCCED651EAA1F5ED21F3BF6E6F711A0F537AB75C1D7DCD04AC20DB775E691A45F795DDC37003299ABC4D0ADFFC7D349B0BAAC52A9DB30FD9924755133BB23B2CD3BCEBA40D25BA18A454102D575F4B013317299995EE01E339EAE82B1BCDEFCD7B623F487F68B334445A189F9749C37B7271E02A7FB68E12046B0CC05AFE73BCF3A7761BDBBE731442A8502401054E45AB43298E8AE374F27D1A06F27CF6DD947E19A4E58F6EBE9B006B0EF3A90B2D0A5D89B63792F1D6988D068A995A737F509CF92F2E10ACCF617ABC80617C01F807B46065FC467A8EAE48B5915ED0395880CC8AF5A113E26BC386FDB221A01F4E1F645BD3B2F34BDB929B42117C6F555F2DDD2080CB205D6288135948220C29F1593201B4306635A14C5516FE756A7E1CCE1FBF4B91798120198B3AE8959830A89AB87BFA8C237FEC28B2F94C4176EEC2FBEFE052B5C4A9D52D8DD8AF535E5446A15775642C790BAF72740F3A4FAEADF13B8D46E9DED2000F1CA87497D3F16138EC48FAEF672A4F41D8BF24B5D4C57EA125ABA1B496418F9C46DC8E7CBBE46E972AE300CD50D39CDD41DD2A6D6E46ECAA25307C41888B1BED164AC20307911F032D93FCC070A3D2A1ED2A3FB22EA5E608E0950EDAE89B2A26A4707122748907818F5913544FCD40330B64DDB3B1C05E876D368D0F12AF5C40E84B8DB0D7DD06CBDEF0728C2D533F6EA4208A44DC1272312148FF7A54E57202E540A88F3BE45495A9BAC623F17FD06DB1E2F484B1428191DBC9952B72AF85A414640BFDC1F15099A53B875DA34DFBB673722AD9898667F13E69818C7EFAD030176971EC3544DFDCBC7E0B1933BFFA5C55132543E09C0E85514141A0CE0D18B154BA1D9EAA50C999B50B76980CB832800A4F9996AB25EA34081B3DFFDD95E7331618D1653F05ACEEA9D169CBD116A18E401F36B6402FC9261F5DA3573F736A1FD6", "context": "", "signature": "55B9CB420B23BB684B897810648D12DDE95931C396F39C68CEEA1841AD0814A552623F441C9B0E5A2D60F879CBACE00E6D13EF2484B9F0203C004805EFA8560E49018B96B2A6EB7D28B67A1DC5002B782E566BFF7F66485237C9D1FE727B03F9549DF495427A87751DA194F891E9586E48363F4C0B544CB9403FE0663BF4D7151B7529C6DD332FE35902B76A740241074EA615D6C40E6A401ED0E727CEFDE518AE851D07135C42B49008BCDA66C8796966601273FC4E01447081A7247FC62155E4F7BEB79829CBEC19E19E8A5575C064783BE3F0CEB4BF7FDFDCC3CFBB83EAE3E6D790C027D679114AD532BBEF7314B91E77537E53E7332A8CD832B44EE9A87ED5F89D4BE72574E115C95853C7FE95EA30A1293C9C07A27A35ED524AADB7DAABE6FA18885CE84B795D3E0BE9296A9B990BE792E86D41F136655BCD4A4B53F8597F2FC99AA2C81ECD52CE048CDB2379F0429B04CE031588C78C587208C73490B98CB37F90C4C6E29947583F25811915416B27749DAAB2727C848913B3FA3DCB9F2A6EC98AB2A5E83DED8BF64F38B0CBD0A123B8FA9E93FD8DD48013FDDC65CD6577E8C0FC6E46EB86AF3861BEDA5978A69818B6AFEAC01645239985C430F13902948242CF607527685CFCE75CA0B2ED7C919401FE1B5839A68911BF909790D41E9BAA53FA1F535C03B8E497666F594C04DD7C5A75735C2CD94387DDE22EB4484B0C4927957B62BE033958B06371388EE5FF1B6167665877F1AB93B3D1E31EC48338C11299BE10B880387B2703F5164F8E9B86FF515E7406C16DBE5FC5B3B38A6E8058067814D0DA498AC5057C5D1CA190BD8F0DDBC595785028DFB67C2333776CA68A71C3625118E93E4E483B615A76F3BB06B1A5D58F3851348DDB76116974C18BA105AA699E739127432C30FE37AC9FDBC81E590A95796FD79AC259565A0CD95695DAF4D8651BF0E63AADBF678BA2487F68954EF8A94C7660410AAA05A421E293095154E4092FCEDE47D629610A6E6436A5B3A96BD0FC085C5DFC0C4E937A87414A90E706CC36B50D36D0977C663117BBBF045A4144E08905EE331C5E79F335C5D35D6C13B97DDE21907B876B98CB59E7BA66946DD689A666122AD97F994C641B45E0641BDFEA23476C64E15E3CCF0221C481AE94FE122E5C43638EC84E7648A6A59FC2DC0BA6FBFFA827E72F036B4A254EA5C05DA8579E765720C69E6B416EA26F5677A750A535940293EAA6F474A43911E11A1DC604FE4107DFEC3E744696BAE8F093AC150B43D5FD0405D5E8062DE953BF55973E714ADFB4E2B38F42515C8C5EF90B2454019898D68C7CAD194D289A1C0A9AA217A7A39E5C0BDD85515114DE00CCF420E020B3BA91995C196C0C322ED05EE5CF355AC6D1DB36CC8361E06001AA18EEC43F61254CFA6F82DA48FA0BAAF607074D28CFC76D463906D77BF4835061440D18A0244100E9AFBBBF9DED484C97908668D570A4A709F55B5C892099D42536E4191EC43C4B8D25E3B6466C5314FBFB6B164C58AA602B547C3309A80B5BA459DA0EAF7B33F4B7E6F3CF3A11CAEE1AE7DB3217B0C7BCE8B662343427F1599787A89893DFBBCB0FB4C6E1F44E5C8B6BB126061D35862D396A32DE0085522FF9308527177C70A5F1F49F8E2EF8529AB9985F28A4400FD6BF498E912A0F8D522930AF57FF0B27C0CA8598FF055ABF9A06620F275FE8191724D3E099CEDCAE578F62CE0E21ADE193C796405B4978CC2306709846F6DD90981B042D8F27680B3ACE1154BD0576C177BB3473560799139273B68B96B8CC47174651E76D148D3EB0417EE2A0FAF4334BA20B727D6BB40103597E05E5C11318E7ED0C0F0FA31696D5DA42E1AB8849E3E025FCB11D28E60DC7A001D688DDE69838B4C71E2CD695249D6D4735FB3F0BE96AA21F7872C7EB82A337E4D851F1EC4A0093D5BC2821DEA85DC1722DC3CAC021256F9AD1F7AD1DE1799D5C6A93C52904D8D7ADB28EDB62D9FBB3A0E30F2AAED7A175B70E6B3D36E1E394819E82B1BDA58DB1E5B86559C661379D553D82B837BAF3DBACFEAF982436CE7F5DA6B6C389EC6A3ACB4183BB11197759138648FC65676541F52B7A33DB0EC25B42DED9F533D26F7FECDDAA9081B3702016C91E94946CB8A1401B6D96E1427709A781AC5A1CCFBA2AF84A3BDB7AF5E2AE2D05F4F5692C47F117295ACCC71374DE0E4A5BBB46BB609FB330D642E92F9ACA67F0B607A5CF08C7E6541FE35723A7EA74C16ED5AE0554485E97FDCA9DB996FEB1B201BE53313ACCEA2BA07A935AF9EC32BD7FCEDE34CFBEDCE6F5F4E10A903F80E34D61DBD11F2955DC008E873A61426E1A973401DEBBD4639C8CBCF589B305C9F71DCB7FE47F798B152F767CE487B41105F014BF3D10ED1AE8B1B17AD00EE5B888ECC25C4F2B4ADB939BAB49FF9B4DC4AD2CADD2B02F916176185E523BC4FB94C294F02ECDD0CC0C6F84C0D65AEEC8FF7EE2CA3F911C731E39F748DB582B8A14AEC4CC9D6892649DEE3E6EDC62B1C68B2BAC9A82D724C6CE05509DA6B8B95D0BE9F74B9B8DC652E1026312AA41E748A71CB927A0FC0312910D97547FE778017AC31AC5CEC0AE7567E3A0013B85F0B300DEE60B6F7BBFFBF53FDBEE72D67B86EC00B9B41B6B3838BDEC208F9300481FEC2010E3CD07F687A8EC1E6211A9522C5D074A14C0940AE59B55A329EF58B8525E14B9268DB5885DEE7856A9E9B5DA4604166C8B7B7DDEB1118C9AA6B0818B791396E713B8C5C19093AEE8D442F308C21DBF2C242B5B4829F56951180E478585E85D34CF8E95CD435D548FF9F649999C29AED532C096EF6964CB5905DBDA7DD15F983546EF0D3F6C7F71332FAD15FB73C168976CB4752C4DBD09F1670DAD9F2C71B2CDC2831AE06F9A6711BBF07DC074897D7CE701B7A00A43B155BF7F41477C6FAA380A7E7F2C33738DDA2C43C4DFEB08B0DAA1B0812593E6DDB0DDB8E0503CF20F76A675344220ACF4BFB8165A1BB11522091BA8DA5043745570DE626A55F0FAA79A7E23BA0D7F67D2B8DC5FB74B450E60F4F89331DA5DE9FAA469BB192B1497DDCC6949CBB982235F22F10BD5A2EF6B2958DCA1F8EC606D6737604E792656E89C70F3E3EDF1CC876D020E6A1647388ACAC58F9A7130D7C32FD085343359283D25DE1B38E3C6B0600D433681A243514C3BFB21098462FF9F48A391069508AF2128685125F8B52287506A0E496E02BDAA31F292F391568C111B5F287C54BE64AAB29D1276615120B736D3018510E203BD39E48FEC2D1FE6C392FF2237006F67D5648A34E0BDB5695E0D83B904A5A3438521FAD8AB15B7EB4F8BBEC961D36594CCBF65D42EC2B8685B9EC95128394CB6D5CFE4CD9CA254E7C154F2A37E3407FC639EF16D10EC8D04FB3F907EA9DA323D77997252B34EDA4061AC3A8095B70BFFF7714B3AE22DDDB46BB6A62D1FF130024FB9723922338E2F038780ADDF7552716957DE3353E5B809ED160AF68EC2AAA1E14B2730E18A90E2C2ED2B0BAA40A07BB25D73F15B0254CE3B6132E94BF647E9DE02CCF9B44671EDE61502C9204C80B2D653CFDB930C89A3090E8A132CC5F72BBF894CD09AA171D4DBA28AEC6D3449BD1128244D2A8ACF27AF6D0D2800C91B3C6B8AFE6D2D03F183DB16F4C77D8359DDCB936E5A7CCAC461A4E9F22D94D8FFAB6B758436A3C1A52568E9F52D8FBD3792B75336D02B8517367F5757EA8563DA06370A55BC96D8165786FDFBBE717D432E2C605AB8C2284B2F23FD47FCD2C1409757531F252F79CC02BEE8909B78591AC1F7FB3223C9779D02119ACACD94370C1CA7C840C42E6C5E14E3F9D8799E6BE97DAA1AE42BB03436C2F7E3CE126149133A9CAF9D87613842FEFECA2DD0014F416421F097FDBC0DDCF7C8CC1EFD0F81F89730BD13E7BAE5EBFA94BDE7E9A43D7A778105C7ACA3B4EA66CBFFD337C2478EEDCD10DFFB79964BB07E4C8611A4937C09361E178C58AF1BA3A3E2ACA1C90B957557AC38DAB0E97766D998172991351D750BCB58E9CBFECDF466285F40D039E053B9D31863E69965F94689E4DE1508CB8E6D019DFCEEFECFF5C0D58BA32871A462CA52433A0B1FA10456DFA323348ED0D156196FD85CCD0B96801A693B1896329A71661EC338247D85083620C2D53879E93BBB0405F65A5A4E427F181499C7981DE08757B517774D186706A31E850B829626D9B52FB75F42C9BD7D75FD433376FD4DC85CF9F3A8FF069281054D2B10C7B17ED5AF74AC04C1F0E1E9C80420676EA2B965E1677368D0510D131C8614B5F55F73ABF3889514164E7A8ABB7383F87F297EF944563B0357A4D65EDE5DA049A5B50731889A94B2107A04C10B6540635D2AD04DC03C8C22178B6A47C4FCCFD7FEA985C7F0CCC72BFDE1732E5C30D9EEDEE36D963184E3F3D92EFBA9A03C0B8DF3624E436B58C22B73ED530B6B92119B1425440AAC48B9291FC76C59DD8B389CFB385E2582F7A4A9D9BB46D2EC4D1F949B6ADAD63A8008640472CD431BCEF23E59A844701A2C573B70F05306DD1176970964BD91D57AD1A6F064CE06815D7E8E996F56DA70935C48E04DB8C3E51E4DE0B192214992731F33D8E87890A280D1B28552397DAF99E21C05186025F63011BCD3752062471CA8C1BFA22599A923178F39E28BE7B7F8852C0B1729CF9329CDFE98E31A23E420622AB32306A626A73FBA2744EC3434A25A50A21FCC4805484EEC37EBFC12A9B71BABBA7AD315C9E36E47DC5622DAA8DCFEBD0AA3B869746151E358E0476FD721120C65D2BF749F8A91163B5D7437764204CB8E41D9CE663C3A539B471956E2F7AF54566C516AB9FDE5A6BE8606DBA8E417123EBEDA8713F6A650F7EB688F90DFEFC14F5285199854E068487C730F8635E42C5A3EF94479A541EC2EA9F5E0D5F512B68246AC220D3189AB0AA088C022C293BC9E67A42684667F5937B56BC70A268FBE26BFC65BEBF68B54C6E1A2A1ABDECC5B12F2235CDA9B318FBB6CB30429EF1CC6DEEFCD722E67133033F4C9E24E2A6360F93786A54F52D3D15F4B459E74B022A25E919FD4E3602A1DE11602D8C59E2CAD85E3F9D1C77DD50EF43A273D42646B1282D876AB0F567C2E4DAEEEBC74195E6ED6A4907EE1B0A9D2DCECE8EF17234BF03F56E64B458B6A67679F270BDA8E2F942C2F8D3E3CAFBC2D7274423A3E1DE46B68B08BFC9A3922D613DC93AB484942627637CD563EC1455EB706C51A82E514AA06C573ECC21E89C7BF1E0A518EFD443A81DBF47CE624B9DB8D6D22C785EA6F8767DB6FC3A8B41C378905F6740B09AA6B2FBC5AEB749B49730D228B2D3C556B300F573F08D074DF0957294A2A32EEA835F97BEBFDB1612B8B998A43A67114FCF626EE4848B7B0057CDE8FE58E3B9D740EB7ABD3E2220C0428160DDBC3CAC1BFFFE99E5BA7DC8DB3B57894EF98F8ECE93675EAD693AEBBAAE77EC5EE07FDCD186D4C8B2C1F60284888F1A2371F61E807844ABC6B6F8D98C8FB287FB0FE09C3C7428BA6EF6457C0954F6DA76F72E3FCBCA4EC40DCBCFE08EED558F27AAB7F2177E6EDE13485BC09BB9BAC0AD8A1C5BACFC927C25A93C7C18BDB771A33ACFABECF1CFD49ED39EF91D3001721FFA747C545A97CDB3F08203BFD12781767D9B7414F0D866EFF646E5B654FF7EAA7BF5AA4108F1AA5E9611868461FA7EABA26805D3D64C189AF6E0FFB08EC0A7E3F890D5482F25E4DF4F5FDA17C3198A900F99A86227A5752AC3C2487CD381DA3D44786866B8FF78E18F3D4BFAF651B27319F429CC441FCC7E7D013B6B6CFB958260205A58A37F0FCD00DF3046BD9E20220CA42F6FC978B499471707AA6FAAF441871BF29505E838A1E8011841CDE867B04F4E9445DAE2CB2033DA1D6E25DBCB15E428B2EDB62FA333E94E0980A339A40B12143F5B56D928DD38302F79F87BC051E0D81D5303FD4E37654539963A375543E6B6A3C0AC5CB380FE921EC90E61DB9F710C6FA4DC23E802B661BF7FE0B54A91B696FE52AC3A33A10624A905315341DB563BB5C0430FF6A117535B391CE2D7E6DD33A0451752186901C58F01E5867FD6F544DAE34D7250D986E87AC53FE45B0CBE1EDF2F694590AE9AB2C29440366BFE23BD62D1A929F1E2793F9717E5A0BD5657248AF77F94CF594D5FE132EFFACD4638EA7202712310724950ABF3416E9B8A1F875A53D98C215CC097638ACA3F3EE626F151F35927CFB148D6ECEBF46144FC3344FA42AE1A23904CCD83B5DE58E586B4B14D76828C3B3142DC741A739DF8E8850E3EA9820FFEC47A9DC3FAC5133EB7B65FD0C07F48C32E19A84F7D110442DF9D4C0E46AFE0E8F8A88BBF9C94EA5DD7418CE8F0C3713DF96F802522295F59288D1C2E94194E85FE55FB17506A87B841636E2BBE13AB0FF04B4BD8748688261200FDBD9F1E390377469E96AEECA075D3931E350E7AA74D8965CB06DFCB22327DF5147E5443A151395DD5218C2B5BDAF39900BDF5210A39DFF90442712FE1CF867E530C1B6AC6F300C419D92EBF28ECD64472CCBFDC99728907A30573CE0E88CF690AD490685B1CBB8F42D8F90E812F625AA5D3687BCF29F3B04D3632CAB0401AEDFC100B2990C7E6774EFAAF40C04D61FABB44CAA1597939A785F59FA88C2AA99058580ADB06BD28A2B3501DF0F41708A85478637E3F90C919127E447B85A7E6CF7DEACC9315FD8F9B24792103F682D0FDB6B8F46C6880B8DCBC7E4E20923BEF7F5F5B1D57A18FB83BD3430D3CF2E099D5E63DD3AFAB924E7FD6C03621FAFC7AECC1CB7E834DFA60D91B681A3AC6F3345E0B2DA53B65F3FC24218BDC54D433FDA0B86367462610F58F6E5224A078BD7A855EBBE78E172C7F4287EFE22FCEF28E4C40729C446C1B22392EDC86AABC15BED2C35113330CEB40AB2EBAF4A7BC1E7652113D3A7AC259038987541A4074F9876CF2E07C1C5373D97D8F7B962C1CCE6FE0FB6B5C0C0E3E29EB20377CDAE351C51D75DE7D408946260B737BA8F2B604521D1566FB03C5902E22A28BA302FAD1903596CFB1443F49E9D36C925F88E0044E3CA49449354CC2109110E90B2B7896FA025A16ADC95DB9A09F8F9DED7F1D1F1476FA8F97796EFEF31061E5CC9EED81C33B86F174A40EB0B1F9C8013660C4E7C886F5C57B7B767BAC1CB1EC59DA32591B7E69699C97E560DCB75CD74679CC1FEE9CEF1229C9B912BCC51A6C598B75768798F68045C9291D69122C6B9F4380A6DC1CE64A06FA4658FD5EDCB1B7784C9F8692969E9C6A036A0F546F8967DCD5FF7FE7F7085E9A94AFA63B695F4E62A04BCA081F615706BE4326B71BAD8ADB7AF7C2A24FD2A7E70346DA3A557C7AAF16928FD794CDF20D6BEDE50508D72760B2C89638473CCF763695624C119C410C767C728053F6B1CB652CBEF49B4B2C69E923CF1140A9597F0A7550FEA6B8ED1612AF243B4C816B56D9BBA0B0709E309609B1E7BD5EBFEBCBF3584A5A9AF775469FAF76884647D55D4B9A5312FED467C3EC5F09E03E5AE08E4E14A921C13263F21898D5570925816A4FA04EB980012B03FB0F44BD1A003DB90F2D36228053DCE886AFDD03E29C5FF2988DC69A2892D61A728CA5A1063F26CC0A89D4EEE6CFFDCA9E4554523774405482012E78F0CE021B987066B29820415CC244A97C33E07F6691CE034B8C4A66905994FE76F474747AFB496C0675A7E3AD1D808876A6EA0D1A7B9C357FE48C9AE667EE3937FAAA0F188D6F67E2AE47FB7AF75569B394EB3946DFFEC3DC89BD1B9AADEE426BC2BD9B57D21696C9318091AA49742108685AFCF654FE62E3C9A54A3ADFC5B50271C16B499FAD4A10C5929A8E7ABEC6C7700FB15216418CCF27334CF351253B009852E403921110C066709205838B359EF11AA707AEC0CE24680AC4329B0091ADD9DFF547D30487F657890C845165ACB82045F7ADA55DA61524C0CC86E35827DA55A3D103928E0EF33D606A7B138C86740EDE48CD1A1D86774036585D1BFA00E38B34F5FD8C5EDDAD03DA31A49F1959C9FBCD0F14D59CD062B19F5F2E2446FCC4000DA56B1EE24FFF1DBB7B93AC396EE9D4B0ED9DAD684A8791A78CACD059A2F95AC797719C96C39F3DD28F8A26B0DA87B96D0BA9FE938A640D0FAFCD48F975D379B5EE6766F99078D92040BF6ACA5334CBC4F443EC7489574EBD6552CFE27DB749F16E8AA9A9D7C887EC5FA5E549F5504402CF96AA096E628EA4466A1059D49CD72AAD82FF689DFBEF185E021C430148898E052FDE77C305A5E3C4C4D68787025EE5C48680D5E95F1BDF805BBF2FE7043ADAD6E6CA0DDE42B89EFEA61B6091D3EBAC1592781A68BA14DAB78A78CA02D04B0162BAF1AC2CC75AA3560ECE0F295F5B085CE6D2F643B1B6278BD86B8A1EB9D8F5FEDAA4778F1C1B323CF8ED4014451A1EEAE6B3CFCA1978A650B656F747C1E51C3374D3AC9B41D6783FD70D4DFEC29F51A35D3BBEBED3932F6FC03065520CB449C4B06F414E748AA5BCC06A86D09D61B8414F3106FC35D3642CE92B63ED2D59C39B4C16F23924180D21DB37ED417F40999EFBF4E348A73DEEE734F1140B4AE5E7741B795DFC3E892A3224C035137E6C2AA59A9D9CFC2B02AF48874225A7DD48EBBB9EBE74E144D200650476DFC4CDD2F18A882DB46A31077E5BBA3B7323AEA38E852A2372FEBB530F9F27C6D82CF007A83B12A6230A0A35A50A18E13AEB1299FB3497A8F109E91CE7E76A0DA15C598676A4AF5ABCD5154A4105B0C8293992E8AB5D88B7011F192D3D6A738546B752F6767791FAF53213BEAE9AEA5E0838D9C8701DDB6EE46CB8A5CBB8C9978A093B3923A6EA66D0AE95408F0759B1F86D841BB85A0CA6C142D9ED4013646C27EB58C2BD8AA8B51CD264C82A61102857EBE20B7CD2A428D59B81B336BB73133C791A0C8B2FD8DFAEA6FFAFAB5411070F5DE2FA279AB84D3208B4931DDAC4083B31B807568547E7FAE1BC512F41C9C26EAE9F404CA22AEF19936DF2048F48DF12EEB2FA27C04AD08A1EDFE50AD13B336C157A2A263DC24556A05D38C805A9C4B425762D594F7E29347DA190512A0C900BD05F2A673669EDA5C20F89C6CEE9D14A87894BB836519930BBDCEB6BF27DBB34CC3B2EF0A1F2F44B43DD9827BE37F8287F40002A11B7CFF68421BEA9C091D75B0444EC059984CF2C39B1C6D1D1AA5510D27E82F5FB9AED5376BF5FBFC130CD378D295E272E8F55EEAF6EA93B08BDE7DD729D8D9DCECB4CBDEBAA3F09C808218139ED055EAD7B4C1885E5026A40A62430D70D621D2FD399904343C87A53FA21D1ACFD1B7519BA9995445ED5CFBF5D83CE5CB82F00B3F3B8B93344D0BC54B3E06143A29223228919EFB5F7479040C378E9055153BA7B16C3AC29E0DE80267F609EE558C8B8207DE7BF9F2545241046DBF7E43E54DC4D7AD6225CFB01ED7DF950FD413D4162D76A85536A1DA8BA1112A80EE1AC240A0C3617C222E9CEC02D5B771DD46D13F7C3F864E376C4D4464A2E75D9E47B9CD8E4A7B8BB51D0E7A2AF15A94184490B008D966535FB4CD44626B1D838F7FDBBD9A7FA59EC3C0FED23950E663396C53DD2998EB8DAC234BE1945C6A43E585DACE4F5189A525D18B4B2136A52D4FA67283F8992D5DBEDF6DDFA044B838FD5A48FA7AB3B878B75E03311F2091B42AD322E29A03F008F71A5FAC4CCB65B3098B3AF1A24981D2F75DCA26596E33D2989266DB9AF7A4C101657BB8C0A89571091A8130554D39D6FCEF5D3020D546C54FE0889A60652C7110EE0829D1FD9E1C46EAB7B9516BCE05A5352C9551656799A28D2312079185E96637906F153497DE2418F4CC6E7A5B2D68BC14856E97693AC40BA6089942965F8AF3F6D31BB7DEEE3CF09134C7C292E385B5F21E81239442A68C49053A791B32032C95930D9854BCECACE56DDC935D378D7CA9C7596245910AF8161F4962D80C210F15479A661EC8204DADD99DA17DF49A925E79382557A105A4659B32B4823B00643B09E8EAC05DFBBC92FC056B89B2B7382696BA6293EE0A92757239569C3DA8AC3E26839DD577FFBAB384CC064B52254648CA1C7F3A7D5D4FC6BEF260BBB348CF8C48CF43083135C64064EE34A9E159F8D8D9C543D7E9C08339C3EEEE2AB1811458101F397DAFC7341FFB08FCB1DE863C3408088947EEE6180AC4FCAE6894DACF4BC4B2A9729F52ADFCA98518957B9F1B71A6F97A02002925BB3F6B1553C16835EBD39A77D701928204C881F2CEA1691C0BFEFF54D6E61B44E67708AA788A2BC367651A570FDE191AD3F2843DCE40375ABB5187F93B703860557128962B33436554A2D69057B7882EDA18CD8E1C4083CF2A266D2186220C2E4DA5C241A84B279A719C9DC216716C4F4757F9C8A5AC77CCF1FF51460240646DC0A37B4C3D4C225180D40922328AEE314A9F35B81C79CA020EFE4D788FAAD07B860CEF3DCE4A434D123DB49B7662C2F8ECB94DCFF6646EDCE827C26C4E595764A50C819F193F5ADA8AE43CABB4F7E2939BC7AA093A5184ABB4E95ABF0721C501D9D87048ED0F9886D569BFB64D215131431AF5A6934705566DAD6EEF17E4AF311807ED3EFADCE6689D165B99B97CEAA04015E144C68FDD0ABA6AA5A5FF6B52B40AD83FC9ADF2B2BFB2F10FF6130A3FB1FE69563C55CEA0DB2C84438D20401D7645F61FF983B2BB213A18E5D478D6F9D95CA0E2CCDFE436BD98B44F693A144361FA4DCFCF85AFF275CB2CC3562DA7DA376BC4B643463389B89FDAEA06B6080BD24E381D7961596A51BC2E6B60D7EDA5CD5E3453AD17DB62D9D3E2948A2438E952C94DE4A54B5316A759EA835CD58A879CC6ABCD53DC5FA52110168AB4A3FD372230EACACC9D08ACF518FF5D26AD14D80901F5CF40A4CEDF652159038A5F9EF3575A25ED8D6DCA9F4042891FD3222EC6022C56C31D5EB8251EC220B487385ABAC7D1D91FEC2876A14AD2E69587E43C08525AF11D0C19F51CCCF2193DDA4A1935C8A5EDC8210834E2651D066E8E15A11E8F6FB13019833D1ABEFBF5F9EF1AE15509665329C70C3A54CC95A81651C3C5195629256D586850B61C46498803F7DB6E986FD4FCC293EFBD3749DDB3A224077F09B92EF9829890C9FE776CB91777DE4319787F9C3DDC2DE128B86F0B55011E15CC9EDC99F24B310F1FD862E35EB67BDF1C26276F523B74EB4C2521512B85A0E278F421AA4D0E8244927F3B5568D6A26678EED10C7A639688FAAEB3C9DC3CE51F8B73643727BFF31469F1BAE2AA1D96BCACA48B13725AA7D8ADA8E50A74C3BBA0B9C3646281418BAA8DA0D0C9F37D61F2CE351EE785AF608EDD3BE530439E6DF9A24D7FA02895B9575D97C41142ADD63883EB4643B6A6A28A7E04D1613AA1D0B60CCE440AE1E213B8B28CB43C63C402BEA853350F4B8BF93FB06D6821F8F9B6EB614A04DCFDC428688B60FC7EC20ACCE7C6C3EAB216FE023927A796B168983E45E4A2218838C110EF9C9D79434E185E13DF225EF0FA0A16ECC31A9E301F72E44671E9BDA581B985353D0994017CE3FAC2A8C324A7179385AD3254A48A63216DD3CFDD7BCF30443F879B126095B03DF9212F1DE6277013C28E901B70CDF186988F9C700BC3DF8BE4F21CB07D705C5A8F7C56DA1237B62C4E58E3A10D44DDBB42F3C341C2B9937CCD9A9CC7919E8023AA59078D171D37C389DDDFC5778B2A32EF153102F8327FD4F1C85FF2BEA369A71DB5C9DED87022734BDF7F0328CA44E7BEEF6E8884D3DC088B1EF30D1CEF694BB493B0392607AD26CC090EE84989851655DC62ADFFE862A19193C82758924BA361176025928E1F6FFF73EED69C65D97CE4087179B86AD6F0246069670DDA7DCDA39B0972F93BC826210BD351AB088B3EF8F044B3D119007579406BC40A2846FA07F5DBB4F4129BEAC8CEAD794D8A114124F588E9AFF6FDF4E0A5BA1398A49AF31EE03817ED9B3C8029C03B3F0C584F0EC675B888F047536BE5D9B633D18D286E62CBBCC8356C3950C4195A4254FFE3AE50ECE0D505E6A1D09C0F833F1E3E91AABF5357EDC392790AF1EA8CA64079803E9B01D2A123AAB54CD94F8374E6AFB94DCAAA042BA2BDE1909C835657618DDF5F5619D404DD75E3C6137432E99077F3440B7069E1D32C2054ED74E56F16FCAFE68247A36A25A9FA56FCDC893357BEE6512F582D7CB12263FA5E464D8CE28A4E99DF8475B81E5FEA0E0C95F129FB11808704E91DECE6C76C61317247EFCD29A919800DED24D6A45B015DB07C5C6672FD0ED812B0930C73ED11D125B05FB0F4EE36D9EF7E7BB4F19F7E1DEDE04B23101655C45E0161F0FF2C5555DE0D1F33A796DCF11873A50C9E67800EEF17CF506398A0F385EE87D4A919F6C66FC4C36ECDC700164535C84FA345F235D09F75A06D33B0C4DB9F0709CA1F17B21B1F6AA3354F7143B163EE4536A46CA5472C5F2D5D460922B88E0F915FF22638D605C1935472B079D534D3BB34F468070090ED752A750370D57C11FDE7B4AC4667D17F7C9ACB45E7E53155CDB0675E8CA389C0B29D8446F4271D843445B664A1A0341209A08946A5537995CB8A41D4D5424B574551D3FD51D190EF82EA56640CEB7D70C39E72AD47F5EAB2BD045FCE2A2712F90FCD96C67460D05602D0C73545548F80AD780089B92DBFEF036BC75A2DBB518FA120967D6D92E986AE8D9F1FA5BD69711A4CA32BAA335B244E1C63C3253C0150E38AFC29B18F51933F19CF1230826540760CE26E9933583C0921B3A1B572AB1E484FD269DDB7AB7C8F756CEA5D33D2D8E6343165C7D4F6D7754B804BC97C3D0B2372E2CD7ED3CDBD0D3248AF276782447D5BF716DDC7BEC6BF2ACD1D39E12E164664DD5C71DA7E3F6A2F488B21BB7B5751AEA0D896E6105F5CDBDFDFDED5496F24C5C12AD282FA5E060AD248A2C07DABCDD58DBC19B8114D941F7A3CF878EFE5CB28C03CDE61E6034F878B835F0A56229A09EB6F86A105B0434CF6E40B1F4069AE4D9B8336C7D70FE4830C718805774BE7A171B9D410E1208DAB8EAACA7E58BC432C7752001400AE13B5C7B8D84EEC3985FEB0D43A0965049A5F5565B8587B7BDFFB69FB3FDFA5532C328E0978A698DD2963AFCE366BD2EC4BDB917BDBB3F50A49A190EEE69E7B649DD392CA6DC130C464ECEC8E1DE542A4B4EB482BCE7C648CA7F19FFD56F28A1D8F5F0769668AD78AF89C90B664BA087E4F1F456406BEA4EE8235AB61C184C7FA5227F65970E46371C8DAFED3EB222F12A5826799A324030D2117F1C36BEFC0B21FC8679EB2B40BA431221ED0C2CDAED5A42A3723AD95656FE0E7B7699B9BB8462B48B133AECD534EDC9614C5E23FE79881E008220FCC4703CA7A808B6B3913E514F3CE3EB11D6D5546B0E4FF0BDB8736C88CA16F1C4B62B60A5EA8DD9C6537E68AED54E1C7DF86B9515634F65F61B79B178A57A1357AE434F9FF1C28A74330B57D906608353373364EDE67A241710DE042507535E764655C654F524D8830BE3F3786EB63E7BA2E161778FD84514D5B5334272AC13A057DD01C9F95D92689FCD9B54014DE56487AAEB15D8615E64796C9CCDB3AD4C4B4EF073EC1866A7774096257D7C3FF6DAF52EA72F18F0CDBC7F50837D09AB922D2D50E791BDBCF7C1927FD8D811D10DA31AF32A5DA7750D6D15A205F4FCDC228C98F0580E791B9F476938E32FF357A2DF189E81DF22D16A6C2591FA16416A47EF030DA8C48CC23EE309401298628DE75AF889A3AA618D9C179D669EEDA98C3C4C9F478E3F5E8409BC8376B8F75A6D8ACA406B47A7F8C462A62FC6894712201B5D991517F22C7B48FDF91B4C1FC9A879FEAAA7306B25CBCFB09D96B91FA455586EB6D45CFE7CC6E32E727AC87EA2D32A62837848A1284C845B23B3B645F6C9A43D7889C75743CBF0198AABA0B8E742300B73E27F3A5362B9A80AACAF0E304B27770ACBCF482EA810B6C1A7ED1DB1EA678D724799D9A7CD88CD7F2A404408B20D796058F1259C9A891C9BB07CFCC000F90BCECB507140F3F5A772C10A0A3481FB85E7DE67AD0AF1B3E93109B4B17FAC08DA8A4681EBFE6E1F75C7D50F42EA8E1BEA8DD7233A1315402982C22AA2D221821058B8EC8B7A33EA65C5DE552EACD585290991B6D5D612FAE65C6D040603E36986575B29909B2D28244FDD305CB3CC43B011281D65124B5CF13F761D6D0CCADE208B12A3830FAD7DCD594E94575FBA0FF9203EE7EFE526C110E25C2638B2E14C4076CB64E9BEE6AB0B3E58A0AA0A75375EAE26ED13B9F164E221539E41A2465EF8EE6FDB0BEDDE25D389526E1FE16DFEEAC26F38DAAC77CC9EEE36722DDA7939B84C1B62356594B788E20A6913773D5828148C2B60F22C91C4E19C9EF9C3909FB3B77B2E0493C90932B9333E35AC5768CD888CAE234BA5E07FB9671C47CCE21B505F5E8022A6D9D2A134F08D1BAD28F1B7A8D6DF5FA585DF72CCBBB33A29FB0FF1A15A2897F9C9E35C605AE336B7BE1E5897E6A35F708DA076FE2542BAC717B8F62C750A62F5940023EE5914B3911A58CE7DB760344C13E92C30D450944508A5CE5DAC841CC8CCFA1B8BF548F1F140C66AC53F36D3C4AD4ADFC3AC37C8B9DE4A6C0E7CEE9907D618DA733A474FCC3ADB4F7DB80412746FC4969443F5918C031739EC34C17654B3F9626ECF14D0928EA627D77B7E221B884990AF18D2E52BA2C2661AF28BE23C35C05E44E083137DFE271EE9D8CE55B7E9EFA4C4EA8B309D165EAED46C3D60C07326B9D5541474BE15714192CA42DE4D6C4B0961BDC653507E7EF6A7A80E7ED560D7BDDA9345FDDF2429E162957568AD7E7B9E22AFD29093C6CDF2CE9E477A8CEB30D20BF55B499A8671457E4F7CEF3B6C5B2B72856BF29020FA9479056FCC15ED1B1AD01A9EEEF7FA85E2B0305DB8C3B5B3F103517ECEA8F076ECFAD3AE2B7321E241F1B4DF33F97D5B9B9D482C146BEF891E62D1EB40BA0BEB896548BFE006907A52D3336AA900A03863E09493EBAC12A6ABA4173D2E54C17DCCFC4DAEDA4EE1595EBB1950F355E0C45B322F9E6543FE4F17FFBF618FAB4316AF158CA0249B2764F128D3D5E6A686FB28405B9B3170E744DFCC33182C167C563AEE7E632522CE4B6BEAE327F2D781FFD184BF692E157C6DAF2962C38FC5020492E3098009B3A912E2D6BC72742B2DD83D91DEB1EB65535B43AB98846F0396FDAF619AC8ACE964E643988AC8373546E185F55BAC4385C40A743BEDF94DF9C7B2B66541CDB7757E2489345D0B4F41E1E947782F43761D7E7396718F4E5EBEFBCEF1313ACDE29D507A398335118B69918CD05C50C7657D066B8B6D645AD71FDF8A96CA57D79E1472C4D8ED0B3768D6FC83267010E751E0E0CF118FA65EA45257CA82258341C6D97DD4B9FF02ACEA5EFAB5C01C7E5D907B7B9B05A2E30D8B28E2414F50A1813AEB460AD0A374DD321154384CB01B5EED4643661C902FD4C5521EF584B58018E58BFC1C0E9D74CC16AAC6B0520E07ED039CF46C4637920F2EBC7FE531691AD3EFFF18F5C73036CB61098DBA3F586B442C1DCD9B2234EDBB993B4568CCDA5816D3794F198C83859376D8F954F35B4F2A44C6D134EBFFE9F8B588C9CC808C70F8D82F382D6653B404EE81A6867FA5FE3E16364B0B462E5C4C6EBE5347E0ECF68CADEFE4649CBCEA258BE40087DE2BF12500D3BD2A30D021A170EF8FB4CE93A4833A11CE511FE3082DE767C0FB72F8888DA5D3034A2A62E73B58E7ED54DA97BB2A68786F1AF13718A9C8C04FD2E47DDA618C6BDAD90637A9BEB412457E0089F8205746F6B74F437AD67465D2A8DDB8C300382310017E6E1B0E69444D3435E6CC8740A53D1F566D920F40D15C77FD1C5A5953634120E8D5D4353952E62B9B0BAFFCC717CC8DE72ED8E6411E33983F5047EB9D9B9C536ED1D21120D57CEAF404096AA08C087AB42235CE5B03496714A5CEAC2AE5964617FAA1EAE106B6D80BEFB113B1FADB3167391BA30EBEE04DEE07786C8094C450107F9EBD4F3AB2E129141CB216A1623031F6175F897C2906EC2B8865210E2FF3BFE929902697F66169FF593D93FDE09A43477404C96C3AB088156BF7474345800DA66B4698969478F8BB76C718BAD9BB94B07C95267710FEDE4FF83CEFF5E489159AB7207F34D6ECE26CF6106F7EB30BBC4BB0E8EB731469AF77DE42521A6BEF6020256E1BFB1C523D4436619A084A0F0095922D5E5DE189662607122E5505886E97C48318368E05E18491F785FA75293CF8A281F36283B9AF8F4662CD4BE42B42CB833F7631C82AD1407657B1250BF6332F5A23645A45DE79A44E59111AFF2C4E81BDE4A4D99F4092B39402E9485DD1E632B606D3496ED7CC9BE6F8474B80429EF20FC13842B084E1B4639627DB28860324855169AFAACBBB17106B7C18979C65A0B2D149046141EF224B6BEEDB7CB87418E3814E4E699BA2210758770D142C5FF0A29182B73BFC722C6A7A5C43C565848554FFE5E8324DDFEF41DB63A25B6DCD1FCE3DAE87A054462DADCCE12B7250413F60A9A4FC8958B5663E700557D7FCF39C656F92FA86F9D2E6B16709E6D75C542FFE7D768B64073CC4C28CBD0531471F97589629E1D976DAA4B3E8366FACEDD79FDCC30E1AA31044E3B13FFD4A8B61E9B04022093574F79089E0BDC4565137F4C19FFB19B13C37E09D3723E22B9D31AAD105E4CE168B63EE514F399A3E64FC7FFC023044E0E53552F6467D19BC61D23613C4DFDB60DE8BCFDE14D68CB9703E1DEF094360C823EC3633206772477C544D91F0DBF32884CDC2AA101C9ABB0EFBCC8A6E6CD89C8DCF1812887DFF1936233DECF93A8CB7042289BDCD27D3B951295DD9BF7F76B067D2EB2B4D4E7D40DF36E0B86C402B43C025BAE1222431DDF7FA1F31747EEA387E2B943973D9C946B38DF45E52B68FDA31385ADA0EEA18655B9653653B149C54A54751FF217B922579DB8ED1DD91C68D8890340C2B4C5ECFDA2D386A7AB0A25C6A1431192D8A7C6FE4355CCA79B903DE96FC9021E4BBB0A6395BD3C478C070EE451AD62DFDB9FC0A05DCF0F87B719316D5FC4D39CC47CA8567DA0BA0D782D3278867B619ABB7D00DF5F587874A2CA5BBC16B9F124B00BCBB40BF8C52D35E9115E2AF6FC1B0A75DEADCAE0A494BAE86FEA44204AFBD9F404AC31EC11349E582AAD766F70FF02E7351BAEB2B044369135F78517FACBEBCA28CC94CBC3C66A9D98A2FAD6A88A6ABBB43B453158A415010FE59CC74DEEFAE233B5C7375AF7CA9CA2277467C6119B54079F09936E24E407E645CC72BFD69488FC42B3632097CEEC44591681672D2079509051B2DED4DC5131DD8D960984CAD680AD93930D9D71F2DCFA026026BC297260DC54E012D8CC01B0076746FB20DEA7B6075F92363461EF941234362BB688E96891E5DCA75F2F320BB683CE09E2C9C1E1E642579DD31E234CBE210469DF0D5F6F1B9168C2F4B7F0F8ED68DA330073A8730B157BCC3EC4FE003A4BB3F79C24A9E7418C7A83F4DBB2CEC9190E1B50619C2B4EEA545D22D368E5E2E0EFD2B1F602167EA6F7C4BF455E0551081C9D517277DAA41C783083FE3B12685201D66F18980DFC7B59A34D44BE565EBF35BA6253D5E719A3354F332568B93EFC5E66CBF25ACCE9D962AE0102AA97E81EB894791360DE0DCE28ABE29649981344406A4ECAF3425B2836620FF7238271E253FA03B3761C0C22C044966CBE70181A430DDD69CD82B8664892ECCA922846E3AF477B7DFCF8CE7C560DF3B28880B0D744F6F7A172BEED92FF05420D8C48C1BABAF69D5F4580CC1D3D19D4AB57EC9DF13AC6E21431188CCA3426735E18A35336F7E72D537850796C0DA67734D57CB0CD4198E665CA6F24919F1124E114110BF2E8564543DAA964ECF1F4954D4DC1BB69C430B3C0D366E1E0103E8BACAEFEF7664A3775FB9773CBA0DEF0E401BAD3531C8D0003401FD9570672480EB897E2B28D5A1C9249F99AEA857C50275755D066A85A906171AE1B4656313C45D5C10B457FB3233ED0A114EDB91026DB9CACD333A770306FB394B99389758C9549BBE5C79F817BA5A3D3702E0D4B7768BA9FA57453D9A0B19C0234D6CA38C3AC1229A1DF5081013345070E8F96007B3DC20584FABECDCFBA2F1F1122F331C2D60C8408877EDF7772B8603A85E6FA0569D1F620431A338BC493AEE6B1A11BCA386F8F6E224E710CF490A9414625F16933DB53D3B3175263DD5A19A45E26D52185E7D17F284D197F4C4B2AA64A88C861C43D59CF03EB0EF3E658F1F0CBDDCC649F2139A28E37496FE38F1DE6F8AE8F946B580C6A8D3ADDBF7B03A7EC2C142EB5F1377BE36F09216F6AF96DDEEFA4FAB504907D23E9A929AF8109F35EE632D6BEC9BD1C7031CDF7A4F81AC44F8201471E1A5EAB75B6FBE9E7140C72E87DB6B1A2354643B068CA4727B8CDC48E3A90408681F6E4B8FF6285F5EE4BD4750B96A2260D694B1A26D59DCA9D777B984C72C593EA3C5331102BB4E9F8BA5FC1CC7DD67CFAC27DCE61BC625A0DF108034ED7902CE7D0996E9B505D5FE13DD00D2512B38E0AF97C8DEB9CAEE6F022B15310B333586D68049965E572AC30B44066DD174CA16020953D51320C6D28A2B6ADC0AB941AC9450EE640679A2D5BDAE90C1045D671860342008567F5CBF499ACC85F49946778BB4F21DB4B60122B59F6C62BD0C30B9DA28FE85270373455F88FE5D85FFD19DF68D20E44F128236D603F68B792792310812FF4015804B1539584DDDA7527F33BB7C02B61269C47EED8D8089454ACD43A59C13FE1382F4832921154B57EEDB4EBF867AC690E2B045670381EF9350A3329ACFC48C60710E1BA135C0277FC958CF686C6A4C53524970D3A2634C43D44945A9A52D152E0E4943A741833AB7078911D828AF1D1D84B0704C1D07668695EC017B9EE1BF71C0A8D8D60CE2F27692F04AE5898BDFAA7090DD09FBBEA57FA8FFA0A745D382B792128F31533D00E5B927C8AA724F7AC54EA5A339B0FEE3655D43F5E37631B429B535269DA9C0BB947F6B8C23ADCF11CEB8D455CF6EBC9DC280B74D9FF2AB711969091BB7C25B279F880262EA777F85DEBAC33E9E0D81BA665CC5824D66B0B41C6EB319139E5A7C08BDA87682421BFA55D1884340A053E14173A1D44ED4A381BBE54614655CE8DD7927464B500636523563A98A1C5661389876C880AEBCC747F3408B8E0E0B40E2826259E079EC4A7D0ACD0C3E655225F50F2891CADF9E91C84F09BBF27E4A97429BFB15C567A8FE0BB1CC5927C96F8FF3D58A34EBA930CBA20C0EAA22D21C2AC67E4F9B3BEEC28FA40A8E0CFCCF70C8C860F171B960EB30F13AE1803D55D876834841F0A0189D9659BDC64AA70B88310C3FDAA18F2DC821ADB0AFB0DA31E9D6E02E994486B434B38FC8E99C16C888A608777EDCF094F00DFFDA96C44157733CE8C8FBD97FCF662274D697ECE2D9F30C589F7AD5C86350401F538B6D86762659F8B4A39703D942AF7DA1E6F040C56CEA2D127972AE3EBA084AEA489316229A15BCC0E93AFDF63F518E87DCD98688396CAFAF1492742DD45B1A9C61A089C4DD3F27873C3EAA60529E2AB0B817A996BDABCDF46DF92843EB96948B30F54209D8F80833825FE06C4A5A6520DFBF501296F88C32E48BB5C07695C53C3EE500F1BAF164B652AB90BB33670C25CB0A141ACC41DDC7B512FAC32B49AEC418002BB091DFB5BC8FF0545D81CFB876856CEC1F80BB84EA3268E89FCC8009DA2464634E1BB91FF62230E5B3840BE4FA09C7C8C80039E482D73CA22B2673A3855D73F505A7CA9ED79C62099580C7E3C623F885D8AA3AE53679578171F3DEB60F37FEC1B7D7D6C1952DA46DB5C8BDCE05804F274FDFF6F30CB61364E89740279F6AE76AB7959FAF29BE7F2A18A75509ED9A165428C4A50A6E517EBE2AA28AA144BAC15235F71A49FC08FF842C302FC26CC5444A9B03E47FBAA1938AEFBCFCC645DF045AD0E4C4E1C1D9611DD5AE1C82D72B9523E5B6B85BABE6F0C18A1EA561082C2562E5F14186FFAC86C1309B3400E4B7512107757E9EBC937EC05B9F292EAD13C667F26C9DE440FF94C964804BB7AAB173B35F8EE778EA2F774AA947BACD085F8AF128C682FE010F178FBE2CDE885DFE7B1F6CD2B19E85C5BFEE766EA0642232E22303FDAEF06EA4939D8502DB264718840CFF43674CEDB274BC5C6F013CDB5D5FADC8DB6112246A55AAF41EBA231042BD20D351FF4D2C0542CF627B514B0266E12C0855A67254F709D4B9020D047B178457D48A5E812DC14D1F879661580202C63043BE362600B4C5D5B55AAE95E48BF0E5D8CB7A17DDFBA52E92918B52B04012ABB5031D82C4D41947C045CADA978FF350D7E72640B87F62B9FA52EF6EDE26A44F07CD761DE59936E27C02F1B0CCF4BD7C1AEF25DB5E11D6BD42DB234C091610B14B792F0BD106BC27C6CDD10AD493D8C647F1778C07C1C1E974C476C7493ADD97A1DF2D0844FB84DA8ADAEBB9B4D3E9C340EB033C5CA2BC9BEDA5C8372128099DF6BA78364E0BE3902192D05EDDAA1ACABE97F7A94280F76166DB91579CDE385EC838645F2F16F3FC3773FD4A8E3F649F05C3AAB3249864CC49030D390F2475F74F7C783F332C6FCC9F5AA766A161B703209822F8A881CD49305BC296A0A016F61315178C3C4B103E4127A93CA4F3451E1BDA96D3C1EBDF2D7B6C1B6EB9C1F78F602A6CCCF7FF184FCEC4A8F0B199B3FDFD04D8397978370611984C64CDCB70DAA288123A7948C3ED885A3A40D7EDBB0044D2E436EBBF12D0B7E552BE98BD86F96A0B1D5D61E22F6BFEE96D5B7F1AE2467E49EBB8316C38DB7AB6490D106B3498EDFB749D3DF9CA1BB41DF586EC005D743D739112EA9BC3070E881A9B7DF0100EB6D42ED21C480D526C28AFB0AA3323E445E5363F73F5149E79EC896C69437E2E2279D10FE09549C974D49FFA4CCA73DE89CB531AB3E6836522FEC8AE9D939B2380E18F14066530EC1F010B5486FD81262BDB5454F5F48BAB3C0E31F2EAA45F548A521642357D2AD21FD9CDBFFBD096BD3452CDA3211502ADD9A924C2A82EB703EF7E5E6910E4F7ABD33979143B2C16B389EAD6BFDEFC6B8AC1E8EA75A565ECE4479DDEFD5654E2F5E4B50671E5C7807D57B8C3E65AD5149BC17DE753ED026759AD2A646B7527FBEE8E384401FCD46B5786C223B1B5D303CCD29E05C7AB232C707F4E70ADE902018EC663D001DE67B089D62E7F8C9C7A2BBF6DB4D20683296A895BC606577CFEB461F9532CD701D26CC893697878419270A96594B88FA3E6B1957095AA1483A788EBC64D09D3E2615E5EB83AF78E3851258E8FD9B11DA6DACA82CD457D13AD6DBD561F53269384415C1FDC38413D669B24370FD5DD6D8B55C354FFA0F179C19DFFD8249ED4D8E05E10F4B5806F83557AAA94D40F322873880019D63353B718A00C770CFC1B17907672A900184F29B1A7C68EBE435AE0B258D8602324577E65ACED9C485C83C188F06DCB888C3B5ED36652CBE633841785328E430815B0CB0DADCF42B24B3CEFF708D0CEBA0FA3D41B5EE28E0DF08E394835F9FE052832A2D580DBB48232039BDFC3A73DEF6509422C58552E680C1E9310E7F0C5BB2113B2880631265956AC7CA4AF0485BB370D16B1F3D7E04A3672B1AE046A2D12A7A4B1E5BBE15FA7FDD7D32AE9C4A30FD183D555E3D5E56AC7CDB335E797936B6A6F14AFC25A93DB2B038A7090DC54C337408CF95576A4A7DF44553EC1BC2AA057A09287C2C6661F516F572E70A6C198B60CDAF1513500222CE5C16F44830DAD57517913F234722540D437951F4D3DF81645817D3B2B3619BFDB1C717A7ED4D81CE42AD252C36FC9B82FD68B66BBB18B022E204AACA772DE0AE285528D04147C00BE94AB6055D9778FA697116CE6274ACE2BF7AFE7DDD2DD3F936A99F3CF68FE9BCA3AD7489D4AE4D1F5CF8BCF10DE5A38A1E28ACF2D1D1744E9BEC439E85427C88CC62AB6E72FBDBBC4F2C30CA084638E910F9D26C1201AF2F6A3E459EBA27F87C0B892CC965F68B81B536AFE897403F5FED235FDC268BE0FEDA466449CDBD0421FE22F5B4D0F9924C1203046537879416C61FFF450590BE4EC15B3FB3ADE439EA3FB7855AFBDC96AA3104F193E28DE7F930BA73F5705DC59BA19EA1BB93314A12B922E479FCC51DDC36F308A3C7EA401205EB74CF6EC4D5E255A0FD3CCFF6F8C809A0F8CE4A5A66CAB23FDC95118FD2252344EDADE64E90D1293C79E79DC26B0F15F253DF921F66ED74373B34B321D2ED5F2EE3B1443129EAA299FA27E05840C44A449A3A5397345B3771E902B4940BC23B166CE3530F79BF9A9C5219416ADD269226C84165A6035862C250F60C990D8CC78D050766CD1671B9618BE205356F9803597ABE7ADF6442064CBC906AAA123D7DA782C3B2CBB93900C1AF11C9CEBA3356C3FA0D6ED66A442C521A454AE8868E881399523FD2A7B1277660F7A6ED4AAECAC228A8DAE04439824174F37BFE57F0DBEA843BBA998F1597C787D2258F7E8F22B789949F1C2D65D35F2AE0E928DF49297DA1E6085B2E17FECEDA13AC006B71F541EBEFD7057E766E6A4CC71234A1D162AE4CCCE04E87411999B47AADB5E5241572BF8B64D20073C6825C91608458A601AC6C58A88B64184D785DA077F5042ECA3EA099B3ABCD9375EBB8F6F4DBEB61E543FAD0F02924C29A8251522ED003368F741C4AEA4B836B34CA5BC35333F7C0152EA5BDA752ADFACAB094EDC25FC9AE2346CDF8BA7735680B2B07D9644558962AEEB549D7BD4C19C5C5D278B08BBE183335AA0CEFB0473C953694B2370FE09701B4EDD1600F76BEDBDB773A177831593018DBDFFE6E47A77B18E7B7C2A83ACBFE8B14863C32F707818C2AF2AD93A975318516AFA7AA649831C1C05925E38D456BAFCB562E9AED7FD68CEE2DEBA82F5542E47A4211B67EB59029C44FA5C84BE29FDD4EEBB191EA7265549BB0A103FDDA7C8FDC0923100FE1EB139607BD983F6F155576E7DF470DB93FF8DA55030D48EADF6157FF5E8766878D077ADC0C79D13FBF2AF0A98AF8D036EF47DC3982599D069091F69439E9BE6C38FD622D52B18AADA769DCD9DDA6F5696C7942574B920E8C12BC4A0AC42FE22D14949802211CB489994E0511D71F8A35949D99C1C92723322C79A8FDBF07F053D262E47C10FEAB47894FF5E2F69D0EA72D323717578244ACE97D5E896D45CBDDB86B2C057DDAA76D21EC254EBD31456AB907A16A49D2C74D68D323D3FD5055CBEC87C7657AABFB12E5962DD8FB86329364E5721B278D6FF280F3E2B283BCE975F60AF7610507813FA185563D4C2A64238A8CCA53D966A457C96C57552163F67F1FBC831DBF319592E7C0A615CFF65A281ACA49BF21EA0338AB28EC0616511D87DBC1E227683CC49D73814659C72376569C65436590840DD8FEC8F23FAA006A94385BA7C9D01662551C46BD72439807D94CA16EB8C8E707A52129C19828ADF31AEF6009DA2E7623DB4EE6C0969D2FE7F845D379E8EBA00F7C442192637456427AE811A52FC67045BCEFC9F3EC2FFBAB77E2F7FE6D42EADB0A7B83DA2D1A6D3CBF8627F4888DCB372FDE4020686DC386898CE751FAFE72A23DF27CDE59D989AE59525CB9998E30DD165FF4234C45A0683309FBD6C45588AE717A92453B9CB4B16B8381064BA6D88F1229B9B8132DE9EBEFA80C2B8FAE0E34A0C20539455CA07ABFB6BE3C270FECD18C90DA13F02704C1449BC01664CCE8900D38A0C33DD51CE37AD266CF6871AB78C0BFDC51343383112A707F488C46D935217C9B4E07632B1008DF9B8F61F04C785D8438C5CF689DC22EEF6FCA7CC4C07B332E5519E914DC82F51E0A4A86BB14A108994F26E842FE4960E5F6BE7EFBDA8FCFF5C310B683AADF852A564A59835B7B46253E276889AC51F397D4584968B6EC1AF4C691597506222EF8BD60FE304D1B9521EB8428D5E033CC0774B3894673397769883A0E274A88F84AB77A7AF7BC78253991839E7B56DA0E5855AC7DB814E0076FEE7A8679A92ABA35942B7EEBCC2CB17BED1C94F04EFAFABA64891ADAD4D2827E7CE22BA316C0A2B8D7780F8258DD82E91AAC944383A0FFD1495089767D5859167C28A5190B890C420C4FCF0403ED27D5F1E87952854AC5F6B02950657AB730F2008AB0EFA054B50356056DDB08622E1F6A3E87C400210E27649301165C0C3979F1DBB679FAF3A4384A294BC5885DB68F3CC966698AEC4FED0062BBB9E2165C969F9F14EE6CC3353AD1C354BBD7001565696BA254C16130159B0D80AF2DB4799FF57ACE8339E615BA24D1", "testPassed": False, "reason": "modified signature - R" } # Work through all the examples above for test in [test_ml_dsa_verify_1, test_ml_dsa_verify_2, test_ml_dsa_verify_3, test_ml_dsa_verify_4, test_shldsa_verify_1, test_shldsa_verify_2]: alg = test['alg'] print("tcId:", test['tcId'], crsyspqc.Dsa.alg_name(alg)) pk = bytes.fromhex(test['pk']) sig = bytes.fromhex(test['signature']) msg = bytes.fromhex(test['message']) ctx = bytes.fromhex(test['context']) testPassed = test['testPassed'] isok = crsyspqc.Dsa.verify(alg, sig, msg, pk, context=ctx) print(f"crsyspqc.Dsa.verify returns {isok}=> expected {testPassed} [{test['reason']}]") assert isok == testPassed def test_util_substring(): print("\nTESTING UTIL_SUBSTRING...") # We don't need this - Python has a better built in # Just testing to see if works by calling core DLL src = "The quick brown fox jumps over the lazy dog" print(src) dest = crsyspqc.Util.substring(src, -8, 4) print(f"out=[{dest}]") # out=[lazy] def do_rng_prompt(): seedfile = "seedfile.dat" crsyspqc.Rng.make_seedfile(seedfile) print(f"Created file '{seedfile}'") dat = read_binary_file(seedfile) print(textwrap(dat.hex())) def quick_version(): print("\nDETAILS OF CORE DLL...") print(f"Version={crsyspqc.General.version()} {crsyspqc.General.dll_info()}") print("[" + crsyspqc.General.module_name() + "]") def main(): # Act on any arguments in command line do_all = True for arg in sys.argv: if (arg == 'some'): do_all = False # DO THE TESTS - EITHER SOME OR ALL if (do_all): print("DOING ALL TESTS...") test_Dsa_sizes() test_Dsa_keygen_random_sign_verify() test_Dsa_keygen_known() test_Dsa_sigGen_known() test_Dsa_sigGen_prehash() test_Dsa_mldsa_external_mu() test_Dsa_sigVerify() test_Kem_keygen_random_encap_decap() test_Kem_keygen_known() test_Kem_encap_decap_known() else: # just do some tests: comment out as necessary print("DOING SOME TESTS...") # test_Dsa_sizes() # test_Dsa_keygen_random_sign_verify() # test_Dsa_keygen_known() # test_Dsa_sigGen_known() # test_Dsa_sigGen_prehash() # test_Dsa_mldsa_external_mu() test_Dsa_sigVerify() # test_Kem_keygen_random_encap_decap() # test_Kem_keygen_known() # test_Kem_encap_decap_known() # Uncomment the next line to test the Rng prompt dialog procedure # Do not do in py.test (unless you want to interact!) # ##do_rng_prompt() quick_version() print("crsyspqc.__version__=", crsyspqc.__version__) print("ALL DONE.") if __name__ == "__main__": main()