moonstream/backend/moonstream/abi_decoder.py

63 wiersze
25 KiB
Python

from typing import Generic, List, Optional, TypeVar, Union, Type, cast
import pyevmasm
import binascii
from moonstreamdb.db import yield_db_session_ctx
from moonstreamdb.models import ESDEventSignature, ESDFunctionSignature
from sqlalchemy.orm.session import Session
from sqlalchemy.sql.expression import text
from .data import EVMEventSignature, EVMFunctionSignature, ContractABI
def query_for_text_signatures(
session: Session,
hex_signature: str,
db_model: Union[ESDFunctionSignature, ESDEventSignature],
) -> Optional[List[str]]:
query = session.query(db_model)
query = query.filter(db_model.hex_signature == hex_signature)
results = query.all()
if not results:
return None
text_signatures = []
for el in results:
text_signatures.append(el.text_signature)
return text_signatures
def decode_signatures(
session: Session, hex_signatures: List[str], data_model: Union[Type[EVMEventSignature], Type[EVMFunctionSignature]], db_model: Union[ESDEventSignature, ESDFunctionSignature]
) -> List[Union[EVMEventSignature, EVMFunctionSignature]]:
decoded_signatures = []
for hex_signature in hex_signatures:
signature = data_model(hex_signature=hex_signature)
signature.text_signature_candidates = query_for_text_signatures(
session, hex_signature, db_model
)
decoded_signatures.append(signature)
return decoded_signatures
def decode_abi(source: str) -> ContractABI:
disassembled = pyevmasm.disassemble_all(binascii.unhexlify(source))
function_hex_signatures = []
event_hex_signatures = []
for instruction in disassembled:
if instruction.name == "PUSH4":
hex_signature = "0x{:x}".format(instruction.operand)
if hex_signature not in function_hex_signatures:
function_hex_signatures.append(hex_signature)
elif instruction.name == "PUSH32":
hex_signature = "0x{:x}".format(instruction.operand)
if hex_signature not in event_hex_signatures:
event_hex_signatures.append(hex_signature)
with yield_db_session_ctx() as session:
function_signatures = decode_signatures(session, function_hex_signatures, EVMFunctionSignature, ESDFunctionSignature)
event_signatures = decode_signatures(session, event_hex_signatures, EVMEventSignature, ESDEventSignature)
abi = ContractABI(functions=cast(EVMFunctionSignature, function_signatures), events=cast(EVMEventSignature, event_signatures))
return abi
ans = decode_abi('608060408190526007805460ff1916905562002c6b38819003908190833981810160405260c08110156200003257600080fd5b81019080805160405193929190846401000000008211156200005357600080fd5b9083019060208201858111156200006957600080fd5b82516401000000008111828201881017156200008457600080fd5b82525081516020918201929091019080838360005b83811015620000b357818101518382015260200162000099565b50505050905090810190601f168015620000e15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010557600080fd5b9083019060208201858111156200011b57600080fd5b82516401000000008111828201881017156200013657600080fd5b82525081516020918201929091019080838360005b83811015620001655781810151838201526020016200014b565b50505050905090810190601f168015620001935780820380516001836020036101000a031916815260200191505b506040818152602083810151848301516060860151608090960151858501909452600d85526c0506f77657266756c455243323609c1b838601528951919750955091928392909189918991889184918491620001f69160039190850190620008d4565b5080516200020c906004906020840190620008d4565b50506005805460ff1916601217905550806200026f576040805162461bcd60e51b815260206004820152601560248201527f45524332304361707065643a2063617020697320300000000000000000000000604482015290519081900360640190fd5b600655620002846301ffc9a760e01b62000433565b62000296634bbee2df60e01b62000433565b620002a8637dcf646760e11b62000433565b5060009050620002b7620004b8565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200031b600062000315620004b8565b620004bc565b6200033960008051602062002c2083398151915262000315620004b8565b816001600160a01b0316632b66d72e34836040518363ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620003985781810151838201526020016200037e565b50505050905090810190601f168015620003c65780820380516001836020036101000a031916815260200191505b50925050506000604051808303818588803b158015620003e557600080fd5b505af1158015620003fa573d6000803e3d6000fd5b505050505050506200041284620004cc60201b60201c565b6200042762000420620004b8565b83620004e2565b50505050505062000980565b6001600160e01b0319808216141562000493576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600860205260409020805460ff19166001179055565b3390565b620004c882826200055a565b5050565b6005805460ff191660ff92909216919091179055565b6200050660008051602062002c2083398151915262000500620004b8565b620005d5565b620005435760405162461bcd60e51b815260040180806020018281038252602b81526020018062002c40602b913960400191505060405180910390fd5b620004c882826200060460201b620013051760201c565b6000828152600a6020908152604090912062000581918390620013f562000713821b17901c565b15620004c85762000591620004b8565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600a602090815260408220620005fb9184906200140a6200072a821b17901c565b90505b92915050565b6001600160a01b03821662000660576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200066e6000838362000741565b6200068a816002546200075e60201b6200141f1790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620006bd9183906200141f6200075e821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000620005fb836001600160a01b038416620007b9565b6000620005fb836001600160a01b03841662000808565b620007598383836200082060201b620014791760201c565b505050565b600082820183811015620005fb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000620007c7838362000808565b620007ff57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fe565b506000620005fe565b60009081526001919091016020526040902054151590565b620008388383836200075960201b62000e101760201c565b6001600160a01b038316620007595762000851620008c8565b620008748262000860620008ce565b6200075e60201b6200141f1790919060201c565b111562000759576040805162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015290519081900360640190fd5b60065490565b60025490565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200090c576000855562000957565b82601f106200092757805160ff191683800117855562000957565b8280016001018555821562000957579182015b82811115620009575782518255916020019190600101906200093a565b506200096592915062000969565b5090565b5b808211156200096557600081556001016200096a565b61229080620009906000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063715018a611610130578063a457c2d7116100b8578063d53913931161007c578063d539139314610894578063d547741f1461089c578063d8fbe994146108c8578063dd62ed3e146108fe578063f2fde38b1461092c57610227565b8063a457c2d71461069e578063a9059cbb146106ca578063c1d34b89146106f6578063ca15c873146107bc578063cae9ca51146107d957610227565b80638da5cb5b116100ff5780638da5cb5b1461061b5780639010d07c1461063f57806391d148541461066257806395d89b411461068e578063a217fddf1461069657610227565b8063715018a6146105b357806379cc6790146105bb5780637d64bcb4146105e75780638980f11f146105ef57610227565b8063313ce567116101b35780633950935111610182578063395093511461045d5780634000aea01461048957806340c10f191461054457806342966c681461057057806370a082311461058d57610227565b8063313ce567146103df5780633177029f146103fd578063355274ea1461042957806336568abe1461043157610227565b80631296ee62116101fa5780631296ee621461031857806318160ddd1461034457806323b872dd1461035e578063248a9ca3146103945780632f2ff15d146103b157610227565b806301ffc9a71461022c57806305d2035b1461026757806306fdde031461026f578063095ea7b3146102ec575b600080fd5b6102536004803603602081101561024257600080fd5b50356001600160e01b031916610952565b604080519115158252519081900360200190f35b610253610971565b61027761097a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b1578181015183820152602001610299565b50505050905090810190601f1680156102de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102536004803603604081101561030257600080fd5b506001600160a01b038135169060200135610a10565b6102536004803603604081101561032e57600080fd5b506001600160a01b038135169060200135610a2e565b61034c610a51565b60408051918252519081900360200190f35b6102536004803603606081101561037457600080fd5b506001600160a01b03813581169160208101359091169060400135610a57565b61034c600480360360208110156103aa57600080fd5b5035610ade565b6103dd600480360360408110156103c757600080fd5b50803590602001356001600160a01b0316610af3565b005b6103e7610b5f565b6040805160ff9092168252519081900360200190f35b6102536004803603604081101561041357600080fd5b506001600160a01b038135169060200135610b68565b61034c610b84565b6103dd6004803603604081101561044757600080fd5b50803590602001356001600160a01b0316610b8a565b6102536004803603604081101561047357600080fd5b506001600160a01b038135169060200135610beb565b6102536004803603606081101561049f57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156104cf57600080fd5b8201836020820111156104e157600080fd5b8035906020019184600183028401116401000000008311171561050357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c39945050505050565b6103dd6004803603604081101561055a57600080fd5b506001600160a01b038135169060200135610c94565b6103dd6004803603602081101561058657600080fd5b5035610ce0565b61034c600480360360208110156105a357600080fd5b50356001600160a01b0316610cf4565b6103dd610d0f565b6103dd600480360360408110156105d157600080fd5b506001600160a01b038135169060200135610dbb565b6103dd610e15565b6103dd6004803603604081101561060557600080fd5b506001600160a01b038135169060200135610e61565b610623610f51565b604080516001600160a01b039092168252519081900360200190f35b6106236004803603604081101561065557600080fd5b5080359060200135610f60565b6102536004803603604081101561067857600080fd5b50803590602001356001600160a01b0316610f78565b610277610f90565b61034c610ff1565b610253600480360360408110156106b457600080fd5b506001600160a01b038135169060200135610ff6565b610253600480360360408110156106e057600080fd5b506001600160a01b03813516906020013561105e565b6102536004803603608081101561070c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561074757600080fd5b82018360208201111561075957600080fd5b8035906020019184600183028401116401000000008311171561077b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611072945050505050565b61034c600480360360208110156107d257600080fd5b50356110d3565b610253600480360360608110156107ef57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561081f57600080fd5b82018360208201111561083157600080fd5b8035906020019184600183028401116401000000008311171561085357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506110ea945050505050565b61034c61113d565b6103dd600480360360408110156108b257600080fd5b50803590602001356001600160a01b0316611161565b610253600480360360608110156108de57600080fd5b506001600160a01b038135811691602081013590911690604001356111ba565b61034c6004803603604081101561091457600080fd5b506001600160a01b03813581169160200135166111d7565b6103dd6004803603602081101561094257600080fd5b50356001600160a01b0316611202565b6001600160e01b03191660009081526008602052604090205460ff1690565b60075460ff1690565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b5050505050905090565b6000610a24610a1d6114ff565b8484611503565b5060015b92915050565b6000610a4a838360405180602001604052806000815250610c39565b9392505050565b60025490565b6000610a648484846115ef565b610ad484610a706114ff565b610acf8560405180606001604052806028815260200161210f602891396001600160a01b038a16600090815260016020526040812090610aae6114ff565b6001600160a01b03168152602081019190915260400160002054919061174a565b611503565b5060019392505050565b6000908152600a602052604090206002015490565b6000828152600a6020526040902060020154610b1690610b116114ff565b610f78565b610b515760405162461bcd60e51b815260040180806020018281038252602f815260200180611faa602f913960400191505060405180910390fd5b610b5b82826117e1565b5050565b60055460ff1690565b6000610a4a8383604051806020016040528060008152506110ea565b60065490565b610b926114ff565b6001600160a01b0316816001600160a01b031614610be15760405162461bcd60e51b815260040180806020018281038252602f81526020018061222c602f913960400191505060405180910390fd5b610b5b828261184a565b6000610a24610bf86114ff565b84610acf8560016000610c096114ff565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061141f565b6000610c45848461105e565b50610c59610c516114ff565b8585856118b3565b610ad45760405162461bcd60e51b81526004018080602001828103825260268152602001806120e96026913960400191505060405180910390fd5b60075460ff1615610cd65760405162461bcd60e51b81526004018080602001828103825260228152602001806121e56022913960400191505060405180910390fd5b610b5b82826119f8565b610cf1610ceb6114ff565b82611a69565b50565b6001600160a01b031660009081526020819052604090205490565b610d176114ff565b6001600160a01b0316610d28610f51565b6001600160a01b031614610d71576040805162461bcd60e51b81526020600482018190526024820152600080516020612137833981519152604482015290519081900360640190fd5b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6000610df28260405180606001604052806024815260200161215760249139610deb86610de66114ff565b6111d7565b919061174a565b9050610e0683610e006114ff565b83611503565b610e108383611a69565b505050565b60075460ff1615610e575760405162461bcd60e51b81526004018080602001828103825260228152602001806121e56022913960400191505060405180910390fd5b610e5f611b65565b565b610e696114ff565b6001600160a01b0316610e7a610f51565b6001600160a01b031614610ec3576040805162461bcd60e51b81526020600482018190526024820152600080516020612137833981519152604482015290519081900360640190fd5b816001600160a01b031663a9059cbb610eda610f51565b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b505050506040513d6020811015610f4b57600080fd5b50505050565b6009546001600160a01b031690565b6000828152600a60205260408120610a4a9083611bcf565b6000828152600a60205260408120610a4a908361140a565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a065780601f106109db57610100808354040283529160200191610a06565b600081565b6000610a246110036114ff565b84610acf85604051806060016040528060258152602001612207602591396001600061102d6114ff565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061174a565b6000610a2461106b6114ff565b84846115ef565b600061107f858585610a57565b5061108c858585856118b3565b6110c75760405162461bcd60e51b81526004018080602001828103825260268152602001806120e96026913960400191505060405180910390fd5b5060015b949350505050565b6000818152600a60205260408120610a2890611bdb565b60006110f68484610a10565b50611102848484611be6565b610ad45760405162461bcd60e51b81526004018080602001828103825260258152602001806120436025913960400191505060405180910390fd5b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b6000828152600a602052604090206002015461117f90610b116114ff565b610be15760405162461bcd60e51b815260040180806020018281038252603081526020018061208e6030913960400191505060405180910390fd5b60006110cb84848460405180602001604052806000815250611072565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61120a6114ff565b6001600160a01b031661121b610f51565b6001600160a01b031614611264576040805162461bcd60e51b81526020600482018190526024820152600080516020612137833981519152604482015290519081900360640190fd5b6001600160a01b0381166112a95760405162461bcd60e51b8152600401808060200182810382526026815260200180611ffb6026913960400191505060405180910390fd5b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216611360576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61136c60008383611d19565b600254611379908261141f565b6002556001600160a01b03821660009081526020819052604090205461139f908261141f565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000610a4a836001600160a01b038416611d24565b6000610a4a836001600160a01b038416611d6e565b600082820183811015610a4a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b611484838383610e10565b6001600160a01b038316610e105761149a610b84565b6114ac826114a6610a51565b9061141f565b1115610e10576040805162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015290519081900360640190fd5b3390565b6001600160a01b0383166115485760405162461bcd60e51b81526004018080602001828103825260248152602001806121c16024913960400191505060405180910390fd5b6001600160a01b03821661158d5760405162461bcd60e51b81526004018080602001828103825260228152602001806120216022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166116345760405162461bcd60e51b815260040180806020018281038252602581526020018061219c6025913960400191505060405180910390fd5b6001600160a01b0382166116795760405162461bcd60e51b8152600401808060200182810382526023815260200180611f876023913960400191505060405180910390fd5b611684838383611d19565b6116c181604051806060016040528060268152602001612068602691396001600160a01b038616600090815260208190526040902054919061174a565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546116f0908261141f565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156117d95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561179e578181015183820152602001611786565b50505050905090810190601f1680156117cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828152600a602052604090206117f990826113f5565b15610b5b576118066114ff565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600a602052604090206118629082611d86565b15610b5b5761186f6114ff565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60006118c7846001600160a01b0316611d9b565b6118d3575060006110cb565b6000846001600160a01b03166388a7ca5c6118ec6114ff565b8887876040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561195f578181015183820152602001611947565b50505050905090810190601f16801561198c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156119ae57600080fd5b505af11580156119c2573d6000803e3d6000fd5b505050506040513d60208110156119d857600080fd5b50516001600160e01b031916632229f29760e21b14915050949350505050565b611a247ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9610b116114ff565b611a5f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806120be602b913960400191505060405180910390fd5b610b5b8282611305565b6001600160a01b038216611aae5760405162461bcd60e51b815260040180806020018281038252602181526020018061217b6021913960400191505060405180910390fd5b611aba82600083611d19565b611af781604051806060016040528060228152602001611fd9602291396001600160a01b038516600090815260208190526040902054919061174a565b6001600160a01b038316600090815260208190526040902055600254611b1d9082611da1565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b611b6d6114ff565b6001600160a01b0316611b7e610f51565b6001600160a01b031614611bc7576040805162461bcd60e51b81526020600482018190526024820152600080516020612137833981519152604482015290519081900360640190fd5b610e5f611dfe565b6000610a4a8383611e36565b6000610a2882611e9a565b6000611bfa846001600160a01b0316611d9b565b611c0657506000610a4a565b6000846001600160a01b0316637b04a2d0611c1f6114ff565b86866040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611c82578181015183820152602001611c6a565b50505050905090810190601f168015611caf5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b505050506040513d6020811015611cfa57600080fd5b50516001600160e01b0319166307b04a2d60e41b149150509392505050565b610e10838383611479565b6000611d308383611d6e565b611d6657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a28565b506000610a28565b60009081526001919091016020526040902054151590565b6000610a4a836001600160a01b038416611e9e565b3b151590565b600082821115611df8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6007805460ff191660011790556040517fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0890600090a1565b81546000908210611e785760405162461bcd60e51b8152600401808060200182810382526022815260200180611f656022913960400191505060405180910390fd5b826000018281548110611e8757fe5b9060005260206000200154905092915050565b5490565b60008181526001830160205260408120548015611f5a5783546000198083019190810190600090879083908110611ed157fe5b9060005260206000200154905080876000018481548110611eee57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611f1e57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a28565b6000915050610a2856fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e647345524332303a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373455243313336333a205f636865636b416e6443616c6c417070726f7665207265766572747345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65526f6c65733a2063616c6c657220646f6573206e6f74206861766520746865204d494e54455220726f6c65455243313336333a205f636865636b416e6443616c6c5472616e73666572207265766572747345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332304d696e7461626c653a206d696e74696e672069732066696e697368656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220f71e5efda71ddfaa0f1173a116ad3cb550aae61b0f54ffcf210a64ca2e14194664736f6c63430007060033f0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9526f6c65733a2063616c6c657220646f6573206e6f74206861766520746865204d494e54455220726f6c6500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000006342fd08f00f63780000000000000000000000000000000000000000000000006342fd08f00f637800000000000000000000000000000022338e74d195b7f166f647070c75b7de944e161200000000000000000000000000000000000000000000000000000000000000074d656c616c69650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d454c0000000000000000000000000000000000000000000000000000000000')
print(ans.json())