{"matchId":"57665015","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-30T10:25:50Z","creationBytecode":{"onchainBytecode":"0x610200604052346200052857620037e680380380916200002282610200620005df565b6102003961046081126200052857610200516001600160401b038111620005285762000058908261020001906102000162000628565b610220516001600160401b038111620005285762000080908361020001906102000162000628565b6200008d61024062000683565b916200009b61026062000683565b91620000a961028062000683565b6102a0516101e0526102c0516102e0516103005161032051610340519399909893979094919390620000e2610200870161036062000698565b96620000f5610200880161046062000698565b98610200880161057f12156200052857604051976200011489620005c2565b8890610660906102000181116200052857610560915b818310620005a5575050506001600160a01b03841615801562000593575b801562000581575b6200056f576101e05115801562000566575b80156200055d575b801562000554575b80156200054b575b801562000542575b620004ae5760405191610cd691828401916001600160401b038311858410176200049857620001c6620001d592869562002b108739608085526080850190620006e4565b908382036020850152620006e4565b906101e051604082015260603091015203906000f0908115620005365760a0919091526001600160a01b039182166080521661010081905260405163313ce56760e01b815290602090829060049082905afa9081156200053657600091620004ee575b50601260ff821611620004ae576101205260c052610180976101e051895260e05261014052610160526101a09485526101c093845260005b60088110620003f6575050505042602355604051916123dc93846200073485396080518481816114fc01526117b9015260a0518481816102b1015281816110eb0152611352015260c051848181610a1a015281816111e6015261176b015260e051848181610a9601528181610eb0015281816117910152611dd601526101005184818161040d0152611ad30152610120518481816109910152611b2a01526101405184818161072f01528181610d50015281816116660152611eef01526101605184818161075601528181610ab901528181611453015281816118080152611e5701525183818161055b015281816106860152818161083c01528181610bf401528181610d1501528181611a5601528181611d270152818161219101526123780152518281816103d4015281816107080152818161086c01528181611d69015261216c015251818181610584015281816105b1015281816105e80152818161064201528181610bb401528181610cd801528181610f0901528181611fbc015261214a0152f35b6200040281846200070b565b51158015620004d9575b8015620004c0575b620004ae576200042581846200070b565b51906200043381866200070b565b5161ffff6200044383866200070b565b51604051949116916060850191906001600160401b038311868410176200049857836040600197600295825284815283602082015201526003850291825585820155019061ffff198254161790550162000270565b634e487b7160e01b600052604160045260246000fd5b6040516301f30c8760e21b8152600490fd5b5061ffff620004d082846200070b565b51161562000414565b50620004e681856200070b565b51156200040c565b90506020813d6020116200052d575b816200050c60209383620005df565b8101031262000528575160ff8116810362000528573862000238565b600080fd5b3d9150620004fd565b6040513d6000823e3d90fd5b50861562000182565b5085156200017a565b508a1562000172565b508b156200016a565b508c1562000162565b60405163d92e233d60e01b8152600490fd5b506001600160a01b0385161562000150565b506001600160a01b0383161562000148565b825161ffff8116810362000528578152602092830192016200012a565b61010081019081106001600160401b038211176200049857604052565b601f909101601f19168101906001600160401b038211908210176200049857604052565b60005b838110620006175750506000910152565b818101518382015260200162000606565b81601f82011215620005285780516001600160401b0381116200049857604051926200065f601f8301601f191660200185620005df565b81845260208284010111620005285762000680916020808501910162000603565b90565b51906001600160a01b03821682036200052857565b9080601f83011215620005285760405191620006b483620005c2565b829061010081019283116200052857905b828210620006d35750505090565b8151815260209182019101620006c5565b90602091620006ff8151809281855285808601910162000603565b601f01601f1916010190565b9060088110156200071d5760051b0190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561002d575b50361561001b57600080fd5b6040516301f30c8760e21b8152600490fd5b60003560e01c90816306f9e52c1461188a575080630f15f4c01461173457806316c2d30f146116fc5780631aa3a0081461161c578063205e0c1114611549578063210ff9bb1461152b5780632f48ab7d146114e65780632f663586146114c95780633590bafe146114ae57806336331c8f1461149257806336f1e6c0146114765780633ddce1071461143b5780634a5628c51461141d5780634e71d92d146112c757806353f96df21461126e578063576dde12146112535780635d0072811461121557806361d027b3146111d057806362de3bd114610fa95780636875227414610f49578063696453b814610f2c5780636a47aa0614610ef15780636ce41f6214610ed357806377d630ae14610e985780638086b8ba14610d735780638b5cdd2914610d385780638f770ad014610cfd578063900cf0cf14610cb85780639cc85c9514610c9a578063a2309ff814610c7c578063a2b1b80e14610c5e578063a878b14314610c43578063b002e11f14610b99578063c046371114610b7b578063c08b8aa1146109f0578063c0a2526c146109d3578063c1f5138a146109b5578063c23953d014610977578063cbf0980214610939578063d7b2afb5146108fe578063d80528ae1461045a578063d89135cd1461043c578063d8ac81af146103f7578063d90e0264146103bc578063e6674a9a146103a1578063f44136a1146102e0578063fc0c546a1461029b578063fc7b9c181461027d5763fe128e1314610255573861000f565b34610278576000366003190112610278576020610270611dc3565b604051908152f35b600080fd5b34610278576000366003190112610278576020602154604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b03811690819003610278576000526024602052602061027060406000206023548042116000146103875761035561034e610346610341670de0b6b3a76400009442611a20565b612126565b508654611951565b835461191e565b0460018201549081811160001461037b5760029161037291611a20565b915b0154611951565b50506002600091610374565b50670de0b6b3a764000061035561034e6103466000612126565b34610278576000366003190112610278576020610270611d9c565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601b54604051908152f35b34610278576000366003190112610278576040516102209081810181811067ffffffffffffffff8211176108e8576040526000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a082015260006101c082015260006101e082015260006102008201526023548042116000146108d75761053c6105286103416105339342611a20565b601993919354611951565b91602054611951565b60185490818452826020850152601a546040850152601b5460608501527f000000000000000000000000000000000000000000000000000000000000000060808501526105a97f000000000000000000000000000000000000000000000000000000000000000084611931565b8060a08601527f000000000000000000000000000000000000000000000000000000000000000060c08601526001810181116108a75761060e849160017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b11156108bd5760a08401516001810181116108a757670de0b6b3a76400006106d76106ea9361066d876106686106e19660017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b611a20565b60e089015260a0880151603c811061089e57506000955b7f000000000000000000000000000000000000000000000000000000000000000088109687158098610896575b15610865575060005b6101008a0152601d546101208a0152601e546101408a015261191e565b0460215490611a20565b60225490611951565b61016084015215610836575060005b610180820152426101a08201527f00000000000000000000000000000000000000000000000000000000000000006101c08201527f00000000000000000000000000000000000000000000000000000000000000006101e08201527f000000000000000000000000000000000000000000000000000000000000000061020082015261020060405191805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c084015260e081015160e08401526101008101516101008401526101208101516101208401526101408101516101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401520151610200820152f35b610860907f0000000000000000000000000000000000000000000000000000000000000000611a20565b6106f9565b61089085917f000000000000000000000000000000000000000000000000000000000000000061191e565b046106ba565b5080156106b1565b83901c95610684565b634e487b7160e01b600052601160045260246000fd5b6106e1670de0b6b3a76400006106d76106ea93600061066d565b5061053361053c6105286000612126565b634e487b7160e01b600052604160045260246000fd5b346102785760203660031901126102785760043560088110156102785761ffff6109296020926118d1565b9190546040519260031b1c168152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020610270604060002054611cd2565b3461027857600036600319011261027857602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610278576000366003190112610278576020601c54604051908152f35b3461027857600036600319011261027857602060405161dead8152f35b600036600319011261027857610a04611dc3565b3410610b6957610a12611e25565b6000808080347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af13d15610b64573d67ffffffffffffffff81116108e85760405190610a72601f8201601f1916602001836119b3565b8152600060203d92013e5b15610b5257610a8e34601c54611951565b601c556040517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2670de0b6b3a7640000610b1d610b17611abd565b3461191e565b046040519034825260208201527f92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e760403392a2005b6040516312171d8360e31b8152600490fd5b610a7d565b6040516305110f0160e41b8152600490fd5b34610278576000366003190112610278576020602354604051908152f35b3461027857600036600319011261027857610bb2611a2d565b7f0000000000000000000000000000000000000000000000000000000000000000610bdd8183611931565b90600182018092116108a757610bf29161191e565b7f0000000000000000000000000000000000000000000000000000000000000000808211610c3b575b5081811115610c305760209161027091611a20565b505060206000610270565b905082610c1b565b34610278576000366003190112610278576020610270611d1d565b34610278576020366003190112610278576020610270600435611cd2565b34610278576000366003190112610278576020601a54604051908152f35b34610278576000366003190112610278576020602254604051908152f35b34610278576000366003190112610278576020610270610cd6611a2d565b7f000000000000000000000000000000000000000000000000000000000000000090611931565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576020366003190112610278576004356001600160a01b0381169081900361027857604051610da58161195e565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260c060405191610ddb83611996565b610100368437015260005260246020526101c06040600020610e9660405191610e038361195e565b805483526001810154906020840191825260028101549060408501918252600381015460608601908152600482015492610e5a6005608089019460ff87161515865260ff60a08b019760081c161515875201611c6d565b9460c0880195865260405197518852516020880152516040870152516060860152511515608085015251151560a08401525160c08301906118a5565bf35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020601954604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051610e108152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760405190610f7c82611996565b61010080923690376000526024602052610f9c6005604060002001611c6d565b610e9660405180926118a5565b346102785760208060031936011261027857600435903360005260248152604060002060ff600482015460081c16156111be5760088310156111ac5760058101610ff38482611902565b9061ffff905491816003880293816002860154169260031b1c16101561119a5761106661103d876110376110a495611029611f9e565b6110323361205d565b6119f4565b95611902565b61104e8483548360031b1c16611c5a565b9061ffff8084549260031b9316831b921b1916179055565b8483019361107685518254611951565b90556110858451601854611951565b60185561104e611094876118d1565b91909283548360031b1c16611c5a565b6110b18151601b54611951565b601b556110bd336120d7565b80516040516323b872dd60e01b815233600482015261dead60248201526044810191909152838160648160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561118e5761115b575b505190516040519282845283015260408201527f02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf4060603392a3005b8381813d8311611187575b61117081836119b3565b810103126102785751801515036102785784611120565b503d611166565b6040513d6000823e3d90fd5b6040516330e57efd60e21b8152600490fd5b6040516321a9b14360e01b8152600490fd5b60405163037c597f60e01b8152600490fd5b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020604060002054604051908152f35b34610278576000366003190112610278576020610270611abd565b346102785760203660031901126102785760043561128a6119d5565b5060088110156111ac576112a26003606092026119f4565b610e96604051809261ffff604080928051855260208101516020860152015116910152565b34610278576000366003190112610278576112e0611f9e565b6112e93361205d565b336000526024602052600260406000200154801561140b573360005260246020526000600260408220015561132081602254611a20565b602255336000526024602052600360406000200161133f828254611951565b905561134d81601a54611951565b601a557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561027857600080926044604051809581936340c10f1960e01b83523360048401528660248401525af1801561118e576113f1575b60209060195460405190828252838201527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60403392a2604051908152f35b67ffffffffffffffff82116108e8576020916040526113b2565b6040516312d37ee560e31b8152600490fd5b34610278576000366003190112610278576020601854604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051603c8152f35b3461027857600036600319011261027857602060405160088152f35b34610278576000366003190112610278576020610270611a2d565b346102785760003660031901126102785760208054604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601d54604051908152f35b346102785760003660031901126102785760405161156681611996565b60005b610100811061160757604051610100810181811067ffffffffffffffff8211176108e857604052600080825b600882106115e957604051846000825b600882106115b35761030084f35b60206060826115dd600194875161ffff604080928051855260208101516020860152015116910152565b019301910190916115a5565b600360206001926115f9866119f4565b815201930191019091611595565b6020906116126119d5565b8184015201611569565b346102785760003660031901126102785733600052602460205260406000206004810160ff8154166116ea57611650611f9e565b6116593361205d565b600160ff198254161790557f000000000000000000000000000000000000000000000000000000000000000090611691828254611951565b905561169f81601854611951565b601855601d54600181018091116108a757601d556116bc336120d7565b6040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a2005b604051630ea075bf60e21b8152600490fd5b34610278576020366003190112610278576020670de0b6b3a764000061172b611723611abd565b60043561191e565b04604051908152f35b346102785760003660031901126102785761174d611e25565b6040516323b872dd60e01b6000908152336004526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024527f0000000000000000000000000000000000000000000000000000000000000000604481905292917f00000000000000000000000000000000000000000000000000000000000000009060209060648180855af160016000511481161561186a575b8360405260006060521561185457836040519081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2005b635274afe760e01b835216600482015260249150fd5b600181151661188057813b15153d1516166117f1565b833d6000823e3d90fd5b3461027857600036600319011261027857602090601e548152f35b6000915b600883106118b657505050565b60019061ffff835116815260208091019201920191906118a9565b9060088210156118ec57601e8260041c601f019260011b1690565b634e487b7160e01b600052603260045260246000fd5b91909160088310156118ec57601e908360041c019260011b1690565b818102929181159184041417156108a757565b811561193b570490565b634e487b7160e01b600052601260045260246000fd5b919082018092116108a757565b60e0810190811067ffffffffffffffff8211176108e857604052565b6060810190811067ffffffffffffffff8211176108e857604052565b610100810190811067ffffffffffffffff8211176108e857604052565b90601f8019910116810190811067ffffffffffffffff8211176108e857604052565b604051906119e28261197a565b60006040838281528260208201520152565b90604051611a018161197a565b604061ffff600283958054855260018101546020860152015416910152565b919082039182116108a757565b602354804211600014611a8757611a4a610341611a549242611a20565b9050601954611951565b7f00000000000000000000000000000000000000000000000000000000000000009081811115611a82575090565b905090565b50611a54611a4a6000612126565b519069ffffffffffffffffffff8216820361027857565b60ff16604d81116108a757600a0a90565b604051633fabe5a360e21b8152600460a08282817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561118e576000928391611c02575b506000831315611bf2578015908115611bc7575b50611bb85760ff7f00000000000000000000000000000000000000000000000000000000000000001660128110611b985760128111611b5f57505090565b601119019060ff8211611b83575090611b7a611b8092611aac565b90611931565b90565b601190634e487b7160e01b6000525260246000fd5b6012039060ff8211611b83575090611bb2611b8092611aac565b9061191e565b604051630cd5fa0760e11b8152fd5b9050610e108101809111611bdd57421138611b21565b601182634e487b7160e01b6000525260246000fd5b5060405163fd1ee34960e01b8152fd5b92905060a0833d60a011611c52575b81611c1e60a093836119b3565b81010312611c4f5750611c3082611a95565b506020820151611c47608060608501519401611a95565b509138611b0d565b80fd5b3d9150611c11565b90600161ffff809316019182116108a757565b90604051915461ffff908181168452818160101c166020850152818160201c166040850152818160301c166060850152818160401c166080850152818160501c1660a0850152818160601c1660c085015260701c1660e0830152611cd082611996565b565b611cda611d1d565b80158015611d15575b8015611d0b575b611d0457611b8091611cfb9161191e565b60185490611931565b5050600090565b5060185415611cea565b508115611ce3565b611d25611a2d565b7f00000000000000000000000000000000000000000000000000000000000000001115611d9757611d54611d9c565b8015611d9157611d8d670de0b6b3a7640000917f000000000000000000000000000000000000000000000000000000000000000061191e565b0490565b50600090565b600090565b611da7610cd6611a2d565b603c8110611db55750600090565b670de0b6b3a7640000901c90565b611dcb611abd565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000008181029181159183041417156108a75781611e0f91611951565b6000198101919082116108a757611b8091611931565b6000338152602460205260408120600481019060ff825460081c16611f8c57611e4c611f9e565b611e553361205d565b7f00000000000000000000000000000000000000000000000000000000000000008092805460ff811615611ee0575b50805461ff0019166101001790558154611ead939291611ea391611951565b9055601854611951565b601855601e549060018201809211611ecc5750601e55611cd0336120d7565b634e487b7160e01b81526011600452602490fd5b60019060ff1916178155611f157f00000000000000000000000000000000000000000000000000000000000000008093611951565b91611f2281601854611951565b601855601d5460018101809111611f785791611ead95949391611ea393601d556040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a29150919293611e84565b634e487b7160e01b87526011600452602487fd5b60405163ef65161f60e01b8152600490fd5b6023548042111561205a57611fb39042611a20565b426023556019547f000000000000000000000000000000000000000000000000000000000000000090611fef611fe98383611931565b93612126565b80156120535761201b9261200861201093602054611951565b602055611951565b918260195582611931565b918211612026575050565b60207f817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e33491604051908152a2565b5050505050565b50565b611cd09060018060a01b03811660005260246020526040600020600181015490670de0b6b3a764000061209482546020549061191e565b04918083116120a6575b5050506120d7565b6120b56002916120cc94611a20565b91016120c2828254611951565b9055602254611951565b60225538808061209e565b60018060a01b03166000526024602052612121604060002061211c6001820191670de0b6b3a7640000612110845492546020549061191e565b04809355602154611a20565b611951565b602155565b60185460009283928391908315801561239e575b8015612372575b612368576019547f0000000000000000000000000000000000000000000000000000000000000000967f0000000000000000000000000000000000000000000000000000000000000000958795917f0000000000000000000000000000000000000000000000000000000000000000905b603c908189108061235f575b80612356575b15612348576121d38c87611931565b9182101561234857670de0b6b3a764000090816121f281851c8d61191e565b049283156122c657600181018091116122b257876106688f6122139361191e565b61221d8886611a20565b808210156123405750925b612232898261191e565b938085116122d65750508792915b83156122c6578083029083820414831517156122b2579161227c81612276612282946122708a6122889998611931565b90611951565b98611951565b97611951565b96611a20565b96600019811461229e57600101969493926121b2565b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b8d52601160045260248dfd5b509b505050505095505050915050565b929093506122e48484611951565b600019810190811161232c57846122fa91611931565b93898511612324575b8461230d9161191e565b9280841161231c575b50612240565b925038612316565b899450612303565b634e487b7160e01b8e52601160045260248efd5b905092612228565b9a5050505095505050915050565b508286106121c4565b508615156121be565b5092935050508190565b506019547f00000000000000000000000000000000000000000000000000000000000000001115612141565b50801561213a56fea26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c6343000818003360c060405234620003c45762000cd6803803806200001d81620003c9565b928339810190608081830312620003c45780516001600160401b0390818111620003c457836200004f918401620003ef565b926020908184015190838211620003c4576200006d918501620003ef565b91606060408501519401519460018060a01b03861691828703620003c4578151818111620002c4576003908154906001948583811c93168015620003b9575b88841014620003a3578190601f938481116200034d575b508890848311600114620002e657600092620002da575b505060001982851b1c191690851b1782555b8651928311620002c45760049687548581811c91168015620002b9575b88821014620002a45782811162000259575b5086918411600114620001ee57938394918492600095620001e2575b50501b92600019911b1c19161783555b15620001b65782156200018b57505060805260a052604051610874908162000462823960805181818160bf0152610317015260a0518181816102e001526105100152f35b60405162461bcd60e51b815291820152600560248201526406361703d360dc1b604482015260649150fd5b60405162461bcd60e51b81529182015260066024820152650706f6f6c3d360d41b604482015260649150fd5b01519350388062000137565b9190601f198416928860005284886000209460005b8a8983831062000241575050501062000226575b50505050811b01835562000147565b01519060f884600019921b161c191690553880808062000217565b86860151895590970196948501948893500162000203565b88600052876000208380870160051c8201928a88106200029a575b0160051c019086905b8281106200028d5750506200011b565b600081550186906200027d565b9250819262000274565b602289634e487b7160e01b6000525260246000fd5b90607f169062000109565b634e487b7160e01b600052604160045260246000fd5b015190503880620000da565b90879350601f19831691866000528a6000209260005b8c8282106200033657505084116200031d575b505050811b018255620000ec565b015160001983871b60f8161c191690553880806200030f565b8385015186558b97909501949384019301620002fc565b90915084600052886000208480850160051c8201928b861062000399575b918991869594930160051c01915b82811062000389575050620000c3565b6000815585945089910162000379565b925081926200036b565b634e487b7160e01b600052602260045260246000fd5b92607f1692620000ac565b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620002c457604052565b919080601f84011215620003c45782516001600160401b038111620002c45760209062000425601f8201601f19168301620003c9565b92818452828287010111620003c45760005b8181106200044d57508260009394955001015290565b85810183015184820184015282016200043756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde03146105e957508163095ea7b31461053f57816316f0115b146104fb57816318160ddd146104dc57816323b872dd146103e5578163313ce567146103c957816340c10f19146102b657816370a082311461027f57816395d89b411461015e57508063a9059cbb1461012e578063dd62ed3e146100e65763ec81b483146100a957600080fd5b346100e257816003193601126100e257602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5080fd5b50346100e257806003193601126100e2578060209261010361070c565b61010b610727565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50346100e257806003193601126100e25760209061015761014d61070c565b6024359033610760565b5160018152f35b8383346100e257816003193601126100e25780519082845460018160011c9060018316928315610275575b60209384841081146102625783885290811561024657506001146101f1575b505050829003601f01601f191682019267ffffffffffffffff8411838510176101de57508291826101da9252826106c3565b0390f35b634e487b7160e01b815260418552602490fd5b8787529192508591837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b83851061023257505050508301018580806101a8565b80548886018301529301928490820161021c565b60ff1916878501525050151560051b84010190508580806101a8565b634e487b7160e01b895260228a52602489fd5b91607f1691610189565b5050346100e25760203660031901126100e25760209181906001600160a01b036102a761070c565b16815280845220549051908152f35b919050346103c557806003193601126103c5576102d161070c565b60243591906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811633036103b55760025491610315858461073d565b7f0000000000000000000000000000000000000000000000000000000000000000106103a5571693841561038e5750827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92610374879560209461073d565b60025585855284835280852082815401905551908152a380f35b825163ec442f0560e01b8152908101869052602490fd5b835163a4875a4960e01b81528690fd5b8251636f61f64160e01b81528590fd5b8280fd5b5050346100e257816003193601126100e2576020905160128152f35b905082346104d95760603660031901126104d95761040161070c565b610409610727565b916044359360018060a01b038316808352600160205286832033845260205286832054916000198310610445575b602088610157898989610760565b8683106104ad57811561049657331561047f5750825260016020908152868320338452815291869020908590039055829061015787610437565b8751634a1406b160e11b8152908101849052602490fd5b875163e602df0560e01b8152908101849052602490fd5b8751637dc7a0d960e11b8152339181019182526020820193909352604081018790528291506060010390fd5b80fd5b5050346100e257816003193601126100e2576020906002549051908152f35b5050346100e257816003193601126100e257517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9050346103c557816003193601126103c55761055961070c565b6024359033156105d2576001600160a01b03169182156105bb57508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b849084346103c557826003193601126103c5578260035460018160011c90600183169283156106b9575b602093848410811461026257838852908115610246575060011461066357505050829003601f01601f191682019267ffffffffffffffff8411838510176101de57508291826101da9252826106c3565b600387529192508591837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106106a557505050508301018580806101a8565b80548886018301529301928490820161068f565b91607f1691610613565b6020808252825181830181905290939260005b8281106106f857505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016106d6565b600435906001600160a01b038216820361072257565b600080fd5b602435906001600160a01b038216820361072257565b9190820180921161074a57565b634e487b7160e01b600052601160045260246000fd5b916001600160a01b03808416928315610825571692831561080c57600090838252816020526040822054908382106107da575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fdfea26469706673582212203df637a26bb0c419fbfb5e3cf8f83135454d932cce26b56cec5aac125c51b9a964736f6c63430008180033000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000055d398326f99059ff775485246999027b31979550000000000000000000000000567f2323251f0aab15c8dfb1967e4e8a7d42aee00000000000000000000000045e5ad18df32acf05fae75abe90a628b7a78d259000000000000000000000000000000000000000000115eec47f6cf7e350000000000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000029a2241af62c000000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000056bc75e2d6310000000000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000006c6b935b8bbd40000000000000000000000000000000000000000000000000010f0cf064dd5920000000000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000002fb474098f67c00000000000000000000000000000000000000000000000000068155a43676e0000000000000000000000000000000000000000000000000000d480ed9ef32b40000000000000000000000000000000000000000000000000028a857425466f8000000000000000000000000000000000000000000000000005c283d4103941000000000000000000000000000000000000000000000000000bdbc41e0348b30000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006486173683231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044841534800000000000000000000000000000000000000000000000000000000","recompiledBytecode":"0x610200604052346200052857620037e680380380916200002282610200620005df565b6102003961046081126200052857610200516001600160401b038111620005285762000058908261020001906102000162000628565b610220516001600160401b038111620005285762000080908361020001906102000162000628565b6200008d61024062000683565b916200009b61026062000683565b91620000a961028062000683565b6102a0516101e0526102c0516102e0516103005161032051610340519399909893979094919390620000e2610200870161036062000698565b96620000f5610200880161046062000698565b98610200880161057f12156200052857604051976200011489620005c2565b8890610660906102000181116200052857610560915b818310620005a5575050506001600160a01b03841615801562000593575b801562000581575b6200056f576101e05115801562000566575b80156200055d575b801562000554575b80156200054b575b801562000542575b620004ae5760405191610cd691828401916001600160401b038311858410176200049857620001c6620001d592869562002b108739608085526080850190620006e4565b908382036020850152620006e4565b906101e051604082015260603091015203906000f0908115620005365760a0919091526001600160a01b039182166080521661010081905260405163313ce56760e01b815290602090829060049082905afa9081156200053657600091620004ee575b50601260ff821611620004ae576101205260c052610180976101e051895260e05261014052610160526101a09485526101c093845260005b60088110620003f6575050505042602355604051916123dc93846200073485396080518481816114fc01526117b9015260a0518481816102b1015281816110eb0152611352015260c051848181610a1a015281816111e6015261176b015260e051848181610a9601528181610eb0015281816117910152611dd601526101005184818161040d0152611ad30152610120518481816109910152611b2a01526101405184818161072f01528181610d50015281816116660152611eef01526101605184818161075601528181610ab901528181611453015281816118080152611e5701525183818161055b015281816106860152818161083c01528181610bf401528181610d1501528181611a5601528181611d270152818161219101526123780152518281816103d4015281816107080152818161086c01528181611d69015261216c015251818181610584015281816105b1015281816105e80152818161064201528181610bb401528181610cd801528181610f0901528181611fbc015261214a0152f35b6200040281846200070b565b51158015620004d9575b8015620004c0575b620004ae576200042581846200070b565b51906200043381866200070b565b5161ffff6200044383866200070b565b51604051949116916060850191906001600160401b038311868410176200049857836040600197600295825284815283602082015201526003850291825585820155019061ffff198254161790550162000270565b634e487b7160e01b600052604160045260246000fd5b6040516301f30c8760e21b8152600490fd5b5061ffff620004d082846200070b565b51161562000414565b50620004e681856200070b565b51156200040c565b90506020813d6020116200052d575b816200050c60209383620005df565b8101031262000528575160ff8116810362000528573862000238565b600080fd5b3d9150620004fd565b6040513d6000823e3d90fd5b50861562000182565b5085156200017a565b508a1562000172565b508b156200016a565b508c1562000162565b60405163d92e233d60e01b8152600490fd5b506001600160a01b0385161562000150565b506001600160a01b0383161562000148565b825161ffff8116810362000528578152602092830192016200012a565b61010081019081106001600160401b038211176200049857604052565b601f909101601f19168101906001600160401b038211908210176200049857604052565b60005b838110620006175750506000910152565b818101518382015260200162000606565b81601f82011215620005285780516001600160401b0381116200049857604051926200065f601f8301601f191660200185620005df565b81845260208284010111620005285762000680916020808501910162000603565b90565b51906001600160a01b03821682036200052857565b9080601f83011215620005285760405191620006b483620005c2565b829061010081019283116200052857905b828210620006d35750505090565b8151815260209182019101620006c5565b90602091620006ff8151809281855285808601910162000603565b601f01601f1916010190565b9060088110156200071d5760051b0190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561002d575b50361561001b57600080fd5b6040516301f30c8760e21b8152600490fd5b60003560e01c90816306f9e52c1461188a575080630f15f4c01461173457806316c2d30f146116fc5780631aa3a0081461161c578063205e0c1114611549578063210ff9bb1461152b5780632f48ab7d146114e65780632f663586146114c95780633590bafe146114ae57806336331c8f1461149257806336f1e6c0146114765780633ddce1071461143b5780634a5628c51461141d5780634e71d92d146112c757806353f96df21461126e578063576dde12146112535780635d0072811461121557806361d027b3146111d057806362de3bd114610fa95780636875227414610f49578063696453b814610f2c5780636a47aa0614610ef15780636ce41f6214610ed357806377d630ae14610e985780638086b8ba14610d735780638b5cdd2914610d385780638f770ad014610cfd578063900cf0cf14610cb85780639cc85c9514610c9a578063a2309ff814610c7c578063a2b1b80e14610c5e578063a878b14314610c43578063b002e11f14610b99578063c046371114610b7b578063c08b8aa1146109f0578063c0a2526c146109d3578063c1f5138a146109b5578063c23953d014610977578063cbf0980214610939578063d7b2afb5146108fe578063d80528ae1461045a578063d89135cd1461043c578063d8ac81af146103f7578063d90e0264146103bc578063e6674a9a146103a1578063f44136a1146102e0578063fc0c546a1461029b578063fc7b9c181461027d5763fe128e1314610255573861000f565b34610278576000366003190112610278576020610270611dc3565b604051908152f35b600080fd5b34610278576000366003190112610278576020602154604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b03811690819003610278576000526024602052602061027060406000206023548042116000146103875761035561034e610346610341670de0b6b3a76400009442611a20565b612126565b508654611951565b835461191e565b0460018201549081811160001461037b5760029161037291611a20565b915b0154611951565b50506002600091610374565b50670de0b6b3a764000061035561034e6103466000612126565b34610278576000366003190112610278576020610270611d9c565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601b54604051908152f35b34610278576000366003190112610278576040516102209081810181811067ffffffffffffffff8211176108e8576040526000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a082015260006101c082015260006101e082015260006102008201526023548042116000146108d75761053c6105286103416105339342611a20565b601993919354611951565b91602054611951565b60185490818452826020850152601a546040850152601b5460608501527f000000000000000000000000000000000000000000000000000000000000000060808501526105a97f000000000000000000000000000000000000000000000000000000000000000084611931565b8060a08601527f000000000000000000000000000000000000000000000000000000000000000060c08601526001810181116108a75761060e849160017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b11156108bd5760a08401516001810181116108a757670de0b6b3a76400006106d76106ea9361066d876106686106e19660017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b611a20565b60e089015260a0880151603c811061089e57506000955b7f000000000000000000000000000000000000000000000000000000000000000088109687158098610896575b15610865575060005b6101008a0152601d546101208a0152601e546101408a015261191e565b0460215490611a20565b60225490611951565b61016084015215610836575060005b610180820152426101a08201527f00000000000000000000000000000000000000000000000000000000000000006101c08201527f00000000000000000000000000000000000000000000000000000000000000006101e08201527f000000000000000000000000000000000000000000000000000000000000000061020082015261020060405191805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c084015260e081015160e08401526101008101516101008401526101208101516101208401526101408101516101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401520151610200820152f35b610860907f0000000000000000000000000000000000000000000000000000000000000000611a20565b6106f9565b61089085917f000000000000000000000000000000000000000000000000000000000000000061191e565b046106ba565b5080156106b1565b83901c95610684565b634e487b7160e01b600052601160045260246000fd5b6106e1670de0b6b3a76400006106d76106ea93600061066d565b5061053361053c6105286000612126565b634e487b7160e01b600052604160045260246000fd5b346102785760203660031901126102785760043560088110156102785761ffff6109296020926118d1565b9190546040519260031b1c168152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020610270604060002054611cd2565b3461027857600036600319011261027857602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610278576000366003190112610278576020601c54604051908152f35b3461027857600036600319011261027857602060405161dead8152f35b600036600319011261027857610a04611dc3565b3410610b6957610a12611e25565b6000808080347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af13d15610b64573d67ffffffffffffffff81116108e85760405190610a72601f8201601f1916602001836119b3565b8152600060203d92013e5b15610b5257610a8e34601c54611951565b601c556040517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2670de0b6b3a7640000610b1d610b17611abd565b3461191e565b046040519034825260208201527f92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e760403392a2005b6040516312171d8360e31b8152600490fd5b610a7d565b6040516305110f0160e41b8152600490fd5b34610278576000366003190112610278576020602354604051908152f35b3461027857600036600319011261027857610bb2611a2d565b7f0000000000000000000000000000000000000000000000000000000000000000610bdd8183611931565b90600182018092116108a757610bf29161191e565b7f0000000000000000000000000000000000000000000000000000000000000000808211610c3b575b5081811115610c305760209161027091611a20565b505060206000610270565b905082610c1b565b34610278576000366003190112610278576020610270611d1d565b34610278576020366003190112610278576020610270600435611cd2565b34610278576000366003190112610278576020601a54604051908152f35b34610278576000366003190112610278576020602254604051908152f35b34610278576000366003190112610278576020610270610cd6611a2d565b7f000000000000000000000000000000000000000000000000000000000000000090611931565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576020366003190112610278576004356001600160a01b0381169081900361027857604051610da58161195e565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260c060405191610ddb83611996565b610100368437015260005260246020526101c06040600020610e9660405191610e038361195e565b805483526001810154906020840191825260028101549060408501918252600381015460608601908152600482015492610e5a6005608089019460ff87161515865260ff60a08b019760081c161515875201611c6d565b9460c0880195865260405197518852516020880152516040870152516060860152511515608085015251151560a08401525160c08301906118a5565bf35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020601954604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051610e108152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760405190610f7c82611996565b61010080923690376000526024602052610f9c6005604060002001611c6d565b610e9660405180926118a5565b346102785760208060031936011261027857600435903360005260248152604060002060ff600482015460081c16156111be5760088310156111ac5760058101610ff38482611902565b9061ffff905491816003880293816002860154169260031b1c16101561119a5761106661103d876110376110a495611029611f9e565b6110323361205d565b6119f4565b95611902565b61104e8483548360031b1c16611c5a565b9061ffff8084549260031b9316831b921b1916179055565b8483019361107685518254611951565b90556110858451601854611951565b60185561104e611094876118d1565b91909283548360031b1c16611c5a565b6110b18151601b54611951565b601b556110bd336120d7565b80516040516323b872dd60e01b815233600482015261dead60248201526044810191909152838160648160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561118e5761115b575b505190516040519282845283015260408201527f02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf4060603392a3005b8381813d8311611187575b61117081836119b3565b810103126102785751801515036102785784611120565b503d611166565b6040513d6000823e3d90fd5b6040516330e57efd60e21b8152600490fd5b6040516321a9b14360e01b8152600490fd5b60405163037c597f60e01b8152600490fd5b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020604060002054604051908152f35b34610278576000366003190112610278576020610270611abd565b346102785760203660031901126102785760043561128a6119d5565b5060088110156111ac576112a26003606092026119f4565b610e96604051809261ffff604080928051855260208101516020860152015116910152565b34610278576000366003190112610278576112e0611f9e565b6112e93361205d565b336000526024602052600260406000200154801561140b573360005260246020526000600260408220015561132081602254611a20565b602255336000526024602052600360406000200161133f828254611951565b905561134d81601a54611951565b601a557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561027857600080926044604051809581936340c10f1960e01b83523360048401528660248401525af1801561118e576113f1575b60209060195460405190828252838201527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60403392a2604051908152f35b67ffffffffffffffff82116108e8576020916040526113b2565b6040516312d37ee560e31b8152600490fd5b34610278576000366003190112610278576020601854604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051603c8152f35b3461027857600036600319011261027857602060405160088152f35b34610278576000366003190112610278576020610270611a2d565b346102785760003660031901126102785760208054604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601d54604051908152f35b346102785760003660031901126102785760405161156681611996565b60005b610100811061160757604051610100810181811067ffffffffffffffff8211176108e857604052600080825b600882106115e957604051846000825b600882106115b35761030084f35b60206060826115dd600194875161ffff604080928051855260208101516020860152015116910152565b019301910190916115a5565b600360206001926115f9866119f4565b815201930191019091611595565b6020906116126119d5565b8184015201611569565b346102785760003660031901126102785733600052602460205260406000206004810160ff8154166116ea57611650611f9e565b6116593361205d565b600160ff198254161790557f000000000000000000000000000000000000000000000000000000000000000090611691828254611951565b905561169f81601854611951565b601855601d54600181018091116108a757601d556116bc336120d7565b6040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a2005b604051630ea075bf60e21b8152600490fd5b34610278576020366003190112610278576020670de0b6b3a764000061172b611723611abd565b60043561191e565b04604051908152f35b346102785760003660031901126102785761174d611e25565b6040516323b872dd60e01b6000908152336004526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024527f0000000000000000000000000000000000000000000000000000000000000000604481905292917f00000000000000000000000000000000000000000000000000000000000000009060209060648180855af160016000511481161561186a575b8360405260006060521561185457836040519081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2005b635274afe760e01b835216600482015260249150fd5b600181151661188057813b15153d1516166117f1565b833d6000823e3d90fd5b3461027857600036600319011261027857602090601e548152f35b6000915b600883106118b657505050565b60019061ffff835116815260208091019201920191906118a9565b9060088210156118ec57601e8260041c601f019260011b1690565b634e487b7160e01b600052603260045260246000fd5b91909160088310156118ec57601e908360041c019260011b1690565b818102929181159184041417156108a757565b811561193b570490565b634e487b7160e01b600052601260045260246000fd5b919082018092116108a757565b60e0810190811067ffffffffffffffff8211176108e857604052565b6060810190811067ffffffffffffffff8211176108e857604052565b610100810190811067ffffffffffffffff8211176108e857604052565b90601f8019910116810190811067ffffffffffffffff8211176108e857604052565b604051906119e28261197a565b60006040838281528260208201520152565b90604051611a018161197a565b604061ffff600283958054855260018101546020860152015416910152565b919082039182116108a757565b602354804211600014611a8757611a4a610341611a549242611a20565b9050601954611951565b7f00000000000000000000000000000000000000000000000000000000000000009081811115611a82575090565b905090565b50611a54611a4a6000612126565b519069ffffffffffffffffffff8216820361027857565b60ff16604d81116108a757600a0a90565b604051633fabe5a360e21b8152600460a08282817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561118e576000928391611c02575b506000831315611bf2578015908115611bc7575b50611bb85760ff7f00000000000000000000000000000000000000000000000000000000000000001660128110611b985760128111611b5f57505090565b601119019060ff8211611b83575090611b7a611b8092611aac565b90611931565b90565b601190634e487b7160e01b6000525260246000fd5b6012039060ff8211611b83575090611bb2611b8092611aac565b9061191e565b604051630cd5fa0760e11b8152fd5b9050610e108101809111611bdd57421138611b21565b601182634e487b7160e01b6000525260246000fd5b5060405163fd1ee34960e01b8152fd5b92905060a0833d60a011611c52575b81611c1e60a093836119b3565b81010312611c4f5750611c3082611a95565b506020820151611c47608060608501519401611a95565b509138611b0d565b80fd5b3d9150611c11565b90600161ffff809316019182116108a757565b90604051915461ffff908181168452818160101c166020850152818160201c166040850152818160301c166060850152818160401c166080850152818160501c1660a0850152818160601c1660c085015260701c1660e0830152611cd082611996565b565b611cda611d1d565b80158015611d15575b8015611d0b575b611d0457611b8091611cfb9161191e565b60185490611931565b5050600090565b5060185415611cea565b508115611ce3565b611d25611a2d565b7f00000000000000000000000000000000000000000000000000000000000000001115611d9757611d54611d9c565b8015611d9157611d8d670de0b6b3a7640000917f000000000000000000000000000000000000000000000000000000000000000061191e565b0490565b50600090565b600090565b611da7610cd6611a2d565b603c8110611db55750600090565b670de0b6b3a7640000901c90565b611dcb611abd565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000008181029181159183041417156108a75781611e0f91611951565b6000198101919082116108a757611b8091611931565b6000338152602460205260408120600481019060ff825460081c16611f8c57611e4c611f9e565b611e553361205d565b7f00000000000000000000000000000000000000000000000000000000000000008092805460ff811615611ee0575b50805461ff0019166101001790558154611ead939291611ea391611951565b9055601854611951565b601855601e549060018201809211611ecc5750601e55611cd0336120d7565b634e487b7160e01b81526011600452602490fd5b60019060ff1916178155611f157f00000000000000000000000000000000000000000000000000000000000000008093611951565b91611f2281601854611951565b601855601d5460018101809111611f785791611ead95949391611ea393601d556040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a29150919293611e84565b634e487b7160e01b87526011600452602487fd5b60405163ef65161f60e01b8152600490fd5b6023548042111561205a57611fb39042611a20565b426023556019547f000000000000000000000000000000000000000000000000000000000000000090611fef611fe98383611931565b93612126565b80156120535761201b9261200861201093602054611951565b602055611951565b918260195582611931565b918211612026575050565b60207f817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e33491604051908152a2565b5050505050565b50565b611cd09060018060a01b03811660005260246020526040600020600181015490670de0b6b3a764000061209482546020549061191e565b04918083116120a6575b5050506120d7565b6120b56002916120cc94611a20565b91016120c2828254611951565b9055602254611951565b60225538808061209e565b60018060a01b03166000526024602052612121604060002061211c6001820191670de0b6b3a7640000612110845492546020549061191e565b04809355602154611a20565b611951565b602155565b60185460009283928391908315801561239e575b8015612372575b612368576019547f0000000000000000000000000000000000000000000000000000000000000000967f0000000000000000000000000000000000000000000000000000000000000000958795917f0000000000000000000000000000000000000000000000000000000000000000905b603c908189108061235f575b80612356575b15612348576121d38c87611931565b9182101561234857670de0b6b3a764000090816121f281851c8d61191e565b049283156122c657600181018091116122b257876106688f6122139361191e565b61221d8886611a20565b808210156123405750925b612232898261191e565b938085116122d65750508792915b83156122c6578083029083820414831517156122b2579161227c81612276612282946122708a6122889998611931565b90611951565b98611951565b97611951565b96611a20565b96600019811461229e57600101969493926121b2565b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b8d52601160045260248dfd5b509b505050505095505050915050565b929093506122e48484611951565b600019810190811161232c57846122fa91611931565b93898511612324575b8461230d9161191e565b9280841161231c575b50612240565b925038612316565b899450612303565b634e487b7160e01b8e52601160045260248efd5b905092612228565b9a5050505095505050915050565b508286106121c4565b508615156121be565b5092935050508190565b506019547f00000000000000000000000000000000000000000000000000000000000000001115612141565b50801561213a56fea26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c6343000818003360c060405234620003c45762000cd6803803806200001d81620003c9565b928339810190608081830312620003c45780516001600160401b0390818111620003c457836200004f918401620003ef565b926020908184015190838211620003c4576200006d918501620003ef565b91606060408501519401519460018060a01b03861691828703620003c4578151818111620002c4576003908154906001948583811c93168015620003b9575b88841014620003a3578190601f938481116200034d575b508890848311600114620002e657600092620002da575b505060001982851b1c191690851b1782555b8651928311620002c45760049687548581811c91168015620002b9575b88821014620002a45782811162000259575b5086918411600114620001ee57938394918492600095620001e2575b50501b92600019911b1c19161783555b15620001b65782156200018b57505060805260a052604051610874908162000462823960805181818160bf0152610317015260a0518181816102e001526105100152f35b60405162461bcd60e51b815291820152600560248201526406361703d360dc1b604482015260649150fd5b60405162461bcd60e51b81529182015260066024820152650706f6f6c3d360d41b604482015260649150fd5b01519350388062000137565b9190601f198416928860005284886000209460005b8a8983831062000241575050501062000226575b50505050811b01835562000147565b01519060f884600019921b161c191690553880808062000217565b86860151895590970196948501948893500162000203565b88600052876000208380870160051c8201928a88106200029a575b0160051c019086905b8281106200028d5750506200011b565b600081550186906200027d565b9250819262000274565b602289634e487b7160e01b6000525260246000fd5b90607f169062000109565b634e487b7160e01b600052604160045260246000fd5b015190503880620000da565b90879350601f19831691866000528a6000209260005b8c8282106200033657505084116200031d575b505050811b018255620000ec565b015160001983871b60f8161c191690553880806200030f565b8385015186558b97909501949384019301620002fc565b90915084600052886000208480850160051c8201928b861062000399575b918991869594930160051c01915b82811062000389575050620000c3565b6000815585945089910162000379565b925081926200036b565b634e487b7160e01b600052602260045260246000fd5b92607f1692620000ac565b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620002c457604052565b919080601f84011215620003c45782516001600160401b038111620002c45760209062000425601f8201601f19168301620003c9565b92818452828287010111620003c45760005b8181106200044d57508260009394955001015290565b85810183015184820184015282016200043756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde03146105e957508163095ea7b31461053f57816316f0115b146104fb57816318160ddd146104dc57816323b872dd146103e5578163313ce567146103c957816340c10f19146102b657816370a082311461027f57816395d89b411461015e57508063a9059cbb1461012e578063dd62ed3e146100e65763ec81b483146100a957600080fd5b346100e257816003193601126100e257602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5080fd5b50346100e257806003193601126100e2578060209261010361070c565b61010b610727565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50346100e257806003193601126100e25760209061015761014d61070c565b6024359033610760565b5160018152f35b8383346100e257816003193601126100e25780519082845460018160011c9060018316928315610275575b60209384841081146102625783885290811561024657506001146101f1575b505050829003601f01601f191682019267ffffffffffffffff8411838510176101de57508291826101da9252826106c3565b0390f35b634e487b7160e01b815260418552602490fd5b8787529192508591837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b83851061023257505050508301018580806101a8565b80548886018301529301928490820161021c565b60ff1916878501525050151560051b84010190508580806101a8565b634e487b7160e01b895260228a52602489fd5b91607f1691610189565b5050346100e25760203660031901126100e25760209181906001600160a01b036102a761070c565b16815280845220549051908152f35b919050346103c557806003193601126103c5576102d161070c565b60243591906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811633036103b55760025491610315858461073d565b7f0000000000000000000000000000000000000000000000000000000000000000106103a5571693841561038e5750827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92610374879560209461073d565b60025585855284835280852082815401905551908152a380f35b825163ec442f0560e01b8152908101869052602490fd5b835163a4875a4960e01b81528690fd5b8251636f61f64160e01b81528590fd5b8280fd5b5050346100e257816003193601126100e2576020905160128152f35b905082346104d95760603660031901126104d95761040161070c565b610409610727565b916044359360018060a01b038316808352600160205286832033845260205286832054916000198310610445575b602088610157898989610760565b8683106104ad57811561049657331561047f5750825260016020908152868320338452815291869020908590039055829061015787610437565b8751634a1406b160e11b8152908101849052602490fd5b875163e602df0560e01b8152908101849052602490fd5b8751637dc7a0d960e11b8152339181019182526020820193909352604081018790528291506060010390fd5b80fd5b5050346100e257816003193601126100e2576020906002549051908152f35b5050346100e257816003193601126100e257517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9050346103c557816003193601126103c55761055961070c565b6024359033156105d2576001600160a01b03169182156105bb57508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b849084346103c557826003193601126103c5578260035460018160011c90600183169283156106b9575b602093848410811461026257838852908115610246575060011461066357505050829003601f01601f191682019267ffffffffffffffff8411838510176101de57508291826101da9252826106c3565b600387529192508591837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106106a557505050508301018580806101a8565b80548886018301529301928490820161068f565b91607f1691610613565b6020808252825181830181905290939260005b8281106106f857505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016106d6565b600435906001600160a01b038216820361072257565b600080fd5b602435906001600160a01b038216820361072257565b9190820180921161074a57565b634e487b7160e01b600052601160045260246000fd5b916001600160a01b03808416928315610825571692831561080c57600090838252816020526040822054908382106107da575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fdfea26469706673582212203df637a26bb0c419fbfb5e3cf8f83135454d932cce26b56cec5aac125c51b9a964736f6c63430008180033","sourceMap":"1514:21374:10:-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;1514:21374:10;;6864:19;:48;;;;1514:21374;6864:75;;;;1514:21374;6860:101;;6988:15;;;:38;;;;1514:21374;6988:65;;;;1514:21374;6988:102;;;;1514:21374;6988:120;;;;1514:21374;6988:144;;;;1514:21374;6971:190;;1514:21374;;;7180:66;;;;;;-1:-1:-1;;;;;7180:66:10;;;;;;;;1514:21374;;7180:66;;;;;;1514:21374;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;7240:4;1514:21374;;;7180:66;;-1:-1:-1;7180:66:10;;;;;;1514:21374;7172:74;;;;-1:-1:-1;;;;;1514:21374:10;;;;7256:20;1514:21374;;7286:47;;;1514:21374;;-1:-1:-1;;;7479:45:10;;1514:21374;;;;;7479:45;;1514:21374;;7479:45;;;;;;;-1:-1:-1;7479:45:10;;;1514:21374;;7544:2;1514:21374;;;7538:8;7534:32;;1514:21374;7576:18;1514:21374;7605:20;7635:22;;;;;;1514:21374;7667:30;1514:21374;7707:20;1514:21374;7737:32;7779:38;;;;7827:34;;;;-1:-1:-1;7892:14:10;1514:21374;7892:14;;;;8126:15;;;;;8113:28;1800:1;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7908:3;7931:10;;;;:::i;:::-;1800:1;7931:15;:34;;;;7908:3;7931:53;;;;7908:3;7927:77;;8043:10;;;;:::i;:::-;1800:1;8061:10;;;;;:::i;:::-;1800:1;1514:21374;8080:10;;;;:::i;:::-;1800:1;1514:21374;;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;1800:1;1514:21374;;;1800:1;;;8030:62;1514:21374;8030:62;;1800:1;8030:62;1800:1;;;;;;;;;;;;;;;;;;;;;1514:21374;7877:13;;1514:21374;;;;-1:-1:-1;1514:21374:10;;7479:45;1514:21374;;-1:-1:-1;1514:21374:10;7927:77;1514:21374;;-1:-1:-1;;;7993:11:10;;7479:45;;7993:11;7931:53;7969:10;1514:21374;7969:10;;;;:::i;:::-;1800:1;1514:21374;7969:15;7931:53;;:34;7950:10;;;;;:::i;:::-;1800:1;7950:15;7931:34;;7479:45;;;1514:21374;7479:45;;1514:21374;7479:45;;;;;;1514:21374;7479:45;;;:::i;:::-;;;1514:21374;;;;;;;;;;;;7479:45;;;1514:21374;-1:-1:-1;1514:21374:10;;7479:45;;;-1:-1:-1;7479:45:10;;;1514:21374;;;-1:-1:-1;1514:21374:10;;;;;6988:144;7112:20;;;6988:144;;:120;7094:14;;;6988:120;;:102;7069:21;;;6988:102;;:65;7030:23;;;6988:65;;:38;7007:19;;;6988:38;;6860:101;1514:21374;;-1:-1:-1;;;6948:13:10;;;;;6864:75;-1:-1:-1;;;;;;1514:21374:10;;6916:23;6864:75;;:48;-1:-1:-1;;;;;;1514:21374:10;;6887:25;6864:48;;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;:::o;:::-;;;;;-1:-1:-1;;1514:21374:10;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;1514:21374:10;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;-1:-1:-1;;;;;1514:21374:10;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;1514:21374:10;;;;:::o;1800:1::-;;;;;;;;;;;;:::o;:::-;1514:21374;;;1800:1;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c63430008180033","offset":10971},"2":{"value":"0xa26469706673582212203df637a26bb0c419fbfb5e3cf8f83135454d932cce26b56cec5aac125c51b9a964736f6c63430008180033","offset":14257}},"transformations":[{"type":"insert","offset":14310,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000055d398326f99059ff775485246999027b31979550000000000000000000000000567f2323251f0aab15c8dfb1967e4e8a7d42aee00000000000000000000000045e5ad18df32acf05fae75abe90a628b7a78d259000000000000000000000000000000000000000000115eec47f6cf7e350000000000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000029a2241af62c000000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000056bc75e2d6310000000000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000006c6b935b8bbd40000000000000000000000000000000000000000000000000010f0cf064dd5920000000000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000002fb474098f67c00000000000000000000000000000000000000000000000000068155a43676e0000000000000000000000000000000000000000000000000000d480ed9ef32b40000000000000000000000000000000000000000000000000028a857425466f8000000000000000000000000000000000000000000000000005c283d4103941000000000000000000000000000000000000000000000000000bdbc41e0348b30000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006486173683231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044841534800000000000000000000000000000000000000000000000000000000"}},"runtimeBytecode":{"onchainBytecode":"0x608080604052600436101561002d575b50361561001b57600080fd5b6040516301f30c8760e21b8152600490fd5b60003560e01c90816306f9e52c1461188a575080630f15f4c01461173457806316c2d30f146116fc5780631aa3a0081461161c578063205e0c1114611549578063210ff9bb1461152b5780632f48ab7d146114e65780632f663586146114c95780633590bafe146114ae57806336331c8f1461149257806336f1e6c0146114765780633ddce1071461143b5780634a5628c51461141d5780634e71d92d146112c757806353f96df21461126e578063576dde12146112535780635d0072811461121557806361d027b3146111d057806362de3bd114610fa95780636875227414610f49578063696453b814610f2c5780636a47aa0614610ef15780636ce41f6214610ed357806377d630ae14610e985780638086b8ba14610d735780638b5cdd2914610d385780638f770ad014610cfd578063900cf0cf14610cb85780639cc85c9514610c9a578063a2309ff814610c7c578063a2b1b80e14610c5e578063a878b14314610c43578063b002e11f14610b99578063c046371114610b7b578063c08b8aa1146109f0578063c0a2526c146109d3578063c1f5138a146109b5578063c23953d014610977578063cbf0980214610939578063d7b2afb5146108fe578063d80528ae1461045a578063d89135cd1461043c578063d8ac81af146103f7578063d90e0264146103bc578063e6674a9a146103a1578063f44136a1146102e0578063fc0c546a1461029b578063fc7b9c181461027d5763fe128e1314610255573861000f565b34610278576000366003190112610278576020610270611dc3565b604051908152f35b600080fd5b34610278576000366003190112610278576020602154604051908152f35b34610278576000366003190112610278576040517f0000000000000000000000006a87de92deb752c6162cf80bd16e3efd4bdc6d906001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b03811690819003610278576000526024602052602061027060406000206023548042116000146103875761035561034e610346610341670de0b6b3a76400009442611a20565b612126565b508654611951565b835461191e565b0460018201549081811160001461037b5760029161037291611a20565b915b0154611951565b50506002600091610374565b50670de0b6b3a764000061035561034e6103466000612126565b34610278576000366003190112610278576020610270611d9c565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000029a2241af62c00008152f35b34610278576000366003190112610278576040517f0000000000000000000000000567f2323251f0aab15c8dfb1967e4e8a7d42aee6001600160a01b03168152602090f35b34610278576000366003190112610278576020601b54604051908152f35b34610278576000366003190112610278576040516102209081810181811067ffffffffffffffff8211176108e8576040526000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a082015260006101c082015260006101e082015260006102008201526023548042116000146108d75761053c6105286103416105339342611a20565b601993919354611951565b91602054611951565b60185490818452826020850152601a546040850152601b5460608501527f000000000000000000000000000000000000000000115eec47f6cf7e3500000060808501526105a97f00000000000000000000000000000000000000000000d3c21bcecceda100000084611931565b8060a08601527f00000000000000000000000000000000000000000000d3c21bcecceda100000060c08601526001810181116108a75761060e849160017f00000000000000000000000000000000000000000000d3c21bcecceda1000000910161191e565b11156108bd5760a08401516001810181116108a757670de0b6b3a76400006106d76106ea9361066d876106686106e19660017f00000000000000000000000000000000000000000000d3c21bcecceda1000000910161191e565b611a20565b60e089015260a0880151603c811061089e57506000955b7f000000000000000000000000000000000000000000115eec47f6cf7e3500000088109687158098610896575b15610865575060005b6101008a0152601d546101208a0152601e546101408a015261191e565b0460215490611a20565b60225490611951565b61016084015215610836575060005b610180820152426101a08201527f00000000000000000000000000000000000000000000000029a2241af62c00006101c08201527f0000000000000000000000000000000000000000000000000de0b6b3a76400006101e08201527f0000000000000000000000000000000000000000000000003782dace9d90000061020082015261020060405191805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c084015260e081015160e08401526101008101516101008401526101208101516101208401526101408101516101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401520151610200820152f35b610860907f000000000000000000000000000000000000000000115eec47f6cf7e35000000611a20565b6106f9565b61089085917f00000000000000000000000000000000000000000000000029a2241af62c000061191e565b046106ba565b5080156106b1565b83901c95610684565b634e487b7160e01b600052601160045260246000fd5b6106e1670de0b6b3a76400006106d76106ea93600061066d565b5061053361053c6105286000612126565b634e487b7160e01b600052604160045260246000fd5b346102785760203660031901126102785760043560088110156102785761ffff6109296020926118d1565b9190546040519260031b1c168152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020610270604060002054611cd2565b3461027857600036600319011261027857602060405160ff7f0000000000000000000000000000000000000000000000000000000000000008168152f35b34610278576000366003190112610278576020601c54604051908152f35b3461027857600036600319011261027857602060405161dead8152f35b600036600319011261027857610a04611dc3565b3410610b6957610a12611e25565b6000808080347f00000000000000000000000045e5ad18df32acf05fae75abe90a628b7a78d2596001600160a01b03165af13d15610b64573d67ffffffffffffffff81116108e85760405190610a72601f8201601f1916602001836119b3565b8152600060203d92013e5b15610b5257610a8e34601c54611951565b601c556040517f0000000000000000000000000000000000000000000000003782dace9d90000081527f0000000000000000000000000000000000000000000000003782dace9d90000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2670de0b6b3a7640000610b1d610b17611abd565b3461191e565b046040519034825260208201527f92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e760403392a2005b6040516312171d8360e31b8152600490fd5b610a7d565b6040516305110f0160e41b8152600490fd5b34610278576000366003190112610278576020602354604051908152f35b3461027857600036600319011261027857610bb2611a2d565b7f00000000000000000000000000000000000000000000d3c21bcecceda1000000610bdd8183611931565b90600182018092116108a757610bf29161191e565b7f000000000000000000000000000000000000000000115eec47f6cf7e35000000808211610c3b575b5081811115610c305760209161027091611a20565b505060206000610270565b905082610c1b565b34610278576000366003190112610278576020610270611d1d565b34610278576020366003190112610278576020610270600435611cd2565b34610278576000366003190112610278576020601a54604051908152f35b34610278576000366003190112610278576020602254604051908152f35b34610278576000366003190112610278576020610270610cd6611a2d565b7f00000000000000000000000000000000000000000000d3c21bcecceda100000090611931565b346102785760003660031901126102785760206040517f000000000000000000000000000000000000000000115eec47f6cf7e350000008152f35b346102785760003660031901126102785760206040517f0000000000000000000000000000000000000000000000000de0b6b3a76400008152f35b34610278576020366003190112610278576004356001600160a01b0381169081900361027857604051610da58161195e565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260c060405191610ddb83611996565b610100368437015260005260246020526101c06040600020610e9660405191610e038361195e565b805483526001810154906020840191825260028101549060408501918252600381015460608601908152600482015492610e5a6005608089019460ff87161515865260ff60a08b019760081c161515875201611c6d565b9460c0880195865260405197518852516020880152516040870152516060860152511515608085015251151560a08401525160c08301906118a5565bf35b346102785760003660031901126102785760206040517f0000000000000000000000000000000000000000000000003782dace9d9000008152f35b34610278576000366003190112610278576020601954604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000d3c21bcecceda10000008152f35b34610278576000366003190112610278576020604051610e108152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760405190610f7c82611996565b61010080923690376000526024602052610f9c6005604060002001611c6d565b610e9660405180926118a5565b346102785760208060031936011261027857600435903360005260248152604060002060ff600482015460081c16156111be5760088310156111ac5760058101610ff38482611902565b9061ffff905491816003880293816002860154169260031b1c16101561119a5761106661103d876110376110a495611029611f9e565b6110323361205d565b6119f4565b95611902565b61104e8483548360031b1c16611c5a565b9061ffff8084549260031b9316831b921b1916179055565b8483019361107685518254611951565b90556110858451601854611951565b60185561104e611094876118d1565b91909283548360031b1c16611c5a565b6110b18151601b54611951565b601b556110bd336120d7565b80516040516323b872dd60e01b815233600482015261dead60248201526044810191909152838160648160007f0000000000000000000000006a87de92deb752c6162cf80bd16e3efd4bdc6d906001600160a01b03165af1801561118e5761115b575b505190516040519282845283015260408201527f02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf4060603392a3005b8381813d8311611187575b61117081836119b3565b810103126102785751801515036102785784611120565b503d611166565b6040513d6000823e3d90fd5b6040516330e57efd60e21b8152600490fd5b6040516321a9b14360e01b8152600490fd5b60405163037c597f60e01b8152600490fd5b34610278576000366003190112610278576040517f00000000000000000000000045e5ad18df32acf05fae75abe90a628b7a78d2596001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020604060002054604051908152f35b34610278576000366003190112610278576020610270611abd565b346102785760203660031901126102785760043561128a6119d5565b5060088110156111ac576112a26003606092026119f4565b610e96604051809261ffff604080928051855260208101516020860152015116910152565b34610278576000366003190112610278576112e0611f9e565b6112e93361205d565b336000526024602052600260406000200154801561140b573360005260246020526000600260408220015561132081602254611a20565b602255336000526024602052600360406000200161133f828254611951565b905561134d81601a54611951565b601a557f0000000000000000000000006a87de92deb752c6162cf80bd16e3efd4bdc6d906001600160a01b031690813b1561027857600080926044604051809581936340c10f1960e01b83523360048401528660248401525af1801561118e576113f1575b60209060195460405190828252838201527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60403392a2604051908152f35b67ffffffffffffffff82116108e8576020916040526113b2565b6040516312d37ee560e31b8152600490fd5b34610278576000366003190112610278576020601854604051908152f35b346102785760003660031901126102785760206040517f0000000000000000000000000000000000000000000000003782dace9d9000008152f35b34610278576000366003190112610278576020604051603c8152f35b3461027857600036600319011261027857602060405160088152f35b34610278576000366003190112610278576020610270611a2d565b346102785760003660031901126102785760208054604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000055d398326f99059ff775485246999027b31979556001600160a01b03168152602090f35b34610278576000366003190112610278576020601d54604051908152f35b346102785760003660031901126102785760405161156681611996565b60005b610100811061160757604051610100810181811067ffffffffffffffff8211176108e857604052600080825b600882106115e957604051846000825b600882106115b35761030084f35b60206060826115dd600194875161ffff604080928051855260208101516020860152015116910152565b019301910190916115a5565b600360206001926115f9866119f4565b815201930191019091611595565b6020906116126119d5565b8184015201611569565b346102785760003660031901126102785733600052602460205260406000206004810160ff8154166116ea57611650611f9e565b6116593361205d565b600160ff198254161790557f0000000000000000000000000000000000000000000000000de0b6b3a764000090611691828254611951565b905561169f81601854611951565b601855601d54600181018091116108a757601d556116bc336120d7565b6040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a2005b604051630ea075bf60e21b8152600490fd5b34610278576020366003190112610278576020670de0b6b3a764000061172b611723611abd565b60043561191e565b04604051908152f35b346102785760003660031901126102785761174d611e25565b6040516323b872dd60e01b6000908152336004526001600160a01b037f00000000000000000000000045e5ad18df32acf05fae75abe90a628b7a78d25981166024527f0000000000000000000000000000000000000000000000003782dace9d900000604481905292917f00000000000000000000000055d398326f99059ff775485246999027b31979559060209060648180855af160016000511481161561186a575b8360405260006060521561185457836040519081527f0000000000000000000000000000000000000000000000003782dace9d90000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2005b635274afe760e01b835216600482015260249150fd5b600181151661188057813b15153d1516166117f1565b833d6000823e3d90fd5b3461027857600036600319011261027857602090601e548152f35b6000915b600883106118b657505050565b60019061ffff835116815260208091019201920191906118a9565b9060088210156118ec57601e8260041c601f019260011b1690565b634e487b7160e01b600052603260045260246000fd5b91909160088310156118ec57601e908360041c019260011b1690565b818102929181159184041417156108a757565b811561193b570490565b634e487b7160e01b600052601260045260246000fd5b919082018092116108a757565b60e0810190811067ffffffffffffffff8211176108e857604052565b6060810190811067ffffffffffffffff8211176108e857604052565b610100810190811067ffffffffffffffff8211176108e857604052565b90601f8019910116810190811067ffffffffffffffff8211176108e857604052565b604051906119e28261197a565b60006040838281528260208201520152565b90604051611a018161197a565b604061ffff600283958054855260018101546020860152015416910152565b919082039182116108a757565b602354804211600014611a8757611a4a610341611a549242611a20565b9050601954611951565b7f000000000000000000000000000000000000000000115eec47f6cf7e350000009081811115611a82575090565b905090565b50611a54611a4a6000612126565b519069ffffffffffffffffffff8216820361027857565b60ff16604d81116108a757600a0a90565b604051633fabe5a360e21b8152600460a08282817f0000000000000000000000000567f2323251f0aab15c8dfb1967e4e8a7d42aee6001600160a01b03165afa801561118e576000928391611c02575b506000831315611bf2578015908115611bc7575b50611bb85760ff7f00000000000000000000000000000000000000000000000000000000000000081660128110611b985760128111611b5f57505090565b601119019060ff8211611b83575090611b7a611b8092611aac565b90611931565b90565b601190634e487b7160e01b6000525260246000fd5b6012039060ff8211611b83575090611bb2611b8092611aac565b9061191e565b604051630cd5fa0760e11b8152fd5b9050610e108101809111611bdd57421138611b21565b601182634e487b7160e01b6000525260246000fd5b5060405163fd1ee34960e01b8152fd5b92905060a0833d60a011611c52575b81611c1e60a093836119b3565b81010312611c4f5750611c3082611a95565b506020820151611c47608060608501519401611a95565b509138611b0d565b80fd5b3d9150611c11565b90600161ffff809316019182116108a757565b90604051915461ffff908181168452818160101c166020850152818160201c166040850152818160301c166060850152818160401c166080850152818160501c1660a0850152818160601c1660c085015260701c1660e0830152611cd082611996565b565b611cda611d1d565b80158015611d15575b8015611d0b575b611d0457611b8091611cfb9161191e565b60185490611931565b5050600090565b5060185415611cea565b508115611ce3565b611d25611a2d565b7f000000000000000000000000000000000000000000115eec47f6cf7e350000001115611d9757611d54611d9c565b8015611d9157611d8d670de0b6b3a7640000917f00000000000000000000000000000000000000000000000029a2241af62c000061191e565b0490565b50600090565b600090565b611da7610cd6611a2d565b603c8110611db55750600090565b670de0b6b3a7640000901c90565b611dcb611abd565b670de0b6b3a76400007f0000000000000000000000000000000000000000000000003782dace9d9000008181029181159183041417156108a75781611e0f91611951565b6000198101919082116108a757611b8091611931565b6000338152602460205260408120600481019060ff825460081c16611f8c57611e4c611f9e565b611e553361205d565b7f0000000000000000000000000000000000000000000000003782dace9d9000008092805460ff811615611ee0575b50805461ff0019166101001790558154611ead939291611ea391611951565b9055601854611951565b601855601e549060018201809211611ecc5750601e55611cd0336120d7565b634e487b7160e01b81526011600452602490fd5b60019060ff1916178155611f157f0000000000000000000000000000000000000000000000000de0b6b3a76400008093611951565b91611f2281601854611951565b601855601d5460018101809111611f785791611ead95949391611ea393601d556040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a29150919293611e84565b634e487b7160e01b87526011600452602487fd5b60405163ef65161f60e01b8152600490fd5b6023548042111561205a57611fb39042611a20565b426023556019547f00000000000000000000000000000000000000000000d3c21bcecceda100000090611fef611fe98383611931565b93612126565b80156120535761201b9261200861201093602054611951565b602055611951565b918260195582611931565b918211612026575050565b60207f817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e33491604051908152a2565b5050505050565b50565b611cd09060018060a01b03811660005260246020526040600020600181015490670de0b6b3a764000061209482546020549061191e565b04918083116120a6575b5050506120d7565b6120b56002916120cc94611a20565b91016120c2828254611951565b9055602254611951565b60225538808061209e565b60018060a01b03166000526024602052612121604060002061211c6001820191670de0b6b3a7640000612110845492546020549061191e565b04809355602154611a20565b611951565b602155565b60185460009283928391908315801561239e575b8015612372575b612368576019547f00000000000000000000000000000000000000000000d3c21bcecceda1000000967f00000000000000000000000000000000000000000000000029a2241af62c0000958795917f000000000000000000000000000000000000000000115eec47f6cf7e35000000905b603c908189108061235f575b80612356575b15612348576121d38c87611931565b9182101561234857670de0b6b3a764000090816121f281851c8d61191e565b049283156122c657600181018091116122b257876106688f6122139361191e565b61221d8886611a20565b808210156123405750925b612232898261191e565b938085116122d65750508792915b83156122c6578083029083820414831517156122b2579161227c81612276612282946122708a6122889998611931565b90611951565b98611951565b97611951565b96611a20565b96600019811461229e57600101969493926121b2565b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b8d52601160045260248dfd5b509b505050505095505050915050565b929093506122e48484611951565b600019810190811161232c57846122fa91611931565b93898511612324575b8461230d9161191e565b9280841161231c575b50612240565b925038612316565b899450612303565b634e487b7160e01b8e52601160045260248efd5b905092612228565b9a5050505095505050915050565b508286106121c4565b508615156121be565b5092935050508190565b506019547f000000000000000000000000000000000000000000115eec47f6cf7e350000001115612141565b50801561213a56fea26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c63430008180033","recompiledBytecode":"0x608080604052600436101561002d575b50361561001b57600080fd5b6040516301f30c8760e21b8152600490fd5b60003560e01c90816306f9e52c1461188a575080630f15f4c01461173457806316c2d30f146116fc5780631aa3a0081461161c578063205e0c1114611549578063210ff9bb1461152b5780632f48ab7d146114e65780632f663586146114c95780633590bafe146114ae57806336331c8f1461149257806336f1e6c0146114765780633ddce1071461143b5780634a5628c51461141d5780634e71d92d146112c757806353f96df21461126e578063576dde12146112535780635d0072811461121557806361d027b3146111d057806362de3bd114610fa95780636875227414610f49578063696453b814610f2c5780636a47aa0614610ef15780636ce41f6214610ed357806377d630ae14610e985780638086b8ba14610d735780638b5cdd2914610d385780638f770ad014610cfd578063900cf0cf14610cb85780639cc85c9514610c9a578063a2309ff814610c7c578063a2b1b80e14610c5e578063a878b14314610c43578063b002e11f14610b99578063c046371114610b7b578063c08b8aa1146109f0578063c0a2526c146109d3578063c1f5138a146109b5578063c23953d014610977578063cbf0980214610939578063d7b2afb5146108fe578063d80528ae1461045a578063d89135cd1461043c578063d8ac81af146103f7578063d90e0264146103bc578063e6674a9a146103a1578063f44136a1146102e0578063fc0c546a1461029b578063fc7b9c181461027d5763fe128e1314610255573861000f565b34610278576000366003190112610278576020610270611dc3565b604051908152f35b600080fd5b34610278576000366003190112610278576020602154604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b03811690819003610278576000526024602052602061027060406000206023548042116000146103875761035561034e610346610341670de0b6b3a76400009442611a20565b612126565b508654611951565b835461191e565b0460018201549081811160001461037b5760029161037291611a20565b915b0154611951565b50506002600091610374565b50670de0b6b3a764000061035561034e6103466000612126565b34610278576000366003190112610278576020610270611d9c565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601b54604051908152f35b34610278576000366003190112610278576040516102209081810181811067ffffffffffffffff8211176108e8576040526000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a082015260006101c082015260006101e082015260006102008201526023548042116000146108d75761053c6105286103416105339342611a20565b601993919354611951565b91602054611951565b60185490818452826020850152601a546040850152601b5460608501527f000000000000000000000000000000000000000000000000000000000000000060808501526105a97f000000000000000000000000000000000000000000000000000000000000000084611931565b8060a08601527f000000000000000000000000000000000000000000000000000000000000000060c08601526001810181116108a75761060e849160017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b11156108bd5760a08401516001810181116108a757670de0b6b3a76400006106d76106ea9361066d876106686106e19660017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b611a20565b60e089015260a0880151603c811061089e57506000955b7f000000000000000000000000000000000000000000000000000000000000000088109687158098610896575b15610865575060005b6101008a0152601d546101208a0152601e546101408a015261191e565b0460215490611a20565b60225490611951565b61016084015215610836575060005b610180820152426101a08201527f00000000000000000000000000000000000000000000000000000000000000006101c08201527f00000000000000000000000000000000000000000000000000000000000000006101e08201527f000000000000000000000000000000000000000000000000000000000000000061020082015261020060405191805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c084015260e081015160e08401526101008101516101008401526101208101516101208401526101408101516101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401520151610200820152f35b610860907f0000000000000000000000000000000000000000000000000000000000000000611a20565b6106f9565b61089085917f000000000000000000000000000000000000000000000000000000000000000061191e565b046106ba565b5080156106b1565b83901c95610684565b634e487b7160e01b600052601160045260246000fd5b6106e1670de0b6b3a76400006106d76106ea93600061066d565b5061053361053c6105286000612126565b634e487b7160e01b600052604160045260246000fd5b346102785760203660031901126102785760043560088110156102785761ffff6109296020926118d1565b9190546040519260031b1c168152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020610270604060002054611cd2565b3461027857600036600319011261027857602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610278576000366003190112610278576020601c54604051908152f35b3461027857600036600319011261027857602060405161dead8152f35b600036600319011261027857610a04611dc3565b3410610b6957610a12611e25565b6000808080347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af13d15610b64573d67ffffffffffffffff81116108e85760405190610a72601f8201601f1916602001836119b3565b8152600060203d92013e5b15610b5257610a8e34601c54611951565b601c556040517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2670de0b6b3a7640000610b1d610b17611abd565b3461191e565b046040519034825260208201527f92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e760403392a2005b6040516312171d8360e31b8152600490fd5b610a7d565b6040516305110f0160e41b8152600490fd5b34610278576000366003190112610278576020602354604051908152f35b3461027857600036600319011261027857610bb2611a2d565b7f0000000000000000000000000000000000000000000000000000000000000000610bdd8183611931565b90600182018092116108a757610bf29161191e565b7f0000000000000000000000000000000000000000000000000000000000000000808211610c3b575b5081811115610c305760209161027091611a20565b505060206000610270565b905082610c1b565b34610278576000366003190112610278576020610270611d1d565b34610278576020366003190112610278576020610270600435611cd2565b34610278576000366003190112610278576020601a54604051908152f35b34610278576000366003190112610278576020602254604051908152f35b34610278576000366003190112610278576020610270610cd6611a2d565b7f000000000000000000000000000000000000000000000000000000000000000090611931565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576020366003190112610278576004356001600160a01b0381169081900361027857604051610da58161195e565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260c060405191610ddb83611996565b610100368437015260005260246020526101c06040600020610e9660405191610e038361195e565b805483526001810154906020840191825260028101549060408501918252600381015460608601908152600482015492610e5a6005608089019460ff87161515865260ff60a08b019760081c161515875201611c6d565b9460c0880195865260405197518852516020880152516040870152516060860152511515608085015251151560a08401525160c08301906118a5565bf35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020601954604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051610e108152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760405190610f7c82611996565b61010080923690376000526024602052610f9c6005604060002001611c6d565b610e9660405180926118a5565b346102785760208060031936011261027857600435903360005260248152604060002060ff600482015460081c16156111be5760088310156111ac5760058101610ff38482611902565b9061ffff905491816003880293816002860154169260031b1c16101561119a5761106661103d876110376110a495611029611f9e565b6110323361205d565b6119f4565b95611902565b61104e8483548360031b1c16611c5a565b9061ffff8084549260031b9316831b921b1916179055565b8483019361107685518254611951565b90556110858451601854611951565b60185561104e611094876118d1565b91909283548360031b1c16611c5a565b6110b18151601b54611951565b601b556110bd336120d7565b80516040516323b872dd60e01b815233600482015261dead60248201526044810191909152838160648160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561118e5761115b575b505190516040519282845283015260408201527f02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf4060603392a3005b8381813d8311611187575b61117081836119b3565b810103126102785751801515036102785784611120565b503d611166565b6040513d6000823e3d90fd5b6040516330e57efd60e21b8152600490fd5b6040516321a9b14360e01b8152600490fd5b60405163037c597f60e01b8152600490fd5b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020604060002054604051908152f35b34610278576000366003190112610278576020610270611abd565b346102785760203660031901126102785760043561128a6119d5565b5060088110156111ac576112a26003606092026119f4565b610e96604051809261ffff604080928051855260208101516020860152015116910152565b34610278576000366003190112610278576112e0611f9e565b6112e93361205d565b336000526024602052600260406000200154801561140b573360005260246020526000600260408220015561132081602254611a20565b602255336000526024602052600360406000200161133f828254611951565b905561134d81601a54611951565b601a557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561027857600080926044604051809581936340c10f1960e01b83523360048401528660248401525af1801561118e576113f1575b60209060195460405190828252838201527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60403392a2604051908152f35b67ffffffffffffffff82116108e8576020916040526113b2565b6040516312d37ee560e31b8152600490fd5b34610278576000366003190112610278576020601854604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051603c8152f35b3461027857600036600319011261027857602060405160088152f35b34610278576000366003190112610278576020610270611a2d565b346102785760003660031901126102785760208054604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601d54604051908152f35b346102785760003660031901126102785760405161156681611996565b60005b610100811061160757604051610100810181811067ffffffffffffffff8211176108e857604052600080825b600882106115e957604051846000825b600882106115b35761030084f35b60206060826115dd600194875161ffff604080928051855260208101516020860152015116910152565b019301910190916115a5565b600360206001926115f9866119f4565b815201930191019091611595565b6020906116126119d5565b8184015201611569565b346102785760003660031901126102785733600052602460205260406000206004810160ff8154166116ea57611650611f9e565b6116593361205d565b600160ff198254161790557f000000000000000000000000000000000000000000000000000000000000000090611691828254611951565b905561169f81601854611951565b601855601d54600181018091116108a757601d556116bc336120d7565b6040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a2005b604051630ea075bf60e21b8152600490fd5b34610278576020366003190112610278576020670de0b6b3a764000061172b611723611abd565b60043561191e565b04604051908152f35b346102785760003660031901126102785761174d611e25565b6040516323b872dd60e01b6000908152336004526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024527f0000000000000000000000000000000000000000000000000000000000000000604481905292917f00000000000000000000000000000000000000000000000000000000000000009060209060648180855af160016000511481161561186a575b8360405260006060521561185457836040519081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2005b635274afe760e01b835216600482015260249150fd5b600181151661188057813b15153d1516166117f1565b833d6000823e3d90fd5b3461027857600036600319011261027857602090601e548152f35b6000915b600883106118b657505050565b60019061ffff835116815260208091019201920191906118a9565b9060088210156118ec57601e8260041c601f019260011b1690565b634e487b7160e01b600052603260045260246000fd5b91909160088310156118ec57601e908360041c019260011b1690565b818102929181159184041417156108a757565b811561193b570490565b634e487b7160e01b600052601260045260246000fd5b919082018092116108a757565b60e0810190811067ffffffffffffffff8211176108e857604052565b6060810190811067ffffffffffffffff8211176108e857604052565b610100810190811067ffffffffffffffff8211176108e857604052565b90601f8019910116810190811067ffffffffffffffff8211176108e857604052565b604051906119e28261197a565b60006040838281528260208201520152565b90604051611a018161197a565b604061ffff600283958054855260018101546020860152015416910152565b919082039182116108a757565b602354804211600014611a8757611a4a610341611a549242611a20565b9050601954611951565b7f00000000000000000000000000000000000000000000000000000000000000009081811115611a82575090565b905090565b50611a54611a4a6000612126565b519069ffffffffffffffffffff8216820361027857565b60ff16604d81116108a757600a0a90565b604051633fabe5a360e21b8152600460a08282817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561118e576000928391611c02575b506000831315611bf2578015908115611bc7575b50611bb85760ff7f00000000000000000000000000000000000000000000000000000000000000001660128110611b985760128111611b5f57505090565b601119019060ff8211611b83575090611b7a611b8092611aac565b90611931565b90565b601190634e487b7160e01b6000525260246000fd5b6012039060ff8211611b83575090611bb2611b8092611aac565b9061191e565b604051630cd5fa0760e11b8152fd5b9050610e108101809111611bdd57421138611b21565b601182634e487b7160e01b6000525260246000fd5b5060405163fd1ee34960e01b8152fd5b92905060a0833d60a011611c52575b81611c1e60a093836119b3565b81010312611c4f5750611c3082611a95565b506020820151611c47608060608501519401611a95565b509138611b0d565b80fd5b3d9150611c11565b90600161ffff809316019182116108a757565b90604051915461ffff908181168452818160101c166020850152818160201c166040850152818160301c166060850152818160401c166080850152818160501c1660a0850152818160601c1660c085015260701c1660e0830152611cd082611996565b565b611cda611d1d565b80158015611d15575b8015611d0b575b611d0457611b8091611cfb9161191e565b60185490611931565b5050600090565b5060185415611cea565b508115611ce3565b611d25611a2d565b7f00000000000000000000000000000000000000000000000000000000000000001115611d9757611d54611d9c565b8015611d9157611d8d670de0b6b3a7640000917f000000000000000000000000000000000000000000000000000000000000000061191e565b0490565b50600090565b600090565b611da7610cd6611a2d565b603c8110611db55750600090565b670de0b6b3a7640000901c90565b611dcb611abd565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000008181029181159183041417156108a75781611e0f91611951565b6000198101919082116108a757611b8091611931565b6000338152602460205260408120600481019060ff825460081c16611f8c57611e4c611f9e565b611e553361205d565b7f00000000000000000000000000000000000000000000000000000000000000008092805460ff811615611ee0575b50805461ff0019166101001790558154611ead939291611ea391611951565b9055601854611951565b601855601e549060018201809211611ecc5750601e55611cd0336120d7565b634e487b7160e01b81526011600452602490fd5b60019060ff1916178155611f157f00000000000000000000000000000000000000000000000000000000000000008093611951565b91611f2281601854611951565b601855601d5460018101809111611f785791611ead95949391611ea393601d556040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a29150919293611e84565b634e487b7160e01b87526011600452602487fd5b60405163ef65161f60e01b8152600490fd5b6023548042111561205a57611fb39042611a20565b426023556019547f000000000000000000000000000000000000000000000000000000000000000090611fef611fe98383611931565b93612126565b80156120535761201b9261200861201093602054611951565b602055611951565b918260195582611931565b918211612026575050565b60207f817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e33491604051908152a2565b5050505050565b50565b611cd09060018060a01b03811660005260246020526040600020600181015490670de0b6b3a764000061209482546020549061191e565b04918083116120a6575b5050506120d7565b6120b56002916120cc94611a20565b91016120c2828254611951565b9055602254611951565b60225538808061209e565b60018060a01b03166000526024602052612121604060002061211c6001820191670de0b6b3a7640000612110845492546020549061191e565b04809355602154611a20565b611951565b602155565b60185460009283928391908315801561239e575b8015612372575b612368576019547f0000000000000000000000000000000000000000000000000000000000000000967f0000000000000000000000000000000000000000000000000000000000000000958795917f0000000000000000000000000000000000000000000000000000000000000000905b603c908189108061235f575b80612356575b15612348576121d38c87611931565b9182101561234857670de0b6b3a764000090816121f281851c8d61191e565b049283156122c657600181018091116122b257876106688f6122139361191e565b61221d8886611a20565b808210156123405750925b612232898261191e565b938085116122d65750508792915b83156122c6578083029083820414831517156122b2579161227c81612276612282946122708a6122889998611931565b90611951565b98611951565b97611951565b96611a20565b96600019811461229e57600101969493926121b2565b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b8d52601160045260248dfd5b509b505050505095505050915050565b929093506122e48484611951565b600019810190811161232c57846122fa91611931565b93898511612324575b8461230d9161191e565b9280841161231c575b50612240565b925038612316565b899450612303565b634e487b7160e01b8e52601160045260248efd5b905092612228565b9a5050505095505050915050565b508286106121c4565b508615156121be565b5092935050508190565b506019547f00000000000000000000000000000000000000000000000000000000000000001115612141565b50801561213a56fea26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c63430008180033","sourceMap":"1514:21374:10:-:0;;;;;;;;;;-1:-1:-1;1514:21374:10;;;;;;;;;;;-1:-1:-1;;;22868:11:10;;1514:21374;;22868:11;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4409:31;1514:21374;4409:31;;;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4527:24;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2281:34;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;19515:9;1514:21374;;;19842:19;1514:21374;;;19576:10;1514:21374;19558:15;;:28;:63;:28;;;19744:12;19693:25;19651:18;19589:28;1984:4;19558:15;;19589:28;:::i;:::-;19651:18;:::i;:::-;1514:21374;;;19693:25;:::i;:::-;1514:21374;;19744:12;:::i;:::-;1984:4;19798:6;;;1514:21374;19790:35;:14;;;:35;:14;;;19842:9;19807:14;;;;:::i;:::-;19790:35;;19842:9;1514:21374;19842:19;:::i;19790:35::-;;;19842:9;1514:21374;19790:35;;;19558:63;;1984:4;19744:12;19693:25;19651:18;1514:21374;19651:18;:::i;1514:21374::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;3120:42;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2557:49;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;3774:26;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21067:10;1514:21374;21049:15;;:28;:63;:28;;;21256:25;21161:18;21080:28;21207:25;21049:15;;21080:28;:::i;21161:18::-;21207:12;1514:21374;;;;21207:25;:::i;:::-;1514:21374;;;21256:25;:::i;:::-;21306:9;1514:21374;;;;;;;;;;21375:11;1514:21374;;;;;21412:11;1514:21374;;;;;21447:9;1514:21374;;;;21476:25;21486:15;21476:25;;:::i;:::-;1514:21374;;;;;21486:15;1514:21374;;;;21585:1;1514:21374;;;;;;21574:31;21486:15;;21585:1;21486:15;1514:21374;;21574:31;:::i;:::-;:41;:113;;;1514:21374;;;;21585:1;1514:21374;;;;;;1984:4;21977:15;21976:56;21486:15;21630:41;21486:15;21630:31;21977:33;21486:15;21585:1;21486:15;1514:21374;;21630:31;:::i;:::-;:41;:::i;:::-;1514:21374;;;;;;;;1921:2;21714:23;;1921:2;;21714:44;1514:21374;21714:44;;21447:9;21787:20;;;;;:35;;;;21714:44;21786:76;;;;1514:21374;21786:76;1514:21374;;;;21892:15;1514:21374;;;;;21936:14;1514:21374;;;;;21977:15;:::i;:::-;1984:4;22001:9;1514:21374;21977:33;;:::i;:::-;22014:18;1514:21374;21976:56;;:::i;:::-;1514:21374;;;;22056:46;;;;1514:21374;22056:46;1514:21374;;;;21049:15;1514:21374;;;;22164:17;1514:21374;;;;22204:8;1514:21374;;;;22241:14;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22056:46;22083:19;21447:9;;22083:19;:::i;:::-;22056:46;;21786:76;21830:26;:17;;;:26;:::i;:::-;1984:4;21786:76;;21787:35;21811:11;;;21787:35;;21714:44;1514:21374;;;21714:44;;;1514:21374;;;;;;;;;;;;21574:113;21977:33;1984:4;21977:15;21976:56;21574:113;1514:21374;21574:113;;21049:63;;21207:25;21256;21161:18;1514:21374;21161:18;:::i;1514:21374::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;4312:34;;;;;1514:21374;4312:34;1514:21374;4312:34;;:::i;:::-;1514:21374;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;20280:9;1514:21374;;;20268:33;1514:21374;;;;20268:33;:::i;1514:21374::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;2714:35;1514:21374;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4018:31;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;1688:42;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;9857:17;;:::i;:::-;9888:9;:20;9884:50;;;;:::i;:::-;1514:21374;;;;9888:9;10166:8;-1:-1:-1;;;;;1514:21374:10;10158:44;;1514:21374;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;:::i;:::-;;;;;;;;;;10216:3;10212:32;;10255:29;9888:9;10255:29;1514:21374;10255:29;:::i;:::-;;1514:21374;;;10322:13;1514:21374;;10337:14;1514:21374;;;;10300:52;1514:21374;10310:10;10300:52;;1984:4;11413:22;11425:10;;:::i;:::-;9888:9;11413:22;:::i;:::-;1984:4;1514:21374;;9888:9;;1514:21374;;;;;;10367:62;1514:21374;10310:10;10367:62;;1514:21374;10212:32;1514:21374;;-1:-1:-1;;;10228:16:10;;1514:21374;;10228:16;1514:21374;;;9884:50;1514:21374;;-1:-1:-1;;;9917:17:10;;1514:21374;;9917:17;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;4674:25;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;18271:13;;:::i;:::-;18320:15;18310:25;;;;:::i;:::-;1514:21374;18338:1;1514:21374;;;;;;;18309:49;;;:::i;:::-;18379:9;18372:16;;;18368:38;;1514:21374;-1:-1:-1;18423:14:10;;;;;;1514:21374;18440:14;;;;:::i;18423:35::-;;;1514:21374;;18423:35;;18368:38;18390:16;;18368:38;;;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;3706:26;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4605:33;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;17867:31;:13;;:::i;:::-;17883:15;17867:31;;:::i;1514:21374::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2998:34;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2824:33;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;19963:9;1514:21374;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2450:38;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;3628:27;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;3234:40;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2236:4;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;22566:9;1514:21374;;;22566:21;1514:21374;;;22566:21;1514:21374;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;12575:10;;1514:21374;;12565:9;1514:21374;;;;;;;12601:11;;1514:21374;;;;12600:12;12596:39;;1514:21374;12649:18;;;12645:40;;12699:7;;;:13;;;;:::i;:::-;1514:21374;;;;;;;;;12716:18;;;;;1514:21374;;;;;;;12699:35;;12695:66;;12863:18;:13;12695:66;1514:21374;12946:19;12695:66;;;:::i;:::-;12803:10;12575;12803;:::i;:::-;1514:21374;:::i;:::-;12863:13;;:::i;:::-;:18;1514:21374;;;;;;;;12863:18;:::i;:::-;1514:21374;;;;;;;;;;;;;;;;;;;;12863:18;12901:6;;;1514:21374;12891:16;1514:21374;;;;12891:16;:::i;:::-;1514:21374;;12917:19;1514:21374;;12917:19;1514:21374;12917:19;:::i;:::-;;1514:21374;12946:19;:14;;;:::i;:::-;1514:21374;;;;;;;;;;12946:19;:::i;:::-;12975:22;1514:21374;;12975:22;1514:21374;12975:22;:::i;:::-;;1514:21374;13015:10;12575;13015;:::i;:::-;1514:21374;;;;-1:-1:-1;;;13037:45:10;;12575:10;1514:21374;13037:45;;1514:21374;1688:42;12565:9;1514:21374;;;;;;;;;;10404:1148:7;1514:21374:10;;;-1:-1:-1;13037:5:10;-1:-1:-1;;;;;1514:21374:10;13037:45;;;;;;;;1514:21374;;;;;;;;;;;;;;;;;;13098:55;1514:21374;12575:10;13098:55;;1514:21374;13037:45;;;;;;;;;;;;;;:::i;:::-;;;1514:21374;;;;;;;;;;;13037:45;;;;;;;;;1514:21374;;;;;;;;;12695:66;1514:21374;;-1:-1:-1;;;12743:18:10;;1514:21374;;12743:18;12645:40;1514:21374;;-1:-1:-1;;;12676:9:10;;1514:21374;;12676:9;12596:39;1514:21374;;-1:-1:-1;;;12621:14:10;;1514:21374;;12621:14;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2354:33;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;20097:9;1514:21374;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;:::i;:::-;;1800:1;19278:18;;;19274:40;;1514:21374;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;13328:14;;:::i;:::-;13385:10;;;:::i;:::-;;1514:21374;;13415:9;1514:21374;;13415:29;1514:21374;;;13415:29;1514:21374;13458:11;;13454:40;;13385:10;1514:21374;;13415:9;1514:21374;;;13415:29;1514:21374;;;13504:29;1514:21374;13547:28;1514:21374;13547:28;1514:21374;13547:28;:::i;:::-;;1514:21374;13385:10;1514:21374;;13415:9;1514:21374;;13585:29;1514:21374;;;13585:29;:39;1514:21374;;;13585:39;:::i;:::-;1514:21374;;13634:21;1514:21374;13634:21;1514:21374;13634:21;:::i;:::-;;1514:21374;13665:5;-1:-1:-1;;;;;1514:21374:10;;13665:30;;;;;1514:21374;;;;;;;;;;;;;13665:30;;13385:10;1514:21374;13665:30;;1514:21374;;13415:9;1514:21374;;;13665:30;;;;;;;;1514:21374;;;13738:12;1514:21374;;;;;;;;;;;13710:41;1514:21374;13385:10;13710:41;;1514:21374;;;;;;13665:30;1514:21374;;;;;;;;;13665:30;;13454:40;1514:21374;;-1:-1:-1;;;13478:16:10;;1514:21374;;13478:16;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;3524:24;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2917:39;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;1921:2;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;1800:1;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;4409:31;1514:21374;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2247:28;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4106:30;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;8445:10;1514:21374;;8435:9;1514:21374;;;;;;8470:12;;1514:21374;;;;8466:44;;;;:::i;:::-;8552:10;8445;8552;:::i;:::-;8589:4;1514:21374;;;;;;;;8613:8;1514:21374;8603:18;1514:21374;;;8603:18;:::i;:::-;1514:21374;;8631:21;1514:21374;8631:21;1514:21374;8631:21;:::i;:::-;;1514:21374;8662:20;1514:21374;8589:4;1514:21374;;;;;;;8662:20;1514:21374;8700:10;8445;8700;:::i;:::-;1514:21374;;;;;8727:32;1514:21374;8445:10;8727:32;;1514:21374;8466:44;1514:21374;;-1:-1:-1;;;8491:19:10;;1514:21374;;8491:19;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;1984:4;11413:22;11425:10;;:::i;:::-;1514:21374;;11413:22;:::i;:::-;1984:4;1514:21374;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;9185:192;;:::i;:::-;1514:21374;10404:1148:7;-1:-1:-1;;;1514:21374:10;10404:1148:7;;;9267:10:10;1514:21374;10404:1148:7;-1:-1:-1;;;;;9279:8:10;10404:1148:7;;;;9289:13:10;10404:1148:7;;;;9289:13:10;10404:1148:7;9245:4:10;;10404:1148:7;;;1514:21374:10;;9245:4;10404:1148:7;;1809:4;1514:21374:10;10404:1148:7;;;;;;;1514:21374:10;10404:1148:7;1514:21374:10;10404:1148:7;1514:21374:10;10404:1148:7;;1766:48;1762:126;;1514:21374:10;;;;;;9355:14;10404:1148:7;1514:21374:10;;;9318:52;1514:21374;9267:10;9318:52;;1514:21374;1762:126:7;-1:-1:-1;;;1837:40:7;;1514:21374:10;;1837:40:7;;1514:21374:10;10404:1148:7;;-1:-1:-1;1837:40:7;10404:1148;1809:4;10404:1148;;;;;;;;;;;;;;;;;;1514:21374:10;10404:1148:7;;;;;1514:21374:10;;;;;;-1:-1:-1;;1514:21374:10;;;;;;4193:29;1514:21374;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12946:8;1514:21374;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;1984:4::-;;;;;;;:::o;:::-;1514:21374;;;1984:4;;;;;;;;1514:21374;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;-1:-1:-1;1514:21374:10;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;17427:315::-;17526:10;1514:21374;17508:15;;:28;:63;:28;;;17606:18;17539:28;17652:25;17508:15;;17539:28;:::i;17606:18::-;1514:21374;;17652:12;1514:21374;17652:25;:::i;:::-;17704:9;;17694:19;;;;;;:41;17427:315;:::o;17694:41::-;;;17427:315;:::o;17508:63::-;;17652:25;17606:18;-1:-1:-1;17606:18:10;:::i;1514:21374::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;10535:487::-;1514:21374;;-1:-1:-1;;;10636:28:10;;;;1514:21374;10636:28;1514:21374;10636:10;-1:-1:-1;;;;;1514:21374:10;10636:28;;;;;;;;;;;;10535:487;10678:11;10636:28;10678:11;;;10674:34;;10722:14;;:60;;;;;10535:487;10718:85;;;1514:21374;10867:12;1514:21374;10899:2;10893:8;;10889:47;;10899:2;10950:8;;10946:47;;11003:12;;10535:487;:::o;10946:47::-;-1:-1:-1;;1514:21374:10;;;;;;;10976:16;;;10967:26;10976:16;;:::i;:::-;10967:26;;:::i;:::-;10960:33;:::o;1514:21374::-;;;;;;10636:28;1514:21374;;;10636:28;1514:21374;10889:47;10899:2;1514:21374;;;;;;;10919:16;;;10910:26;10919:16;;:::i;:::-;10910:26;;:::i;10718:85::-;1514:21374;;-1:-1:-1;;;10791:12:10;;;10722:60;1514:21374;;2236:4;1514:21374;;;;;;;10740:15;:42;10722:60;;;1514:21374;;;;;;10636:28;1514:21374;;;10636:28;1514:21374;10674:34;-1:-1:-1;1514:21374:10;;-1:-1:-1;;;10698:10:10;;;10636:28;;;;;;;;;;;;;;;;;;:::i;:::-;;;1514:21374;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;10636:28;;;;1514:21374;;;10636:28;;;-1:-1:-1;10636:28:10;;1514:21374;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;18957:235::-;19051:22;;:::i;:::-;19087:12;;:26;;;;18957:235;19087:44;;;;18957:235;19083:58;;19158:27;:15;;;;:::i;:::-;19176:9;1514:21374;19158:27;;:::i;19083:58::-;19133:8;;19098:1;19133:8;:::o;19087:44::-;1514:21374;19117:9;1514:21374;19117:14;19087:44;;:26;19103:10;;;19087:26;;18566:280;18656:13;;:::i;:::-;18694:9;-1:-1:-1;18683:20:10;18679:34;;18740:15;;:::i;:::-;18769:11;;18765:25;;18807:26;1984:4;18807:17;;:26;:::i;:::-;1984:4;18566:280;:::o;18765:25::-;18782:8;18779:1;18782:8;:::o;18679:34::-;18712:1;18705:8;:::o;17985:140::-;17867:31;:13;;:::i;:31::-;1921:2;18086:17;;1921:2;;18086:32;-1:-1:-1;17985:140:10;:::o;18086:32::-;1984:4;1514:21374;;17985:140;:::o;11104:158::-;11187:10;;:::i;:::-;1984:4;11215:13;1514:21374;;;;;;;;;;;;;;11215:27;;;;:::i;:::-;-1:-1:-1;;1514:21374:10;;;;;;;;11214:41;;;:::i;11638:612::-;-1:-1:-1;11708:10:10;1514:21374;;11698:9;1514:21374;;;;;11733:11;;;1514:21374;;;;;;;11729:42;;;;:::i;:::-;11813:10;11708;11813;:::i;:::-;11853:14;11835:32;1514:21374;;;;;;11881:13;11877:216;;11638:612;-1:-1:-1;1514:21374:10;;-1:-1:-1;;1514:21374:10;;;;;;;12158:27;;1514:21374;;12131:17;;;:::i;:::-;1514:21374;;12158:27;1514:21374;12158:27;:::i;:::-;;1514:21374;12195:19;1514:21374;;12117:4;1514:21374;;;;;;;;12195:19;1514:21374;12232:10;11708;12232;:::i;1514:21374::-;-1:-1:-1;;;1514:21374:10;;;11733:11;1514:21374;11698:9;;1514:21374;11877:216;11925:4;1514:21374;;;;;;;11943:19;11954:8;11943:19;;;:::i;:::-;1514:21374;11976:21;1514:21374;11976:21;1514:21374;11976:21;:::i;:::-;;1514:21374;12011:20;1514:21374;11925:4;1514:21374;;;;;;;;12158:27;1514:21374;;;;12131:17;1514:21374;12011:20;1514:21374;;;;;;12050:32;1514:21374;11708:10;12050:32;;11877:216;;;;;;;1514:21374;-1:-1:-1;;;1514:21374:10;;;11733:11;1514:21374;11698:9;1514:21374;;11729:42;1514:21374;;-1:-1:-1;;;11753:18:10;;11733:11;;11753:18;15734:562;15824:10;1514:21374;15789:15;;15818:16;;15814:29;;15870:15;15789;;15870;:::i;:::-;15789;15824:10;1514:21374;15943:12;1514:21374;15958:15;15943:30;16022:18;15943:30;;;;:::i;:::-;16022:18;;:::i;:::-;16054:15;;16050:28;;16182:30;1514:21374;16088:26;16124;1514:21374;16088:26;1514:21374;16088:26;:::i;:::-;;1514:21374;16124:26;:::i;:::-;1514:21374;;15943:12;1514:21374;16182:30;;:::i;:::-;16226:24;;;16222:67;;15734:562;;:::o;16222:67::-;16088:26;16257:32;1514:21374;;;;;;16257:32;15734:562::o;16050:28::-;16071:7;;;;;:::o;15814:29::-;15836:7;:::o;16302:371::-;16661:4;16302:371;10404:1148:7;;;;;1514:21374:10;;-1:-1:-1;1514:21374:10;16372:9;1514:21374;;;-1:-1:-1;1514:21374:10;16415:6;;;1514:21374;;1984:4;16449:25;1514:21374;;;;16449:25;;:::i;:::-;1984:4;16494:17;;;;16490:154;;16302:371;16661:4;;;;:::i;16490:154::-;16543:17;16574:9;16543:17;16606:27;16543:17;;:::i;:::-;16574:9;;:18;1514:21374;;;16574:18;:::i;:::-;1514:21374;;16606:27;1514:21374;16606:27;:::i;:::-;;1514:21374;16490:154;;;;;16858:262;10404:1148:7;;;;;1514:21374:10;-1:-1:-1;1514:21374:10;16928:9;1514:21374;;17084:29;1514:21374;-1:-1:-1;1514:21374:10;17084:19;16971:6;;;1514:21374;1984:4;17005:25;1514:21374;;;;;;17005:25;;:::i;:::-;1984:4;1514:21374;;;17084:9;1514:21374;17084:19;:::i;:::-;:29;:::i;:::-;:9;1514:21374;16858:262::o;14188:1540::-;14309:9;1514:21374;;;;;;;14188:1540;14332:10;;:26;;;;14188:1540;14332:55;;;;14188:1540;14328:74;;14431:12;1514:21374;14615:15;;14750:17;;14496:13;;14615:15;14930:9;;14569:3;1921:2;14511:16;;;;:33;;;14569:3;14511:56;;;14569:3;14511:56;;;14605:25;;;;:::i;:::-;14648:22;;;;14644:33;;1984:4;1514:21374;;14750:26;1514:21374;;;14750:26;;:::i;:::-;1984:4;14800:9;;;14796:20;;14866:1;1514:21374;;;;;;;14856:30;;;:40;:30;;:::i;:40::-;14930:19;;;;:::i;:::-;14978:26;;;;;;:55;;;15066:16;;;;:::i;:::-;15096:12;15153:15;;;;;15188:16;;;15222:15;15149:314;;15480:9;;15476:20;;1514:21374;;;;;;;;;;;;;;15598:19;15631;15598;15588:29;15664:16;15598:19;;;15694:17;15598:19;;;:::i;:::-;15588:29;;:::i;:::-;15631:19;;:::i;:::-;15664:16;;:::i;:::-;15694:17;;:::i;:::-;14569:3;-1:-1:-1;;1514:21374:10;;;;14866:1;1514:21374;14496:13;;;;;;1514:21374;-1:-1:-1;;;1514:21374:10;;;;;;;;;-1:-1:-1;;;1514:21374:10;;;;;;;;15476:20;15491:5;;;;;;;;;;;;;;14188:1540::o;15149:314::-;15284:11;;;;;;;;:::i;:::-;-1:-1:-1;;1514:21374:10;;;;;;;15283:24;;;;:::i;:::-;15329:16;;;;15325:38;;15149:314;15389:11;;;;:::i;:::-;15422:12;;;;15418:30;;15149:314;;;;15418:30;15436:12;-1:-1:-1;15418:30:10;;;15325:38;15347:16;;-1:-1:-1;15325:38:10;;1514:21374;-1:-1:-1;;;1514:21374:10;;;;;;;;14978:55;;;;;;14644:33;14672:5;;;;;;;;;;;;14188:1540::o;14511:56::-;14548:19;;;;14511:56;;:33;14531:13;;;;14511:33;;14328:74;14389:13;;;;;;;;:::o;14332:55::-;1514:21374;14362:12;1514:21374;14378:9;-1:-1:-1;14362:25:10;14332:55;;:26;14346:12;;;14332:26;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c63430008180033","offset":9127}},"immutableReferences":{"1380":[{"start":5372,"length":32},{"start":6073,"length":32}],"1383":[{"start":689,"length":32},{"start":4331,"length":32},{"start":4946,"length":32}],"1386":[{"start":2586,"length":32},{"start":4582,"length":32},{"start":5995,"length":32}],"1389":[{"start":2710,"length":32},{"start":3760,"length":32},{"start":6033,"length":32},{"start":7638,"length":32}],"1393":[{"start":1037,"length":32},{"start":6867,"length":32}],"1396":[{"start":2449,"length":32},{"start":6954,"length":32}],"1399":[{"start":1839,"length":32},{"start":3408,"length":32},{"start":5734,"length":32},{"start":7919,"length":32}],"1402":[{"start":1878,"length":32},{"start":2745,"length":32},{"start":5203,"length":32},{"start":6152,"length":32},{"start":7767,"length":32}],"1405":[{"start":1371,"length":32},{"start":1670,"length":32},{"start":2108,"length":32},{"start":3060,"length":32},{"start":3349,"length":32},{"start":6742,"length":32},{"start":7463,"length":32},{"start":8593,"length":32},{"start":9080,"length":32}],"1408":[{"start":980,"length":32},{"start":1800,"length":32},{"start":2156,"length":32},{"start":7529,"length":32},{"start":8556,"length":32}],"1411":[{"start":1412,"length":32},{"start":1457,"length":32},{"start":1512,"length":32},{"start":1602,"length":32},{"start":2996,"length":32},{"start":3288,"length":32},{"start":3849,"length":32},{"start":8124,"length":32},{"start":8522,"length":32}]},"transformations":[{"id":"1383","type":"replace","offset":689,"reason":"immutable"},{"id":"1408","type":"replace","offset":980,"reason":"immutable"},{"id":"1393","type":"replace","offset":1037,"reason":"immutable"},{"id":"1405","type":"replace","offset":1371,"reason":"immutable"},{"id":"1411","type":"replace","offset":1412,"reason":"immutable"},{"id":"1411","type":"replace","offset":1457,"reason":"immutable"},{"id":"1411","type":"replace","offset":1512,"reason":"immutable"},{"id":"1411","type":"replace","offset":1602,"reason":"immutable"},{"id":"1405","type":"replace","offset":1670,"reason":"immutable"},{"id":"1408","type":"replace","offset":1800,"reason":"immutable"},{"id":"1399","type":"replace","offset":1839,"reason":"immutable"},{"id":"1402","type":"replace","offset":1878,"reason":"immutable"},{"id":"1405","type":"replace","offset":2108,"reason":"immutable"},{"id":"1408","type":"replace","offset":2156,"reason":"immutable"},{"id":"1396","type":"replace","offset":2449,"reason":"immutable"},{"id":"1386","type":"replace","offset":2586,"reason":"immutable"},{"id":"1389","type":"replace","offset":2710,"reason":"immutable"},{"id":"1402","type":"replace","offset":2745,"reason":"immutable"},{"id":"1411","type":"replace","offset":2996,"reason":"immutable"},{"id":"1405","type":"replace","offset":3060,"reason":"immutable"},{"id":"1411","type":"replace","offset":3288,"reason":"immutable"},{"id":"1405","type":"replace","offset":3349,"reason":"immutable"},{"id":"1399","type":"replace","offset":3408,"reason":"immutable"},{"id":"1389","type":"replace","offset":3760,"reason":"immutable"},{"id":"1411","type":"replace","offset":3849,"reason":"immutable"},{"id":"1383","type":"replace","offset":4331,"reason":"immutable"},{"id":"1386","type":"replace","offset":4582,"reason":"immutable"},{"id":"1383","type":"replace","offset":4946,"reason":"immutable"},{"id":"1402","type":"replace","offset":5203,"reason":"immutable"},{"id":"1380","type":"replace","offset":5372,"reason":"immutable"},{"id":"1399","type":"replace","offset":5734,"reason":"immutable"},{"id":"1386","type":"replace","offset":5995,"reason":"immutable"},{"id":"1389","type":"replace","offset":6033,"reason":"immutable"},{"id":"1380","type":"replace","offset":6073,"reason":"immutable"},{"id":"1402","type":"replace","offset":6152,"reason":"immutable"},{"id":"1405","type":"replace","offset":6742,"reason":"immutable"},{"id":"1393","type":"replace","offset":6867,"reason":"immutable"},{"id":"1396","type":"replace","offset":6954,"reason":"immutable"},{"id":"1405","type":"replace","offset":7463,"reason":"immutable"},{"id":"1408","type":"replace","offset":7529,"reason":"immutable"},{"id":"1389","type":"replace","offset":7638,"reason":"immutable"},{"id":"1402","type":"replace","offset":7767,"reason":"immutable"},{"id":"1399","type":"replace","offset":7919,"reason":"immutable"},{"id":"1411","type":"replace","offset":8124,"reason":"immutable"},{"id":"1411","type":"replace","offset":8522,"reason":"immutable"},{"id":"1408","type":"replace","offset":8556,"reason":"immutable"},{"id":"1405","type":"replace","offset":8593,"reason":"immutable"},{"id":"1405","type":"replace","offset":9080,"reason":"immutable"}],"transformationValues":{"immutables":{"1380":"0x00000000000000000000000055d398326f99059ff775485246999027b3197955","1383":"0x0000000000000000000000006a87de92deb752c6162cf80bd16e3efd4bdc6d90","1386":"0x00000000000000000000000045e5ad18df32acf05fae75abe90a628b7a78d259","1389":"0x0000000000000000000000000000000000000000000000003782dace9d900000","1393":"0x0000000000000000000000000567f2323251f0aab15c8dfb1967e4e8a7d42aee","1396":"0x0000000000000000000000000000000000000000000000000000000000000008","1399":"0x0000000000000000000000000000000000000000000000000de0b6b3a7640000","1402":"0x0000000000000000000000000000000000000000000000003782dace9d900000","1405":"0x000000000000000000000000000000000000000000115eec47f6cf7e35000000","1408":"0x00000000000000000000000000000000000000000000000029a2241af62c0000","1411":"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000"}}},"deployment":{"transactionHash":"0xdac0f1a2f94d46f1e4fc5e8b12c8e225f7970a7d4a7018153862559ac90df2ff","blockNumber":"130647982","transactionIndex":"58","deployer":"0x45e5Ad18Df32aCF05Fae75ABe90A628b7A78D259"},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-721.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"@openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n    mapping(address account => uint256) private _balances;\n\n    mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * Both values are immutable: they can only be set once during construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /// @inheritdoc IERC20\n    function totalSupply() public view virtual returns (uint256) {\n        return _totalSupply;\n    }\n\n    /// @inheritdoc IERC20\n    function balanceOf(address account) public view virtual returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            _totalSupply += value;\n        } else {\n            uint256 fromBalance = _balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                _balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                _totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                _balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation sets the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the `transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        _allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance < type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"contracts/MiningPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {MiningToken} from \"./MiningToken.sol\";\nimport {AggregatorV3Interface} from \"./PriceFeed.sol\";\n\n/**\n * 算力矿池。全部规则在部署时固定，之后没有任何管理函数可以改价格、算力、产出或上限。\n *\n * 产出公式（唯一口径，前端所有数字都从这里推）：\n *\n *     H_u   = freeHash × r_u + activationHash × a_u + Σ n_{u,i} × h_i\n *     H_net = Σ_u H_u\n *     s_u   = H_u / H_net\n *     r(t)  = baseRatePerSecond / 2^(S(t) / halvingInterval)\n *     ṁ_u   = r(t) × s_u\n *     S(t)  = min(∫r dτ, supplyCap)\n *\n * 也就是：\n *   1. 「3 枚/秒」是**全网**的固定产出，不是每 1H 的产出。\n *   2. 个人产出 = 全网每秒产出 × 个人算力占比。\n *   3. 加算力不增加全网总量，只是重新分配份额（零和竞争）。\n *   4. 每累计产出 halvingInterval（100 万枚）全网速率减半一次。\n *\n * 算力来源：\n *   - 注册（免费）：+freeHash（1H），每个地址一次。\n *   - 开通（4 USDT 等值）：+activationHash（4H），每个地址一次，并解锁买矿机。\n *     开通费可用 USDT 支付，也可用等值 BNB 支付（按链上价格源折算）。\n *   - 买矿机（销毁代币）：+对应档位算力，台数上限按**单个钱包**统计。\n */\ncontract MiningPool {\n    using SafeERC20 for IERC20;\n\n    /// 销毁地址。买矿机消耗的代币全部打到这里，永不回收。\n    address public constant BURN = 0x000000000000000000000000000000000000dEaD;\n    /// 矿机档位数。\n    uint256 public constant TIER_COUNT = 8;\n    /// 减半次数上限，超过后产出归零，避免移位溢出。\n    uint256 public constant MAX_HALVINGS = 60;\n    /// 定点标度。\n    uint256 private constant ONE = 1e18;\n    /// 价格源最大容忍陈旧时间（秒）。BNB/USD 心跳是 27 秒，1 小时已经非常宽松；\n    /// 再旧就说明喂价停了，此时宁可拒绝支付也不能按错价格收费。\n    uint256 public constant MAX_FEED_AGE = 3600;\n\n    IERC20 public immutable usdt;\n    MiningToken public immutable token;\n    /// 开通费收款地址。\n    address public immutable treasury;\n    /// 开通费，wei 计价（USDT 18 位小数）。\n    uint256 public immutable activationFee;\n    /// BNB/USD 价格源，用于把开通费折算成 BNB。\n    AggregatorV3Interface public immutable bnbUsdFeed;\n    /// 价格源小数位，构造时读一次固化，避免每次开通都多一次外部调用。\n    uint8 public immutable feedDecimals;\n    /// 注册赠送的算力（1H），wei 计价（1H = 1e18）。\n    uint256 public immutable freeHash;\n    /// 开通赠送的算力（4H），wei 计价。\n    uint256 public immutable activationHash;\n    /// 代币总量硬顶，wei。\n    uint256 public immutable supplyCap;\n    /// **全网**每秒基础产出（3 枚），wei。不是每 1H 的产出。\n    uint256 public immutable baseRatePerSecond;\n    /// 累计产出每达到该值，全网速率减半，wei。\n    uint256 public immutable halvingInterval;\n\n    struct Tier {\n        uint256 price; // 代币，wei\n        uint256 hash;  // 算力，wei（1H = 1e18）\n        uint16 limit;  // 每个钱包可购买台数\n    }\n\n    Tier[TIER_COUNT] private _tiers;\n\n    /// 全网总算力 H_net。\n    uint256 public totalHash;\n    /// 累计产出 S(t)（含未领取部分），减半按它推进。\n    uint256 public emittedTotal;\n    /// 实际铸造出去的代币总量。\n    uint256 public totalMinted;\n    /// 已销毁的代币总量。\n    uint256 public totalBurned;\n    /// 累计收到的开通费 BNB（wei）。\n    /// 开通费可以走 USDT 或 BNB 两条通道，后台要能分别看到实收，\n    /// 否则「开通人数 × 4 USDT」会把 BNB 那部分算成 0。\n    uint256 public totalBnbReceived;\n    /// 已注册地址数（免费那一步）。\n    uint256 public registeredCount;\n    /// 已开通地址数（付费那一步）。\n    uint256 public activatedCount;\n    /// 每档全网已售台数（仅统计用；台数上限是单钱包的）。\n    uint16[TIER_COUNT] public tierSold;\n\n    /// 每单位算力累计已产出，标度 1e18。\n    uint256 public accRewardPerHash;\n    /// 全网已结算算力对应的累计债务，用于算全网待领取。\n    uint256 public totalDebt;\n    /// 全网已结算但未领取的总量。\n    uint256 public totalPendingStored;\n    /// 上次结算时间。\n    uint256 public lastUpdate;\n\n    struct Account {\n        uint256 hash;      // 当前算力 H_u\n        uint256 debt;      // hash * acc / 1e18\n        uint256 pending;   // 已结算未领取\n        uint256 claimed;   // 已领取\n        bool registered;   // 是否已注册（免费赠送 1H）\n        bool activated;    // 是否已付开通费（赠送 4H 并解锁买矿机）\n        uint16[TIER_COUNT] owned; // 本钱包各档持有台数\n    }\n\n    mapping(address => Account) private _accounts;\n\n    event Registered(address indexed user, uint256 freeHash);\n    event Activated(address indexed user, uint256 fee, uint256 activationHash);\n    /// 用 BNB 支付开通费时额外发一条，带上实付 BNB 与折算出的美元价值。\n    event ActivatedWithBnb(address indexed user, uint256 bnbPaid, uint256 usdValue);\n    event MinerBought(address indexed user, uint256 indexed tier, uint256 price, uint256 hash, uint256 burned);\n    event Claimed(address indexed user, uint256 amount, uint256 emittedAtClaim);\n    event Halved(uint256 indexed epoch, uint256 emittedTotal);\n\n    error AlreadyRegistered();\n    error NotRegistered();\n    error NotActivated();\n    error AlreadyActivated();\n    error BadTier();\n    error TierLimitReached();\n    error NothingToClaim();\n    error ZeroAddress();\n    error BadConfig();\n    /// 用 BNB 开通但随交易附带的 BNB 不够（含价格源陈旧的情况）。\n    error InsufficientBnb();\n    /// 价格源返回了非正数，按错价格收费比拒绝服务更糟。\n    error BadPrice();\n    /// 价格源太久没更新。\n    error StalePrice();\n    /// 给 treasury 转 BNB 失败。\n    error TransferFailed();\n\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        address usdt_,\n        address bnbUsdFeed_,\n        address treasury_,\n        uint256 supplyCap_,\n        uint256 activationFee_,\n        uint256 freeHash_,\n        uint256 activationHash_,\n        uint256 baseRatePerSecond_,\n        uint256 halvingInterval_,\n        uint256[TIER_COUNT] memory prices_,\n        uint256[TIER_COUNT] memory hashes_,\n        uint16[TIER_COUNT] memory limits_\n    ) {\n        if (usdt_ == address(0) || bnbUsdFeed_ == address(0) || treasury_ == address(0)) revert ZeroAddress();\n        if (\n            supplyCap_ == 0 || activationFee_ == 0 || baseRatePerSecond_ == 0 ||\n            halvingInterval_ == 0 || freeHash_ == 0 || activationHash_ == 0\n        ) revert BadConfig();\n\n        token = new MiningToken(tokenName, tokenSymbol, supplyCap_, address(this));\n        usdt = IERC20(usdt_);\n        bnbUsdFeed = AggregatorV3Interface(bnbUsdFeed_);\n\n        // 小数位在这里读一次就固化：feed 的小数位不会变，每次开通都读一遍纯属浪费 gas。\n        uint8 dec = AggregatorV3Interface(bnbUsdFeed_).decimals();\n        if (dec > 18) revert BadConfig();\n        feedDecimals = dec;\n\n        treasury = treasury_;\n        supplyCap = supplyCap_;\n        activationFee = activationFee_;\n        freeHash = freeHash_;\n        activationHash = activationHash_;\n        baseRatePerSecond = baseRatePerSecond_;\n        halvingInterval = halvingInterval_;\n\n        for (uint256 i = 0; i < TIER_COUNT; i++) {\n            if (prices_[i] == 0 || hashes_[i] == 0 || limits_[i] == 0) revert BadConfig();\n            _tiers[i] = Tier({price: prices_[i], hash: hashes_[i], limit: limits_[i]});\n        }\n\n        lastUpdate = block.timestamp;\n    }\n\n    // ------------------------------------------------------------ 注册（免费）\n\n    /**\n     * 注册并领取初始矿机。不收费，只需 gas。\n     * 每个地址一次，赠送 freeHash（1H）。\n     */\n    function register() external {\n        Account storage a = _accounts[msg.sender];\n        if (a.registered) revert AlreadyRegistered();\n\n        _updatePool();\n        _settle(msg.sender);\n\n        a.registered = true;\n        a.hash += freeHash;\n        totalHash += freeHash;\n        registeredCount += 1;\n        _rebase(msg.sender);\n\n        emit Registered(msg.sender, freeHash);\n    }\n\n    // ------------------------------------------------------------ 开通（付费）\n\n    /**\n     * 用 USDT 支付开通费，领取 4H 矿机并解锁买矿机。\n     * 需要先 approve 本合约 activationFee 的 USDT。每个地址一次。\n     *\n     * 若尚未注册，会顺带补发注册赠送的 1H——\n     * 否则直接开通的用户会白白丢掉那 1H，属于不必要的坑。\n     */\n    function activate() external {\n        _activate();\n        usdt.safeTransferFrom(msg.sender, treasury, activationFee);\n        emit Activated(msg.sender, activationFee, activationHash);\n    }\n\n    /**\n     * 用 BNB 支付开通费。实付金额按链上 BNB/USD 价格源折算，价值必须 >= activationFee。\n     *\n     * 多付的 BNB 不退（金额由前端算好，误差极小），但绝不允许少付：\n     * 用 BNB 结算时点差和价格波动都是常态，宁可让用户重试也不能让项目方少收。\n     * 交易里附带的 BNB 全额转给 treasury。\n     */\n    function activateWithBnb() external payable {\n        uint256 required = bnbAmountForFee();\n        if (msg.value < required) revert InsufficientBnb();\n\n        _activate();\n\n        // 直接转账而不是 call：treasury 是项目方自己的 EOA，\n        // 用 call 会把重入面打开，而这里没有任何需要 treasury 回调的理由。\n        (bool ok,) = payable(treasury).call{value: msg.value}(\"\");\n        if (!ok) revert TransferFailed();\n\n        totalBnbReceived += msg.value;\n\n        emit Activated(msg.sender, activationFee, activationHash);\n        emit ActivatedWithBnb(msg.sender, msg.value, usdValueOf(msg.value));\n    }\n\n    /// 当前 BNB 价格（1 BNB = 多少 USDT），标度 1e18。价格异常时 revert。\n    function bnbPrice() public view returns (uint256) {\n        (, int256 answer,, uint256 updatedAt,) = bnbUsdFeed.latestRoundData();\n        if (answer <= 0) revert BadPrice();\n        if (updatedAt == 0 || block.timestamp > updatedAt + MAX_FEED_AGE) revert StalePrice();\n\n        uint256 price = uint256(answer);\n        uint8 dec = feedDecimals;\n        if (dec < 18) return price * (10 ** (18 - dec));\n        if (dec > 18) return price / (10 ** (dec - 18));\n        return price;\n    }\n\n    /// 支付 activationFee 所需的最小 BNB（wei），向上取整。\n    function bnbAmountForFee() public view returns (uint256) {\n        uint256 price = bnbPrice();\n        return (activationFee * ONE + price - 1) / price;\n    }\n\n    /// 给定 BNB 数量折算成 USDT 价值（wei）。\n    function usdValueOf(uint256 bnbAmount) public view returns (uint256) {\n        return bnbAmount * bnbPrice() / ONE;\n    }\n\n    /**\n     * 开通的公共部分：发算力、改状态。收费由调用方负责，\n     * 这样 USDT 与 BNB 两条通道的记账逻辑只有一份，不会走偏。\n     */\n    function _activate() internal {\n        Account storage a = _accounts[msg.sender];\n        if (a.activated) revert AlreadyActivated();\n\n        _updatePool();\n        _settle(msg.sender);\n\n        uint256 granted = activationHash;\n        if (!a.registered) {\n            a.registered = true;\n            granted += freeHash;\n            totalHash += freeHash;\n            registeredCount += 1;\n            emit Registered(msg.sender, freeHash);\n        }\n\n        a.activated = true;\n        a.hash += granted;\n        totalHash += activationHash;\n        activatedCount += 1;\n        _rebase(msg.sender);\n    }\n\n    // ------------------------------------------------------------ 买矿机\n\n    /**\n     * 用代币购买矿机。代币全额销毁，算力立即生效。\n     * 台数上限是**本钱包**的上限，不是全网上限。\n     */\n    function buyMiner(uint256 tier) external {\n        Account storage a = _accounts[msg.sender];\n        if (!a.activated) revert NotActivated();\n        if (tier >= TIER_COUNT) revert BadTier();\n        if (a.owned[tier] >= _tiers[tier].limit) revert TierLimitReached();\n\n        _updatePool();\n        _settle(msg.sender);\n\n        Tier memory t = _tiers[tier];\n        a.owned[tier] += 1;\n        a.hash += t.hash;\n        totalHash += t.hash;\n        tierSold[tier] += 1;\n        totalBurned += t.price;\n        _rebase(msg.sender);\n\n        token.transferFrom(msg.sender, BURN, t.price);\n\n        emit MinerBought(msg.sender, tier, t.price, t.hash, t.price);\n    }\n\n    // ------------------------------------------------------------ 领取\n\n    /// 领取当前地址的全部待领产出。\n    function claim() external returns (uint256 amount) {\n        _updatePool();\n        _settle(msg.sender);\n        amount = _accounts[msg.sender].pending;\n        if (amount == 0) revert NothingToClaim();\n        _accounts[msg.sender].pending = 0;\n        totalPendingStored -= amount;\n        _accounts[msg.sender].claimed += amount;\n        totalMinted += amount;\n        token.mint(msg.sender, amount);\n        emit Claimed(msg.sender, amount, emittedTotal);\n    }\n\n    // ------------------------------------------------------------ 内部结算\n\n    /**\n     * 模拟从上次结算到现在新增的累计产出。\n     * 逐段推进，跨过减半边界或总量硬顶时按实际秒数切分，避免用旧速率算整段时间。\n     *\n     * 注意速率是**全网**速率：r = baseRate / 2^epoch，与总算力无关。\n     * 算力只通过占比影响个人分配。\n     */\n    function _simulate(uint256 elapsed) internal view returns (uint256 accInc, uint256 emittedInc) {\n        uint256 hash_ = totalHash;\n        if (hash_ == 0 || elapsed == 0 || emittedTotal >= supplyCap) return (0, 0);\n\n        uint256 emitted = emittedTotal;\n        uint256 remaining = elapsed;\n\n        for (uint256 i = 0; i < MAX_HALVINGS && remaining > 0 && emitted < supplyCap; i++) {\n            uint256 round_ = emitted / halvingInterval;\n            if (round_ >= MAX_HALVINGS) break;\n            uint256 factor = ONE >> round_;\n            uint256 rate = baseRatePerSecond * factor / ONE;\n            if (rate == 0) break;\n\n            uint256 roomToBoundary = (round_ + 1) * halvingInterval - emitted;\n            uint256 roomToCap = supplyCap - emitted;\n            uint256 room = roomToBoundary < roomToCap ? roomToBoundary : roomToCap;\n\n            uint256 maxEmit = rate * remaining;\n            uint256 secs;\n            uint256 chunk;\n            if (maxEmit <= room) {\n                secs = remaining;\n                chunk = maxEmit;\n            } else {\n                secs = (room + rate - 1) / rate;\n                if (secs > remaining) secs = remaining;\n                chunk = rate * secs;\n                if (chunk > room) chunk = room;\n            }\n            if (secs == 0) break;\n\n            // acc 增量 = 全网每秒产出 / 总算力 × 秒数 × 1e18\n            accInc += chunk * ONE / hash_;\n            emittedInc += chunk;\n            emitted += chunk;\n            remaining -= secs;\n        }\n    }\n\n    function _updatePool() internal {\n        uint256 ts = block.timestamp;\n        if (ts <= lastUpdate) return;\n        uint256 elapsed = ts - lastUpdate;\n        lastUpdate = ts;\n\n        uint256 epochBefore = emittedTotal / halvingInterval;\n        (uint256 accInc, uint256 emittedInc) = _simulate(elapsed);\n        if (emittedInc == 0) return;\n\n        accRewardPerHash += accInc;\n        emittedTotal += emittedInc;\n\n        uint256 epochAfter = emittedTotal / halvingInterval;\n        if (epochAfter > epochBefore) emit Halved(epochAfter, emittedTotal);\n    }\n\n    function _settle(address user) internal {\n        Account storage a = _accounts[user];\n        uint256 oldDebt = a.debt;\n        uint256 newDebt = a.hash * accRewardPerHash / ONE;\n        if (newDebt > oldDebt) {\n            uint256 delta = newDebt - oldDebt;\n            a.pending += delta;\n            totalPendingStored += delta;\n        }\n        _rebase(user);\n    }\n\n    /**\n     * 把地址债务对齐到当前算力。算力变动后必须调用，\n     * 否则新增的算力会按「从上线到现在」的累计值追溯产出。\n     */\n    function _rebase(address user) internal {\n        Account storage a = _accounts[user];\n        uint256 oldDebt = a.debt;\n        uint256 newDebt = a.hash * accRewardPerHash / ONE;\n        a.debt = newDebt;\n        totalDebt = totalDebt - oldDebt + newDebt;\n    }\n\n    // ------------------------------------------------------------ 只读\n\n    /**\n     * 含「尚未结算时间」的实时累计产出。\n     * 只读函数一律走这里：直接读 emittedTotal 会拿到上次结算时的旧值，\n     * 前端显示的速率与轮次就会滞后。\n     */\n    function liveEmitted() public view returns (uint256) {\n        uint256 elapsed = block.timestamp > lastUpdate ? block.timestamp - lastUpdate : 0;\n        (, uint256 emittedInc) = _simulate(elapsed);\n        uint256 emitted = emittedTotal + emittedInc;\n        return emitted > supplyCap ? supplyCap : emitted;\n    }\n\n    /// 当前减半轮次（S(t) / 减半间隔）。\n    function epoch() public view returns (uint256) {\n        return liveEmitted() / halvingInterval;\n    }\n\n    /// 当前全网速率倍数，标度 1e18（第 n 轮为 1/2^n）。\n    function halvingFactor() public view returns (uint256) {\n        uint256 e = epoch();\n        return e >= MAX_HALVINGS ? 0 : ONE >> e;\n    }\n\n    /// 距下一次减半还差多少产出（wei）。\n    function toNextHalving() public view returns (uint256) {\n        uint256 emitted = liveEmitted();\n        uint256 next = (emitted / halvingInterval + 1) * halvingInterval;\n        if (next > supplyCap) next = supplyCap;\n        return next > emitted ? next - emitted : 0;\n    }\n\n    /// 全网每秒产出 r(t)（wei）。这是公式里的 r(t)，不是每 1H 的产出。\n    function currentRatePerSecond() public view returns (uint256) {\n        uint256 emitted = liveEmitted();\n        if (emitted >= supplyCap) return 0;\n        uint256 factor = halvingFactor();\n        if (factor == 0) return 0;\n        return baseRatePerSecond * factor / ONE;\n    }\n\n    /// 给定算力在当前全网占比下每秒能产出多少（wei）。前端档位表用这个。\n    function rateForHash(uint256 hash_) public view returns (uint256) {\n        uint256 netRate = currentRatePerSecond();\n        if (netRate == 0 || hash_ == 0 || totalHash == 0) return 0;\n        return netRate * hash_ / totalHash;\n    }\n\n    function tierOf(uint256 tier) external view returns (Tier memory) {\n        if (tier >= TIER_COUNT) revert BadTier();\n        return _tiers[tier];\n    }\n\n    /// 某地址当前待领产出，含尚未结算的部分。\n    function pendingOf(address user) public view returns (uint256) {\n        Account storage a = _accounts[user];\n        uint256 elapsed = block.timestamp > lastUpdate ? block.timestamp - lastUpdate : 0;\n        (uint256 accInc,) = _simulate(elapsed);\n        uint256 acc = accRewardPerHash + accInc;\n        uint256 gross = a.hash * acc / ONE;\n        uint256 accrued = gross > a.debt ? gross - a.debt : 0;\n        return a.pending + accrued;\n    }\n\n    function accountOf(address user) external view returns (Account memory) {\n        return _accounts[user];\n    }\n\n    /// 单地址算力。\n    function hashOf(address user) external view returns (uint256) {\n        return _accounts[user].hash;\n    }\n\n    /// 单地址当前每秒产出 ṁ_u = r(t) × s_u。\n    function rateOf(address user) external view returns (uint256) {\n        return rateForHash(_accounts[user].hash);\n    }\n\n    /// 全网聚合状态，一次 eth_call 取回，避免前端逐字段读。\n    struct Stats {\n        uint256 totalHash;      // H_net\n        uint256 emittedTotal;   // S(t)\n        uint256 totalMinted;\n        uint256 totalBurned;\n        uint256 supplyCap;\n        uint256 epoch;\n        uint256 halvingInterval;\n        uint256 toNextHalving;\n        uint256 ratePerSecond;  // r(t)\n        uint256 registeredCount;\n        uint256 activatedCount;\n        uint256 outstanding;\n        uint256 remaining;\n        uint256 timestamp;\n        uint256 baseRate;       // 基础 r\n        uint256 freeHash;\n        uint256 activationHash;\n    }\n\n    function stats() external view returns (Stats memory s) {\n        uint256 elapsed = block.timestamp > lastUpdate ? block.timestamp - lastUpdate : 0;\n        (uint256 accInc, uint256 emittedInc) = _simulate(elapsed);\n        uint256 emitted = emittedTotal + emittedInc;\n        uint256 acc = accRewardPerHash + accInc;\n\n        s.totalHash = totalHash;\n        s.emittedTotal = emitted;\n        s.totalMinted = totalMinted;\n        s.totalBurned = totalBurned;\n        s.supplyCap = supplyCap;\n        s.epoch = emitted / halvingInterval;\n        s.halvingInterval = halvingInterval;\n        s.toNextHalving = (s.epoch + 1) * halvingInterval > emitted\n            ? (s.epoch + 1) * halvingInterval - emitted\n            : 0;\n        uint256 factor = s.epoch >= MAX_HALVINGS ? 0 : ONE >> s.epoch;\n        s.ratePerSecond = (emitted >= supplyCap || factor == 0) ? 0 : baseRatePerSecond * factor / ONE;\n        s.registeredCount = registeredCount;\n        s.activatedCount = activatedCount;\n        s.outstanding = (totalHash * acc / ONE - totalDebt) + totalPendingStored;\n        s.remaining = emitted >= supplyCap ? 0 : supplyCap - emitted;\n        s.timestamp = block.timestamp;\n        s.baseRate = baseRatePerSecond;\n        s.freeHash = freeHash;\n        s.activationHash = activationHash;\n    }\n\n    /// 一次读回全部档位配置。\n    function allTiers() external view returns (Tier[TIER_COUNT] memory) {\n        return _tiers;\n    }\n\n    /// 一次读回某地址的全部持有台数。\n    function ownedOf(address user) external view returns (uint16[TIER_COUNT] memory) {\n        return _accounts[user].owned;\n    }\n\n    /**\n     * 合约不留任何 BNB：开通费随交易进随交易出。\n     * 裸转账一律拒绝，避免有人误转 BNB 进来后卡在合约里（合约没有任何提币函数，也永远不会有）。\n     */\n    receive() external payable {\n        revert BadConfig();\n    }\n}\n"},"contracts/MiningToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n/**\n * 挖矿代币。总量硬顶，铸造权只给矿池合约，且矿池只能在挖矿产出时铸造。\n * 没有 owner、没有 mint 开关、没有团队份额——部署后任何人（包括部署者）都无法增发。\n */\ncontract MiningToken is ERC20 {\n    /// 总量硬顶（wei）。\n    uint256 public immutable CAP;\n    /// 唯一铸造方，部署时由矿池合约自己创建本代币，因此等于矿池地址。\n    address public immutable pool;\n\n    error NotPool();\n    error CapExceeded();\n\n    constructor(string memory name_, string memory symbol_, uint256 cap_, address pool_) ERC20(name_, symbol_) {\n        require(pool_ != address(0), \"pool=0\");\n        require(cap_ > 0, \"cap=0\");\n        CAP = cap_;\n        pool = pool_;\n    }\n\n    function mint(address to, uint256 amount) external {\n        if (msg.sender != pool) revert NotPool();\n        if (totalSupply() + amount > CAP) revert CapExceeded();\n        _mint(to, amount);\n    }\n}\n"},"contracts/PriceFeed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\n/**\n * Chainlink 价格聚合器的最小接口。\n *\n * 只声明用得到的四个函数，避免为了一个价格把整包 chainlink 合约拖进来。\n * BSC 主网的 BNB/USD 喂价（0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE）\n * 就是这套接口，8 位小数，心跳 27 秒。\n */\ninterface AggregatorV3Interface {\n    function decimals() external view returns (uint8);\n\n    function description() external view returns (string memory);\n\n    function latestRoundData()\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.24+commit.e11b9ed9","compilerSettings":{"viaIR":true,"optimizer":{"runs":200,"enabled":true},"evmVersion":"paris"},"name":"MiningPool","fullyQualifiedName":"contracts/MiningPool.sol:MiningPool"},"abi":[{"type":"constructor","inputs":[{"name":"tokenName","type":"string","internalType":"string"},{"name":"tokenSymbol","type":"string","internalType":"string"},{"name":"usdt_","type":"address","internalType":"address"},{"name":"bnbUsdFeed_","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"},{"name":"supplyCap_","type":"uint256","internalType":"uint256"},{"name":"activationFee_","type":"uint256","internalType":"uint256"},{"name":"freeHash_","type":"uint256","internalType":"uint256"},{"name":"activationHash_","type":"uint256","internalType":"uint256"},{"name":"baseRatePerSecond_","type":"uint256","internalType":"uint256"},{"name":"halvingInterval_","type":"uint256","internalType":"uint256"},{"name":"prices_","type":"uint256[8]","internalType":"uint256[8]"},{"name":"hashes_","type":"uint256[8]","internalType":"uint256[8]"},{"name":"limits_","type":"uint16[8]","internalType":"uint16[8]"}],"stateMutability":"nonpayable"},{"name":"AlreadyActivated","type":"error","inputs":[]},{"name":"AlreadyRegistered","type":"error","inputs":[]},{"name":"BadConfig","type":"error","inputs":[]},{"name":"BadPrice","type":"error","inputs":[]},{"name":"BadTier","type":"error","inputs":[]},{"name":"InsufficientBnb","type":"error","inputs":[]},{"name":"NotActivated","type":"error","inputs":[]},{"name":"NotRegistered","type":"error","inputs":[]},{"name":"NothingToClaim","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"StalePrice","type":"error","inputs":[]},{"name":"TierLimitReached","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"Activated","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"activationHash","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ActivatedWithBnb","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"bnbPaid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"usdValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Claimed","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"emittedAtClaim","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Halved","type":"event","inputs":[{"name":"epoch","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"emittedTotal","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MinerBought","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tier","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"price","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"hash","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burned","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Registered","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"freeHash","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BURN","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"MAX_FEED_AGE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_HALVINGS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TIER_COUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accRewardPerHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accountOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"hash","type":"uint256","internalType":"uint256"},{"name":"debt","type":"uint256","internalType":"uint256"},{"name":"pending","type":"uint256","internalType":"uint256"},{"name":"claimed","type":"uint256","internalType":"uint256"},{"name":"registered","type":"bool","internalType":"bool"},{"name":"activated","type":"bool","internalType":"bool"},{"name":"owned","type":"uint16[8]","internalType":"uint16[8]"}],"internalType":"struct MiningPool.Account"}],"stateMutability":"view"},{"name":"activate","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"activateWithBnb","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"activatedCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activationFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activationHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allTiers","type":"function","inputs":[],"outputs":[{"name":"","type":"tuple[8]","components":[{"name":"price","type":"uint256","internalType":"uint256"},{"name":"hash","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint16","internalType":"uint16"}],"internalType":"struct MiningPool.Tier[8]"}],"stateMutability":"view"},{"name":"baseRatePerSecond","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bnbAmountForFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bnbPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bnbUsdFeed","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract AggregatorV3Interface"}],"stateMutability":"view"},{"name":"buyMiner","type":"function","inputs":[{"name":"tier","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"claim","type":"function","inputs":[],"outputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"currentRatePerSecond","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"emittedTotal","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"epoch","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"feedDecimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"freeHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"halvingFactor","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"halvingInterval","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"hashOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lastUpdate","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"liveEmitted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ownedOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint16[8]","internalType":"uint16[8]"}],"stateMutability":"view"},{"name":"pendingOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rateForHash","type":"function","inputs":[{"name":"hash_","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rateOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"register","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"registeredCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"stats","type":"function","inputs":[],"outputs":[{"name":"s","type":"tuple","components":[{"name":"totalHash","type":"uint256","internalType":"uint256"},{"name":"emittedTotal","type":"uint256","internalType":"uint256"},{"name":"totalMinted","type":"uint256","internalType":"uint256"},{"name":"totalBurned","type":"uint256","internalType":"uint256"},{"name":"supplyCap","type":"uint256","internalType":"uint256"},{"name":"epoch","type":"uint256","internalType":"uint256"},{"name":"halvingInterval","type":"uint256","internalType":"uint256"},{"name":"toNextHalving","type":"uint256","internalType":"uint256"},{"name":"ratePerSecond","type":"uint256","internalType":"uint256"},{"name":"registeredCount","type":"uint256","internalType":"uint256"},{"name":"activatedCount","type":"uint256","internalType":"uint256"},{"name":"outstanding","type":"uint256","internalType":"uint256"},{"name":"remaining","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"baseRate","type":"uint256","internalType":"uint256"},{"name":"freeHash","type":"uint256","internalType":"uint256"},{"name":"activationHash","type":"uint256","internalType":"uint256"}],"internalType":"struct MiningPool.Stats"}],"stateMutability":"view"},{"name":"supplyCap","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tierOf","type":"function","inputs":[{"name":"tier","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"price","type":"uint256","internalType":"uint256"},{"name":"hash","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint16","internalType":"uint16"}],"internalType":"struct MiningPool.Tier"}],"stateMutability":"view"},{"name":"tierSold","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"toNextHalving","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"token","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract MiningToken"}],"stateMutability":"view"},{"name":"totalBnbReceived","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalBurned","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalDebt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalPendingStored","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"usdValueOf","type":"function","inputs":[{"name":"bnbAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"usdt","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"usdt_","type":"address"},{"internalType":"address","name":"bnbUsdFeed_","type":"address"},{"internalType":"address","name":"treasury_","type":"address"},{"internalType":"uint256","name":"supplyCap_","type":"uint256"},{"internalType":"uint256","name":"activationFee_","type":"uint256"},{"internalType":"uint256","name":"freeHash_","type":"uint256"},{"internalType":"uint256","name":"activationHash_","type":"uint256"},{"internalType":"uint256","name":"baseRatePerSecond_","type":"uint256"},{"internalType":"uint256","name":"halvingInterval_","type":"uint256"},{"internalType":"uint256[8]","name":"prices_","type":"uint256[8]"},{"internalType":"uint256[8]","name":"hashes_","type":"uint256[8]"},{"internalType":"uint16[8]","name":"limits_","type":"uint16[8]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyActivated","type":"error"},{"inputs":[],"name":"AlreadyRegistered","type":"error"},{"inputs":[],"name":"BadConfig","type":"error"},{"inputs":[],"name":"BadPrice","type":"error"},{"inputs":[],"name":"BadTier","type":"error"},{"inputs":[],"name":"InsufficientBnb","type":"error"},{"inputs":[],"name":"NotActivated","type":"error"},{"inputs":[],"name":"NotRegistered","type":"error"},{"inputs":[],"name":"NothingToClaim","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"StalePrice","type":"error"},{"inputs":[],"name":"TierLimitReached","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"activationHash","type":"uint256"}],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bnbPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdValue","type":"uint256"}],"name":"ActivatedWithBnb","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"emittedAtClaim","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"emittedTotal","type":"uint256"}],"name":"Halved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hash","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burned","type":"uint256"}],"name":"MinerBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"freeHash","type":"uint256"}],"name":"Registered","type":"event"},{"inputs":[],"name":"BURN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEED_AGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_HALVINGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIER_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accRewardPerHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"accountOf","outputs":[{"components":[{"internalType":"uint256","name":"hash","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"bool","name":"registered","type":"bool"},{"internalType":"bool","name":"activated","type":"bool"},{"internalType":"uint16[8]","name":"owned","type":"uint16[8]"}],"internalType":"struct MiningPool.Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateWithBnb","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"activatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activationHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allTiers","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"hash","type":"uint256"},{"internalType":"uint16","name":"limit","type":"uint16"}],"internalType":"struct MiningPool.Tier[8]","name":"","type":"tuple[8]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseRatePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnbAmountForFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnbPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnbUsdFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"buyMiner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRatePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emittedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"halvingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"halvingInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hashOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liveEmitted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"ownedOf","outputs":[{"internalType":"uint16[8]","name":"","type":"uint16[8]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"hash_","type":"uint256"}],"name":"rateForHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"rateOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registeredCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stats","outputs":[{"components":[{"internalType":"uint256","name":"totalHash","type":"uint256"},{"internalType":"uint256","name":"emittedTotal","type":"uint256"},{"internalType":"uint256","name":"totalMinted","type":"uint256"},{"internalType":"uint256","name":"totalBurned","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"halvingInterval","type":"uint256"},{"internalType":"uint256","name":"toNextHalving","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"},{"internalType":"uint256","name":"registeredCount","type":"uint256"},{"internalType":"uint256","name":"activatedCount","type":"uint256"},{"internalType":"uint256","name":"outstanding","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"baseRate","type":"uint256"},{"internalType":"uint256","name":"freeHash","type":"uint256"},{"internalType":"uint256","name":"activationHash","type":"uint256"}],"internalType":"struct MiningPool.Stats","name":"s","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"tierOf","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"hash","type":"uint256"},{"internalType":"uint16","name":"limit","type":"uint16"}],"internalType":"struct MiningPool.Tier","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tierSold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextHalving","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract MiningToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBnbReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPendingStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbAmount","type":"uint256"}],"name":"usdValueOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"errors":{"BadPrice()":[{"notice":"价格源返回了非正数，按错价格收费比拒绝服务更糟。"}],"InsufficientBnb()":[{"notice":"用 BNB 开通但随交易附带的 BNB 不够（含价格源陈旧的情况）。"}],"StalePrice()":[{"notice":"价格源太久没更新。"}],"TransferFailed()":[{"notice":"给 treasury 转 BNB 失败。"}]},"events":{"ActivatedWithBnb(address,uint256,uint256)":{"notice":"用 BNB 支付开通费时额外发一条，带上实付 BNB 与折算出的美元价值。"}},"kind":"user","methods":{"BURN()":{"notice":"销毁地址。买矿机消耗的代币全部打到这里，永不回收。"},"MAX_FEED_AGE()":{"notice":"价格源最大容忍陈旧时间（秒）。BNB/USD 心跳是 27 秒，1 小时已经非常宽松； 再旧就说明喂价停了，此时宁可拒绝支付也不能按错价格收费。"},"MAX_HALVINGS()":{"notice":"减半次数上限，超过后产出归零，避免移位溢出。"},"TIER_COUNT()":{"notice":"矿机档位数。"},"accRewardPerHash()":{"notice":"每单位算力累计已产出，标度 1e18。"},"activate()":{"notice":"用 USDT 支付开通费，领取 4H 矿机并解锁买矿机。 需要先 approve 本合约 activationFee 的 USDT。每个地址一次。 若尚未注册，会顺带补发注册赠送的 1H—— 否则直接开通的用户会白白丢掉那 1H，属于不必要的坑。"},"activateWithBnb()":{"notice":"用 BNB 支付开通费。实付金额按链上 BNB/USD 价格源折算，价值必须 >= activationFee。 多付的 BNB 不退（金额由前端算好，误差极小），但绝不允许少付： 用 BNB 结算时点差和价格波动都是常态，宁可让用户重试也不能让项目方少收。 交易里附带的 BNB 全额转给 treasury。"},"activatedCount()":{"notice":"已开通地址数（付费那一步）。"},"activationFee()":{"notice":"开通费，wei 计价（USDT 18 位小数）。"},"activationHash()":{"notice":"开通赠送的算力（4H），wei 计价。"},"allTiers()":{"notice":"一次读回全部档位配置。"},"baseRatePerSecond()":{"notice":"**全网**每秒基础产出（3 枚），wei。不是每 1H 的产出。"},"bnbAmountForFee()":{"notice":"支付 activationFee 所需的最小 BNB（wei），向上取整。"},"bnbPrice()":{"notice":"当前 BNB 价格（1 BNB = 多少 USDT），标度 1e18。价格异常时 revert。"},"bnbUsdFeed()":{"notice":"BNB/USD 价格源，用于把开通费折算成 BNB。"},"buyMiner(uint256)":{"notice":"用代币购买矿机。代币全额销毁，算力立即生效。 台数上限是**本钱包**的上限，不是全网上限。"},"claim()":{"notice":"领取当前地址的全部待领产出。"},"currentRatePerSecond()":{"notice":"全网每秒产出 r(t)（wei）。这是公式里的 r(t)，不是每 1H 的产出。"},"emittedTotal()":{"notice":"累计产出 S(t)（含未领取部分），减半按它推进。"},"epoch()":{"notice":"当前减半轮次（S(t) / 减半间隔）。"},"feedDecimals()":{"notice":"价格源小数位，构造时读一次固化，避免每次开通都多一次外部调用。"},"freeHash()":{"notice":"注册赠送的算力（1H），wei 计价（1H = 1e18）。"},"halvingFactor()":{"notice":"当前全网速率倍数，标度 1e18（第 n 轮为 1/2^n）。"},"halvingInterval()":{"notice":"累计产出每达到该值，全网速率减半，wei。"},"hashOf(address)":{"notice":"单地址算力。"},"lastUpdate()":{"notice":"上次结算时间。"},"liveEmitted()":{"notice":"含「尚未结算时间」的实时累计产出。 只读函数一律走这里：直接读 emittedTotal 会拿到上次结算时的旧值， 前端显示的速率与轮次就会滞后。"},"ownedOf(address)":{"notice":"一次读回某地址的全部持有台数。"},"pendingOf(address)":{"notice":"某地址当前待领产出，含尚未结算的部分。"},"rateForHash(uint256)":{"notice":"给定算力在当前全网占比下每秒能产出多少（wei）。前端档位表用这个。"},"rateOf(address)":{"notice":"单地址当前每秒产出 ṁ_u = r(t) × s_u。"},"register()":{"notice":"注册并领取初始矿机。不收费，只需 gas。 每个地址一次，赠送 freeHash（1H）。"},"registeredCount()":{"notice":"已注册地址数（免费那一步）。"},"supplyCap()":{"notice":"代币总量硬顶，wei。"},"tierSold(uint256)":{"notice":"每档全网已售台数（仅统计用；台数上限是单钱包的）。"},"toNextHalving()":{"notice":"距下一次减半还差多少产出（wei）。"},"totalBnbReceived()":{"notice":"累计收到的开通费 BNB（wei）。 开通费可以走 USDT 或 BNB 两条通道，后台要能分别看到实收， 否则「开通人数 × 4 USDT」会把 BNB 那部分算成 0。"},"totalBurned()":{"notice":"已销毁的代币总量。"},"totalDebt()":{"notice":"全网已结算算力对应的累计债务，用于算全网待领取。"},"totalHash()":{"notice":"全网总算力 H_net。"},"totalMinted()":{"notice":"实际铸造出去的代币总量。"},"totalPendingStored()":{"notice":"全网已结算但未领取的总量。"},"treasury()":{"notice":"开通费收款地址。"},"usdValueOf(uint256)":{"notice":"给定 BNB 数量折算成 USDT 价值（wei）。"}},"notice":"算力矿池。全部规则在部署时固定，之后没有任何管理函数可以改价格、算力、产出或上限。 产出公式（唯一口径，前端所有数字都从这里推）：     H_u   = freeHash × r_u + activationHash × a_u + Σ n_{u,i} × h_i     H_net = Σ_u H_u     s_u   = H_u / H_net     r(t)  = baseRatePerSecond / 2^(S(t) / halvingInterval)     ṁ_u   = r(t) × s_u     S(t)  = min(∫r dτ, supplyCap) 也就是：   1. 「3 枚/秒」是**全网**的固定产出，不是每 1H 的产出。   2. 个人产出 = 全网每秒产出 × 个人算力占比。   3. 加算力不增加全网总量，只是重新分配份额（零和竞争）。   4. 每累计产出 halvingInterval（100 万枚）全网速率减半一次。 算力来源：   - 注册（免费）：+freeHash（1H），每个地址一次。   - 开通（4 USDT 等值）：+activationHash（4H），每个地址一次，并解锁买矿机。     开通费可用 USDT 支付，也可用等值 BNB 支付（按链上价格源折算）。   - 买矿机（销毁代币）：+对应档位算力，台数上限按**单个钱包**统计。","version":1}},"settings":{"compilationTarget":{"contracts/MiningPool.sol":"MiningPool"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","license":"MIT","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"]},"@openzeppelin/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","license":"MIT","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"]},"@openzeppelin/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","license":"MIT","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998","license":"MIT","urls":["bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c","dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x669464167428061ee0f8618b73b3ee90aff8405683e7ddde8cd77dadaa1afe29","license":"MIT","urls":["bzz-raw://0dda78587a7358b4fdf6b9fca0fde5a5e34930f36d5268a16028627fc0170195","dweb:/ipfs/QmQ1b6cCceDRWNxti9HifsTCzmVP25Haxs1bWugm52vTqH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f","license":"MIT","urls":["bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e","dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098","license":"MIT","urls":["bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0","dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"contracts/MiningPool.sol":{"keccak256":"0xe62a389c6f729e758b319b5ab6d12ea4a956e5576517f0c04779134baebe85eb","license":"MIT","urls":["bzz-raw://3f67b50f472cc9b04e6aeba3e0b70be9ae2f075139b5f5cc12f64e3655ab192e","dweb:/ipfs/QmXSVGiwhPuiAdwdk1R6mTXdyWW3VGMVPXTFSKPMzRkvFY"]},"contracts/MiningToken.sol":{"keccak256":"0xbd9f761ab75e9f58d43dd167e6d8f447fe816e00af7ff74030a897b95c82e3e2","license":"MIT","urls":["bzz-raw://3a019b40dafc272e9e1992a2aa1ac69b39e8e502275efa8cad2266fc1d424d59","dweb:/ipfs/QmS797BF1awciD7QAkLxptDa84Vu6TRGo3dMKLwjUAMBzF"]},"contracts/PriceFeed.sol":{"keccak256":"0x3f8dd3642c1a9c435bb169deeb5312b0e95222c58540c562e6e79ea7c250f0b7","license":"MIT","urls":["bzz-raw://dfe40105b7e942b701cca3e169df4560f9737552fa6e94b56fe13a912be73cad","dweb:/ipfs/QmW2JW6FiB7X2sYgoiErsoigzssjEqtyAoHB6ECoahZ7QH"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_array(t_uint16)8_storage":{"base":"t_uint16","label":"uint16[8]","encoding":"inplace","numberOfBytes":"32"},"t_struct(Tier)1418_storage":{"label":"struct MiningPool.Tier","members":[{"slot":"0","type":"t_uint256","astId":1413,"label":"price","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"1","type":"t_uint256","astId":1415,"label":"hash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"2","type":"t_uint16","astId":1417,"label":"limit","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"}],"encoding":"inplace","numberOfBytes":"96"},"t_struct(Account)1478_storage":{"label":"struct MiningPool.Account","members":[{"slot":"0","type":"t_uint256","astId":1463,"label":"hash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"1","type":"t_uint256","astId":1465,"label":"debt","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"2","type":"t_uint256","astId":1467,"label":"pending","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"3","type":"t_uint256","astId":1469,"label":"claimed","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"4","type":"t_bool","astId":1471,"label":"registered","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"4","type":"t_bool","astId":1473,"label":"activated","offset":1,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"5","type":"t_array(t_uint16)8_storage","astId":1477,"label":"owned","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"}],"encoding":"inplace","numberOfBytes":"192"},"t_array(t_struct(Tier)1418_storage)8_storage":{"base":"t_struct(Tier)1418_storage","label":"struct MiningPool.Tier[8]","encoding":"inplace","numberOfBytes":"768"},"t_mapping(t_address,t_struct(Account)1478_storage)":{"key":"t_address","label":"mapping(address => struct MiningPool.Account)","value":"t_struct(Account)1478_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_array(t_struct(Tier)1418_storage)8_storage","astId":1423,"label":"_tiers","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"24","type":"t_uint256","astId":1426,"label":"totalHash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"25","type":"t_uint256","astId":1429,"label":"emittedTotal","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"26","type":"t_uint256","astId":1432,"label":"totalMinted","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"27","type":"t_uint256","astId":1435,"label":"totalBurned","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"28","type":"t_uint256","astId":1438,"label":"totalBnbReceived","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"29","type":"t_uint256","astId":1441,"label":"registeredCount","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"30","type":"t_uint256","astId":1444,"label":"activatedCount","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"31","type":"t_array(t_uint16)8_storage","astId":1449,"label":"tierSold","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"32","type":"t_uint256","astId":1452,"label":"accRewardPerHash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"33","type":"t_uint256","astId":1455,"label":"totalDebt","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"34","type":"t_uint256","astId":1458,"label":"totalPendingStored","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"35","type":"t_uint256","astId":1461,"label":"lastUpdate","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"36","type":"t_mapping(t_address,t_struct(Account)1478_storage)","astId":1483,"label":"_accounts","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","errors":{"BadPrice()":[{"notice":"价格源返回了非正数，按错价格收费比拒绝服务更糟。"}],"StalePrice()":[{"notice":"价格源太久没更新。"}],"TransferFailed()":[{"notice":"给 treasury 转 BNB 失败。"}],"InsufficientBnb()":[{"notice":"用 BNB 开通但随交易附带的 BNB 不够（含价格源陈旧的情况）。"}]},"events":{"ActivatedWithBnb(address,uint256,uint256)":{"notice":"用 BNB 支付开通费时额外发一条，带上实付 BNB 与折算出的美元价值。"}},"notice":"算力矿池。全部规则在部署时固定，之后没有任何管理函数可以改价格、算力、产出或上限。 产出公式（唯一口径，前端所有数字都从这里推）：     H_u   = freeHash × r_u + activationHash × a_u + Σ n_{u,i} × h_i     H_net = Σ_u H_u     s_u   = H_u / H_net     r(t)  = baseRatePerSecond / 2^(S(t) / halvingInterval)     ṁ_u   = r(t) × s_u     S(t)  = min(∫r dτ, supplyCap) 也就是：   1. 「3 枚/秒」是**全网**的固定产出，不是每 1H 的产出。   2. 个人产出 = 全网每秒产出 × 个人算力占比。   3. 加算力不增加全网总量，只是重新分配份额（零和竞争）。   4. 每累计产出 halvingInterval（100 万枚）全网速率减半一次。 算力来源：   - 注册（免费）：+freeHash（1H），每个地址一次。   - 开通（4 USDT 等值）：+activationHash（4H），每个地址一次，并解锁买矿机。     开通费可用 USDT 支付，也可用等值 BNB 支付（按链上价格源折算）。   - 买矿机（销毁代币）：+对应档位算力，台数上限按**单个钱包**统计。","methods":{"BURN()":{"notice":"销毁地址。买矿机消耗的代币全部打到这里，永不回收。"},"claim()":{"notice":"领取当前地址的全部待领产出。"},"epoch()":{"notice":"当前减半轮次（S(t) / 减半间隔）。"},"activate()":{"notice":"用 USDT 支付开通费，领取 4H 矿机并解锁买矿机。 需要先 approve 本合约 activationFee 的 USDT。每个地址一次。 若尚未注册，会顺带补发注册赠送的 1H—— 否则直接开通的用户会白白丢掉那 1H，属于不必要的坑。"},"allTiers()":{"notice":"一次读回全部档位配置。"},"bnbPrice()":{"notice":"当前 BNB 价格（1 BNB = 多少 USDT），标度 1e18。价格异常时 revert。"},"freeHash()":{"notice":"注册赠送的算力（1H），wei 计价（1H = 1e18）。"},"register()":{"notice":"注册并领取初始矿机。不收费，只需 gas。 每个地址一次，赠送 freeHash（1H）。"},"treasury()":{"notice":"开通费收款地址。"},"supplyCap()":{"notice":"代币总量硬顶，wei。"},"totalDebt()":{"notice":"全网已结算算力对应的累计债务，用于算全网待领取。"},"totalHash()":{"notice":"全网总算力 H_net。"},"TIER_COUNT()":{"notice":"矿机档位数。"},"bnbUsdFeed()":{"notice":"BNB/USD 价格源，用于把开通费折算成 BNB。"},"lastUpdate()":{"notice":"上次结算时间。"},"liveEmitted()":{"notice":"含「尚未结算时间」的实时累计产出。 只读函数一律走这里：直接读 emittedTotal 会拿到上次结算时的旧值， 前端显示的速率与轮次就会滞后。"},"totalBurned()":{"notice":"已销毁的代币总量。"},"totalMinted()":{"notice":"实际铸造出去的代币总量。"},"MAX_FEED_AGE()":{"notice":"价格源最大容忍陈旧时间（秒）。BNB/USD 心跳是 27 秒，1 小时已经非常宽松； 再旧就说明喂价停了，此时宁可拒绝支付也不能按错价格收费。"},"MAX_HALVINGS()":{"notice":"减半次数上限，超过后产出归零，避免移位溢出。"},"emittedTotal()":{"notice":"累计产出 S(t)（含未领取部分），减半按它推进。"},"feedDecimals()":{"notice":"价格源小数位，构造时读一次固化，避免每次开通都多一次外部调用。"},"activationFee()":{"notice":"开通费，wei 计价（USDT 18 位小数）。"},"halvingFactor()":{"notice":"当前全网速率倍数，标度 1e18（第 n 轮为 1/2^n）。"},"hashOf(address)":{"notice":"单地址算力。"},"rateOf(address)":{"notice":"单地址当前每秒产出 ṁ_u = r(t) × s_u。"},"toNextHalving()":{"notice":"距下一次减半还差多少产出（wei）。"},"activatedCount()":{"notice":"已开通地址数（付费那一步）。"},"activationHash()":{"notice":"开通赠送的算力（4H），wei 计价。"},"ownedOf(address)":{"notice":"一次读回某地址的全部持有台数。"},"activateWithBnb()":{"notice":"用 BNB 支付开通费。实付金额按链上 BNB/USD 价格源折算，价值必须 >= activationFee。 多付的 BNB 不退（金额由前端算好，误差极小），但绝不允许少付： 用 BNB 结算时点差和价格波动都是常态，宁可让用户重试也不能让项目方少收。 交易里附带的 BNB 全额转给 treasury。"},"bnbAmountForFee()":{"notice":"支付 activationFee 所需的最小 BNB（wei），向上取整。"},"buyMiner(uint256)":{"notice":"用代币购买矿机。代币全额销毁，算力立即生效。 台数上限是**本钱包**的上限，不是全网上限。"},"halvingInterval()":{"notice":"累计产出每达到该值，全网速率减半，wei。"},"registeredCount()":{"notice":"已注册地址数（免费那一步）。"},"tierSold(uint256)":{"notice":"每档全网已售台数（仅统计用；台数上限是单钱包的）。"},"accRewardPerHash()":{"notice":"每单位算力累计已产出，标度 1e18。"},"pendingOf(address)":{"notice":"某地址当前待领产出，含尚未结算的部分。"},"totalBnbReceived()":{"notice":"累计收到的开通费 BNB（wei）。 开通费可以走 USDT 或 BNB 两条通道，后台要能分别看到实收， 否则「开通人数 × 4 USDT」会把 BNB 那部分算成 0。"},"baseRatePerSecond()":{"notice":"**全网**每秒基础产出（3 枚），wei。不是每 1H 的产出。"},"usdValueOf(uint256)":{"notice":"给定 BNB 数量折算成 USDT 价值（wei）。"},"rateForHash(uint256)":{"notice":"给定算力在当前全网占比下每秒能产出多少（wei）。前端档位表用这个。"},"totalPendingStored()":{"notice":"全网已结算但未领取的总量。"},"currentRatePerSecond()":{"notice":"全网每秒产出 r(t)（wei）。这是公式里的 r(t)，不是每 1H 的产出。"}},"version":1},"devdoc":{"kind":"dev","errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"methods":{},"version":1},"sourceIds":{"contracts/PriceFeed.sol":{"id":15},"contracts/MiningPool.sol":{"id":10},"contracts/MiningToken.sol":{"id":12},"@openzeppelin/contracts/utils/Context.sol":{"id":8},"@openzeppelin/contracts/interfaces/IERC20.sol":{"id":2},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"id":4},"@openzeppelin/contracts/interfaces/IERC165.sol":{"id":1},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":5},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"id":0},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"id":3},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":7},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":9},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":6}},"additionalInput":null,"stdJsonInput":{"sources":{"contracts/PriceFeed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\n/**\n * Chainlink 价格聚合器的最小接口。\n *\n * 只声明用得到的四个函数，避免为了一个价格把整包 chainlink 合约拖进来。\n * BSC 主网的 BNB/USD 喂价（0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE）\n * 就是这套接口，8 位小数，心跳 27 秒。\n */\ninterface AggregatorV3Interface {\n    function decimals() external view returns (uint8);\n\n    function description() external view returns (string memory);\n\n    function latestRoundData()\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}\n"},"contracts/MiningPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {MiningToken} from \"./MiningToken.sol\";\nimport {AggregatorV3Interface} from \"./PriceFeed.sol\";\n\n/**\n * 算力矿池。全部规则在部署时固定，之后没有任何管理函数可以改价格、算力、产出或上限。\n *\n * 产出公式（唯一口径，前端所有数字都从这里推）：\n *\n *     H_u   = freeHash × r_u + activationHash × a_u + Σ n_{u,i} × h_i\n *     H_net = Σ_u H_u\n *     s_u   = H_u / H_net\n *     r(t)  = baseRatePerSecond / 2^(S(t) / halvingInterval)\n *     ṁ_u   = r(t) × s_u\n *     S(t)  = min(∫r dτ, supplyCap)\n *\n * 也就是：\n *   1. 「3 枚/秒」是**全网**的固定产出，不是每 1H 的产出。\n *   2. 个人产出 = 全网每秒产出 × 个人算力占比。\n *   3. 加算力不增加全网总量，只是重新分配份额（零和竞争）。\n *   4. 每累计产出 halvingInterval（100 万枚）全网速率减半一次。\n *\n * 算力来源：\n *   - 注册（免费）：+freeHash（1H），每个地址一次。\n *   - 开通（4 USDT 等值）：+activationHash（4H），每个地址一次，并解锁买矿机。\n *     开通费可用 USDT 支付，也可用等值 BNB 支付（按链上价格源折算）。\n *   - 买矿机（销毁代币）：+对应档位算力，台数上限按**单个钱包**统计。\n */\ncontract MiningPool {\n    using SafeERC20 for IERC20;\n\n    /// 销毁地址。买矿机消耗的代币全部打到这里，永不回收。\n    address public constant BURN = 0x000000000000000000000000000000000000dEaD;\n    /// 矿机档位数。\n    uint256 public constant TIER_COUNT = 8;\n    /// 减半次数上限，超过后产出归零，避免移位溢出。\n    uint256 public constant MAX_HALVINGS = 60;\n    /// 定点标度。\n    uint256 private constant ONE = 1e18;\n    /// 价格源最大容忍陈旧时间（秒）。BNB/USD 心跳是 27 秒，1 小时已经非常宽松；\n    /// 再旧就说明喂价停了，此时宁可拒绝支付也不能按错价格收费。\n    uint256 public constant MAX_FEED_AGE = 3600;\n\n    IERC20 public immutable usdt;\n    MiningToken public immutable token;\n    /// 开通费收款地址。\n    address public immutable treasury;\n    /// 开通费，wei 计价（USDT 18 位小数）。\n    uint256 public immutable activationFee;\n    /// BNB/USD 价格源，用于把开通费折算成 BNB。\n    AggregatorV3Interface public immutable bnbUsdFeed;\n    /// 价格源小数位，构造时读一次固化，避免每次开通都多一次外部调用。\n    uint8 public immutable feedDecimals;\n    /// 注册赠送的算力（1H），wei 计价（1H = 1e18）。\n    uint256 public immutable freeHash;\n    /// 开通赠送的算力（4H），wei 计价。\n    uint256 public immutable activationHash;\n    /// 代币总量硬顶，wei。\n    uint256 public immutable supplyCap;\n    /// **全网**每秒基础产出（3 枚），wei。不是每 1H 的产出。\n    uint256 public immutable baseRatePerSecond;\n    /// 累计产出每达到该值，全网速率减半，wei。\n    uint256 public immutable halvingInterval;\n\n    struct Tier {\n        uint256 price; // 代币，wei\n        uint256 hash;  // 算力，wei（1H = 1e18）\n        uint16 limit;  // 每个钱包可购买台数\n    }\n\n    Tier[TIER_COUNT] private _tiers;\n\n    /// 全网总算力 H_net。\n    uint256 public totalHash;\n    /// 累计产出 S(t)（含未领取部分），减半按它推进。\n    uint256 public emittedTotal;\n    /// 实际铸造出去的代币总量。\n    uint256 public totalMinted;\n    /// 已销毁的代币总量。\n    uint256 public totalBurned;\n    /// 累计收到的开通费 BNB（wei）。\n    /// 开通费可以走 USDT 或 BNB 两条通道，后台要能分别看到实收，\n    /// 否则「开通人数 × 4 USDT」会把 BNB 那部分算成 0。\n    uint256 public totalBnbReceived;\n    /// 已注册地址数（免费那一步）。\n    uint256 public registeredCount;\n    /// 已开通地址数（付费那一步）。\n    uint256 public activatedCount;\n    /// 每档全网已售台数（仅统计用；台数上限是单钱包的）。\n    uint16[TIER_COUNT] public tierSold;\n\n    /// 每单位算力累计已产出，标度 1e18。\n    uint256 public accRewardPerHash;\n    /// 全网已结算算力对应的累计债务，用于算全网待领取。\n    uint256 public totalDebt;\n    /// 全网已结算但未领取的总量。\n    uint256 public totalPendingStored;\n    /// 上次结算时间。\n    uint256 public lastUpdate;\n\n    struct Account {\n        uint256 hash;      // 当前算力 H_u\n        uint256 debt;      // hash * acc / 1e18\n        uint256 pending;   // 已结算未领取\n        uint256 claimed;   // 已领取\n        bool registered;   // 是否已注册（免费赠送 1H）\n        bool activated;    // 是否已付开通费（赠送 4H 并解锁买矿机）\n        uint16[TIER_COUNT] owned; // 本钱包各档持有台数\n    }\n\n    mapping(address => Account) private _accounts;\n\n    event Registered(address indexed user, uint256 freeHash);\n    event Activated(address indexed user, uint256 fee, uint256 activationHash);\n    /// 用 BNB 支付开通费时额外发一条，带上实付 BNB 与折算出的美元价值。\n    event ActivatedWithBnb(address indexed user, uint256 bnbPaid, uint256 usdValue);\n    event MinerBought(address indexed user, uint256 indexed tier, uint256 price, uint256 hash, uint256 burned);\n    event Claimed(address indexed user, uint256 amount, uint256 emittedAtClaim);\n    event Halved(uint256 indexed epoch, uint256 emittedTotal);\n\n    error AlreadyRegistered();\n    error NotRegistered();\n    error NotActivated();\n    error AlreadyActivated();\n    error BadTier();\n    error TierLimitReached();\n    error NothingToClaim();\n    error ZeroAddress();\n    error BadConfig();\n    /// 用 BNB 开通但随交易附带的 BNB 不够（含价格源陈旧的情况）。\n    error InsufficientBnb();\n    /// 价格源返回了非正数，按错价格收费比拒绝服务更糟。\n    error BadPrice();\n    /// 价格源太久没更新。\n    error StalePrice();\n    /// 给 treasury 转 BNB 失败。\n    error TransferFailed();\n\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        address usdt_,\n        address bnbUsdFeed_,\n        address treasury_,\n        uint256 supplyCap_,\n        uint256 activationFee_,\n        uint256 freeHash_,\n        uint256 activationHash_,\n        uint256 baseRatePerSecond_,\n        uint256 halvingInterval_,\n        uint256[TIER_COUNT] memory prices_,\n        uint256[TIER_COUNT] memory hashes_,\n        uint16[TIER_COUNT] memory limits_\n    ) {\n        if (usdt_ == address(0) || bnbUsdFeed_ == address(0) || treasury_ == address(0)) revert ZeroAddress();\n        if (\n            supplyCap_ == 0 || activationFee_ == 0 || baseRatePerSecond_ == 0 ||\n            halvingInterval_ == 0 || freeHash_ == 0 || activationHash_ == 0\n        ) revert BadConfig();\n\n        token = new MiningToken(tokenName, tokenSymbol, supplyCap_, address(this));\n        usdt = IERC20(usdt_);\n        bnbUsdFeed = AggregatorV3Interface(bnbUsdFeed_);\n\n        // 小数位在这里读一次就固化：feed 的小数位不会变，每次开通都读一遍纯属浪费 gas。\n        uint8 dec = AggregatorV3Interface(bnbUsdFeed_).decimals();\n        if (dec > 18) revert BadConfig();\n        feedDecimals = dec;\n\n        treasury = treasury_;\n        supplyCap = supplyCap_;\n        activationFee = activationFee_;\n        freeHash = freeHash_;\n        activationHash = activationHash_;\n        baseRatePerSecond = baseRatePerSecond_;\n        halvingInterval = halvingInterval_;\n\n        for (uint256 i = 0; i < TIER_COUNT; i++) {\n            if (prices_[i] == 0 || hashes_[i] == 0 || limits_[i] == 0) revert BadConfig();\n            _tiers[i] = Tier({price: prices_[i], hash: hashes_[i], limit: limits_[i]});\n        }\n\n        lastUpdate = block.timestamp;\n    }\n\n    // ------------------------------------------------------------ 注册（免费）\n\n    /**\n     * 注册并领取初始矿机。不收费，只需 gas。\n     * 每个地址一次，赠送 freeHash（1H）。\n     */\n    function register() external {\n        Account storage a = _accounts[msg.sender];\n        if (a.registered) revert AlreadyRegistered();\n\n        _updatePool();\n        _settle(msg.sender);\n\n        a.registered = true;\n        a.hash += freeHash;\n        totalHash += freeHash;\n        registeredCount += 1;\n        _rebase(msg.sender);\n\n        emit Registered(msg.sender, freeHash);\n    }\n\n    // ------------------------------------------------------------ 开通（付费）\n\n    /**\n     * 用 USDT 支付开通费，领取 4H 矿机并解锁买矿机。\n     * 需要先 approve 本合约 activationFee 的 USDT。每个地址一次。\n     *\n     * 若尚未注册，会顺带补发注册赠送的 1H——\n     * 否则直接开通的用户会白白丢掉那 1H，属于不必要的坑。\n     */\n    function activate() external {\n        _activate();\n        usdt.safeTransferFrom(msg.sender, treasury, activationFee);\n        emit Activated(msg.sender, activationFee, activationHash);\n    }\n\n    /**\n     * 用 BNB 支付开通费。实付金额按链上 BNB/USD 价格源折算，价值必须 >= activationFee。\n     *\n     * 多付的 BNB 不退（金额由前端算好，误差极小），但绝不允许少付：\n     * 用 BNB 结算时点差和价格波动都是常态，宁可让用户重试也不能让项目方少收。\n     * 交易里附带的 BNB 全额转给 treasury。\n     */\n    function activateWithBnb() external payable {\n        uint256 required = bnbAmountForFee();\n        if (msg.value < required) revert InsufficientBnb();\n\n        _activate();\n\n        // 直接转账而不是 call：treasury 是项目方自己的 EOA，\n        // 用 call 会把重入面打开，而这里没有任何需要 treasury 回调的理由。\n        (bool ok,) = payable(treasury).call{value: msg.value}(\"\");\n        if (!ok) revert TransferFailed();\n\n        totalBnbReceived += msg.value;\n\n        emit Activated(msg.sender, activationFee, activationHash);\n        emit ActivatedWithBnb(msg.sender, msg.value, usdValueOf(msg.value));\n    }\n\n    /// 当前 BNB 价格（1 BNB = 多少 USDT），标度 1e18。价格异常时 revert。\n    function bnbPrice() public view returns (uint256) {\n        (, int256 answer,, uint256 updatedAt,) = bnbUsdFeed.latestRoundData();\n        if (answer <= 0) revert BadPrice();\n        if (updatedAt == 0 || block.timestamp > updatedAt + MAX_FEED_AGE) revert StalePrice();\n\n        uint256 price = uint256(answer);\n        uint8 dec = feedDecimals;\n        if (dec < 18) return price * (10 ** (18 - dec));\n        if (dec > 18) return price / (10 ** (dec - 18));\n        return price;\n    }\n\n    /// 支付 activationFee 所需的最小 BNB（wei），向上取整。\n    function bnbAmountForFee() public view returns (uint256) {\n        uint256 price = bnbPrice();\n        return (activationFee * ONE + price - 1) / price;\n    }\n\n    /// 给定 BNB 数量折算成 USDT 价值（wei）。\n    function usdValueOf(uint256 bnbAmount) public view returns (uint256) {\n        return bnbAmount * bnbPrice() / ONE;\n    }\n\n    /**\n     * 开通的公共部分：发算力、改状态。收费由调用方负责，\n     * 这样 USDT 与 BNB 两条通道的记账逻辑只有一份，不会走偏。\n     */\n    function _activate() internal {\n        Account storage a = _accounts[msg.sender];\n        if (a.activated) revert AlreadyActivated();\n\n        _updatePool();\n        _settle(msg.sender);\n\n        uint256 granted = activationHash;\n        if (!a.registered) {\n            a.registered = true;\n            granted += freeHash;\n            totalHash += freeHash;\n            registeredCount += 1;\n            emit Registered(msg.sender, freeHash);\n        }\n\n        a.activated = true;\n        a.hash += granted;\n        totalHash += activationHash;\n        activatedCount += 1;\n        _rebase(msg.sender);\n    }\n\n    // ------------------------------------------------------------ 买矿机\n\n    /**\n     * 用代币购买矿机。代币全额销毁，算力立即生效。\n     * 台数上限是**本钱包**的上限，不是全网上限。\n     */\n    function buyMiner(uint256 tier) external {\n        Account storage a = _accounts[msg.sender];\n        if (!a.activated) revert NotActivated();\n        if (tier >= TIER_COUNT) revert BadTier();\n        if (a.owned[tier] >= _tiers[tier].limit) revert TierLimitReached();\n\n        _updatePool();\n        _settle(msg.sender);\n\n        Tier memory t = _tiers[tier];\n        a.owned[tier] += 1;\n        a.hash += t.hash;\n        totalHash += t.hash;\n        tierSold[tier] += 1;\n        totalBurned += t.price;\n        _rebase(msg.sender);\n\n        token.transferFrom(msg.sender, BURN, t.price);\n\n        emit MinerBought(msg.sender, tier, t.price, t.hash, t.price);\n    }\n\n    // ------------------------------------------------------------ 领取\n\n    /// 领取当前地址的全部待领产出。\n    function claim() external returns (uint256 amount) {\n        _updatePool();\n        _settle(msg.sender);\n        amount = _accounts[msg.sender].pending;\n        if (amount == 0) revert NothingToClaim();\n        _accounts[msg.sender].pending = 0;\n        totalPendingStored -= amount;\n        _accounts[msg.sender].claimed += amount;\n        totalMinted += amount;\n        token.mint(msg.sender, amount);\n        emit Claimed(msg.sender, amount, emittedTotal);\n    }\n\n    // ------------------------------------------------------------ 内部结算\n\n    /**\n     * 模拟从上次结算到现在新增的累计产出。\n     * 逐段推进，跨过减半边界或总量硬顶时按实际秒数切分，避免用旧速率算整段时间。\n     *\n     * 注意速率是**全网**速率：r = baseRate / 2^epoch，与总算力无关。\n     * 算力只通过占比影响个人分配。\n     */\n    function _simulate(uint256 elapsed) internal view returns (uint256 accInc, uint256 emittedInc) {\n        uint256 hash_ = totalHash;\n        if (hash_ == 0 || elapsed == 0 || emittedTotal >= supplyCap) return (0, 0);\n\n        uint256 emitted = emittedTotal;\n        uint256 remaining = elapsed;\n\n        for (uint256 i = 0; i < MAX_HALVINGS && remaining > 0 && emitted < supplyCap; i++) {\n            uint256 round_ = emitted / halvingInterval;\n            if (round_ >= MAX_HALVINGS) break;\n            uint256 factor = ONE >> round_;\n            uint256 rate = baseRatePerSecond * factor / ONE;\n            if (rate == 0) break;\n\n            uint256 roomToBoundary = (round_ + 1) * halvingInterval - emitted;\n            uint256 roomToCap = supplyCap - emitted;\n            uint256 room = roomToBoundary < roomToCap ? roomToBoundary : roomToCap;\n\n            uint256 maxEmit = rate * remaining;\n            uint256 secs;\n            uint256 chunk;\n            if (maxEmit <= room) {\n                secs = remaining;\n                chunk = maxEmit;\n            } else {\n                secs = (room + rate - 1) / rate;\n                if (secs > remaining) secs = remaining;\n                chunk = rate * secs;\n                if (chunk > room) chunk = room;\n            }\n            if (secs == 0) break;\n\n            // acc 增量 = 全网每秒产出 / 总算力 × 秒数 × 1e18\n            accInc += chunk * ONE / hash_;\n            emittedInc += chunk;\n            emitted += chunk;\n            remaining -= secs;\n        }\n    }\n\n    function _updatePool() internal {\n        uint256 ts = block.timestamp;\n        if (ts <= lastUpdate) return;\n        uint256 elapsed = ts - lastUpdate;\n        lastUpdate = ts;\n\n        uint256 epochBefore = emittedTotal / halvingInterval;\n        (uint256 accInc, uint256 emittedInc) = _simulate(elapsed);\n        if (emittedInc == 0) return;\n\n        accRewardPerHash += accInc;\n        emittedTotal += emittedInc;\n\n        uint256 epochAfter = emittedTotal / halvingInterval;\n        if (epochAfter > epochBefore) emit Halved(epochAfter, emittedTotal);\n    }\n\n    function _settle(address user) internal {\n        Account storage a = _accounts[user];\n        uint256 oldDebt = a.debt;\n        uint256 newDebt = a.hash * accRewardPerHash / ONE;\n        if (newDebt > oldDebt) {\n            uint256 delta = newDebt - oldDebt;\n            a.pending += delta;\n            totalPendingStored += delta;\n        }\n        _rebase(user);\n    }\n\n    /**\n     * 把地址债务对齐到当前算力。算力变动后必须调用，\n     * 否则新增的算力会按「从上线到现在」的累计值追溯产出。\n     */\n    function _rebase(address user) internal {\n        Account storage a = _accounts[user];\n        uint256 oldDebt = a.debt;\n        uint256 newDebt = a.hash * accRewardPerHash / ONE;\n        a.debt = newDebt;\n        totalDebt = totalDebt - oldDebt + newDebt;\n    }\n\n    // ------------------------------------------------------------ 只读\n\n    /**\n     * 含「尚未结算时间」的实时累计产出。\n     * 只读函数一律走这里：直接读 emittedTotal 会拿到上次结算时的旧值，\n     * 前端显示的速率与轮次就会滞后。\n     */\n    function liveEmitted() public view returns (uint256) {\n        uint256 elapsed = block.timestamp > lastUpdate ? block.timestamp - lastUpdate : 0;\n        (, uint256 emittedInc) = _simulate(elapsed);\n        uint256 emitted = emittedTotal + emittedInc;\n        return emitted > supplyCap ? supplyCap : emitted;\n    }\n\n    /// 当前减半轮次（S(t) / 减半间隔）。\n    function epoch() public view returns (uint256) {\n        return liveEmitted() / halvingInterval;\n    }\n\n    /// 当前全网速率倍数，标度 1e18（第 n 轮为 1/2^n）。\n    function halvingFactor() public view returns (uint256) {\n        uint256 e = epoch();\n        return e >= MAX_HALVINGS ? 0 : ONE >> e;\n    }\n\n    /// 距下一次减半还差多少产出（wei）。\n    function toNextHalving() public view returns (uint256) {\n        uint256 emitted = liveEmitted();\n        uint256 next = (emitted / halvingInterval + 1) * halvingInterval;\n        if (next > supplyCap) next = supplyCap;\n        return next > emitted ? next - emitted : 0;\n    }\n\n    /// 全网每秒产出 r(t)（wei）。这是公式里的 r(t)，不是每 1H 的产出。\n    function currentRatePerSecond() public view returns (uint256) {\n        uint256 emitted = liveEmitted();\n        if (emitted >= supplyCap) return 0;\n        uint256 factor = halvingFactor();\n        if (factor == 0) return 0;\n        return baseRatePerSecond * factor / ONE;\n    }\n\n    /// 给定算力在当前全网占比下每秒能产出多少（wei）。前端档位表用这个。\n    function rateForHash(uint256 hash_) public view returns (uint256) {\n        uint256 netRate = currentRatePerSecond();\n        if (netRate == 0 || hash_ == 0 || totalHash == 0) return 0;\n        return netRate * hash_ / totalHash;\n    }\n\n    function tierOf(uint256 tier) external view returns (Tier memory) {\n        if (tier >= TIER_COUNT) revert BadTier();\n        return _tiers[tier];\n    }\n\n    /// 某地址当前待领产出，含尚未结算的部分。\n    function pendingOf(address user) public view returns (uint256) {\n        Account storage a = _accounts[user];\n        uint256 elapsed = block.timestamp > lastUpdate ? block.timestamp - lastUpdate : 0;\n        (uint256 accInc,) = _simulate(elapsed);\n        uint256 acc = accRewardPerHash + accInc;\n        uint256 gross = a.hash * acc / ONE;\n        uint256 accrued = gross > a.debt ? gross - a.debt : 0;\n        return a.pending + accrued;\n    }\n\n    function accountOf(address user) external view returns (Account memory) {\n        return _accounts[user];\n    }\n\n    /// 单地址算力。\n    function hashOf(address user) external view returns (uint256) {\n        return _accounts[user].hash;\n    }\n\n    /// 单地址当前每秒产出 ṁ_u = r(t) × s_u。\n    function rateOf(address user) external view returns (uint256) {\n        return rateForHash(_accounts[user].hash);\n    }\n\n    /// 全网聚合状态，一次 eth_call 取回，避免前端逐字段读。\n    struct Stats {\n        uint256 totalHash;      // H_net\n        uint256 emittedTotal;   // S(t)\n        uint256 totalMinted;\n        uint256 totalBurned;\n        uint256 supplyCap;\n        uint256 epoch;\n        uint256 halvingInterval;\n        uint256 toNextHalving;\n        uint256 ratePerSecond;  // r(t)\n        uint256 registeredCount;\n        uint256 activatedCount;\n        uint256 outstanding;\n        uint256 remaining;\n        uint256 timestamp;\n        uint256 baseRate;       // 基础 r\n        uint256 freeHash;\n        uint256 activationHash;\n    }\n\n    function stats() external view returns (Stats memory s) {\n        uint256 elapsed = block.timestamp > lastUpdate ? block.timestamp - lastUpdate : 0;\n        (uint256 accInc, uint256 emittedInc) = _simulate(elapsed);\n        uint256 emitted = emittedTotal + emittedInc;\n        uint256 acc = accRewardPerHash + accInc;\n\n        s.totalHash = totalHash;\n        s.emittedTotal = emitted;\n        s.totalMinted = totalMinted;\n        s.totalBurned = totalBurned;\n        s.supplyCap = supplyCap;\n        s.epoch = emitted / halvingInterval;\n        s.halvingInterval = halvingInterval;\n        s.toNextHalving = (s.epoch + 1) * halvingInterval > emitted\n            ? (s.epoch + 1) * halvingInterval - emitted\n            : 0;\n        uint256 factor = s.epoch >= MAX_HALVINGS ? 0 : ONE >> s.epoch;\n        s.ratePerSecond = (emitted >= supplyCap || factor == 0) ? 0 : baseRatePerSecond * factor / ONE;\n        s.registeredCount = registeredCount;\n        s.activatedCount = activatedCount;\n        s.outstanding = (totalHash * acc / ONE - totalDebt) + totalPendingStored;\n        s.remaining = emitted >= supplyCap ? 0 : supplyCap - emitted;\n        s.timestamp = block.timestamp;\n        s.baseRate = baseRatePerSecond;\n        s.freeHash = freeHash;\n        s.activationHash = activationHash;\n    }\n\n    /// 一次读回全部档位配置。\n    function allTiers() external view returns (Tier[TIER_COUNT] memory) {\n        return _tiers;\n    }\n\n    /// 一次读回某地址的全部持有台数。\n    function ownedOf(address user) external view returns (uint16[TIER_COUNT] memory) {\n        return _accounts[user].owned;\n    }\n\n    /**\n     * 合约不留任何 BNB：开通费随交易进随交易出。\n     * 裸转账一律拒绝，避免有人误转 BNB 进来后卡在合约里（合约没有任何提币函数，也永远不会有）。\n     */\n    receive() external payable {\n        revert BadConfig();\n    }\n}\n"},"contracts/MiningToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n/**\n * 挖矿代币。总量硬顶，铸造权只给矿池合约，且矿池只能在挖矿产出时铸造。\n * 没有 owner、没有 mint 开关、没有团队份额——部署后任何人（包括部署者）都无法增发。\n */\ncontract MiningToken is ERC20 {\n    /// 总量硬顶（wei）。\n    uint256 public immutable CAP;\n    /// 唯一铸造方，部署时由矿池合约自己创建本代币，因此等于矿池地址。\n    address public immutable pool;\n\n    error NotPool();\n    error CapExceeded();\n\n    constructor(string memory name_, string memory symbol_, uint256 cap_, address pool_) ERC20(name_, symbol_) {\n        require(pool_ != address(0), \"pool=0\");\n        require(cap_ > 0, \"cap=0\");\n        CAP = cap_;\n        pool = pool_;\n    }\n\n    function mint(address to, uint256 amount) external {\n        if (msg.sender != pool) revert NotPool();\n        if (totalSupply() + amount > CAP) revert CapExceeded();\n        _mint(to, amount);\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n    mapping(address account => uint256) private _balances;\n\n    mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * Both values are immutable: they can only be set once during construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /// @inheritdoc IERC20\n    function totalSupply() public view virtual returns (uint256) {\n        return _totalSupply;\n    }\n\n    /// @inheritdoc IERC20\n    function balanceOf(address account) public view virtual returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            _totalSupply += value;\n        } else {\n            uint256 fromBalance = _balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                _balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                _totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                _balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation sets the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the `transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        _allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance < type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-721.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"}},"language":"Solidity","settings":{"viaIR":true,"optimizer":{"runs":200,"enabled":true},"evmVersion":"paris"}},"stdJsonOutput":{"sources":{"contracts/PriceFeed.sol":{"id":15},"contracts/MiningPool.sol":{"id":10},"contracts/MiningToken.sol":{"id":12},"@openzeppelin/contracts/utils/Context.sol":{"id":8},"@openzeppelin/contracts/interfaces/IERC20.sol":{"id":2},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"id":4},"@openzeppelin/contracts/interfaces/IERC165.sol":{"id":1},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":5},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"id":0},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"id":3},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":7},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":9},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":6}},"contracts":{"contracts/MiningPool.sol":{"MiningPool":{"abi":[{"type":"constructor","inputs":[{"name":"tokenName","type":"string","internalType":"string"},{"name":"tokenSymbol","type":"string","internalType":"string"},{"name":"usdt_","type":"address","internalType":"address"},{"name":"bnbUsdFeed_","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"},{"name":"supplyCap_","type":"uint256","internalType":"uint256"},{"name":"activationFee_","type":"uint256","internalType":"uint256"},{"name":"freeHash_","type":"uint256","internalType":"uint256"},{"name":"activationHash_","type":"uint256","internalType":"uint256"},{"name":"baseRatePerSecond_","type":"uint256","internalType":"uint256"},{"name":"halvingInterval_","type":"uint256","internalType":"uint256"},{"name":"prices_","type":"uint256[8]","internalType":"uint256[8]"},{"name":"hashes_","type":"uint256[8]","internalType":"uint256[8]"},{"name":"limits_","type":"uint16[8]","internalType":"uint16[8]"}],"stateMutability":"nonpayable"},{"name":"AlreadyActivated","type":"error","inputs":[]},{"name":"AlreadyRegistered","type":"error","inputs":[]},{"name":"BadConfig","type":"error","inputs":[]},{"name":"BadPrice","type":"error","inputs":[]},{"name":"BadTier","type":"error","inputs":[]},{"name":"InsufficientBnb","type":"error","inputs":[]},{"name":"NotActivated","type":"error","inputs":[]},{"name":"NotRegistered","type":"error","inputs":[]},{"name":"NothingToClaim","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"StalePrice","type":"error","inputs":[]},{"name":"TierLimitReached","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"Activated","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"activationHash","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ActivatedWithBnb","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"bnbPaid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"usdValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Claimed","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"emittedAtClaim","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Halved","type":"event","inputs":[{"name":"epoch","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"emittedTotal","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MinerBought","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tier","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"price","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"hash","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burned","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Registered","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"freeHash","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BURN","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"MAX_FEED_AGE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_HALVINGS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TIER_COUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accRewardPerHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accountOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"hash","type":"uint256","internalType":"uint256"},{"name":"debt","type":"uint256","internalType":"uint256"},{"name":"pending","type":"uint256","internalType":"uint256"},{"name":"claimed","type":"uint256","internalType":"uint256"},{"name":"registered","type":"bool","internalType":"bool"},{"name":"activated","type":"bool","internalType":"bool"},{"name":"owned","type":"uint16[8]","internalType":"uint16[8]"}],"internalType":"struct MiningPool.Account"}],"stateMutability":"view"},{"name":"activate","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"activateWithBnb","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"activatedCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activationFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activationHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allTiers","type":"function","inputs":[],"outputs":[{"name":"","type":"tuple[8]","components":[{"name":"price","type":"uint256","internalType":"uint256"},{"name":"hash","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint16","internalType":"uint16"}],"internalType":"struct MiningPool.Tier[8]"}],"stateMutability":"view"},{"name":"baseRatePerSecond","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bnbAmountForFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bnbPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bnbUsdFeed","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract AggregatorV3Interface"}],"stateMutability":"view"},{"name":"buyMiner","type":"function","inputs":[{"name":"tier","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"claim","type":"function","inputs":[],"outputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"currentRatePerSecond","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"emittedTotal","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"epoch","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"feedDecimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"freeHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"halvingFactor","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"halvingInterval","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"hashOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lastUpdate","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"liveEmitted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ownedOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint16[8]","internalType":"uint16[8]"}],"stateMutability":"view"},{"name":"pendingOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rateForHash","type":"function","inputs":[{"name":"hash_","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rateOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"register","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"registeredCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"stats","type":"function","inputs":[],"outputs":[{"name":"s","type":"tuple","components":[{"name":"totalHash","type":"uint256","internalType":"uint256"},{"name":"emittedTotal","type":"uint256","internalType":"uint256"},{"name":"totalMinted","type":"uint256","internalType":"uint256"},{"name":"totalBurned","type":"uint256","internalType":"uint256"},{"name":"supplyCap","type":"uint256","internalType":"uint256"},{"name":"epoch","type":"uint256","internalType":"uint256"},{"name":"halvingInterval","type":"uint256","internalType":"uint256"},{"name":"toNextHalving","type":"uint256","internalType":"uint256"},{"name":"ratePerSecond","type":"uint256","internalType":"uint256"},{"name":"registeredCount","type":"uint256","internalType":"uint256"},{"name":"activatedCount","type":"uint256","internalType":"uint256"},{"name":"outstanding","type":"uint256","internalType":"uint256"},{"name":"remaining","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"baseRate","type":"uint256","internalType":"uint256"},{"name":"freeHash","type":"uint256","internalType":"uint256"},{"name":"activationHash","type":"uint256","internalType":"uint256"}],"internalType":"struct MiningPool.Stats"}],"stateMutability":"view"},{"name":"supplyCap","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tierOf","type":"function","inputs":[{"name":"tier","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"price","type":"uint256","internalType":"uint256"},{"name":"hash","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint16","internalType":"uint16"}],"internalType":"struct MiningPool.Tier"}],"stateMutability":"view"},{"name":"tierSold","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"toNextHalving","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"token","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract MiningToken"}],"stateMutability":"view"},{"name":"totalBnbReceived","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalBurned","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalDebt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalHash","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalPendingStored","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"usdValueOf","type":"function","inputs":[{"name":"bnbAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"usdt","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"usdt_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"bnbUsdFeed_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"treasury_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"supplyCap_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activationFee_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"freeHash_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activationHash_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseRatePerSecond_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"halvingInterval_\",\"type\":\"uint256\"},{\"internalType\":\"uint256[8]\",\"name\":\"prices_\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint256[8]\",\"name\":\"hashes_\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint16[8]\",\"name\":\"limits_\",\"type\":\"uint16[8]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyActivated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadTier\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBnb\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotActivated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToClaim\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StalePrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TierLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"activationHash\",\"type\":\"uint256\"}],\"name\":\"Activated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bnbPaid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"usdValue\",\"type\":\"uint256\"}],\"name\":\"ActivatedWithBnb\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"emittedAtClaim\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"emittedTotal\",\"type\":\"uint256\"}],\"name\":\"Halved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tier\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"hash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"burned\",\"type\":\"uint256\"}],\"name\":\"MinerBought\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"freeHash\",\"type\":\"uint256\"}],\"name\":\"Registered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_FEED_AGE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_HALVINGS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIER_COUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accRewardPerHash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"accountOf\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"hash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pending\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"activated\",\"type\":\"bool\"},{\"internalType\":\"uint16[8]\",\"name\":\"owned\",\"type\":\"uint16[8]\"}],\"internalType\":\"struct MiningPool.Account\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateWithBnb\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activatedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activationFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activationHash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allTiers\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"hash\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"limit\",\"type\":\"uint16\"}],\"internalType\":\"struct MiningPool.Tier[8]\",\"name\":\"\",\"type\":\"tuple[8]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseRatePerSecond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bnbAmountForFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bnbPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bnbUsdFeed\",\"outputs\":[{\"internalType\":\"contract AggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tier\",\"type\":\"uint256\"}],\"name\":\"buyMiner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRatePerSecond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emittedTotal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"freeHash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"halvingFactor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"halvingInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"hashOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liveEmitted\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"ownedOf\",\"outputs\":[{\"internalType\":\"uint16[8]\",\"name\":\"\",\"type\":\"uint16[8]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"pendingOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"hash_\",\"type\":\"uint256\"}],\"name\":\"rateForHash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"rateOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registeredCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stats\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"totalHash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"emittedTotal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalMinted\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBurned\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyCap\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"halvingInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"toNextHalving\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratePerSecond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"registeredCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activatedCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"outstanding\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"freeHash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activationHash\",\"type\":\"uint256\"}],\"internalType\":\"struct MiningPool.Stats\",\"name\":\"s\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supplyCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tier\",\"type\":\"uint256\"}],\"name\":\"tierOf\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"hash\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"limit\",\"type\":\"uint16\"}],\"internalType\":\"struct MiningPool.Tier\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tierSold\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"toNextHalving\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract MiningToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBnbReceived\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBurned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalHash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalMinted\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalPendingStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"treasury\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bnbAmount\",\"type\":\"uint256\"}],\"name\":\"usdValueOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdt\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"BadPrice()\":[{\"notice\":\"价格源返回了非正数，按错价格收费比拒绝服务更糟。\"}],\"InsufficientBnb()\":[{\"notice\":\"用 BNB 开通但随交易附带的 BNB 不够（含价格源陈旧的情况）。\"}],\"StalePrice()\":[{\"notice\":\"价格源太久没更新。\"}],\"TransferFailed()\":[{\"notice\":\"给 treasury 转 BNB 失败。\"}]},\"events\":{\"ActivatedWithBnb(address,uint256,uint256)\":{\"notice\":\"用 BNB 支付开通费时额外发一条，带上实付 BNB 与折算出的美元价值。\"}},\"kind\":\"user\",\"methods\":{\"BURN()\":{\"notice\":\"销毁地址。买矿机消耗的代币全部打到这里，永不回收。\"},\"MAX_FEED_AGE()\":{\"notice\":\"价格源最大容忍陈旧时间（秒）。BNB/USD 心跳是 27 秒，1 小时已经非常宽松； 再旧就说明喂价停了，此时宁可拒绝支付也不能按错价格收费。\"},\"MAX_HALVINGS()\":{\"notice\":\"减半次数上限，超过后产出归零，避免移位溢出。\"},\"TIER_COUNT()\":{\"notice\":\"矿机档位数。\"},\"accRewardPerHash()\":{\"notice\":\"每单位算力累计已产出，标度 1e18。\"},\"activate()\":{\"notice\":\"用 USDT 支付开通费，领取 4H 矿机并解锁买矿机。 需要先 approve 本合约 activationFee 的 USDT。每个地址一次。 若尚未注册，会顺带补发注册赠送的 1H—— 否则直接开通的用户会白白丢掉那 1H，属于不必要的坑。\"},\"activateWithBnb()\":{\"notice\":\"用 BNB 支付开通费。实付金额按链上 BNB/USD 价格源折算，价值必须 >= activationFee。 多付的 BNB 不退（金额由前端算好，误差极小），但绝不允许少付： 用 BNB 结算时点差和价格波动都是常态，宁可让用户重试也不能让项目方少收。 交易里附带的 BNB 全额转给 treasury。\"},\"activatedCount()\":{\"notice\":\"已开通地址数（付费那一步）。\"},\"activationFee()\":{\"notice\":\"开通费，wei 计价（USDT 18 位小数）。\"},\"activationHash()\":{\"notice\":\"开通赠送的算力（4H），wei 计价。\"},\"allTiers()\":{\"notice\":\"一次读回全部档位配置。\"},\"baseRatePerSecond()\":{\"notice\":\"**全网**每秒基础产出（3 枚），wei。不是每 1H 的产出。\"},\"bnbAmountForFee()\":{\"notice\":\"支付 activationFee 所需的最小 BNB（wei），向上取整。\"},\"bnbPrice()\":{\"notice\":\"当前 BNB 价格（1 BNB = 多少 USDT），标度 1e18。价格异常时 revert。\"},\"bnbUsdFeed()\":{\"notice\":\"BNB/USD 价格源，用于把开通费折算成 BNB。\"},\"buyMiner(uint256)\":{\"notice\":\"用代币购买矿机。代币全额销毁，算力立即生效。 台数上限是**本钱包**的上限，不是全网上限。\"},\"claim()\":{\"notice\":\"领取当前地址的全部待领产出。\"},\"currentRatePerSecond()\":{\"notice\":\"全网每秒产出 r(t)（wei）。这是公式里的 r(t)，不是每 1H 的产出。\"},\"emittedTotal()\":{\"notice\":\"累计产出 S(t)（含未领取部分），减半按它推进。\"},\"epoch()\":{\"notice\":\"当前减半轮次（S(t) / 减半间隔）。\"},\"feedDecimals()\":{\"notice\":\"价格源小数位，构造时读一次固化，避免每次开通都多一次外部调用。\"},\"freeHash()\":{\"notice\":\"注册赠送的算力（1H），wei 计价（1H = 1e18）。\"},\"halvingFactor()\":{\"notice\":\"当前全网速率倍数，标度 1e18（第 n 轮为 1/2^n）。\"},\"halvingInterval()\":{\"notice\":\"累计产出每达到该值，全网速率减半，wei。\"},\"hashOf(address)\":{\"notice\":\"单地址算力。\"},\"lastUpdate()\":{\"notice\":\"上次结算时间。\"},\"liveEmitted()\":{\"notice\":\"含「尚未结算时间」的实时累计产出。 只读函数一律走这里：直接读 emittedTotal 会拿到上次结算时的旧值， 前端显示的速率与轮次就会滞后。\"},\"ownedOf(address)\":{\"notice\":\"一次读回某地址的全部持有台数。\"},\"pendingOf(address)\":{\"notice\":\"某地址当前待领产出，含尚未结算的部分。\"},\"rateForHash(uint256)\":{\"notice\":\"给定算力在当前全网占比下每秒能产出多少（wei）。前端档位表用这个。\"},\"rateOf(address)\":{\"notice\":\"单地址当前每秒产出 ṁ_u = r(t) × s_u。\"},\"register()\":{\"notice\":\"注册并领取初始矿机。不收费，只需 gas。 每个地址一次，赠送 freeHash（1H）。\"},\"registeredCount()\":{\"notice\":\"已注册地址数（免费那一步）。\"},\"supplyCap()\":{\"notice\":\"代币总量硬顶，wei。\"},\"tierSold(uint256)\":{\"notice\":\"每档全网已售台数（仅统计用；台数上限是单钱包的）。\"},\"toNextHalving()\":{\"notice\":\"距下一次减半还差多少产出（wei）。\"},\"totalBnbReceived()\":{\"notice\":\"累计收到的开通费 BNB（wei）。 开通费可以走 USDT 或 BNB 两条通道，后台要能分别看到实收， 否则「开通人数 × 4 USDT」会把 BNB 那部分算成 0。\"},\"totalBurned()\":{\"notice\":\"已销毁的代币总量。\"},\"totalDebt()\":{\"notice\":\"全网已结算算力对应的累计债务，用于算全网待领取。\"},\"totalHash()\":{\"notice\":\"全网总算力 H_net。\"},\"totalMinted()\":{\"notice\":\"实际铸造出去的代币总量。\"},\"totalPendingStored()\":{\"notice\":\"全网已结算但未领取的总量。\"},\"treasury()\":{\"notice\":\"开通费收款地址。\"},\"usdValueOf(uint256)\":{\"notice\":\"给定 BNB 数量折算成 USDT 价值（wei）。\"}},\"notice\":\"算力矿池。全部规则在部署时固定，之后没有任何管理函数可以改价格、算力、产出或上限。 产出公式（唯一口径，前端所有数字都从这里推）：     H_u   = freeHash × r_u + activationHash × a_u + Σ n_{u,i} × h_i     H_net = Σ_u H_u     s_u   = H_u / H_net     r(t)  = baseRatePerSecond / 2^(S(t) / halvingInterval)     ṁ_u   = r(t) × s_u     S(t)  = min(∫r dτ, supplyCap) 也就是：   1. 「3 枚/秒」是**全网**的固定产出，不是每 1H 的产出。   2. 个人产出 = 全网每秒产出 × 个人算力占比。   3. 加算力不增加全网总量，只是重新分配份额（零和竞争）。   4. 每累计产出 halvingInterval（100 万枚）全网速率减半一次。 算力来源：   - 注册（免费）：+freeHash（1H），每个地址一次。   - 开通（4 USDT 等值）：+activationHash（4H），每个地址一次，并解锁买矿机。     开通费可用 USDT 支付，也可用等值 BNB 支付（按链上价格源折算）。   - 买矿机（销毁代币）：+对应档位算力，台数上限按**单个钱包**统计。\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MiningPool.sol\":\"MiningPool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c\",\"dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL\"]},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x669464167428061ee0f8618b73b3ee90aff8405683e7ddde8cd77dadaa1afe29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0dda78587a7358b4fdf6b9fca0fde5a5e34930f36d5268a16028627fc0170195\",\"dweb:/ipfs/QmQ1b6cCceDRWNxti9HifsTCzmVP25Haxs1bWugm52vTqH\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e\",\"dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR\"]},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0\",\"dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"contracts/MiningPool.sol\":{\"keccak256\":\"0xe62a389c6f729e758b319b5ab6d12ea4a956e5576517f0c04779134baebe85eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f67b50f472cc9b04e6aeba3e0b70be9ae2f075139b5f5cc12f64e3655ab192e\",\"dweb:/ipfs/QmXSVGiwhPuiAdwdk1R6mTXdyWW3VGMVPXTFSKPMzRkvFY\"]},\"contracts/MiningToken.sol\":{\"keccak256\":\"0xbd9f761ab75e9f58d43dd167e6d8f447fe816e00af7ff74030a897b95c82e3e2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3a019b40dafc272e9e1992a2aa1ac69b39e8e502275efa8cad2266fc1d424d59\",\"dweb:/ipfs/QmS797BF1awciD7QAkLxptDa84Vu6TRGo3dMKLwjUAMBzF\"]},\"contracts/PriceFeed.sol\":{\"keccak256\":\"0x3f8dd3642c1a9c435bb169deeb5312b0e95222c58540c562e6e79ea7c250f0b7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dfe40105b7e942b701cca3e169df4560f9737552fa6e94b56fe13a912be73cad\",\"dweb:/ipfs/QmW2JW6FiB7X2sYgoiErsoigzssjEqtyAoHB6ECoahZ7QH\"]}},\"version\":1}","userdoc":{"kind":"user","errors":{"BadPrice()":[{"notice":"价格源返回了非正数，按错价格收费比拒绝服务更糟。"}],"StalePrice()":[{"notice":"价格源太久没更新。"}],"TransferFailed()":[{"notice":"给 treasury 转 BNB 失败。"}],"InsufficientBnb()":[{"notice":"用 BNB 开通但随交易附带的 BNB 不够（含价格源陈旧的情况）。"}]},"events":{"ActivatedWithBnb(address,uint256,uint256)":{"notice":"用 BNB 支付开通费时额外发一条，带上实付 BNB 与折算出的美元价值。"}},"notice":"算力矿池。全部规则在部署时固定，之后没有任何管理函数可以改价格、算力、产出或上限。 产出公式（唯一口径，前端所有数字都从这里推）：     H_u   = freeHash × r_u + activationHash × a_u + Σ n_{u,i} × h_i     H_net = Σ_u H_u     s_u   = H_u / H_net     r(t)  = baseRatePerSecond / 2^(S(t) / halvingInterval)     ṁ_u   = r(t) × s_u     S(t)  = min(∫r dτ, supplyCap) 也就是：   1. 「3 枚/秒」是**全网**的固定产出，不是每 1H 的产出。   2. 个人产出 = 全网每秒产出 × 个人算力占比。   3. 加算力不增加全网总量，只是重新分配份额（零和竞争）。   4. 每累计产出 halvingInterval（100 万枚）全网速率减半一次。 算力来源：   - 注册（免费）：+freeHash（1H），每个地址一次。   - 开通（4 USDT 等值）：+activationHash（4H），每个地址一次，并解锁买矿机。     开通费可用 USDT 支付，也可用等值 BNB 支付（按链上价格源折算）。   - 买矿机（销毁代币）：+对应档位算力，台数上限按**单个钱包**统计。","methods":{"BURN()":{"notice":"销毁地址。买矿机消耗的代币全部打到这里，永不回收。"},"claim()":{"notice":"领取当前地址的全部待领产出。"},"epoch()":{"notice":"当前减半轮次（S(t) / 减半间隔）。"},"activate()":{"notice":"用 USDT 支付开通费，领取 4H 矿机并解锁买矿机。 需要先 approve 本合约 activationFee 的 USDT。每个地址一次。 若尚未注册，会顺带补发注册赠送的 1H—— 否则直接开通的用户会白白丢掉那 1H，属于不必要的坑。"},"allTiers()":{"notice":"一次读回全部档位配置。"},"bnbPrice()":{"notice":"当前 BNB 价格（1 BNB = 多少 USDT），标度 1e18。价格异常时 revert。"},"freeHash()":{"notice":"注册赠送的算力（1H），wei 计价（1H = 1e18）。"},"register()":{"notice":"注册并领取初始矿机。不收费，只需 gas。 每个地址一次，赠送 freeHash（1H）。"},"treasury()":{"notice":"开通费收款地址。"},"supplyCap()":{"notice":"代币总量硬顶，wei。"},"totalDebt()":{"notice":"全网已结算算力对应的累计债务，用于算全网待领取。"},"totalHash()":{"notice":"全网总算力 H_net。"},"TIER_COUNT()":{"notice":"矿机档位数。"},"bnbUsdFeed()":{"notice":"BNB/USD 价格源，用于把开通费折算成 BNB。"},"lastUpdate()":{"notice":"上次结算时间。"},"liveEmitted()":{"notice":"含「尚未结算时间」的实时累计产出。 只读函数一律走这里：直接读 emittedTotal 会拿到上次结算时的旧值， 前端显示的速率与轮次就会滞后。"},"totalBurned()":{"notice":"已销毁的代币总量。"},"totalMinted()":{"notice":"实际铸造出去的代币总量。"},"MAX_FEED_AGE()":{"notice":"价格源最大容忍陈旧时间（秒）。BNB/USD 心跳是 27 秒，1 小时已经非常宽松； 再旧就说明喂价停了，此时宁可拒绝支付也不能按错价格收费。"},"MAX_HALVINGS()":{"notice":"减半次数上限，超过后产出归零，避免移位溢出。"},"emittedTotal()":{"notice":"累计产出 S(t)（含未领取部分），减半按它推进。"},"feedDecimals()":{"notice":"价格源小数位，构造时读一次固化，避免每次开通都多一次外部调用。"},"activationFee()":{"notice":"开通费，wei 计价（USDT 18 位小数）。"},"halvingFactor()":{"notice":"当前全网速率倍数，标度 1e18（第 n 轮为 1/2^n）。"},"hashOf(address)":{"notice":"单地址算力。"},"rateOf(address)":{"notice":"单地址当前每秒产出 ṁ_u = r(t) × s_u。"},"toNextHalving()":{"notice":"距下一次减半还差多少产出（wei）。"},"activatedCount()":{"notice":"已开通地址数（付费那一步）。"},"activationHash()":{"notice":"开通赠送的算力（4H），wei 计价。"},"ownedOf(address)":{"notice":"一次读回某地址的全部持有台数。"},"activateWithBnb()":{"notice":"用 BNB 支付开通费。实付金额按链上 BNB/USD 价格源折算，价值必须 >= activationFee。 多付的 BNB 不退（金额由前端算好，误差极小），但绝不允许少付： 用 BNB 结算时点差和价格波动都是常态，宁可让用户重试也不能让项目方少收。 交易里附带的 BNB 全额转给 treasury。"},"bnbAmountForFee()":{"notice":"支付 activationFee 所需的最小 BNB（wei），向上取整。"},"buyMiner(uint256)":{"notice":"用代币购买矿机。代币全额销毁，算力立即生效。 台数上限是**本钱包**的上限，不是全网上限。"},"halvingInterval()":{"notice":"累计产出每达到该值，全网速率减半，wei。"},"registeredCount()":{"notice":"已注册地址数（免费那一步）。"},"tierSold(uint256)":{"notice":"每档全网已售台数（仅统计用；台数上限是单钱包的）。"},"accRewardPerHash()":{"notice":"每单位算力累计已产出，标度 1e18。"},"pendingOf(address)":{"notice":"某地址当前待领产出，含尚未结算的部分。"},"totalBnbReceived()":{"notice":"累计收到的开通费 BNB（wei）。 开通费可以走 USDT 或 BNB 两条通道，后台要能分别看到实收， 否则「开通人数 × 4 USDT」会把 BNB 那部分算成 0。"},"baseRatePerSecond()":{"notice":"**全网**每秒基础产出（3 枚），wei。不是每 1H 的产出。"},"usdValueOf(uint256)":{"notice":"给定 BNB 数量折算成 USDT 价值（wei）。"},"rateForHash(uint256)":{"notice":"给定算力在当前全网占比下每秒能产出多少（wei）。前端档位表用这个。"},"totalPendingStored()":{"notice":"全网已结算但未领取的总量。"},"currentRatePerSecond()":{"notice":"全网每秒产出 r(t)（wei）。这是公式里的 r(t)，不是每 1H 的产出。"}},"version":1},"devdoc":{"kind":"dev","errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"methods":{},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_array(t_uint16)8_storage":{"base":"t_uint16","label":"uint16[8]","encoding":"inplace","numberOfBytes":"32"},"t_struct(Tier)1418_storage":{"label":"struct MiningPool.Tier","members":[{"slot":"0","type":"t_uint256","astId":1413,"label":"price","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"1","type":"t_uint256","astId":1415,"label":"hash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"2","type":"t_uint16","astId":1417,"label":"limit","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"}],"encoding":"inplace","numberOfBytes":"96"},"t_struct(Account)1478_storage":{"label":"struct MiningPool.Account","members":[{"slot":"0","type":"t_uint256","astId":1463,"label":"hash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"1","type":"t_uint256","astId":1465,"label":"debt","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"2","type":"t_uint256","astId":1467,"label":"pending","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"3","type":"t_uint256","astId":1469,"label":"claimed","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"4","type":"t_bool","astId":1471,"label":"registered","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"4","type":"t_bool","astId":1473,"label":"activated","offset":1,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"5","type":"t_array(t_uint16)8_storage","astId":1477,"label":"owned","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"}],"encoding":"inplace","numberOfBytes":"192"},"t_array(t_struct(Tier)1418_storage)8_storage":{"base":"t_struct(Tier)1418_storage","label":"struct MiningPool.Tier[8]","encoding":"inplace","numberOfBytes":"768"},"t_mapping(t_address,t_struct(Account)1478_storage)":{"key":"t_address","label":"mapping(address => struct MiningPool.Account)","value":"t_struct(Account)1478_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_array(t_struct(Tier)1418_storage)8_storage","astId":1423,"label":"_tiers","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"24","type":"t_uint256","astId":1426,"label":"totalHash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"25","type":"t_uint256","astId":1429,"label":"emittedTotal","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"26","type":"t_uint256","astId":1432,"label":"totalMinted","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"27","type":"t_uint256","astId":1435,"label":"totalBurned","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"28","type":"t_uint256","astId":1438,"label":"totalBnbReceived","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"29","type":"t_uint256","astId":1441,"label":"registeredCount","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"30","type":"t_uint256","astId":1444,"label":"activatedCount","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"31","type":"t_array(t_uint16)8_storage","astId":1449,"label":"tierSold","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"32","type":"t_uint256","astId":1452,"label":"accRewardPerHash","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"33","type":"t_uint256","astId":1455,"label":"totalDebt","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"34","type":"t_uint256","astId":1458,"label":"totalPendingStored","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"35","type":"t_uint256","astId":1461,"label":"lastUpdate","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"},{"slot":"36","type":"t_mapping(t_address,t_struct(Account)1478_storage)","astId":1483,"label":"_accounts","offset":0,"contract":"contracts/MiningPool.sol:MiningPool"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"610200604052346200052857620037e680380380916200002282610200620005df565b6102003961046081126200052857610200516001600160401b038111620005285762000058908261020001906102000162000628565b610220516001600160401b038111620005285762000080908361020001906102000162000628565b6200008d61024062000683565b916200009b61026062000683565b91620000a961028062000683565b6102a0516101e0526102c0516102e0516103005161032051610340519399909893979094919390620000e2610200870161036062000698565b96620000f5610200880161046062000698565b98610200880161057f12156200052857604051976200011489620005c2565b8890610660906102000181116200052857610560915b818310620005a5575050506001600160a01b03841615801562000593575b801562000581575b6200056f576101e05115801562000566575b80156200055d575b801562000554575b80156200054b575b801562000542575b620004ae5760405191610cd691828401916001600160401b038311858410176200049857620001c6620001d592869562002b108739608085526080850190620006e4565b908382036020850152620006e4565b906101e051604082015260603091015203906000f0908115620005365760a0919091526001600160a01b039182166080521661010081905260405163313ce56760e01b815290602090829060049082905afa9081156200053657600091620004ee575b50601260ff821611620004ae576101205260c052610180976101e051895260e05261014052610160526101a09485526101c093845260005b60088110620003f6575050505042602355604051916123dc93846200073485396080518481816114fc01526117b9015260a0518481816102b1015281816110eb0152611352015260c051848181610a1a015281816111e6015261176b015260e051848181610a9601528181610eb0015281816117910152611dd601526101005184818161040d0152611ad30152610120518481816109910152611b2a01526101405184818161072f01528181610d50015281816116660152611eef01526101605184818161075601528181610ab901528181611453015281816118080152611e5701525183818161055b015281816106860152818161083c01528181610bf401528181610d1501528181611a5601528181611d270152818161219101526123780152518281816103d4015281816107080152818161086c01528181611d69015261216c015251818181610584015281816105b1015281816105e80152818161064201528181610bb401528181610cd801528181610f0901528181611fbc015261214a0152f35b6200040281846200070b565b51158015620004d9575b8015620004c0575b620004ae576200042581846200070b565b51906200043381866200070b565b5161ffff6200044383866200070b565b51604051949116916060850191906001600160401b038311868410176200049857836040600197600295825284815283602082015201526003850291825585820155019061ffff198254161790550162000270565b634e487b7160e01b600052604160045260246000fd5b6040516301f30c8760e21b8152600490fd5b5061ffff620004d082846200070b565b51161562000414565b50620004e681856200070b565b51156200040c565b90506020813d6020116200052d575b816200050c60209383620005df565b8101031262000528575160ff8116810362000528573862000238565b600080fd5b3d9150620004fd565b6040513d6000823e3d90fd5b50861562000182565b5085156200017a565b508a1562000172565b508b156200016a565b508c1562000162565b60405163d92e233d60e01b8152600490fd5b506001600160a01b0385161562000150565b506001600160a01b0383161562000148565b825161ffff8116810362000528578152602092830192016200012a565b61010081019081106001600160401b038211176200049857604052565b601f909101601f19168101906001600160401b038211908210176200049857604052565b60005b838110620006175750506000910152565b818101518382015260200162000606565b81601f82011215620005285780516001600160401b0381116200049857604051926200065f601f8301601f191660200185620005df565b81845260208284010111620005285762000680916020808501910162000603565b90565b51906001600160a01b03821682036200052857565b9080601f83011215620005285760405191620006b483620005c2565b829061010081019283116200052857905b828210620006d35750505090565b8151815260209182019101620006c5565b90602091620006ff8151809281855285808601910162000603565b601f01601f1916010190565b9060088110156200071d5760051b0190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561002d575b50361561001b57600080fd5b6040516301f30c8760e21b8152600490fd5b60003560e01c90816306f9e52c1461188a575080630f15f4c01461173457806316c2d30f146116fc5780631aa3a0081461161c578063205e0c1114611549578063210ff9bb1461152b5780632f48ab7d146114e65780632f663586146114c95780633590bafe146114ae57806336331c8f1461149257806336f1e6c0146114765780633ddce1071461143b5780634a5628c51461141d5780634e71d92d146112c757806353f96df21461126e578063576dde12146112535780635d0072811461121557806361d027b3146111d057806362de3bd114610fa95780636875227414610f49578063696453b814610f2c5780636a47aa0614610ef15780636ce41f6214610ed357806377d630ae14610e985780638086b8ba14610d735780638b5cdd2914610d385780638f770ad014610cfd578063900cf0cf14610cb85780639cc85c9514610c9a578063a2309ff814610c7c578063a2b1b80e14610c5e578063a878b14314610c43578063b002e11f14610b99578063c046371114610b7b578063c08b8aa1146109f0578063c0a2526c146109d3578063c1f5138a146109b5578063c23953d014610977578063cbf0980214610939578063d7b2afb5146108fe578063d80528ae1461045a578063d89135cd1461043c578063d8ac81af146103f7578063d90e0264146103bc578063e6674a9a146103a1578063f44136a1146102e0578063fc0c546a1461029b578063fc7b9c181461027d5763fe128e1314610255573861000f565b34610278576000366003190112610278576020610270611dc3565b604051908152f35b600080fd5b34610278576000366003190112610278576020602154604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b03811690819003610278576000526024602052602061027060406000206023548042116000146103875761035561034e610346610341670de0b6b3a76400009442611a20565b612126565b508654611951565b835461191e565b0460018201549081811160001461037b5760029161037291611a20565b915b0154611951565b50506002600091610374565b50670de0b6b3a764000061035561034e6103466000612126565b34610278576000366003190112610278576020610270611d9c565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601b54604051908152f35b34610278576000366003190112610278576040516102209081810181811067ffffffffffffffff8211176108e8576040526000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a082015260006101c082015260006101e082015260006102008201526023548042116000146108d75761053c6105286103416105339342611a20565b601993919354611951565b91602054611951565b60185490818452826020850152601a546040850152601b5460608501527f000000000000000000000000000000000000000000000000000000000000000060808501526105a97f000000000000000000000000000000000000000000000000000000000000000084611931565b8060a08601527f000000000000000000000000000000000000000000000000000000000000000060c08601526001810181116108a75761060e849160017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b11156108bd5760a08401516001810181116108a757670de0b6b3a76400006106d76106ea9361066d876106686106e19660017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b611a20565b60e089015260a0880151603c811061089e57506000955b7f000000000000000000000000000000000000000000000000000000000000000088109687158098610896575b15610865575060005b6101008a0152601d546101208a0152601e546101408a015261191e565b0460215490611a20565b60225490611951565b61016084015215610836575060005b610180820152426101a08201527f00000000000000000000000000000000000000000000000000000000000000006101c08201527f00000000000000000000000000000000000000000000000000000000000000006101e08201527f000000000000000000000000000000000000000000000000000000000000000061020082015261020060405191805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c084015260e081015160e08401526101008101516101008401526101208101516101208401526101408101516101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401520151610200820152f35b610860907f0000000000000000000000000000000000000000000000000000000000000000611a20565b6106f9565b61089085917f000000000000000000000000000000000000000000000000000000000000000061191e565b046106ba565b5080156106b1565b83901c95610684565b634e487b7160e01b600052601160045260246000fd5b6106e1670de0b6b3a76400006106d76106ea93600061066d565b5061053361053c6105286000612126565b634e487b7160e01b600052604160045260246000fd5b346102785760203660031901126102785760043560088110156102785761ffff6109296020926118d1565b9190546040519260031b1c168152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020610270604060002054611cd2565b3461027857600036600319011261027857602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610278576000366003190112610278576020601c54604051908152f35b3461027857600036600319011261027857602060405161dead8152f35b600036600319011261027857610a04611dc3565b3410610b6957610a12611e25565b6000808080347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af13d15610b64573d67ffffffffffffffff81116108e85760405190610a72601f8201601f1916602001836119b3565b8152600060203d92013e5b15610b5257610a8e34601c54611951565b601c556040517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2670de0b6b3a7640000610b1d610b17611abd565b3461191e565b046040519034825260208201527f92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e760403392a2005b6040516312171d8360e31b8152600490fd5b610a7d565b6040516305110f0160e41b8152600490fd5b34610278576000366003190112610278576020602354604051908152f35b3461027857600036600319011261027857610bb2611a2d565b7f0000000000000000000000000000000000000000000000000000000000000000610bdd8183611931565b90600182018092116108a757610bf29161191e565b7f0000000000000000000000000000000000000000000000000000000000000000808211610c3b575b5081811115610c305760209161027091611a20565b505060206000610270565b905082610c1b565b34610278576000366003190112610278576020610270611d1d565b34610278576020366003190112610278576020610270600435611cd2565b34610278576000366003190112610278576020601a54604051908152f35b34610278576000366003190112610278576020602254604051908152f35b34610278576000366003190112610278576020610270610cd6611a2d565b7f000000000000000000000000000000000000000000000000000000000000000090611931565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576020366003190112610278576004356001600160a01b0381169081900361027857604051610da58161195e565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260c060405191610ddb83611996565b610100368437015260005260246020526101c06040600020610e9660405191610e038361195e565b805483526001810154906020840191825260028101549060408501918252600381015460608601908152600482015492610e5a6005608089019460ff87161515865260ff60a08b019760081c161515875201611c6d565b9460c0880195865260405197518852516020880152516040870152516060860152511515608085015251151560a08401525160c08301906118a5565bf35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020601954604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051610e108152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760405190610f7c82611996565b61010080923690376000526024602052610f9c6005604060002001611c6d565b610e9660405180926118a5565b346102785760208060031936011261027857600435903360005260248152604060002060ff600482015460081c16156111be5760088310156111ac5760058101610ff38482611902565b9061ffff905491816003880293816002860154169260031b1c16101561119a5761106661103d876110376110a495611029611f9e565b6110323361205d565b6119f4565b95611902565b61104e8483548360031b1c16611c5a565b9061ffff8084549260031b9316831b921b1916179055565b8483019361107685518254611951565b90556110858451601854611951565b60185561104e611094876118d1565b91909283548360031b1c16611c5a565b6110b18151601b54611951565b601b556110bd336120d7565b80516040516323b872dd60e01b815233600482015261dead60248201526044810191909152838160648160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561118e5761115b575b505190516040519282845283015260408201527f02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf4060603392a3005b8381813d8311611187575b61117081836119b3565b810103126102785751801515036102785784611120565b503d611166565b6040513d6000823e3d90fd5b6040516330e57efd60e21b8152600490fd5b6040516321a9b14360e01b8152600490fd5b60405163037c597f60e01b8152600490fd5b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020604060002054604051908152f35b34610278576000366003190112610278576020610270611abd565b346102785760203660031901126102785760043561128a6119d5565b5060088110156111ac576112a26003606092026119f4565b610e96604051809261ffff604080928051855260208101516020860152015116910152565b34610278576000366003190112610278576112e0611f9e565b6112e93361205d565b336000526024602052600260406000200154801561140b573360005260246020526000600260408220015561132081602254611a20565b602255336000526024602052600360406000200161133f828254611951565b905561134d81601a54611951565b601a557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561027857600080926044604051809581936340c10f1960e01b83523360048401528660248401525af1801561118e576113f1575b60209060195460405190828252838201527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60403392a2604051908152f35b67ffffffffffffffff82116108e8576020916040526113b2565b6040516312d37ee560e31b8152600490fd5b34610278576000366003190112610278576020601854604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051603c8152f35b3461027857600036600319011261027857602060405160088152f35b34610278576000366003190112610278576020610270611a2d565b346102785760003660031901126102785760208054604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601d54604051908152f35b346102785760003660031901126102785760405161156681611996565b60005b610100811061160757604051610100810181811067ffffffffffffffff8211176108e857604052600080825b600882106115e957604051846000825b600882106115b35761030084f35b60206060826115dd600194875161ffff604080928051855260208101516020860152015116910152565b019301910190916115a5565b600360206001926115f9866119f4565b815201930191019091611595565b6020906116126119d5565b8184015201611569565b346102785760003660031901126102785733600052602460205260406000206004810160ff8154166116ea57611650611f9e565b6116593361205d565b600160ff198254161790557f000000000000000000000000000000000000000000000000000000000000000090611691828254611951565b905561169f81601854611951565b601855601d54600181018091116108a757601d556116bc336120d7565b6040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a2005b604051630ea075bf60e21b8152600490fd5b34610278576020366003190112610278576020670de0b6b3a764000061172b611723611abd565b60043561191e565b04604051908152f35b346102785760003660031901126102785761174d611e25565b6040516323b872dd60e01b6000908152336004526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024527f0000000000000000000000000000000000000000000000000000000000000000604481905292917f00000000000000000000000000000000000000000000000000000000000000009060209060648180855af160016000511481161561186a575b8360405260006060521561185457836040519081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2005b635274afe760e01b835216600482015260249150fd5b600181151661188057813b15153d1516166117f1565b833d6000823e3d90fd5b3461027857600036600319011261027857602090601e548152f35b6000915b600883106118b657505050565b60019061ffff835116815260208091019201920191906118a9565b9060088210156118ec57601e8260041c601f019260011b1690565b634e487b7160e01b600052603260045260246000fd5b91909160088310156118ec57601e908360041c019260011b1690565b818102929181159184041417156108a757565b811561193b570490565b634e487b7160e01b600052601260045260246000fd5b919082018092116108a757565b60e0810190811067ffffffffffffffff8211176108e857604052565b6060810190811067ffffffffffffffff8211176108e857604052565b610100810190811067ffffffffffffffff8211176108e857604052565b90601f8019910116810190811067ffffffffffffffff8211176108e857604052565b604051906119e28261197a565b60006040838281528260208201520152565b90604051611a018161197a565b604061ffff600283958054855260018101546020860152015416910152565b919082039182116108a757565b602354804211600014611a8757611a4a610341611a549242611a20565b9050601954611951565b7f00000000000000000000000000000000000000000000000000000000000000009081811115611a82575090565b905090565b50611a54611a4a6000612126565b519069ffffffffffffffffffff8216820361027857565b60ff16604d81116108a757600a0a90565b604051633fabe5a360e21b8152600460a08282817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561118e576000928391611c02575b506000831315611bf2578015908115611bc7575b50611bb85760ff7f00000000000000000000000000000000000000000000000000000000000000001660128110611b985760128111611b5f57505090565b601119019060ff8211611b83575090611b7a611b8092611aac565b90611931565b90565b601190634e487b7160e01b6000525260246000fd5b6012039060ff8211611b83575090611bb2611b8092611aac565b9061191e565b604051630cd5fa0760e11b8152fd5b9050610e108101809111611bdd57421138611b21565b601182634e487b7160e01b6000525260246000fd5b5060405163fd1ee34960e01b8152fd5b92905060a0833d60a011611c52575b81611c1e60a093836119b3565b81010312611c4f5750611c3082611a95565b506020820151611c47608060608501519401611a95565b509138611b0d565b80fd5b3d9150611c11565b90600161ffff809316019182116108a757565b90604051915461ffff908181168452818160101c166020850152818160201c166040850152818160301c166060850152818160401c166080850152818160501c1660a0850152818160601c1660c085015260701c1660e0830152611cd082611996565b565b611cda611d1d565b80158015611d15575b8015611d0b575b611d0457611b8091611cfb9161191e565b60185490611931565b5050600090565b5060185415611cea565b508115611ce3565b611d25611a2d565b7f00000000000000000000000000000000000000000000000000000000000000001115611d9757611d54611d9c565b8015611d9157611d8d670de0b6b3a7640000917f000000000000000000000000000000000000000000000000000000000000000061191e565b0490565b50600090565b600090565b611da7610cd6611a2d565b603c8110611db55750600090565b670de0b6b3a7640000901c90565b611dcb611abd565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000008181029181159183041417156108a75781611e0f91611951565b6000198101919082116108a757611b8091611931565b6000338152602460205260408120600481019060ff825460081c16611f8c57611e4c611f9e565b611e553361205d565b7f00000000000000000000000000000000000000000000000000000000000000008092805460ff811615611ee0575b50805461ff0019166101001790558154611ead939291611ea391611951565b9055601854611951565b601855601e549060018201809211611ecc5750601e55611cd0336120d7565b634e487b7160e01b81526011600452602490fd5b60019060ff1916178155611f157f00000000000000000000000000000000000000000000000000000000000000008093611951565b91611f2281601854611951565b601855601d5460018101809111611f785791611ead95949391611ea393601d556040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a29150919293611e84565b634e487b7160e01b87526011600452602487fd5b60405163ef65161f60e01b8152600490fd5b6023548042111561205a57611fb39042611a20565b426023556019547f000000000000000000000000000000000000000000000000000000000000000090611fef611fe98383611931565b93612126565b80156120535761201b9261200861201093602054611951565b602055611951565b918260195582611931565b918211612026575050565b60207f817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e33491604051908152a2565b5050505050565b50565b611cd09060018060a01b03811660005260246020526040600020600181015490670de0b6b3a764000061209482546020549061191e565b04918083116120a6575b5050506120d7565b6120b56002916120cc94611a20565b91016120c2828254611951565b9055602254611951565b60225538808061209e565b60018060a01b03166000526024602052612121604060002061211c6001820191670de0b6b3a7640000612110845492546020549061191e565b04809355602154611a20565b611951565b602155565b60185460009283928391908315801561239e575b8015612372575b612368576019547f0000000000000000000000000000000000000000000000000000000000000000967f0000000000000000000000000000000000000000000000000000000000000000958795917f0000000000000000000000000000000000000000000000000000000000000000905b603c908189108061235f575b80612356575b15612348576121d38c87611931565b9182101561234857670de0b6b3a764000090816121f281851c8d61191e565b049283156122c657600181018091116122b257876106688f6122139361191e565b61221d8886611a20565b808210156123405750925b612232898261191e565b938085116122d65750508792915b83156122c6578083029083820414831517156122b2579161227c81612276612282946122708a6122889998611931565b90611951565b98611951565b97611951565b96611a20565b96600019811461229e57600101969493926121b2565b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b8d52601160045260248dfd5b509b505050505095505050915050565b929093506122e48484611951565b600019810190811161232c57846122fa91611931565b93898511612324575b8461230d9161191e565b9280841161231c575b50612240565b925038612316565b899450612303565b634e487b7160e01b8e52601160045260248efd5b905092612228565b9a5050505095505050915050565b508286106121c4565b508615156121be565b5092935050508190565b506019547f00000000000000000000000000000000000000000000000000000000000000001115612141565b50801561213a56fea26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c6343000818003360c060405234620003c45762000cd6803803806200001d81620003c9565b928339810190608081830312620003c45780516001600160401b0390818111620003c457836200004f918401620003ef565b926020908184015190838211620003c4576200006d918501620003ef565b91606060408501519401519460018060a01b03861691828703620003c4578151818111620002c4576003908154906001948583811c93168015620003b9575b88841014620003a3578190601f938481116200034d575b508890848311600114620002e657600092620002da575b505060001982851b1c191690851b1782555b8651928311620002c45760049687548581811c91168015620002b9575b88821014620002a45782811162000259575b5086918411600114620001ee57938394918492600095620001e2575b50501b92600019911b1c19161783555b15620001b65782156200018b57505060805260a052604051610874908162000462823960805181818160bf0152610317015260a0518181816102e001526105100152f35b60405162461bcd60e51b815291820152600560248201526406361703d360dc1b604482015260649150fd5b60405162461bcd60e51b81529182015260066024820152650706f6f6c3d360d41b604482015260649150fd5b01519350388062000137565b9190601f198416928860005284886000209460005b8a8983831062000241575050501062000226575b50505050811b01835562000147565b01519060f884600019921b161c191690553880808062000217565b86860151895590970196948501948893500162000203565b88600052876000208380870160051c8201928a88106200029a575b0160051c019086905b8281106200028d5750506200011b565b600081550186906200027d565b9250819262000274565b602289634e487b7160e01b6000525260246000fd5b90607f169062000109565b634e487b7160e01b600052604160045260246000fd5b015190503880620000da565b90879350601f19831691866000528a6000209260005b8c8282106200033657505084116200031d575b505050811b018255620000ec565b015160001983871b60f8161c191690553880806200030f565b8385015186558b97909501949384019301620002fc565b90915084600052886000208480850160051c8201928b861062000399575b918991869594930160051c01915b82811062000389575050620000c3565b6000815585945089910162000379565b925081926200036b565b634e487b7160e01b600052602260045260246000fd5b92607f1692620000ac565b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620002c457604052565b919080601f84011215620003c45782516001600160401b038111620002c45760209062000425601f8201601f19168301620003c9565b92818452828287010111620003c45760005b8181106200044d57508260009394955001015290565b85810183015184820184015282016200043756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde03146105e957508163095ea7b31461053f57816316f0115b146104fb57816318160ddd146104dc57816323b872dd146103e5578163313ce567146103c957816340c10f19146102b657816370a082311461027f57816395d89b411461015e57508063a9059cbb1461012e578063dd62ed3e146100e65763ec81b483146100a957600080fd5b346100e257816003193601126100e257602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5080fd5b50346100e257806003193601126100e2578060209261010361070c565b61010b610727565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50346100e257806003193601126100e25760209061015761014d61070c565b6024359033610760565b5160018152f35b8383346100e257816003193601126100e25780519082845460018160011c9060018316928315610275575b60209384841081146102625783885290811561024657506001146101f1575b505050829003601f01601f191682019267ffffffffffffffff8411838510176101de57508291826101da9252826106c3565b0390f35b634e487b7160e01b815260418552602490fd5b8787529192508591837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b83851061023257505050508301018580806101a8565b80548886018301529301928490820161021c565b60ff1916878501525050151560051b84010190508580806101a8565b634e487b7160e01b895260228a52602489fd5b91607f1691610189565b5050346100e25760203660031901126100e25760209181906001600160a01b036102a761070c565b16815280845220549051908152f35b919050346103c557806003193601126103c5576102d161070c565b60243591906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811633036103b55760025491610315858461073d565b7f0000000000000000000000000000000000000000000000000000000000000000106103a5571693841561038e5750827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92610374879560209461073d565b60025585855284835280852082815401905551908152a380f35b825163ec442f0560e01b8152908101869052602490fd5b835163a4875a4960e01b81528690fd5b8251636f61f64160e01b81528590fd5b8280fd5b5050346100e257816003193601126100e2576020905160128152f35b905082346104d95760603660031901126104d95761040161070c565b610409610727565b916044359360018060a01b038316808352600160205286832033845260205286832054916000198310610445575b602088610157898989610760565b8683106104ad57811561049657331561047f5750825260016020908152868320338452815291869020908590039055829061015787610437565b8751634a1406b160e11b8152908101849052602490fd5b875163e602df0560e01b8152908101849052602490fd5b8751637dc7a0d960e11b8152339181019182526020820193909352604081018790528291506060010390fd5b80fd5b5050346100e257816003193601126100e2576020906002549051908152f35b5050346100e257816003193601126100e257517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9050346103c557816003193601126103c55761055961070c565b6024359033156105d2576001600160a01b03169182156105bb57508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b849084346103c557826003193601126103c5578260035460018160011c90600183169283156106b9575b602093848410811461026257838852908115610246575060011461066357505050829003601f01601f191682019267ffffffffffffffff8411838510176101de57508291826101da9252826106c3565b600387529192508591837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106106a557505050508301018580806101a8565b80548886018301529301928490820161068f565b91607f1691610613565b6020808252825181830181905290939260005b8281106106f857505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016106d6565b600435906001600160a01b038216820361072257565b600080fd5b602435906001600160a01b038216820361072257565b9190820180921161074a57565b634e487b7160e01b600052601160045260246000fd5b916001600160a01b03808416928315610825571692831561080c57600090838252816020526040822054908382106107da575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fdfea26469706673582212203df637a26bb0c419fbfb5e3cf8f83135454d932cce26b56cec5aac125c51b9a964736f6c63430008180033","sourceMap":"1514:21374:10:-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;1514:21374:10;;6864:19;:48;;;;1514:21374;6864:75;;;;1514:21374;6860:101;;6988:15;;;:38;;;;1514:21374;6988:65;;;;1514:21374;6988:102;;;;1514:21374;6988:120;;;;1514:21374;6988:144;;;;1514:21374;6971:190;;1514:21374;;;7180:66;;;;;;-1:-1:-1;;;;;7180:66:10;;;;;;;;1514:21374;;7180:66;;;;;;1514:21374;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;7240:4;1514:21374;;;7180:66;;-1:-1:-1;7180:66:10;;;;;;1514:21374;7172:74;;;;-1:-1:-1;;;;;1514:21374:10;;;;7256:20;1514:21374;;7286:47;;;1514:21374;;-1:-1:-1;;;7479:45:10;;1514:21374;;;;;7479:45;;1514:21374;;7479:45;;;;;;;-1:-1:-1;7479:45:10;;;1514:21374;;7544:2;1514:21374;;;7538:8;7534:32;;1514:21374;7576:18;1514:21374;7605:20;7635:22;;;;;;1514:21374;7667:30;1514:21374;7707:20;1514:21374;7737:32;7779:38;;;;7827:34;;;;-1:-1:-1;7892:14:10;1514:21374;7892:14;;;;8126:15;;;;;8113:28;1800:1;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7908:3;7931:10;;;;:::i;:::-;1800:1;7931:15;:34;;;;7908:3;7931:53;;;;7908:3;7927:77;;8043:10;;;;:::i;:::-;1800:1;8061:10;;;;;:::i;:::-;1800:1;1514:21374;8080:10;;;;:::i;:::-;1800:1;1514:21374;;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;1800:1;1514:21374;;;1800:1;;;8030:62;1514:21374;8030:62;;1800:1;8030:62;1800:1;;;;;;;;;;;;;;;;;;;;;1514:21374;7877:13;;1514:21374;;;;-1:-1:-1;1514:21374:10;;7479:45;1514:21374;;-1:-1:-1;1514:21374:10;7927:77;1514:21374;;-1:-1:-1;;;7993:11:10;;7479:45;;7993:11;7931:53;7969:10;1514:21374;7969:10;;;;:::i;:::-;1800:1;1514:21374;7969:15;7931:53;;:34;7950:10;;;;;:::i;:::-;1800:1;7950:15;7931:34;;7479:45;;;1514:21374;7479:45;;1514:21374;7479:45;;;;;;1514:21374;7479:45;;;:::i;:::-;;;1514:21374;;;;;;;;;;;;7479:45;;;1514:21374;-1:-1:-1;1514:21374:10;;7479:45;;;-1:-1:-1;7479:45:10;;;1514:21374;;;-1:-1:-1;1514:21374:10;;;;;6988:144;7112:20;;;6988:144;;:120;7094:14;;;6988:120;;:102;7069:21;;;6988:102;;:65;7030:23;;;6988:65;;:38;7007:19;;;6988:38;;6860:101;1514:21374;;-1:-1:-1;;;6948:13:10;;;;;6864:75;-1:-1:-1;;;;;;1514:21374:10;;6916:23;6864:75;;:48;-1:-1:-1;;;;;;1514:21374:10;;6887:25;6864:48;;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;:::o;:::-;;;;;-1:-1:-1;;1514:21374:10;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;1514:21374:10;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;-1:-1:-1;;;;;1514:21374:10;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;1514:21374:10;;;;:::o;1800:1::-;;;;;;;;;;;;:::o;:::-;1514:21374;;;1800:1;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608080604052600436101561002d575b50361561001b57600080fd5b6040516301f30c8760e21b8152600490fd5b60003560e01c90816306f9e52c1461188a575080630f15f4c01461173457806316c2d30f146116fc5780631aa3a0081461161c578063205e0c1114611549578063210ff9bb1461152b5780632f48ab7d146114e65780632f663586146114c95780633590bafe146114ae57806336331c8f1461149257806336f1e6c0146114765780633ddce1071461143b5780634a5628c51461141d5780634e71d92d146112c757806353f96df21461126e578063576dde12146112535780635d0072811461121557806361d027b3146111d057806362de3bd114610fa95780636875227414610f49578063696453b814610f2c5780636a47aa0614610ef15780636ce41f6214610ed357806377d630ae14610e985780638086b8ba14610d735780638b5cdd2914610d385780638f770ad014610cfd578063900cf0cf14610cb85780639cc85c9514610c9a578063a2309ff814610c7c578063a2b1b80e14610c5e578063a878b14314610c43578063b002e11f14610b99578063c046371114610b7b578063c08b8aa1146109f0578063c0a2526c146109d3578063c1f5138a146109b5578063c23953d014610977578063cbf0980214610939578063d7b2afb5146108fe578063d80528ae1461045a578063d89135cd1461043c578063d8ac81af146103f7578063d90e0264146103bc578063e6674a9a146103a1578063f44136a1146102e0578063fc0c546a1461029b578063fc7b9c181461027d5763fe128e1314610255573861000f565b34610278576000366003190112610278576020610270611dc3565b604051908152f35b600080fd5b34610278576000366003190112610278576020602154604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b03811690819003610278576000526024602052602061027060406000206023548042116000146103875761035561034e610346610341670de0b6b3a76400009442611a20565b612126565b508654611951565b835461191e565b0460018201549081811160001461037b5760029161037291611a20565b915b0154611951565b50506002600091610374565b50670de0b6b3a764000061035561034e6103466000612126565b34610278576000366003190112610278576020610270611d9c565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601b54604051908152f35b34610278576000366003190112610278576040516102209081810181811067ffffffffffffffff8211176108e8576040526000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a082015260006101c082015260006101e082015260006102008201526023548042116000146108d75761053c6105286103416105339342611a20565b601993919354611951565b91602054611951565b60185490818452826020850152601a546040850152601b5460608501527f000000000000000000000000000000000000000000000000000000000000000060808501526105a97f000000000000000000000000000000000000000000000000000000000000000084611931565b8060a08601527f000000000000000000000000000000000000000000000000000000000000000060c08601526001810181116108a75761060e849160017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b11156108bd5760a08401516001810181116108a757670de0b6b3a76400006106d76106ea9361066d876106686106e19660017f0000000000000000000000000000000000000000000000000000000000000000910161191e565b611a20565b60e089015260a0880151603c811061089e57506000955b7f000000000000000000000000000000000000000000000000000000000000000088109687158098610896575b15610865575060005b6101008a0152601d546101208a0152601e546101408a015261191e565b0460215490611a20565b60225490611951565b61016084015215610836575060005b610180820152426101a08201527f00000000000000000000000000000000000000000000000000000000000000006101c08201527f00000000000000000000000000000000000000000000000000000000000000006101e08201527f000000000000000000000000000000000000000000000000000000000000000061020082015261020060405191805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c084015260e081015160e08401526101008101516101008401526101208101516101208401526101408101516101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401520151610200820152f35b610860907f0000000000000000000000000000000000000000000000000000000000000000611a20565b6106f9565b61089085917f000000000000000000000000000000000000000000000000000000000000000061191e565b046106ba565b5080156106b1565b83901c95610684565b634e487b7160e01b600052601160045260246000fd5b6106e1670de0b6b3a76400006106d76106ea93600061066d565b5061053361053c6105286000612126565b634e487b7160e01b600052604160045260246000fd5b346102785760203660031901126102785760043560088110156102785761ffff6109296020926118d1565b9190546040519260031b1c168152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020610270604060002054611cd2565b3461027857600036600319011261027857602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610278576000366003190112610278576020601c54604051908152f35b3461027857600036600319011261027857602060405161dead8152f35b600036600319011261027857610a04611dc3565b3410610b6957610a12611e25565b6000808080347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af13d15610b64573d67ffffffffffffffff81116108e85760405190610a72601f8201601f1916602001836119b3565b8152600060203d92013e5b15610b5257610a8e34601c54611951565b601c556040517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2670de0b6b3a7640000610b1d610b17611abd565b3461191e565b046040519034825260208201527f92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e760403392a2005b6040516312171d8360e31b8152600490fd5b610a7d565b6040516305110f0160e41b8152600490fd5b34610278576000366003190112610278576020602354604051908152f35b3461027857600036600319011261027857610bb2611a2d565b7f0000000000000000000000000000000000000000000000000000000000000000610bdd8183611931565b90600182018092116108a757610bf29161191e565b7f0000000000000000000000000000000000000000000000000000000000000000808211610c3b575b5081811115610c305760209161027091611a20565b505060206000610270565b905082610c1b565b34610278576000366003190112610278576020610270611d1d565b34610278576020366003190112610278576020610270600435611cd2565b34610278576000366003190112610278576020601a54604051908152f35b34610278576000366003190112610278576020602254604051908152f35b34610278576000366003190112610278576020610270610cd6611a2d565b7f000000000000000000000000000000000000000000000000000000000000000090611931565b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576020366003190112610278576004356001600160a01b0381169081900361027857604051610da58161195e565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260c060405191610ddb83611996565b610100368437015260005260246020526101c06040600020610e9660405191610e038361195e565b805483526001810154906020840191825260028101549060408501918252600381015460608601908152600482015492610e5a6005608089019460ff87161515865260ff60a08b019760081c161515875201611c6d565b9460c0880195865260405197518852516020880152516040870152516060860152511515608085015251151560a08401525160c08301906118a5565bf35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020601954604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051610e108152f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760405190610f7c82611996565b61010080923690376000526024602052610f9c6005604060002001611c6d565b610e9660405180926118a5565b346102785760208060031936011261027857600435903360005260248152604060002060ff600482015460081c16156111be5760088310156111ac5760058101610ff38482611902565b9061ffff905491816003880293816002860154169260031b1c16101561119a5761106661103d876110376110a495611029611f9e565b6110323361205d565b6119f4565b95611902565b61104e8483548360031b1c16611c5a565b9061ffff8084549260031b9316831b921b1916179055565b8483019361107685518254611951565b90556110858451601854611951565b60185561104e611094876118d1565b91909283548360031b1c16611c5a565b6110b18151601b54611951565b601b556110bd336120d7565b80516040516323b872dd60e01b815233600482015261dead60248201526044810191909152838160648160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561118e5761115b575b505190516040519282845283015260408201527f02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf4060603392a3005b8381813d8311611187575b61117081836119b3565b810103126102785751801515036102785784611120565b503d611166565b6040513d6000823e3d90fd5b6040516330e57efd60e21b8152600490fd5b6040516321a9b14360e01b8152600490fd5b60405163037c597f60e01b8152600490fd5b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576020366003190112610278576004356001600160a01b038116908190036102785760005260246020526020604060002054604051908152f35b34610278576000366003190112610278576020610270611abd565b346102785760203660031901126102785760043561128a6119d5565b5060088110156111ac576112a26003606092026119f4565b610e96604051809261ffff604080928051855260208101516020860152015116910152565b34610278576000366003190112610278576112e0611f9e565b6112e93361205d565b336000526024602052600260406000200154801561140b573360005260246020526000600260408220015561132081602254611a20565b602255336000526024602052600360406000200161133f828254611951565b905561134d81601a54611951565b601a557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561027857600080926044604051809581936340c10f1960e01b83523360048401528660248401525af1801561118e576113f1575b60209060195460405190828252838201527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60403392a2604051908152f35b67ffffffffffffffff82116108e8576020916040526113b2565b6040516312d37ee560e31b8152600490fd5b34610278576000366003190112610278576020601854604051908152f35b346102785760003660031901126102785760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610278576000366003190112610278576020604051603c8152f35b3461027857600036600319011261027857602060405160088152f35b34610278576000366003190112610278576020610270611a2d565b346102785760003660031901126102785760208054604051908152f35b34610278576000366003190112610278576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610278576000366003190112610278576020601d54604051908152f35b346102785760003660031901126102785760405161156681611996565b60005b610100811061160757604051610100810181811067ffffffffffffffff8211176108e857604052600080825b600882106115e957604051846000825b600882106115b35761030084f35b60206060826115dd600194875161ffff604080928051855260208101516020860152015116910152565b019301910190916115a5565b600360206001926115f9866119f4565b815201930191019091611595565b6020906116126119d5565b8184015201611569565b346102785760003660031901126102785733600052602460205260406000206004810160ff8154166116ea57611650611f9e565b6116593361205d565b600160ff198254161790557f000000000000000000000000000000000000000000000000000000000000000090611691828254611951565b905561169f81601854611951565b601855601d54600181018091116108a757601d556116bc336120d7565b6040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a2005b604051630ea075bf60e21b8152600490fd5b34610278576020366003190112610278576020670de0b6b3a764000061172b611723611abd565b60043561191e565b04604051908152f35b346102785760003660031901126102785761174d611e25565b6040516323b872dd60e01b6000908152336004526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024527f0000000000000000000000000000000000000000000000000000000000000000604481905292917f00000000000000000000000000000000000000000000000000000000000000009060209060648180855af160016000511481161561186a575b8360405260006060521561185457836040519081527f000000000000000000000000000000000000000000000000000000000000000060208201527ff89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc60403392a2005b635274afe760e01b835216600482015260249150fd5b600181151661188057813b15153d1516166117f1565b833d6000823e3d90fd5b3461027857600036600319011261027857602090601e548152f35b6000915b600883106118b657505050565b60019061ffff835116815260208091019201920191906118a9565b9060088210156118ec57601e8260041c601f019260011b1690565b634e487b7160e01b600052603260045260246000fd5b91909160088310156118ec57601e908360041c019260011b1690565b818102929181159184041417156108a757565b811561193b570490565b634e487b7160e01b600052601260045260246000fd5b919082018092116108a757565b60e0810190811067ffffffffffffffff8211176108e857604052565b6060810190811067ffffffffffffffff8211176108e857604052565b610100810190811067ffffffffffffffff8211176108e857604052565b90601f8019910116810190811067ffffffffffffffff8211176108e857604052565b604051906119e28261197a565b60006040838281528260208201520152565b90604051611a018161197a565b604061ffff600283958054855260018101546020860152015416910152565b919082039182116108a757565b602354804211600014611a8757611a4a610341611a549242611a20565b9050601954611951565b7f00000000000000000000000000000000000000000000000000000000000000009081811115611a82575090565b905090565b50611a54611a4a6000612126565b519069ffffffffffffffffffff8216820361027857565b60ff16604d81116108a757600a0a90565b604051633fabe5a360e21b8152600460a08282817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561118e576000928391611c02575b506000831315611bf2578015908115611bc7575b50611bb85760ff7f00000000000000000000000000000000000000000000000000000000000000001660128110611b985760128111611b5f57505090565b601119019060ff8211611b83575090611b7a611b8092611aac565b90611931565b90565b601190634e487b7160e01b6000525260246000fd5b6012039060ff8211611b83575090611bb2611b8092611aac565b9061191e565b604051630cd5fa0760e11b8152fd5b9050610e108101809111611bdd57421138611b21565b601182634e487b7160e01b6000525260246000fd5b5060405163fd1ee34960e01b8152fd5b92905060a0833d60a011611c52575b81611c1e60a093836119b3565b81010312611c4f5750611c3082611a95565b506020820151611c47608060608501519401611a95565b509138611b0d565b80fd5b3d9150611c11565b90600161ffff809316019182116108a757565b90604051915461ffff908181168452818160101c166020850152818160201c166040850152818160301c166060850152818160401c166080850152818160501c1660a0850152818160601c1660c085015260701c1660e0830152611cd082611996565b565b611cda611d1d565b80158015611d15575b8015611d0b575b611d0457611b8091611cfb9161191e565b60185490611931565b5050600090565b5060185415611cea565b508115611ce3565b611d25611a2d565b7f00000000000000000000000000000000000000000000000000000000000000001115611d9757611d54611d9c565b8015611d9157611d8d670de0b6b3a7640000917f000000000000000000000000000000000000000000000000000000000000000061191e565b0490565b50600090565b600090565b611da7610cd6611a2d565b603c8110611db55750600090565b670de0b6b3a7640000901c90565b611dcb611abd565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000008181029181159183041417156108a75781611e0f91611951565b6000198101919082116108a757611b8091611931565b6000338152602460205260408120600481019060ff825460081c16611f8c57611e4c611f9e565b611e553361205d565b7f00000000000000000000000000000000000000000000000000000000000000008092805460ff811615611ee0575b50805461ff0019166101001790558154611ead939291611ea391611951565b9055601854611951565b601855601e549060018201809211611ecc5750601e55611cd0336120d7565b634e487b7160e01b81526011600452602490fd5b60019060ff1916178155611f157f00000000000000000000000000000000000000000000000000000000000000008093611951565b91611f2281601854611951565b601855601d5460018101809111611f785791611ead95949391611ea393601d556040519081527f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c60203392a29150919293611e84565b634e487b7160e01b87526011600452602487fd5b60405163ef65161f60e01b8152600490fd5b6023548042111561205a57611fb39042611a20565b426023556019547f000000000000000000000000000000000000000000000000000000000000000090611fef611fe98383611931565b93612126565b80156120535761201b9261200861201093602054611951565b602055611951565b918260195582611931565b918211612026575050565b60207f817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e33491604051908152a2565b5050505050565b50565b611cd09060018060a01b03811660005260246020526040600020600181015490670de0b6b3a764000061209482546020549061191e565b04918083116120a6575b5050506120d7565b6120b56002916120cc94611a20565b91016120c2828254611951565b9055602254611951565b60225538808061209e565b60018060a01b03166000526024602052612121604060002061211c6001820191670de0b6b3a7640000612110845492546020549061191e565b04809355602154611a20565b611951565b602155565b60185460009283928391908315801561239e575b8015612372575b612368576019547f0000000000000000000000000000000000000000000000000000000000000000967f0000000000000000000000000000000000000000000000000000000000000000958795917f0000000000000000000000000000000000000000000000000000000000000000905b603c908189108061235f575b80612356575b15612348576121d38c87611931565b9182101561234857670de0b6b3a764000090816121f281851c8d61191e565b049283156122c657600181018091116122b257876106688f6122139361191e565b61221d8886611a20565b808210156123405750925b612232898261191e565b938085116122d65750508792915b83156122c6578083029083820414831517156122b2579161227c81612276612282946122708a6122889998611931565b90611951565b98611951565b97611951565b96611a20565b96600019811461229e57600101969493926121b2565b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b8d52601160045260248dfd5b509b505050505095505050915050565b929093506122e48484611951565b600019810190811161232c57846122fa91611931565b93898511612324575b8461230d9161191e565b9280841161231c575b50612240565b925038612316565b899450612303565b634e487b7160e01b8e52601160045260248efd5b905092612228565b9a5050505095505050915050565b508286106121c4565b508615156121be565b5092935050508190565b506019547f00000000000000000000000000000000000000000000000000000000000000001115612141565b50801561213a56fea26469706673582212206d314a29ee94f66c045ac9362a10804a2a19c1dac70986c47f4aa54ca0454b7f64736f6c63430008180033","sourceMap":"1514:21374:10:-:0;;;;;;;;;;-1:-1:-1;1514:21374:10;;;;;;;;;;;-1:-1:-1;;;22868:11:10;;1514:21374;;22868:11;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4409:31;1514:21374;4409:31;;;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4527:24;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2281:34;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;19515:9;1514:21374;;;19842:19;1514:21374;;;19576:10;1514:21374;19558:15;;:28;:63;:28;;;19744:12;19693:25;19651:18;19589:28;1984:4;19558:15;;19589:28;:::i;:::-;19651:18;:::i;:::-;1514:21374;;;19693:25;:::i;:::-;1514:21374;;19744:12;:::i;:::-;1984:4;19798:6;;;1514:21374;19790:35;:14;;;:35;:14;;;19842:9;19807:14;;;;:::i;:::-;19790:35;;19842:9;1514:21374;19842:19;:::i;19790:35::-;;;19842:9;1514:21374;19790:35;;;19558:63;;1984:4;19744:12;19693:25;19651:18;1514:21374;19651:18;:::i;1514:21374::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;3120:42;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2557:49;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;3774:26;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21067:10;1514:21374;21049:15;;:28;:63;:28;;;21256:25;21161:18;21080:28;21207:25;21049:15;;21080:28;:::i;21161:18::-;21207:12;1514:21374;;;;21207:25;:::i;:::-;1514:21374;;;21256:25;:::i;:::-;21306:9;1514:21374;;;;;;;;;;21375:11;1514:21374;;;;;21412:11;1514:21374;;;;;21447:9;1514:21374;;;;21476:25;21486:15;21476:25;;:::i;:::-;1514:21374;;;;;21486:15;1514:21374;;;;21585:1;1514:21374;;;;;;21574:31;21486:15;;21585:1;21486:15;1514:21374;;21574:31;:::i;:::-;:41;:113;;;1514:21374;;;;21585:1;1514:21374;;;;;;1984:4;21977:15;21976:56;21486:15;21630:41;21486:15;21630:31;21977:33;21486:15;21585:1;21486:15;1514:21374;;21630:31;:::i;:::-;:41;:::i;:::-;1514:21374;;;;;;;;1921:2;21714:23;;1921:2;;21714:44;1514:21374;21714:44;;21447:9;21787:20;;;;;:35;;;;21714:44;21786:76;;;;1514:21374;21786:76;1514:21374;;;;21892:15;1514:21374;;;;;21936:14;1514:21374;;;;;21977:15;:::i;:::-;1984:4;22001:9;1514:21374;21977:33;;:::i;:::-;22014:18;1514:21374;21976:56;;:::i;:::-;1514:21374;;;;22056:46;;;;1514:21374;22056:46;1514:21374;;;;21049:15;1514:21374;;;;22164:17;1514:21374;;;;22204:8;1514:21374;;;;22241:14;1514:21374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22056:46;22083:19;21447:9;;22083:19;:::i;:::-;22056:46;;21786:76;21830:26;:17;;;:26;:::i;:::-;1984:4;21786:76;;21787:35;21811:11;;;21787:35;;21714:44;1514:21374;;;21714:44;;;1514:21374;;;;;;;;;;;;21574:113;21977:33;1984:4;21977:15;21976:56;21574:113;1514:21374;21574:113;;21049:63;;21207:25;21256;21161:18;1514:21374;21161:18;:::i;1514:21374::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;4312:34;;;;;1514:21374;4312:34;1514:21374;4312:34;;:::i;:::-;1514:21374;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;20280:9;1514:21374;;;20268:33;1514:21374;;;;20268:33;:::i;1514:21374::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;2714:35;1514:21374;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4018:31;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;1688:42;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;9857:17;;:::i;:::-;9888:9;:20;9884:50;;;;:::i;:::-;1514:21374;;;;9888:9;10166:8;-1:-1:-1;;;;;1514:21374:10;10158:44;;1514:21374;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;:::i;:::-;;;;;;;;;;10216:3;10212:32;;10255:29;9888:9;10255:29;1514:21374;10255:29;:::i;:::-;;1514:21374;;;10322:13;1514:21374;;10337:14;1514:21374;;;;10300:52;1514:21374;10310:10;10300:52;;1984:4;11413:22;11425:10;;:::i;:::-;9888:9;11413:22;:::i;:::-;1984:4;1514:21374;;9888:9;;1514:21374;;;;;;10367:62;1514:21374;10310:10;10367:62;;1514:21374;10212:32;1514:21374;;-1:-1:-1;;;10228:16:10;;1514:21374;;10228:16;1514:21374;;;9884:50;1514:21374;;-1:-1:-1;;;9917:17:10;;1514:21374;;9917:17;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;4674:25;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;18271:13;;:::i;:::-;18320:15;18310:25;;;;:::i;:::-;1514:21374;18338:1;1514:21374;;;;;;;18309:49;;;:::i;:::-;18379:9;18372:16;;;18368:38;;1514:21374;-1:-1:-1;18423:14:10;;;;;;1514:21374;18440:14;;;;:::i;18423:35::-;;;1514:21374;;18423:35;;18368:38;18390:16;;18368:38;;;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;3706:26;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4605:33;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;17867:31;:13;;:::i;:::-;17883:15;17867:31;;:::i;1514:21374::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2998:34;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2824:33;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;19963:9;1514:21374;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2450:38;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;3628:27;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;3234:40;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2236:4;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;22566:9;1514:21374;;;22566:21;1514:21374;;;22566:21;1514:21374;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;12575:10;;1514:21374;;12565:9;1514:21374;;;;;;;12601:11;;1514:21374;;;;12600:12;12596:39;;1514:21374;12649:18;;;12645:40;;12699:7;;;:13;;;;:::i;:::-;1514:21374;;;;;;;;;12716:18;;;;;1514:21374;;;;;;;12699:35;;12695:66;;12863:18;:13;12695:66;1514:21374;12946:19;12695:66;;;:::i;:::-;12803:10;12575;12803;:::i;:::-;1514:21374;:::i;:::-;12863:13;;:::i;:::-;:18;1514:21374;;;;;;;;12863:18;:::i;:::-;1514:21374;;;;;;;;;;;;;;;;;;;;12863:18;12901:6;;;1514:21374;12891:16;1514:21374;;;;12891:16;:::i;:::-;1514:21374;;12917:19;1514:21374;;12917:19;1514:21374;12917:19;:::i;:::-;;1514:21374;12946:19;:14;;;:::i;:::-;1514:21374;;;;;;;;;;12946:19;:::i;:::-;12975:22;1514:21374;;12975:22;1514:21374;12975:22;:::i;:::-;;1514:21374;13015:10;12575;13015;:::i;:::-;1514:21374;;;;-1:-1:-1;;;13037:45:10;;12575:10;1514:21374;13037:45;;1514:21374;1688:42;12565:9;1514:21374;;;;;;;;;;10404:1148:7;1514:21374:10;;;-1:-1:-1;13037:5:10;-1:-1:-1;;;;;1514:21374:10;13037:45;;;;;;;;1514:21374;;;;;;;;;;;;;;;;;;13098:55;1514:21374;12575:10;13098:55;;1514:21374;13037:45;;;;;;;;;;;;;;:::i;:::-;;;1514:21374;;;;;;;;;;;13037:45;;;;;;;;;1514:21374;;;;;;;;;12695:66;1514:21374;;-1:-1:-1;;;12743:18:10;;1514:21374;;12743:18;12645:40;1514:21374;;-1:-1:-1;;;12676:9:10;;1514:21374;;12676:9;12596:39;1514:21374;;-1:-1:-1;;;12621:14:10;;1514:21374;;12621:14;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2354:33;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;20097:9;1514:21374;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;:::i;:::-;;1800:1;19278:18;;;19274:40;;1514:21374;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;13328:14;;:::i;:::-;13385:10;;;:::i;:::-;;1514:21374;;13415:9;1514:21374;;13415:29;1514:21374;;;13415:29;1514:21374;13458:11;;13454:40;;13385:10;1514:21374;;13415:9;1514:21374;;;13415:29;1514:21374;;;13504:29;1514:21374;13547:28;1514:21374;13547:28;1514:21374;13547:28;:::i;:::-;;1514:21374;13385:10;1514:21374;;13415:9;1514:21374;;13585:29;1514:21374;;;13585:29;:39;1514:21374;;;13585:39;:::i;:::-;1514:21374;;13634:21;1514:21374;13634:21;1514:21374;13634:21;:::i;:::-;;1514:21374;13665:5;-1:-1:-1;;;;;1514:21374:10;;13665:30;;;;;1514:21374;;;;;;;;;;;;;13665:30;;13385:10;1514:21374;13665:30;;1514:21374;;13415:9;1514:21374;;;13665:30;;;;;;;;1514:21374;;;13738:12;1514:21374;;;;;;;;;;;13710:41;1514:21374;13385:10;13710:41;;1514:21374;;;;;;13665:30;1514:21374;;;;;;;;;13665:30;;13454:40;1514:21374;;-1:-1:-1;;;13478:16:10;;1514:21374;;13478:16;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;3524:24;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;2917:39;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;1921:2;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;1800:1;1514:21374;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1514:21374:10;;;;4409:31;1514:21374;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;2247:28;-1:-1:-1;;;;;1514:21374:10;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;4106:30;1514:21374;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;8445:10;1514:21374;;8435:9;1514:21374;;;;;;8470:12;;1514:21374;;;;8466:44;;;;:::i;:::-;8552:10;8445;8552;:::i;:::-;8589:4;1514:21374;;;;;;;;8613:8;1514:21374;8603:18;1514:21374;;;8603:18;:::i;:::-;1514:21374;;8631:21;1514:21374;8631:21;1514:21374;8631:21;:::i;:::-;;1514:21374;8662:20;1514:21374;8589:4;1514:21374;;;;;;;8662:20;1514:21374;8700:10;8445;8700;:::i;:::-;1514:21374;;;;;8727:32;1514:21374;8445:10;8727:32;;1514:21374;8466:44;1514:21374;;-1:-1:-1;;;8491:19:10;;1514:21374;;8491:19;1514:21374;;;;;;-1:-1:-1;;1514:21374:10;;;;;1984:4;11413:22;11425:10;;:::i;:::-;1514:21374;;11413:22;:::i;:::-;1984:4;1514:21374;;;;;;;;;;;;-1:-1:-1;;1514:21374:10;;;;9185:192;;:::i;:::-;1514:21374;10404:1148:7;-1:-1:-1;;;1514:21374:10;10404:1148:7;;;9267:10:10;1514:21374;10404:1148:7;-1:-1:-1;;;;;9279:8:10;10404:1148:7;;;;9289:13:10;10404:1148:7;;;;9289:13:10;10404:1148:7;9245:4:10;;10404:1148:7;;;1514:21374:10;;9245:4;10404:1148:7;;1809:4;1514:21374:10;10404:1148:7;;;;;;;1514:21374:10;10404:1148:7;1514:21374:10;10404:1148:7;1514:21374:10;10404:1148:7;;1766:48;1762:126;;1514:21374:10;;;;;;9355:14;10404:1148:7;1514:21374:10;;;9318:52;1514:21374;9267:10;9318:52;;1514:21374;1762:126:7;-1:-1:-1;;;1837:40:7;;1514:21374:10;;1837:40:7;;1514:21374:10;10404:1148:7;;-1:-1:-1;1837:40:7;10404:1148;1809:4;10404:1148;;;;;;;;;;;;;;;;;;1514:21374:10;10404:1148:7;;;;;1514:21374:10;;;;;;-1:-1:-1;;1514:21374:10;;;;;;4193:29;1514:21374;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12946:8;1514:21374;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;1984:4::-;;;;;;;:::o;:::-;1514:21374;;;1984:4;;;;;;;;1514:21374;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;-1:-1:-1;1514:21374:10;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;17427:315::-;17526:10;1514:21374;17508:15;;:28;:63;:28;;;17606:18;17539:28;17652:25;17508:15;;17539:28;:::i;17606:18::-;1514:21374;;17652:12;1514:21374;17652:25;:::i;:::-;17704:9;;17694:19;;;;;;:41;17427:315;:::o;17694:41::-;;;17427:315;:::o;17508:63::-;;17652:25;17606:18;-1:-1:-1;17606:18:10;:::i;1514:21374::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;10535:487::-;1514:21374;;-1:-1:-1;;;10636:28:10;;;;1514:21374;10636:28;1514:21374;10636:10;-1:-1:-1;;;;;1514:21374:10;10636:28;;;;;;;;;;;;10535:487;10678:11;10636:28;10678:11;;;10674:34;;10722:14;;:60;;;;;10535:487;10718:85;;;1514:21374;10867:12;1514:21374;10899:2;10893:8;;10889:47;;10899:2;10950:8;;10946:47;;11003:12;;10535:487;:::o;10946:47::-;-1:-1:-1;;1514:21374:10;;;;;;;10976:16;;;10967:26;10976:16;;:::i;:::-;10967:26;;:::i;:::-;10960:33;:::o;1514:21374::-;;;;;;10636:28;1514:21374;;;10636:28;1514:21374;10889:47;10899:2;1514:21374;;;;;;;10919:16;;;10910:26;10919:16;;:::i;:::-;10910:26;;:::i;10718:85::-;1514:21374;;-1:-1:-1;;;10791:12:10;;;10722:60;1514:21374;;2236:4;1514:21374;;;;;;;10740:15;:42;10722:60;;;1514:21374;;;;;;10636:28;1514:21374;;;10636:28;1514:21374;10674:34;-1:-1:-1;1514:21374:10;;-1:-1:-1;;;10698:10:10;;;10636:28;;;;;;;;;;;;;;;;;;:::i;:::-;;;1514:21374;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;10636:28;;;;1514:21374;;;10636:28;;;-1:-1:-1;10636:28:10;;1514:21374;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;18957:235::-;19051:22;;:::i;:::-;19087:12;;:26;;;;18957:235;19087:44;;;;18957:235;19083:58;;19158:27;:15;;;;:::i;:::-;19176:9;1514:21374;19158:27;;:::i;19083:58::-;19133:8;;19098:1;19133:8;:::o;19087:44::-;1514:21374;19117:9;1514:21374;19117:14;19087:44;;:26;19103:10;;;19087:26;;18566:280;18656:13;;:::i;:::-;18694:9;-1:-1:-1;18683:20:10;18679:34;;18740:15;;:::i;:::-;18769:11;;18765:25;;18807:26;1984:4;18807:17;;:26;:::i;:::-;1984:4;18566:280;:::o;18765:25::-;18782:8;18779:1;18782:8;:::o;18679:34::-;18712:1;18705:8;:::o;17985:140::-;17867:31;:13;;:::i;:31::-;1921:2;18086:17;;1921:2;;18086:32;-1:-1:-1;17985:140:10;:::o;18086:32::-;1984:4;1514:21374;;17985:140;:::o;11104:158::-;11187:10;;:::i;:::-;1984:4;11215:13;1514:21374;;;;;;;;;;;;;;11215:27;;;;:::i;:::-;-1:-1:-1;;1514:21374:10;;;;;;;;11214:41;;;:::i;11638:612::-;-1:-1:-1;11708:10:10;1514:21374;;11698:9;1514:21374;;;;;11733:11;;;1514:21374;;;;;;;11729:42;;;;:::i;:::-;11813:10;11708;11813;:::i;:::-;11853:14;11835:32;1514:21374;;;;;;11881:13;11877:216;;11638:612;-1:-1:-1;1514:21374:10;;-1:-1:-1;;1514:21374:10;;;;;;;12158:27;;1514:21374;;12131:17;;;:::i;:::-;1514:21374;;12158:27;1514:21374;12158:27;:::i;:::-;;1514:21374;12195:19;1514:21374;;12117:4;1514:21374;;;;;;;;12195:19;1514:21374;12232:10;11708;12232;:::i;1514:21374::-;-1:-1:-1;;;1514:21374:10;;;11733:11;1514:21374;11698:9;;1514:21374;11877:216;11925:4;1514:21374;;;;;;;11943:19;11954:8;11943:19;;;:::i;:::-;1514:21374;11976:21;1514:21374;11976:21;1514:21374;11976:21;:::i;:::-;;1514:21374;12011:20;1514:21374;11925:4;1514:21374;;;;;;;;12158:27;1514:21374;;;;12131:17;1514:21374;12011:20;1514:21374;;;;;;12050:32;1514:21374;11708:10;12050:32;;11877:216;;;;;;;1514:21374;-1:-1:-1;;;1514:21374:10;;;11733:11;1514:21374;11698:9;1514:21374;;11729:42;1514:21374;;-1:-1:-1;;;11753:18:10;;11733:11;;11753:18;15734:562;15824:10;1514:21374;15789:15;;15818:16;;15814:29;;15870:15;15789;;15870;:::i;:::-;15789;15824:10;1514:21374;15943:12;1514:21374;15958:15;15943:30;16022:18;15943:30;;;;:::i;:::-;16022:18;;:::i;:::-;16054:15;;16050:28;;16182:30;1514:21374;16088:26;16124;1514:21374;16088:26;1514:21374;16088:26;:::i;:::-;;1514:21374;16124:26;:::i;:::-;1514:21374;;15943:12;1514:21374;16182:30;;:::i;:::-;16226:24;;;16222:67;;15734:562;;:::o;16222:67::-;16088:26;16257:32;1514:21374;;;;;;16257:32;15734:562::o;16050:28::-;16071:7;;;;;:::o;15814:29::-;15836:7;:::o;16302:371::-;16661:4;16302:371;10404:1148:7;;;;;1514:21374:10;;-1:-1:-1;1514:21374:10;16372:9;1514:21374;;;-1:-1:-1;1514:21374:10;16415:6;;;1514:21374;;1984:4;16449:25;1514:21374;;;;16449:25;;:::i;:::-;1984:4;16494:17;;;;16490:154;;16302:371;16661:4;;;;:::i;16490:154::-;16543:17;16574:9;16543:17;16606:27;16543:17;;:::i;:::-;16574:9;;:18;1514:21374;;;16574:18;:::i;:::-;1514:21374;;16606:27;1514:21374;16606:27;:::i;:::-;;1514:21374;16490:154;;;;;16858:262;10404:1148:7;;;;;1514:21374:10;-1:-1:-1;1514:21374:10;16928:9;1514:21374;;17084:29;1514:21374;-1:-1:-1;1514:21374:10;17084:19;16971:6;;;1514:21374;1984:4;17005:25;1514:21374;;;;;;17005:25;;:::i;:::-;1984:4;1514:21374;;;17084:9;1514:21374;17084:19;:::i;:::-;:29;:::i;:::-;:9;1514:21374;16858:262::o;14188:1540::-;14309:9;1514:21374;;;;;;;14188:1540;14332:10;;:26;;;;14188:1540;14332:55;;;;14188:1540;14328:74;;14431:12;1514:21374;14615:15;;14750:17;;14496:13;;14615:15;14930:9;;14569:3;1921:2;14511:16;;;;:33;;;14569:3;14511:56;;;14569:3;14511:56;;;14605:25;;;;:::i;:::-;14648:22;;;;14644:33;;1984:4;1514:21374;;14750:26;1514:21374;;;14750:26;;:::i;:::-;1984:4;14800:9;;;14796:20;;14866:1;1514:21374;;;;;;;14856:30;;;:40;:30;;:::i;:40::-;14930:19;;;;:::i;:::-;14978:26;;;;;;:55;;;15066:16;;;;:::i;:::-;15096:12;15153:15;;;;;15188:16;;;15222:15;15149:314;;15480:9;;15476:20;;1514:21374;;;;;;;;;;;;;;15598:19;15631;15598;15588:29;15664:16;15598:19;;;15694:17;15598:19;;;:::i;:::-;15588:29;;:::i;:::-;15631:19;;:::i;:::-;15664:16;;:::i;:::-;15694:17;;:::i;:::-;14569:3;-1:-1:-1;;1514:21374:10;;;;14866:1;1514:21374;14496:13;;;;;;1514:21374;-1:-1:-1;;;1514:21374:10;;;;;;;;;-1:-1:-1;;;1514:21374:10;;;;;;;;15476:20;15491:5;;;;;;;;;;;;;;14188:1540::o;15149:314::-;15284:11;;;;;;;;:::i;:::-;-1:-1:-1;;1514:21374:10;;;;;;;15283:24;;;;:::i;:::-;15329:16;;;;15325:38;;15149:314;15389:11;;;;:::i;:::-;15422:12;;;;15418:30;;15149:314;;;;15418:30;15436:12;-1:-1:-1;15418:30:10;;;15325:38;15347:16;;-1:-1:-1;15325:38:10;;1514:21374;-1:-1:-1;;;1514:21374:10;;;;;;;;14978:55;;;;;;14644:33;14672:5;;;;;;;;;;;;14188:1540::o;14511:56::-;14548:19;;;;14511:56;;:33;14531:13;;;;14511:33;;14328:74;14389:13;;;;;;;;:::o;14332:55::-;1514:21374;14362:12;1514:21374;14378:9;-1:-1:-1;14362:25:10;14332:55;;:26;14346:12;;;14332:26;","linkReferences":{},"immutableReferences":{"1380":[{"start":5372,"length":32},{"start":6073,"length":32}],"1383":[{"start":689,"length":32},{"start":4331,"length":32},{"start":4946,"length":32}],"1386":[{"start":2586,"length":32},{"start":4582,"length":32},{"start":5995,"length":32}],"1389":[{"start":2710,"length":32},{"start":3760,"length":32},{"start":6033,"length":32},{"start":7638,"length":32}],"1393":[{"start":1037,"length":32},{"start":6867,"length":32}],"1396":[{"start":2449,"length":32},{"start":6954,"length":32}],"1399":[{"start":1839,"length":32},{"start":3408,"length":32},{"start":5734,"length":32},{"start":7919,"length":32}],"1402":[{"start":1878,"length":32},{"start":2745,"length":32},{"start":5203,"length":32},{"start":6152,"length":32},{"start":7767,"length":32}],"1405":[{"start":1371,"length":32},{"start":1670,"length":32},{"start":2108,"length":32},{"start":3060,"length":32},{"start":3349,"length":32},{"start":6742,"length":32},{"start":7463,"length":32},{"start":8593,"length":32},{"start":9080,"length":32}],"1408":[{"start":980,"length":32},{"start":1800,"length":32},{"start":2156,"length":32},{"start":7529,"length":32},{"start":8556,"length":32}],"1411":[{"start":1412,"length":32},{"start":1457,"length":32},{"start":1512,"length":32},{"start":1602,"length":32},{"start":2996,"length":32},{"start":3288,"length":32},{"start":3849,"length":32},{"start":8124,"length":32},{"start":8522,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"accountOf(address)","signatureHash4":"0x8086b8ba","signatureHash32":"0x8086b8ba3d2a7efad127c70ae70125bb23e647bef5598fcfa24dea14b84996b0"},{"signature":"accRewardPerHash()","signatureHash4":"0x2f663586","signatureHash32":"0x2f663586d17ce682da0e3e68ec9dcc82d1d4f6fe16ea50197b872e6c956e8d0b"},{"signature":"activate()","signatureHash4":"0x0f15f4c0","signatureHash32":"0x0f15f4c010fae13cc621a6e86a832bb05fc2e310dc65efb4daae09a55330f2db"},{"signature":"activatedCount()","signatureHash4":"0x06f9e52c","signatureHash32":"0x06f9e52cb39e22a753d4a9f205a3b22b3b97b5a21a1272c66ff7aebe010fe593"},{"signature":"activateWithBnb()","signatureHash4":"0xc08b8aa1","signatureHash32":"0xc08b8aa1806089ffd2a7e46d51b7d91433dfa930aa6dcedb4933eeed2d83845d"},{"signature":"activationFee()","signatureHash4":"0x77d630ae","signatureHash32":"0x77d630ae097746cd234bc982a1f48a4a3361cb24694592130e5b6bad7d8d002c"},{"signature":"activationHash()","signatureHash4":"0x3ddce107","signatureHash32":"0x3ddce107aaf5b609230b68f9f5071dee1abada7aff899dfe73af9ec91f2e1845"},{"signature":"allTiers()","signatureHash4":"0x205e0c11","signatureHash32":"0x205e0c1187f0bd9444a20e58880a4295e5f5aefb9518d73a0d0e8f71d238a9f0"},{"signature":"baseRatePerSecond()","signatureHash4":"0xd90e0264","signatureHash32":"0xd90e02643c8ddaccdc19c8ce9e99242521ad4b14acdfe2a2465d83735dd2842e"},{"signature":"bnbAmountForFee()","signatureHash4":"0xfe128e13","signatureHash32":"0xfe128e13746f1eec830393760e48ebad13ed941f6f5d899a7df96a344d1ff316"},{"signature":"bnbPrice()","signatureHash4":"0x576dde12","signatureHash32":"0x576dde12dd20480d912d7ed8b1c4929d92f2786b9eadad3d475a80bf95c07efc"},{"signature":"bnbUsdFeed()","signatureHash4":"0xd8ac81af","signatureHash32":"0xd8ac81af53036c2f659b3ca8d571d57fae15c6ec30d8352d4ed2a18bea629a14"},{"signature":"BURN()","signatureHash4":"0xc0a2526c","signatureHash32":"0xc0a2526c4d26b4a9ab1997a87f72a2602f724c8ed20819a3c8357687e62aad0a"},{"signature":"buyMiner(uint256)","signatureHash4":"0x62de3bd1","signatureHash32":"0x62de3bd18c603051a341aff5962f943b95337e6d2f31d46c91dc59d4584af54c"},{"signature":"claim()","signatureHash4":"0x4e71d92d","signatureHash32":"0x4e71d92d1cab44b435a6dcbe7dcfe75cf72953916cfa3842f5057ce194aa60e2"},{"signature":"currentRatePerSecond()","signatureHash4":"0xa878b143","signatureHash32":"0xa878b1433ad765de67461d66904329e3586130fcc323455c0a2ddaadaaa95d71"},{"signature":"emittedTotal()","signatureHash4":"0x6ce41f62","signatureHash32":"0x6ce41f627bcbe62bf32321bceebb73c01c3a1a5e4056c6115ab1f909df7ff6e8"},{"signature":"epoch()","signatureHash4":"0x900cf0cf","signatureHash32":"0x900cf0cf594b4d6fb869e414c5a8e8475887548991dec95223717d0d2ba052c7"},{"signature":"feedDecimals()","signatureHash4":"0xc23953d0","signatureHash32":"0xc23953d0c6c633f011430d638296f150155300bed5d06c23bc702b09853892ad"},{"signature":"freeHash()","signatureHash4":"0x8b5cdd29","signatureHash32":"0x8b5cdd29d150ef4672b0c5900b029d19c01988da6a567b04c8616b8fc873325d"},{"signature":"halvingFactor()","signatureHash4":"0xe6674a9a","signatureHash32":"0xe6674a9a20ada30748b815adda5490358f8ee8adae802b7f32bebc0829ce22be"},{"signature":"halvingInterval()","signatureHash4":"0x6a47aa06","signatureHash32":"0x6a47aa065b0d19724c88a6dab4060ad915ef85233b3b57f0ace40465b24b8318"},{"signature":"hashOf(address)","signatureHash4":"0x5d007281","signatureHash32":"0x5d007281ccbfc9f19ef1840bd3d64420c667fe002ad9191e5e92bb1ea1b293f6"},{"signature":"lastUpdate()","signatureHash4":"0xc0463711","signatureHash32":"0xc0463711bb0cf949c0bd43b4cba6f69731fc286b6d6f1b0559d8ca0263a16714"},{"signature":"liveEmitted()","signatureHash4":"0x3590bafe","signatureHash32":"0x3590bafe312b14a6bd0739d0b825b8ab035ba51af54db0912beffdb8bc1256bf"},{"signature":"MAX_FEED_AGE()","signatureHash4":"0x696453b8","signatureHash32":"0x696453b8e4ebab7dd1ef750c5b397df3c4ac64a20458971a0cb4ec8ec34bdb68"},{"signature":"MAX_HALVINGS()","signatureHash4":"0x36f1e6c0","signatureHash32":"0x36f1e6c09b986c05aa49fbe27871d609c469f00838416787fe50e9d9e7ef1b19"},{"signature":"ownedOf(address)","signatureHash4":"0x68752274","signatureHash32":"0x68752274d87cf1835b68cefb4b3a17089ed7e47c4abd83a5b51a4ab503c7a1bf"},{"signature":"pendingOf(address)","signatureHash4":"0xf44136a1","signatureHash32":"0xf44136a1e0a07d21326fca9bf65d3ee37417e0eec6b7e57e9785b508454ec62a"},{"signature":"rateForHash(uint256)","signatureHash4":"0xa2b1b80e","signatureHash32":"0xa2b1b80ed6e7119bf8f24a7157efb3fca417ed4cf9d3033c5375f5ebbcbaa26e"},{"signature":"rateOf(address)","signatureHash4":"0xcbf09802","signatureHash32":"0xcbf09802fa8dac4cb229fcae15b37eb20506088243ef2c16201af383dacb1067"},{"signature":"register()","signatureHash4":"0x1aa3a008","signatureHash32":"0x1aa3a0089645bc8f33baa54bd0f4a78a2539c5d9f817cf3ef696a41874798fb9"},{"signature":"registeredCount()","signatureHash4":"0x210ff9bb","signatureHash32":"0x210ff9bb5b3450628a7bc2b2abd1769e05574171d5269372b55be7f56094aaf7"},{"signature":"stats()","signatureHash4":"0xd80528ae","signatureHash32":"0xd80528aec515743aac3ed54ef607f130c9265a2bc062ca4d4dae691096d33e05"},{"signature":"supplyCap()","signatureHash4":"0x8f770ad0","signatureHash32":"0x8f770ad0d077d18483d7caeaf08bed13ca7daa3a89ae6bafa549c15223b231b3"},{"signature":"TIER_COUNT()","signatureHash4":"0x36331c8f","signatureHash32":"0x36331c8f6cb3f44ee8611afcb1c3aad069eee1b71ff86e51e5cfea8b75180903"},{"signature":"tierOf(uint256)","signatureHash4":"0x53f96df2","signatureHash32":"0x53f96df2b33dccc370fe17904b5af4b9f0851a3c98f592940754a99a9a18e89d"},{"signature":"tierSold(uint256)","signatureHash4":"0xd7b2afb5","signatureHash32":"0xd7b2afb52be18cee789149a228106f04db1468b968e6d7d6c4b8e23a56af82c6"},{"signature":"token()","signatureHash4":"0xfc0c546a","signatureHash32":"0xfc0c546a8dce9d6e9b97c086302918c9106d97a17809f6bcacfe02124763cb39"},{"signature":"toNextHalving()","signatureHash4":"0xb002e11f","signatureHash32":"0xb002e11f0a6d6cd6cad7182d475dfa7e5fd755e2982ac245a95a76724a3ef76d"},{"signature":"totalBnbReceived()","signatureHash4":"0xc1f5138a","signatureHash32":"0xc1f5138ab2de31308d6b062213e8a4cfe50d7e033f67bd3dc9cbe1b2539efb5f"},{"signature":"totalBurned()","signatureHash4":"0xd89135cd","signatureHash32":"0xd89135cddb3b6c41c0720c8d7275cdd8b5478920e58bcf7bd96e92e3c514ddb2"},{"signature":"totalDebt()","signatureHash4":"0xfc7b9c18","signatureHash32":"0xfc7b9c18c6db75a723f81b7cede941cf521aa7e6b90c04dfa14c557691912bf9"},{"signature":"totalHash()","signatureHash4":"0x4a5628c5","signatureHash32":"0x4a5628c5610ae69a50b12e3d01697858c4299a4df65f2913272b576759760b50"},{"signature":"totalMinted()","signatureHash4":"0xa2309ff8","signatureHash32":"0xa2309ff8a1f86a4fb15fe22cc66ca2240889c22973a8705ca226daf66b420ca7"},{"signature":"totalPendingStored()","signatureHash4":"0x9cc85c95","signatureHash32":"0x9cc85c95a6494c44d3ac6d3aacea70ba010f95e0586bd505677f59b113c4c38c"},{"signature":"treasury()","signatureHash4":"0x61d027b3","signatureHash32":"0x61d027b30ea0954414618cb8201bc912d75d6474f7f913dfdc4b5172d13bee5b"},{"signature":"usdt()","signatureHash4":"0x2f48ab7d","signatureHash32":"0x2f48ab7d4c06f0247b855e84d1c3e37a005e2105e24c196fc1466600f4a12585"},{"signature":"usdValueOf(uint256)","signatureHash4":"0x16c2d30f","signatureHash32":"0x16c2d30f9bce70b6151d7a0f8fb178c22c5ecbbc483392bb42ac9d69c99909f2"}],"event":[{"signature":"Activated(address,uint256,uint256)","signatureHash4":"0xf89be561","signatureHash32":"0xf89be561c4ce44410305a86555ebae8b579de22890a703ac89051c5971b5d4dc"},{"signature":"ActivatedWithBnb(address,uint256,uint256)","signatureHash4":"0x92873c75","signatureHash32":"0x92873c7542ae0db4098e52204b79cdd356bc556ccf33776ed09568dd842111e7"},{"signature":"Claimed(address,uint256,uint256)","signatureHash4":"0x987d620f","signatureHash32":"0x987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a"},{"signature":"Halved(uint256,uint256)","signatureHash4":"0x817dd46c","signatureHash32":"0x817dd46c9e086ff5d522e93cfaf06ec87cf8c9af5b02982f5d4a5b7f2cd3e334"},{"signature":"MinerBought(address,uint256,uint256,uint256,uint256)","signatureHash4":"0x02c783c8","signatureHash32":"0x02c783c8f6fb950cd4c364db52f36a1823b864f2ef1790005074c61d9a46cf40"},{"signature":"Registered(address,uint256)","signatureHash4":"0x6f3bf3fa","signatureHash32":"0x6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c"}],"error":[{"signature":"AlreadyActivated()","signatureHash4":"0xef65161f","signatureHash32":"0xef65161f47b198d60985ba520f0b14717f8099ebe93eff3b039c432a820a0263"},{"signature":"AlreadyRegistered()","signatureHash4":"0x3a81d6fc","signatureHash32":"0x3a81d6fc79a5635b1f06f5006b0b65f8bc72a09a41893acedbabc02c660943ca"},{"signature":"BadConfig()","signatureHash4":"0x07cc321c","signatureHash32":"0x07cc321ce71a3eebb30014b3b8f136f5e867b17e2b76292bf086143aa7c7b50c"},{"signature":"BadPrice()","signatureHash4":"0xfd1ee349","signatureHash32":"0xfd1ee34991eddd196c50d188f87a9503734e90f4e5ce5aaa05d6fef640bb37a4"},{"signature":"BadTier()","signatureHash4":"0x21a9b143","signatureHash32":"0x21a9b143c3c125504b5386011d14f67104ee817465bc4bf4dfeb70b85ec13c28"},{"signature":"InsufficientBnb()","signatureHash4":"0x5110f010","signatureHash32":"0x5110f010e485849a025f6e28656464968a15a75221f3a5d0a0a49851a8238295"},{"signature":"NotActivated()","signatureHash4":"0x037c597f","signatureHash32":"0x037c597f938de672a2145c298a0a52cf353878d6a88f21c02969ffdbd232b44d"},{"signature":"NothingToClaim()","signatureHash4":"0x969bf728","signatureHash32":"0x969bf7288f744225521096ebffff657851af77dd4c63700d76b8d1cf6481d1f1"},{"signature":"NotRegistered()","signatureHash4":"0xaba47339","signatureHash32":"0xaba47339dbaad712368e6665e6e6eade636ab60e9b7dba037407409b19d7a053"},{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"},{"signature":"StalePrice()","signatureHash4":"0x19abf40e","signatureHash32":"0x19abf40e7c2e0280d6137a5d95d9f3793d913552f00d0e25e4ab4388bcc0d573"},{"signature":"TierLimitReached()","signatureHash4":"0xc395fbf4","signatureHash32":"0xc395fbf4b30192c71dc9c626e5890a3d9525b6db6c8e998fa6e4610355440a5e"},{"signature":"TransferFailed()","signatureHash4":"0x90b8ec18","signatureHash32":"0x90b8ec1877afffd816d05d9b13947f3ff18ec5851c38bad15ec2b710f92391b1"},{"signature":"ZeroAddress()","signatureHash4":"0xd92e233d","signatureHash32":"0xd92e233df2717d4a40030e20904abd27b68fcbeede117eaaccbbdac9618c8c73"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"56","address":"0x6884D40B10c55A6c2faB2D3c829d41c3C798279D"}