From a40385a5a0dee5361ebddac1c4c86ac3111cbe18 Mon Sep 17 00:00:00 2001 From: lash Date: Thu, 5 Oct 2023 17:41:52 +0100 Subject: [PATCH] Truncate approve request out of value bounds --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../DemurrageTokenSingleNocap.metadata.json | 2 +- python/setup.cfg | 2 +- python/tests/test_basic.py | 24 +++++++++++++++++++ solidity/DemurrageTokenSingleNocap.sol | 11 ++++++++- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 8c46338..4ade302 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b506040516200662338038062006623833981810160405281019062000038919062000859565b6801000000000000000083600f0b126200005157600080fd5b6200005b6200056e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b7a565b508560079081620000bf919062000b7a565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c90565b60c081815250506200010d60016200029f640100000000026401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016284620002c6640100000000026401000000009004565b600f0b60e081600f0b815250506200019e6000600260009054906101000a9004600f0b600060016200031a640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000cdb565b6000677fffffffffffffff821115620002b757600080fd5b6040829060020a029050919050565b60008082600f0b13620002d857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af62000305846200039e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003246200056e565b6200032e6200056e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003b057600080fd5b60008083600f0b9050680100000000000000008112620003ec576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126200041b576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000448576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000474576008819060008212600003808260020a82851804189250505090506008820191505b601081126200049f576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004ca576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004da576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000561578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000507565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061382620005c8565b810181811067ffffffffffffffff82111715620006355762000634620005d9565b5b80604052505050565b60006200064a620005aa565b905062000658828262000608565b919050565b600067ffffffffffffffff8211156200067b576200067a620005d9565b5b6200068682620005c8565b9050602081019050919050565b60005b83811015620006b357808201518184015260208101905062000696565b60008484015250505050565b6000620006d6620006d0846200065d565b6200063e565b905082815260208101848484011115620006f557620006f4620005c3565b5b6200070284828562000693565b509392505050565b600082601f830112620007225762000721620005be565b5b815162000734848260208601620006bf565b91505092915050565b600060ff82169050919050565b62000755816200073d565b81146200076157600080fd5b50565b60008151905062000775816200074a565b92915050565b600081600f0b9050919050565b62000793816200077b565b81146200079f57600080fd5b50565b600081519050620007b38162000788565b92915050565b6000819050919050565b620007ce81620007b9565b8114620007da57600080fd5b50565b600081519050620007ee81620007c3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082182620007f4565b9050919050565b620008338162000814565b81146200083f57600080fd5b50565b600081519050620008538162000828565b92915050565b60008060008060008060c08789031215620008795762000878620005b4565b5b600087015167ffffffffffffffff8111156200089a5762000899620005b9565b5b620008a889828a016200070a565b965050602087015167ffffffffffffffff811115620008cc57620008cb620005b9565b5b620008da89828a016200070a565b9550506040620008ed89828a0162000764565b94505060606200090089828a01620007a2565b93505060806200091389828a01620007dd565b92505060a06200092689828a0162000842565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200098657607f821691505b6020821081036200099c576200099b6200093e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009c7565b62000a158683620009c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a5862000a5262000a4c84620007b9565b62000a2d565b620007b9565b9050919050565b6000819050919050565b62000a748362000a37565b62000a8c62000a838262000a5f565b848454620009d7565b825550505050565b600090565b62000aa362000a94565b62000ab081848462000a69565b505050565b5b8181101562000ad85762000acc60008262000a99565b60018101905062000ab6565b5050565b601f82111562000b275762000af181620009a2565b62000afc84620009b7565b8101602085101562000b0c578190505b62000b2462000b1b85620009b7565b83018262000ab5565b50505b505050565b60008160020a8304905092915050565b600062000b4f6000198460080262000b2c565b1980831691505092915050565b600062000b6a838362000b3c565b9150826002028217905092915050565b62000b858262000933565b67ffffffffffffffff81111562000ba15762000ba0620005d9565b5b62000bad82546200096d565b62000bba82828562000adc565b600060209050601f83116001811462000bf2576000841562000bdd578287015190505b62000be9858262000b5c565b86555062000c59565b601f19841662000c0286620009a2565b60005b8281101562000c2c5784890151825560018201915060208501945060208101905062000c05565b8683101562000c4c578489015162000c48601f89168262000b3c565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c9d82620007b9565b915062000caa83620007b9565b925082820262000cba81620007b9565b9150828204841483151762000cd45762000cd362000c61565b5b5092915050565b60805160a05160c05160e0516158c862000d5b600039600081816118e9015281816127d4015281816129c10152612dbd0152600081816120360152818161279701528181612d1501528181612f5a01526131a701526000818161206201528181612f86015281816131c8015261320d0152600061194701526158c86000f3fe608060405234801561001057600080fd5b50600436106103e2576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e1161021c578063a457c2d711610137578063d89135cd116100ca578063e69571af11610099578063e69571af14610ce3578063e809529514610d13578063eda4e6d614610d31578063f2fde38b14610d4f576103e2565b8063d89135cd14610c35578063da2824a814610c53578063dd62ed3e14610c83578063e54063a614610cb3576103e2565b8063c0ab707711610106578063c0ab707714610bad578063d340ef8a14610bdd578063d5abeb0114610bfb578063d7a52fa914610c19576103e2565b8063a457c2d714610b11578063a9059cbb14610b41578063b1cb0db314610b71578063b470aade14610b8f576103e2565b80638832e6e3116101af57806394d008ef1161017e57806394d008ef14610a9b57806395d89b4114610ab75780639f24880814610ad5578063a2309ff814610af3576103e2565b80638832e6e314610a275780638da5cb5b14610a435780638f0b2d5d14610a615780638f1df6bc14610a7d576103e2565b80637445e33a116101eb5780637445e33a1461098b57806374bedb95146109bb57806384dde4af146109d957806386fe212d146109f7576103e2565b80636a2d094e146108f15780636f8b44b01461092157806370a082311461093d578063731f237c1461096d576103e2565b8063313334871161030c57806344df8e701161029f57806358b2833b1161026e57806358b2833b146108555780635ae06f7e146108735780635f408c04146108a35780636787a9be146108c1576103e2565b806344df8e70146107a757806347a50517146107c55780634abfbba2146107f557806351b4541c14610825576103e2565b806340452d91116102db57806340452d91146106f957806342966c681461072b578063449a52f81461075b57806344d171871461078b576103e2565b8063313334871461065d578063313ce5671461068d57806331a5995d146106ab57806339509351146106c9576103e2565b806318cbbcfc1161038457806323b872dd1161035357806323b872dd1461059d5780632a7aec09146105cd5780632b29ba23146105fd5780632c1758c11461062d576103e2565b806318cbbcfc146105015780631989c6a81461051f578063213d1e1e1461053d57806323a859441461056d576103e2565b8063095ea7b3116103c0578063095ea7b31461046557806309f28f3c1461049557806311c56615146104b357806318160ddd146104e3576103e2565b806301681a62146103e757806301ffc9a71461041757806306fdde0314610447575b600080fd5b61040160048036038101906103fc9190614afd565b610d7f565b60405161040e9190614b43565b60405180910390f35b610431600480360381019061042c9190614bb6565b610ecd565b60405161043e9190614bfe565b60405180910390f35b61044f6111bb565b60405161045c9190614ca9565b60405180910390f35b61047f600480360381019061047a9190614cf7565b611249565b60405161048c9190614bfe565b60405180910390f35b61049d611485565b6040516104aa9190614d53565b60405180910390f35b6104cd60048036038101906104c89190614d9a565b611498565b6040516104da9190614b43565b60405180910390f35b6104eb6114e8565b6040516104f89190614b43565b60405180910390f35b6105096114ff565b6040516105169190614b43565b60405180910390f35b610527611504565b6040516105349190614b43565b60405180910390f35b61055760048036038101906105529190614f7b565b611510565b6040516105649190614b43565b60405180910390f35b61058760048036038101906105829190614f7b565b611529565b6040516105949190614bfe565b60405180910390f35b6105b760048036038101906105b29190614fa8565b611591565b6040516105c49190614bfe565b60405180910390f35b6105e760048036038101906105e29190614f7b565b6117af565b6040516105f49190614d53565b60405180910390f35b61061760048036038101906106129190614afd565b6117e7565b6040516106249190614bfe565b60405180910390f35b61064760048036038101906106429190614ffb565b611895565b6040516106549190614bfe565b60405180910390f35b61067760048036038101906106729190615028565b6118c8565b6040516106849190614b43565b60405180910390f35b610695611945565b6040516106a29190614b43565b60405180910390f35b6106b3611969565b6040516106c09190614b43565b60405180910390f35b6106e360048036038101906106de9190614cf7565b61196f565b6040516106f09190614bfe565b60405180910390f35b610713600480360381019061070e9190614ffb565b611b05565b60405161072293929190615095565b60405180910390f35b61074560048036038101906107409190614ffb565b611b74565b6040516107529190614bfe565b60405180910390f35b61077560048036038101906107709190614cf7565b611d45565b6040516107829190614bfe565b60405180910390f35b6107a560048036038101906107a09190615131565b611f1c565b005b6107af611f9a565b6040516107bc9190614bfe565b60405180910390f35b6107df60048036038101906107da9190614afd565b611fe9565b6040516107ec9190614b43565b60405180910390f35b61080f600480360381019061080a9190614ffb565b612032565b60405161081c9190614b43565b60405180910390f35b61083f600480360381019061083a9190614ffb565b612092565b60405161084c9190614b43565b60405180910390f35b61085d6120b3565b60405161086a9190614b43565b60405180910390f35b61088d60048036038101906108889190614afd565b6120b9565b60405161089a9190614bfe565b60405180910390f35b6108ab6121c3565b6040516108b891906151c1565b60405180910390f35b6108db60048036038101906108d69190614ffb565b612290565b6040516108e89190614b43565b60405180910390f35b61090b60048036038101906109069190614ffb565b6122d1565b6040516109189190614b43565b60405180910390f35b61093b60048036038101906109369190614ffb565b6122f2565b005b61095760048036038101906109529190614afd565b6123ba565b6040516109649190614b43565b60405180910390f35b610975612421565b6040516109829190614b43565b60405180910390f35b6109a560048036038101906109a09190614f7b565b612432565b6040516109b29190614b43565b60405180910390f35b6109c3612460565b6040516109d09190614b43565b60405180910390f35b6109e1612466565b6040516109ee91906151eb565b60405180910390f35b610a116004803603810190610a0c9190614ffb565b61248c565b604051610a1e9190614b43565b60405180910390f35b610a416004803603810190610a3c9190615131565b612573565b005b610a4b612584565b604051610a5891906151eb565b60405180910390f35b610a7b6004803603810190610a769190614afd565b6125aa565b005b610a8561265f565b604051610a929190614bfe565b60405180910390f35b610ab56004803603810190610ab09190615131565b612920565b005b610abf612931565b604051610acc9190614ca9565b60405180910390f35b610add6129bf565b604051610aea9190614d53565b60405180910390f35b610afb6129e3565b604051610b089190614b43565b60405180910390f35b610b2b6004803603810190610b269190614cf7565b6129ed565b604051610b389190614bfe565b60405180910390f35b610b5b6004803603810190610b569190614cf7565b612c0c565b604051610b689190614bfe565b60405180910390f35b610b79612d0d565b604051610b869190614b43565b60405180910390f35b610b97612d13565b604051610ba49190614b43565b60405180910390f35b610bc76004803603810190610bc29190614ffb565b612d37565b604051610bd49190614b43565b60405180910390f35b610be5612ebe565b604051610bf29190614b43565b60405180910390f35b610c03612ec4565b604051610c109190614b43565b60405180910390f35b610c336004803603810190610c2e9190614ffb565b612eca565b005b610c3d61300a565b604051610c4a9190614b43565b60405180910390f35b610c6d6004803603810190610c689190614afd565b613014565b604051610c7a9190614bfe565b60405180910390f35b610c9d6004803603810190610c989190615206565b6130e8565b604051610caa9190614b43565b60405180910390f35b610ccd6004803603810190610cc89190614f7b565b61310d565b604051610cda9190614b43565b60405180910390f35b610cfd6004803603810190610cf89190615246565b613121565b604051610d0a919061531c565b60405180910390f35b610d1b6131a1565b604051610d289190615362565b60405180910390f35b610d3961320b565b604051610d469190614b43565b60405180910390f35b610d696004803603810190610d649190614afd565b61322f565b604051610d769190614bfe565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5891906153ac565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ebc9190614b43565b60405180910390a380915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f2157600190506111b6565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f7357600190506111b6565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc557600190506111b6565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101757600190506111b6565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106957600190506111b6565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bb57600190506111b6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361110d57600190506111b6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361115f57600190506111b6565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111b157600190506111b6565b600090505b919050565b600680546111c89061540f565b80601f01602080910402602001604051908101604052809291908181526020018280546111f49061540f565b80156112415780601f1061121657610100808354040283529160200191611241565b820191906000526020600020905b81548152906001019060200180831161122457829003601f168201915b505050505081565b60008060006112566121c3565b905060028160ff160361126e5760009250505061147f565b60008160ff1611156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061548c565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561137e576000841461137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374906154f8565b60405180910390fd5b5b61138661265f565b5061139084612290565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516114709190614b43565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806114bf6114a785613378565b6114ba6114b46001613378565b8661339e565b613405565b90506114ca81613484565b67ffffffffffffffff16846114df9190615518565b91505092915050565b6000600b546008546114fa9190615518565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff161115611546576000905061158c565b6000826020015168ffffffffffffffffff161115611567576000905061158c565b6000826040015167ffffffffffffffff161115611587576000905061158c565b600190505b919050565b60008060008061159f6121c3565b905060028160ff16036115b857600093505050506117a8565b60008160ff1611156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69061548c565b60405180910390fd5b61160761265f565b5061161185612290565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561169c57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117289190615518565b9250508190555061173a8787856134b9565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516117999190614b43565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036117de576117db6001613378565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061188e5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000600f82106118a457600080fd5b600082036118b957600f6012541490506118c3565b8160125483161490505b919050565b6000806000806118d786613378565b92506118e285613378565b915061190e7f000000000000000000000000000000000000000000000000000000000000000083613405565b9050611919816134dc565b90506119258382613405565b905061193081613484565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b60008061197a61265f565b5061198483612290565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1291906153ac565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611af29190614b43565b60405180910390a3600191505092915050565b60008181548110611b1557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611b7f6121c3565b60ff1614611b8c57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c315750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790615598565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611cbc57600080fd5b6000611cc783612290565b9050611cd33382613569565b5082600b6000828254611ce691906153ac565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611d339190614b43565b60405180910390a26001915050919050565b6000806000611d526121c3565b60ff1614611d5f57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e045750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a90615598565b60405180910390fd5b611e4b61265f565b5060006011541115611e745760115483600854611e6891906153ac565b1115611e7357600080fd5b5b8260086000828254611e8691906153ac565b92505081905550611e9683612290565b9050611ea2848261366d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611f009190614b43565b60405180910390a3611f1061372e565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190615604565b60405180910390fd5b611f9383611b74565b5050505050565b6000611fe4600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b74565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826120609190615624565b7f000000000000000000000000000000000000000000000000000000000000000061208b91906153ac565b9050919050565b6000603c82426120a29190615518565b6120ac9190615695565b9050919050565b60035481565b60006120c8600160ff16611895565b156120d257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061215957503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61216257600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff16156121e3576001905061228d565b6000600f54036121f6576000905061228d565b600f54421061228857612223603c6003546122119190615695565b600f5461221e9190615518565b612d37565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe94260405161226e9190614b43565b60405180910390a161227e61265f565b506002905061228d565b600090505b90565b6000806122b461229f84613378565b600260009054906101000a9004600f0b6138f2565b90506122bf81613484565b67ffffffffffffffff16915050919050565b6000603c82426122e19190615518565b6122eb9190615695565b9050919050565b6122ff600860ff16611895565b1561230957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461236357600080fd5b61236b6114e8565b811161237657600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516123a89190614b43565b60405180910390a28060118190555050565b6000806000806123d16123cc86611fe9565b613378565b92506123de600354612092565b90506123f983600260009054906101000a9004600f0b613405565b915061241761240783613484565b67ffffffffffffffff16826118c8565b9350505050919050565b600061242d6000612d37565b905090565b600080600061244084611510565b915061244b846117af565b90506124578282611498565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c890615712565b60405180910390fd5b6000601254831614612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f9061577e565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516125619190614b43565b60405180910390a26012549050919050565b61257d8484611d45565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125b7600260ff16611895565b156125c157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461261b57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612669614a4f565b612671614a4f565b612679614a4f565b6000806000806000612689612421565b5061269261397e565b975061269d88611529565b156126b35760009850505050505050505061291d565b6000600954815481106126c9576126c861579e565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506127768861310d565b945060018561278591906153ac565b9050612790866117af565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006127c09190615624565b6127ca9190615695565b91506128066128017f00000000000000000000000000000000000000000000000000000000000000006127fc85613378565b613405565b6134dc565b925061281c6000846128166114e8565b84613121565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506128d887613b14565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516129089190614b43565b60405180910390a16001985050505050505050505b90565b61292a8484611d45565b5050505050565b6007805461293e9061540f565b80601f016020809104026020016040519081016040528092919081815260200182805461296a9061540f565b80156129b75780601f1061298c576101008083540402835291602001916129b7565b820191906000526020600020905b81548152906001019060200180831161299a57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b6000806129f983612290565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612a8457600080fd5b612a8c61265f565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b199190615518565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612bf99190614b43565b60405180910390a3600191505092915050565b600080600080612c1a6121c3565b905060028160ff1603612c335760009350505050612d07565b60008160ff161115612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c719061548c565b60405180910390fd5b612c8261265f565b50612c8c85612290565b9250612c993387856134b9565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612cf89190614b43565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612d61576000945050505050612eb9565b612d6c600354612092565b925060008303612d83576000945050505050612eb9565b600260009054906101000a9004600f0b9050600086118015612da457508286105b15612dad578592505b612db683613378565b9150612de27f000000000000000000000000000000000000000000000000000000000000000083613405565b9350612ded846134dc565b9350612e08600260009054906101000a9004600f0b85613405565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612e509190615624565b600354612e5d91906153ac565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612ea99190614d53565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612eda600460ff16611895565b15612ee457600080fd5b601060009054906101000a900460ff1615612efe57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f5857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612f849190615624565b7f0000000000000000000000000000000000000000000000000000000000000000612faf91906153ac565b9150600f548211612fbf57600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f54604051612ffd9190614b43565b60405180910390a2505050565b6000600b54905090565b6000613023600160ff16611895565b1561302d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461308757600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b6000816000015163ffffffff169050919050565b613129614a4f565b613131614a4f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426131f29190615518565b6131fc9190615695565b61320691906153ac565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461328c57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff82111561338f57600080fd5b6040829060020a029050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156133f257506f7fffffffffffffffffffffffffffffff600f0b8113155b6133fb57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561347157506f7fffffffffffffffffffffffffffffff600f0b8113155b61347a57600080fd5b8091505092915050565b60008082600f0b121561349657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006134c58483613569565b506134d0838361366d565b50600190509392505050565b60006840000000000000000082600f0b126134f657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561352a5760009050613564565b6135616080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613c33565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135c357600092505050613667565b6135cc85611fe9565b915083821015613611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360890615819565b60405180910390fd5b838261361d9190615518565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036136c757600092505050613728565b6136d085611fe9565b915083826136de91906153ac565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000613738614a4f565b60006137426114e8565b9050600060016000805490506137589190615518565b815481106137695761376861579e565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506138449190615518565b815481106138555761385461579e565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361390357600080fd5b600082600f0b604085600f0b9060020a028161392257613921615666565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561396b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61397457600080fd5b8091505092915050565b613986614a4f565b61398e614a4f565b613996614a4f565b600080600954815481106139ad576139ac61579e565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adc9190615865565b6fffffffffffffffffffffffffffffffff169050613af98361310d565b8111613b0a57819350505050613b11565b8293505050505b90565b6000806000613b2284612432565b613b2a6114e8565b613b349190615518565b9150600a54613b4283612290565b613b4c9190615518565b9050613b7a600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261366d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613bee9190614b43565b60405180910390a3600160096000828254613c0991906153ac565b9250508190555080600a6000828254613c2291906153ac565b925050819055508192505050919050565b60006840000000000000000082600f0b12613c4d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613c815760009050614a4a565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613ccf57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613d085760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613d415760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613d7a57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613db35760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613dec576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613e2557608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613e5e576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613e9657608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613ece5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613f06576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613f3e5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613f76576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613fae57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613fe65760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561401e57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156140555760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b131561408c576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156140c357608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b13156140fa576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561413157608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156141685760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b131561419f576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156141d65760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b131561420c576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561424257608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156142785760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156142ae57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156142e45760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b131561431a576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561435057608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614386576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156143bb57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156143f05760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614425576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561445a5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561448f576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156144c457608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156144f95760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561452e57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156145625760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614596576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156145ca57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156145fe576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561463257608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156146665760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561469a576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156146ce5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614701576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561473457608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156147675760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561479a57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156147cd5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614800576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561483357608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614866576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561489857608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156148ca5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156148fc576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561492e5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614960576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561499257608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156149c45760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156149f657608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614a4557600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aca82614a9f565b9050919050565b614ada81614abf565b8114614ae557600080fd5b50565b600081359050614af781614ad1565b92915050565b600060208284031215614b1357614b12614a95565b5b6000614b2184828501614ae8565b91505092915050565b6000819050919050565b614b3d81614b2a565b82525050565b6000602082019050614b586000830184614b34565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614b9381614b5e565b8114614b9e57600080fd5b50565b600081359050614bb081614b8a565b92915050565b600060208284031215614bcc57614bcb614a95565b5b6000614bda84828501614ba1565b91505092915050565b60008115159050919050565b614bf881614be3565b82525050565b6000602082019050614c136000830184614bef565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614c53578082015181840152602081019050614c38565b60008484015250505050565b6000601f19601f8301169050919050565b6000614c7b82614c19565b614c858185614c24565b9350614c95818560208601614c35565b614c9e81614c5f565b840191505092915050565b60006020820190508181036000830152614cc38184614c70565b905092915050565b614cd481614b2a565b8114614cdf57600080fd5b50565b600081359050614cf181614ccb565b92915050565b60008060408385031215614d0e57614d0d614a95565b5b6000614d1c85828601614ae8565b9250506020614d2d85828601614ce2565b9150509250929050565b600081600f0b9050919050565b614d4d81614d37565b82525050565b6000602082019050614d686000830184614d44565b92915050565b614d7781614d37565b8114614d8257600080fd5b50565b600081359050614d9481614d6e565b92915050565b60008060408385031215614db157614db0614a95565b5b6000614dbf85828601614ce2565b9250506020614dd085828601614d85565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614e1782614c5f565b810181811067ffffffffffffffff82111715614e3657614e35614ddf565b5b80604052505050565b6000614e49614a8b565b9050614e558282614e0e565b919050565b600063ffffffff82169050919050565b614e7381614e5a565b8114614e7e57600080fd5b50565b600081359050614e9081614e6a565b92915050565b600068ffffffffffffffffff82169050919050565b614eb481614e96565b8114614ebf57600080fd5b50565b600081359050614ed181614eab565b92915050565b600067ffffffffffffffff82169050919050565b614ef481614ed7565b8114614eff57600080fd5b50565b600081359050614f1181614eeb565b92915050565b600060608284031215614f2d57614f2c614dda565b5b614f376060614e3f565b90506000614f4784828501614e81565b6000830152506020614f5b84828501614ec2565b6020830152506040614f6f84828501614f02565b60408301525092915050565b600060608284031215614f9157614f90614a95565b5b6000614f9f84828501614f17565b91505092915050565b600080600060608486031215614fc157614fc0614a95565b5b6000614fcf86828701614ae8565b9350506020614fe086828701614ae8565b9250506040614ff186828701614ce2565b9150509250925092565b60006020828403121561501157615010614a95565b5b600061501f84828501614ce2565b91505092915050565b6000806040838503121561503f5761503e614a95565b5b600061504d85828601614ce2565b925050602061505e85828601614ce2565b9150509250929050565b61507181614e5a565b82525050565b61508081614e96565b82525050565b61508f81614ed7565b82525050565b60006060820190506150aa6000830186615068565b6150b76020830185615077565b6150c46040830184615086565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126150f1576150f06150cc565b5b8235905067ffffffffffffffff81111561510e5761510d6150d1565b5b60208301915083600182028301111561512a576151296150d6565b5b9250929050565b6000806000806060858703121561514b5761514a614a95565b5b600061515987828801614ae8565b945050602061516a87828801614ce2565b935050604085013567ffffffffffffffff81111561518b5761518a614a9a565b5b615197878288016150db565b925092505092959194509250565b600060ff82169050919050565b6151bb816151a5565b82525050565b60006020820190506151d660008301846151b2565b92915050565b6151e581614abf565b82525050565b600060208201905061520060008301846151dc565b92915050565b6000806040838503121561521d5761521c614a95565b5b600061522b85828601614ae8565b925050602061523c85828601614ae8565b9150509250929050565b600080600080608085870312156152605761525f614a95565b5b600061526e87828801614ce2565b945050602061527f87828801614d85565b935050604061529087828801614ce2565b92505060606152a187828801614ce2565b91505092959194509250565b6152b681614e5a565b82525050565b6152c581614e96565b82525050565b6152d481614ed7565b82525050565b6060820160008201516152f060008501826152ad565b50602082015161530360208501826152bc565b50604082015161531660408501826152cb565b50505050565b600060608201905061533160008301846152da565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61535c81615337565b82525050565b60006020820190506153776000830184615353565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006153b782614b2a565b91506153c283614b2a565b92508282019050808211156153da576153d961537d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061542757607f821691505b60208210810361543a576154396153e0565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615476600783614c24565b915061548182615440565b602082019050919050565b600060208201905081810360008301526154a581615469565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006154e2600a83614c24565b91506154ed826154ac565b602082019050919050565b60006020820190508181036000830152615511816154d5565b9050919050565b600061552382614b2a565b915061552e83614b2a565b92508282039050818111156155465761554561537d565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615582600a83614c24565b915061558d8261554c565b602082019050919050565b600060208201905081810360008301526155b181615575565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b60006155ee601283614c24565b91506155f9826155b8565b602082019050919050565b6000602082019050818103600083015261561d816155e1565b9050919050565b600061562f82614b2a565b915061563a83614b2a565b925082820261564881614b2a565b9150828204841483151761565f5761565e61537d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156a082614b2a565b91506156ab83614b2a565b9250826156bb576156ba615666565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006156fc601183614c24565b9150615707826156c6565b602082019050919050565b6000602082019050818103600083015261572b816156ef565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615768601283614c24565b915061577382615732565b602082019050919050565b600060208201905081810360008301526157978161575b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615803600d83614c24565b915061580e826157cd565b602082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b61584281615337565b811461584d57600080fd5b50565b60008151905061585f81615839565b92915050565b60006020828403121561587b5761587a614a95565b5b600061588984828501615850565b9150509291505056fea2646970667358221220956635fe0272508b863999b434ed5ea439b584de83b492e7ee2bcd62acfad43464736f6c63430008130033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200664338038062006643833981810160405281019062000038919062000859565b6801000000000000000083600f0b126200005157600080fd5b6200005b6200056e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b7a565b508560079081620000bf919062000b7a565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c90565b60c081815250506200010d60016200029f640100000000026401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016284620002c6640100000000026401000000009004565b600f0b60e081600f0b815250506200019e6000600260009054906101000a9004600f0b600060016200031a640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000cdb565b6000677fffffffffffffff821115620002b757600080fd5b6040829060020a029050919050565b60008082600f0b13620002d857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af62000305846200039e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003246200056e565b6200032e6200056e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003b057600080fd5b60008083600f0b9050680100000000000000008112620003ec576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126200041b576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000448576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000474576008819060008212600003808260020a82851804189250505090506008820191505b601081126200049f576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004ca576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004da576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000561578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000507565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061382620005c8565b810181811067ffffffffffffffff82111715620006355762000634620005d9565b5b80604052505050565b60006200064a620005aa565b905062000658828262000608565b919050565b600067ffffffffffffffff8211156200067b576200067a620005d9565b5b6200068682620005c8565b9050602081019050919050565b60005b83811015620006b357808201518184015260208101905062000696565b60008484015250505050565b6000620006d6620006d0846200065d565b6200063e565b905082815260208101848484011115620006f557620006f4620005c3565b5b6200070284828562000693565b509392505050565b600082601f830112620007225762000721620005be565b5b815162000734848260208601620006bf565b91505092915050565b600060ff82169050919050565b62000755816200073d565b81146200076157600080fd5b50565b60008151905062000775816200074a565b92915050565b600081600f0b9050919050565b62000793816200077b565b81146200079f57600080fd5b50565b600081519050620007b38162000788565b92915050565b6000819050919050565b620007ce81620007b9565b8114620007da57600080fd5b50565b600081519050620007ee81620007c3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082182620007f4565b9050919050565b620008338162000814565b81146200083f57600080fd5b50565b600081519050620008538162000828565b92915050565b60008060008060008060c08789031215620008795762000878620005b4565b5b600087015167ffffffffffffffff8111156200089a5762000899620005b9565b5b620008a889828a016200070a565b965050602087015167ffffffffffffffff811115620008cc57620008cb620005b9565b5b620008da89828a016200070a565b9550506040620008ed89828a0162000764565b94505060606200090089828a01620007a2565b93505060806200091389828a01620007dd565b92505060a06200092689828a0162000842565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200098657607f821691505b6020821081036200099c576200099b6200093e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009c7565b62000a158683620009c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a5862000a5262000a4c84620007b9565b62000a2d565b620007b9565b9050919050565b6000819050919050565b62000a748362000a37565b62000a8c62000a838262000a5f565b848454620009d7565b825550505050565b600090565b62000aa362000a94565b62000ab081848462000a69565b505050565b5b8181101562000ad85762000acc60008262000a99565b60018101905062000ab6565b5050565b601f82111562000b275762000af181620009a2565b62000afc84620009b7565b8101602085101562000b0c578190505b62000b2462000b1b85620009b7565b83018262000ab5565b50505b505050565b60008160020a8304905092915050565b600062000b4f6000198460080262000b2c565b1980831691505092915050565b600062000b6a838362000b3c565b9150826002028217905092915050565b62000b858262000933565b67ffffffffffffffff81111562000ba15762000ba0620005d9565b5b62000bad82546200096d565b62000bba82828562000adc565b600060209050601f83116001811462000bf2576000841562000bdd578287015190505b62000be9858262000b5c565b86555062000c59565b601f19841662000c0286620009a2565b60005b8281101562000c2c5784890151825560018201915060208501945060208101905062000c05565b8683101562000c4c578489015162000c48601f89168262000b3c565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c9d82620007b9565b915062000caa83620007b9565b925082820262000cba81620007b9565b9150828204841483151762000cd45762000cd362000c61565b5b5092915050565b60805160a05160c05160e0516158e862000d5b60003960008181611909015281816127f4015281816129e10152612ddd015260008181612056015281816127b701528181612d3501528181612f7a01526131c701526000818161208201528181612fa6015281816131e8015261322d0152600061196701526158e86000f3fe608060405234801561001057600080fd5b50600436106103e2576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e1161021c578063a457c2d711610137578063d89135cd116100ca578063e69571af11610099578063e69571af14610ce3578063e809529514610d13578063eda4e6d614610d31578063f2fde38b14610d4f576103e2565b8063d89135cd14610c35578063da2824a814610c53578063dd62ed3e14610c83578063e54063a614610cb3576103e2565b8063c0ab707711610106578063c0ab707714610bad578063d340ef8a14610bdd578063d5abeb0114610bfb578063d7a52fa914610c19576103e2565b8063a457c2d714610b11578063a9059cbb14610b41578063b1cb0db314610b71578063b470aade14610b8f576103e2565b80638832e6e3116101af57806394d008ef1161017e57806394d008ef14610a9b57806395d89b4114610ab75780639f24880814610ad5578063a2309ff814610af3576103e2565b80638832e6e314610a275780638da5cb5b14610a435780638f0b2d5d14610a615780638f1df6bc14610a7d576103e2565b80637445e33a116101eb5780637445e33a1461098b57806374bedb95146109bb57806384dde4af146109d957806386fe212d146109f7576103e2565b80636a2d094e146108f15780636f8b44b01461092157806370a082311461093d578063731f237c1461096d576103e2565b8063313334871161030c57806344df8e701161029f57806358b2833b1161026e57806358b2833b146108555780635ae06f7e146108735780635f408c04146108a35780636787a9be146108c1576103e2565b806344df8e70146107a757806347a50517146107c55780634abfbba2146107f557806351b4541c14610825576103e2565b806340452d91116102db57806340452d91146106f957806342966c681461072b578063449a52f81461075b57806344d171871461078b576103e2565b8063313334871461065d578063313ce5671461068d57806331a5995d146106ab57806339509351146106c9576103e2565b806318cbbcfc1161038457806323b872dd1161035357806323b872dd1461059d5780632a7aec09146105cd5780632b29ba23146105fd5780632c1758c11461062d576103e2565b806318cbbcfc146105015780631989c6a81461051f578063213d1e1e1461053d57806323a859441461056d576103e2565b8063095ea7b3116103c0578063095ea7b31461046557806309f28f3c1461049557806311c56615146104b357806318160ddd146104e3576103e2565b806301681a62146103e757806301ffc9a71461041757806306fdde0314610447575b600080fd5b61040160048036038101906103fc9190614b1d565b610d7f565b60405161040e9190614b63565b60405180910390f35b610431600480360381019061042c9190614bd6565b610ecd565b60405161043e9190614c1e565b60405180910390f35b61044f6111bb565b60405161045c9190614cc9565b60405180910390f35b61047f600480360381019061047a9190614d17565b611249565b60405161048c9190614c1e565b60405180910390f35b61049d6114a5565b6040516104aa9190614d73565b60405180910390f35b6104cd60048036038101906104c89190614dba565b6114b8565b6040516104da9190614b63565b60405180910390f35b6104eb611508565b6040516104f89190614b63565b60405180910390f35b61050961151f565b6040516105169190614b63565b60405180910390f35b610527611524565b6040516105349190614b63565b60405180910390f35b61055760048036038101906105529190614f9b565b611530565b6040516105649190614b63565b60405180910390f35b61058760048036038101906105829190614f9b565b611549565b6040516105949190614c1e565b60405180910390f35b6105b760048036038101906105b29190614fc8565b6115b1565b6040516105c49190614c1e565b60405180910390f35b6105e760048036038101906105e29190614f9b565b6117cf565b6040516105f49190614d73565b60405180910390f35b61061760048036038101906106129190614b1d565b611807565b6040516106249190614c1e565b60405180910390f35b6106476004803603810190610642919061501b565b6118b5565b6040516106549190614c1e565b60405180910390f35b61067760048036038101906106729190615048565b6118e8565b6040516106849190614b63565b60405180910390f35b610695611965565b6040516106a29190614b63565b60405180910390f35b6106b3611989565b6040516106c09190614b63565b60405180910390f35b6106e360048036038101906106de9190614d17565b61198f565b6040516106f09190614c1e565b60405180910390f35b610713600480360381019061070e919061501b565b611b25565b604051610722939291906150b5565b60405180910390f35b6107456004803603810190610740919061501b565b611b94565b6040516107529190614c1e565b60405180910390f35b61077560048036038101906107709190614d17565b611d65565b6040516107829190614c1e565b60405180910390f35b6107a560048036038101906107a09190615151565b611f3c565b005b6107af611fba565b6040516107bc9190614c1e565b60405180910390f35b6107df60048036038101906107da9190614b1d565b612009565b6040516107ec9190614b63565b60405180910390f35b61080f600480360381019061080a919061501b565b612052565b60405161081c9190614b63565b60405180910390f35b61083f600480360381019061083a919061501b565b6120b2565b60405161084c9190614b63565b60405180910390f35b61085d6120d3565b60405161086a9190614b63565b60405180910390f35b61088d60048036038101906108889190614b1d565b6120d9565b60405161089a9190614c1e565b60405180910390f35b6108ab6121e3565b6040516108b891906151e1565b60405180910390f35b6108db60048036038101906108d6919061501b565b6122b0565b6040516108e89190614b63565b60405180910390f35b61090b6004803603810190610906919061501b565b6122f1565b6040516109189190614b63565b60405180910390f35b61093b6004803603810190610936919061501b565b612312565b005b61095760048036038101906109529190614b1d565b6123da565b6040516109649190614b63565b60405180910390f35b610975612441565b6040516109829190614b63565b60405180910390f35b6109a560048036038101906109a09190614f9b565b612452565b6040516109b29190614b63565b60405180910390f35b6109c3612480565b6040516109d09190614b63565b60405180910390f35b6109e1612486565b6040516109ee919061520b565b60405180910390f35b610a116004803603810190610a0c919061501b565b6124ac565b604051610a1e9190614b63565b60405180910390f35b610a416004803603810190610a3c9190615151565b612593565b005b610a4b6125a4565b604051610a58919061520b565b60405180910390f35b610a7b6004803603810190610a769190614b1d565b6125ca565b005b610a8561267f565b604051610a929190614c1e565b60405180910390f35b610ab56004803603810190610ab09190615151565b612940565b005b610abf612951565b604051610acc9190614cc9565b60405180910390f35b610add6129df565b604051610aea9190614d73565b60405180910390f35b610afb612a03565b604051610b089190614b63565b60405180910390f35b610b2b6004803603810190610b269190614d17565b612a0d565b604051610b389190614c1e565b60405180910390f35b610b5b6004803603810190610b569190614d17565b612c2c565b604051610b689190614c1e565b60405180910390f35b610b79612d2d565b604051610b869190614b63565b60405180910390f35b610b97612d33565b604051610ba49190614b63565b60405180910390f35b610bc76004803603810190610bc2919061501b565b612d57565b604051610bd49190614b63565b60405180910390f35b610be5612ede565b604051610bf29190614b63565b60405180910390f35b610c03612ee4565b604051610c109190614b63565b60405180910390f35b610c336004803603810190610c2e919061501b565b612eea565b005b610c3d61302a565b604051610c4a9190614b63565b60405180910390f35b610c6d6004803603810190610c689190614b1d565b613034565b604051610c7a9190614c1e565b60405180910390f35b610c9d6004803603810190610c989190615226565b613108565b604051610caa9190614b63565b60405180910390f35b610ccd6004803603810190610cc89190614f9b565b61312d565b604051610cda9190614b63565b60405180910390f35b610cfd6004803603810190610cf89190615266565b613141565b604051610d0a919061533c565b60405180910390f35b610d1b6131c1565b604051610d289190615382565b60405180910390f35b610d3961322b565b604051610d469190614b63565b60405180910390f35b610d696004803603810190610d649190614b1d565b61324f565b604051610d769190614c1e565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5891906153cc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ebc9190614b63565b60405180910390a380915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f2157600190506111b6565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f7357600190506111b6565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc557600190506111b6565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101757600190506111b6565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106957600190506111b6565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bb57600190506111b6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361110d57600190506111b6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361115f57600190506111b6565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111b157600190506111b6565b600090505b919050565b600680546111c89061542f565b80601f01602080910402602001604051908101604052809291908181526020018280546111f49061542f565b80156112415780601f1061121657610100808354040283529160200191611241565b820191906000526020600020905b81548152906001019060200180831161122457829003601f168201915b505050505081565b60008060006112566121e3565b905060028160ff160361126e5760009250505061149f565b60008160ff1611156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906154ac565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561137e576000841461137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490615518565b60405180910390fd5b5b61138661267f565b5067800000000000000084116113a65761139f846122b0565b91506113b2565b67800000000000000091505b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516114909190614b63565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806114df6114c785613398565b6114da6114d46001613398565b866133be565b613425565b90506114ea816134a4565b67ffffffffffffffff16846114ff9190615538565b91505092915050565b6000600b5460085461151a9190615538565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff16111561156657600090506115ac565b6000826020015168ffffffffffffffffff16111561158757600090506115ac565b6000826040015167ffffffffffffffff1611156115a757600090506115ac565b600190505b919050565b6000806000806115bf6121e3565b905060028160ff16036115d857600093505050506117c8565b60008160ff16111561161f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611616906154ac565b60405180910390fd5b61162761267f565b50611631856122b0565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156116bc57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117489190615538565b9250508190555061175a8787856134d9565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516117b99190614b63565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036117fe576117fb6001613398565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806118ae5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000600f82106118c457600080fd5b600082036118d957600f6012541490506118e3565b8160125483161490505b919050565b6000806000806118f786613398565b925061190285613398565b915061192e7f000000000000000000000000000000000000000000000000000000000000000083613425565b9050611939816134fc565b90506119458382613425565b9050611950816134a4565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b60008061199a61267f565b506119a4836122b0565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3291906153cc565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611b129190614b63565b60405180910390a3600191505092915050565b60008181548110611b3557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611b9f6121e3565b60ff1614611bac57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c515750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c87906155b8565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611cdc57600080fd5b6000611ce7836122b0565b9050611cf33382613589565b5082600b6000828254611d0691906153cc565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611d539190614b63565b60405180910390a26001915050919050565b6000806000611d726121e3565b60ff1614611d7f57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e245750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a906155b8565b60405180910390fd5b611e6b61267f565b5060006011541115611e945760115483600854611e8891906153cc565b1115611e9357600080fd5b5b8260086000828254611ea691906153cc565b92505081905550611eb6836122b0565b9050611ec2848261368d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611f209190614b63565b60405180910390a3611f3061374e565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190615624565b60405180910390fd5b611fb383611b94565b5050505050565b6000612004600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b94565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826120809190615644565b7f00000000000000000000000000000000000000000000000000000000000000006120ab91906153cc565b9050919050565b6000603c82426120c29190615538565b6120cc91906156b5565b9050919050565b60035481565b60006120e8600160ff166118b5565b156120f257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061217957503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61218257600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff161561220357600190506122ad565b6000600f540361221657600090506122ad565b600f5442106122a857612243603c60035461223191906156b5565b600f5461223e9190615538565b612d57565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe94260405161228e9190614b63565b60405180910390a161229e61267f565b50600290506122ad565b600090505b90565b6000806122d46122bf84613398565b600260009054906101000a9004600f0b613912565b90506122df816134a4565b67ffffffffffffffff16915050919050565b6000603c82426123019190615538565b61230b91906156b5565b9050919050565b61231f600860ff166118b5565b1561232957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461238357600080fd5b61238b611508565b811161239657600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516123c89190614b63565b60405180910390a28060118190555050565b6000806000806123f16123ec86612009565b613398565b92506123fe6003546120b2565b905061241983600260009054906101000a9004600f0b613425565b9150612437612427836134a4565b67ffffffffffffffff16826118e8565b9350505050919050565b600061244d6000612d57565b905090565b600080600061246084611530565b915061246b846117cf565b905061247782826114b8565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890615732565b60405180910390fd5b6000601254831614612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f9061579e565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516125819190614b63565b60405180910390a26012549050919050565b61259d8484611d65565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125d7600260ff166118b5565b156125e157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461263b57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612689614a6f565b612691614a6f565b612699614a6f565b60008060008060006126a9612441565b506126b261399e565b97506126bd88611549565b156126d35760009850505050505050505061293d565b6000600954815481106126e9576126e86157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506127968861312d565b94506001856127a591906153cc565b90506127b0866117cf565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006127e09190615644565b6127ea91906156b5565b91506128266128217f000000000000000000000000000000000000000000000000000000000000000061281c85613398565b613425565b6134fc565b925061283c600084612836611508565b84613141565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506128f887613b34565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516129289190614b63565b60405180910390a16001985050505050505050505b90565b61294a8484611d65565b5050505050565b6007805461295e9061542f565b80601f016020809104026020016040519081016040528092919081815260200182805461298a9061542f565b80156129d75780601f106129ac576101008083540402835291602001916129d7565b820191906000526020600020905b8154815290600101906020018083116129ba57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b600080612a19836122b0565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612aa457600080fd5b612aac61267f565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b399190615538565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612c199190614b63565b60405180910390a3600191505092915050565b600080600080612c3a6121e3565b905060028160ff1603612c535760009350505050612d27565b60008160ff161115612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c91906154ac565b60405180910390fd5b612ca261267f565b50612cac856122b0565b9250612cb93387856134d9565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d189190614b63565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612d81576000945050505050612ed9565b612d8c6003546120b2565b925060008303612da3576000945050505050612ed9565b600260009054906101000a9004600f0b9050600086118015612dc457508286105b15612dcd578592505b612dd683613398565b9150612e027f000000000000000000000000000000000000000000000000000000000000000083613425565b9350612e0d846134fc565b9350612e28600260009054906101000a9004600f0b85613425565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612e709190615644565b600354612e7d91906153cc565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612ec99190614d73565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612efa600460ff166118b5565b15612f0457600080fd5b601060009054906101000a900460ff1615612f1e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612fa49190615644565b7f0000000000000000000000000000000000000000000000000000000000000000612fcf91906153cc565b9150600f548211612fdf57600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f5460405161301d9190614b63565b60405180910390a2505050565b6000600b54905090565b6000613043600160ff166118b5565b1561304d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130a757600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b6000816000015163ffffffff169050919050565b613149614a6f565b613151614a6f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426132129190615538565b61321c91906156b5565b61322691906153cc565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132ac57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff8211156133af57600080fd5b6040829060020a029050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561341257506f7fffffffffffffffffffffffffffffff600f0b8113155b61341b57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561349157506f7fffffffffffffffffffffffffffffff600f0b8113155b61349a57600080fd5b8091505092915050565b60008082600f0b12156134b657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006134e58483613589565b506134f0838361368d565b50600190509392505050565b60006840000000000000000082600f0b1261351657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561354a5760009050613584565b6135816080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613c53565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135e357600092505050613687565b6135ec85612009565b915083821015613631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362890615839565b60405180910390fd5b838261363d9190615538565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036136e757600092505050613748565b6136f085612009565b915083826136fe91906153cc565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000613758614a6f565b6000613762611508565b9050600060016000805490506137789190615538565b81548110613789576137886157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506138649190615538565b81548110613875576138746157be565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361392357600080fd5b600082600f0b604085600f0b9060020a028161394257613941615686565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561398b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61399457600080fd5b8091505092915050565b6139a6614a6f565b6139ae614a6f565b6139b6614a6f565b600080600954815481106139cd576139cc6157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afc9190615885565b6fffffffffffffffffffffffffffffffff169050613b198361312d565b8111613b2a57819350505050613b31565b8293505050505b90565b6000806000613b4284612452565b613b4a611508565b613b549190615538565b9150600a54613b62836122b0565b613b6c9190615538565b9050613b9a600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261368d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613c0e9190614b63565b60405180910390a3600160096000828254613c2991906153cc565b9250508190555080600a6000828254613c4291906153cc565b925050819055508192505050919050565b60006840000000000000000082600f0b12613c6d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613ca15760009050614a6a565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613cef57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613d285760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613d615760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613d9a57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613dd35760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613e0c576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613e4557608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613e7e576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613eb657608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613eee5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613f26576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613f5e5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613f96576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613fce57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156140065760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561403e57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156140755760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156140ac576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156140e357608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b131561411a576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561415157608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156141885760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156141bf576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156141f65760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b131561422c576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561426257608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156142985760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156142ce57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156143045760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b131561433a576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561437057608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156143a6576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156143db57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156144105760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614445576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561447a5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156144af576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156144e457608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156145195760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561454e57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156145825760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156145b6576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156145ea57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561461e576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561465257608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156146865760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156146ba576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156146ee5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614721576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561475457608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156147875760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156147ba57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156147ed5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614820576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561485357608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614886576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156148b857608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156148ea5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b131561491c576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561494e5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614980576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156149b257608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156149e45760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315614a1657608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614a6557600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aea82614abf565b9050919050565b614afa81614adf565b8114614b0557600080fd5b50565b600081359050614b1781614af1565b92915050565b600060208284031215614b3357614b32614ab5565b5b6000614b4184828501614b08565b91505092915050565b6000819050919050565b614b5d81614b4a565b82525050565b6000602082019050614b786000830184614b54565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bb381614b7e565b8114614bbe57600080fd5b50565b600081359050614bd081614baa565b92915050565b600060208284031215614bec57614beb614ab5565b5b6000614bfa84828501614bc1565b91505092915050565b60008115159050919050565b614c1881614c03565b82525050565b6000602082019050614c336000830184614c0f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614c73578082015181840152602081019050614c58565b60008484015250505050565b6000601f19601f8301169050919050565b6000614c9b82614c39565b614ca58185614c44565b9350614cb5818560208601614c55565b614cbe81614c7f565b840191505092915050565b60006020820190508181036000830152614ce38184614c90565b905092915050565b614cf481614b4a565b8114614cff57600080fd5b50565b600081359050614d1181614ceb565b92915050565b60008060408385031215614d2e57614d2d614ab5565b5b6000614d3c85828601614b08565b9250506020614d4d85828601614d02565b9150509250929050565b600081600f0b9050919050565b614d6d81614d57565b82525050565b6000602082019050614d886000830184614d64565b92915050565b614d9781614d57565b8114614da257600080fd5b50565b600081359050614db481614d8e565b92915050565b60008060408385031215614dd157614dd0614ab5565b5b6000614ddf85828601614d02565b9250506020614df085828601614da5565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614e3782614c7f565b810181811067ffffffffffffffff82111715614e5657614e55614dff565b5b80604052505050565b6000614e69614aab565b9050614e758282614e2e565b919050565b600063ffffffff82169050919050565b614e9381614e7a565b8114614e9e57600080fd5b50565b600081359050614eb081614e8a565b92915050565b600068ffffffffffffffffff82169050919050565b614ed481614eb6565b8114614edf57600080fd5b50565b600081359050614ef181614ecb565b92915050565b600067ffffffffffffffff82169050919050565b614f1481614ef7565b8114614f1f57600080fd5b50565b600081359050614f3181614f0b565b92915050565b600060608284031215614f4d57614f4c614dfa565b5b614f576060614e5f565b90506000614f6784828501614ea1565b6000830152506020614f7b84828501614ee2565b6020830152506040614f8f84828501614f22565b60408301525092915050565b600060608284031215614fb157614fb0614ab5565b5b6000614fbf84828501614f37565b91505092915050565b600080600060608486031215614fe157614fe0614ab5565b5b6000614fef86828701614b08565b935050602061500086828701614b08565b925050604061501186828701614d02565b9150509250925092565b60006020828403121561503157615030614ab5565b5b600061503f84828501614d02565b91505092915050565b6000806040838503121561505f5761505e614ab5565b5b600061506d85828601614d02565b925050602061507e85828601614d02565b9150509250929050565b61509181614e7a565b82525050565b6150a081614eb6565b82525050565b6150af81614ef7565b82525050565b60006060820190506150ca6000830186615088565b6150d76020830185615097565b6150e460408301846150a6565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f840112615111576151106150ec565b5b8235905067ffffffffffffffff81111561512e5761512d6150f1565b5b60208301915083600182028301111561514a576151496150f6565b5b9250929050565b6000806000806060858703121561516b5761516a614ab5565b5b600061517987828801614b08565b945050602061518a87828801614d02565b935050604085013567ffffffffffffffff8111156151ab576151aa614aba565b5b6151b7878288016150fb565b925092505092959194509250565b600060ff82169050919050565b6151db816151c5565b82525050565b60006020820190506151f660008301846151d2565b92915050565b61520581614adf565b82525050565b600060208201905061522060008301846151fc565b92915050565b6000806040838503121561523d5761523c614ab5565b5b600061524b85828601614b08565b925050602061525c85828601614b08565b9150509250929050565b600080600080608085870312156152805761527f614ab5565b5b600061528e87828801614d02565b945050602061529f87828801614da5565b93505060406152b087828801614d02565b92505060606152c187828801614d02565b91505092959194509250565b6152d681614e7a565b82525050565b6152e581614eb6565b82525050565b6152f481614ef7565b82525050565b60608201600082015161531060008501826152cd565b50602082015161532360208501826152dc565b50604082015161533660408501826152eb565b50505050565b600060608201905061535160008301846152fa565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61537c81615357565b82525050565b60006020820190506153976000830184615373565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006153d782614b4a565b91506153e283614b4a565b92508282019050808211156153fa576153f961539d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061544757607f821691505b60208210810361545a57615459615400565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615496600783614c44565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615502600a83614c44565b915061550d826154cc565b602082019050919050565b60006020820190508181036000830152615531816154f5565b9050919050565b600061554382614b4a565b915061554e83614b4a565b92508282039050818111156155665761556561539d565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006155a2600a83614c44565b91506155ad8261556c565b602082019050919050565b600060208201905081810360008301526155d181615595565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b600061560e601283614c44565b9150615619826155d8565b602082019050919050565b6000602082019050818103600083015261563d81615601565b9050919050565b600061564f82614b4a565b915061565a83614b4a565b925082820261566881614b4a565b9150828204841483151761567f5761567e61539d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156c082614b4a565b91506156cb83614b4a565b9250826156db576156da615686565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061571c601183614c44565b9150615727826156e6565b602082019050919050565b6000602082019050818103600083015261574b8161570f565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615788601283614c44565b915061579382615752565b602082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615823600d83614c44565b915061582e826157ed565b602082019050919050565b6000602082019050818103600083015261585281615816565b9050919050565b61586281615357565b811461586d57600080fd5b50565b60008151905061587f81615859565b92915050565b60006020828403121561589b5761589a614ab5565b5b60006158a984828501615870565b9150509291505056fea2646970667358221220f385dd87c8c69c6c2a499f6ef1b86f025999a2d3537d134331e8146c1db7c54a64736f6c63430008130033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json index 1c9835d..78dba73 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json @@ -1 +1 @@ -{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","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":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"balanceOf(address)":{"notice":"Implements ERC20"}},"version":1}},"settings":{"compilationTarget":{"DemurrageTokenSingleNocap.sol":"DemurrageTokenSingleNocap"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DemurrageTokenSingleNocap.sol":{"keccak256":"0xe7c88ed36f6f3cdc57147fe1684302fbfbaf47e05c051738e80e25ecf9a91aa0","license":"AGPL-3.0-or-later","urls":["bzz-raw://e5bbb9875999451c53dd85f8b0349a29026b387926351549f140851440301054","dweb:/ipfs/QmWTVGjkBpURV2r895YW3tqRncKFm8irfS1tJkr8Xgrw54"]},"aux/ABDKMath64x64.sol":{"keccak256":"0x089b21db72314836305ba36b1773c3f0c2d5ac3a0f418820557c17c0e57c3c50","license":"BSD-4-Clause","urls":["bzz-raw://730ce8d750b0a6588f0d0724ace1c4d6dd90cf6dc0d2805b775b065fce147dfa","dweb:/ipfs/Qmdx7xRKvhXu1JtAVs25bER3LN2oGj2ZjW8jEvJpzQyXhc"]}},"version":1} +{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","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":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"balanceOf(address)":{"notice":"Implements ERC20"}},"version":1}},"settings":{"compilationTarget":{"DemurrageTokenSingleNocap.sol":"DemurrageTokenSingleNocap"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DemurrageTokenSingleNocap.sol":{"keccak256":"0x538a3234dd292c31486318f8c54fbfe778f26120b52915c076572d50639d6ead","license":"AGPL-3.0-or-later","urls":["bzz-raw://42f0c58b1197c3ffe34fd2b311ea06cbb394f80d8f9165948946ec6d7ebcef1b","dweb:/ipfs/QmbL6QcoQAXBzfjarB7ap3tBcerVM6MzJ4aG9egjxoRReg"]},"aux/ABDKMath64x64.sol":{"keccak256":"0x089b21db72314836305ba36b1773c3f0c2d5ac3a0f418820557c17c0e57c3c50","license":"BSD-4-Clause","urls":["bzz-raw://730ce8d750b0a6588f0d0724ace1c4d6dd90cf6dc0d2805b775b065fce147dfa","dweb:/ipfs/Qmdx7xRKvhXu1JtAVs25bER3LN2oGj2ZjW8jEvJpzQyXhc"]}},"version":1} diff --git a/python/setup.cfg b/python/setup.cfg index b973275..49ad087 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.5.5 +version = 0.5.6 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index d693662..b1edf76 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -308,6 +308,30 @@ class TestBasic(TestDemurrageDefault): self.assertEqual(r['status'], 1) + def test_approve_max(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], int.from_bytes(b'\xff' * 32, byteorder='big')) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 0) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + self.backend.time_travel(self.start_time + (60 * 60 * 24 * 365 * 10)) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], int.from_bytes(b'\xff' * 32, byteorder='big')) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + def test_transfer_from(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 47d8c1b..8fe0082 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -6,6 +6,8 @@ import "aux/ABDKMath64x64.sol"; contract DemurrageTokenSingleNocap { + uint256 constant VALUE_LIMIT = 1 << 63; + struct redistributionItem { uint32 period; uint72 value; @@ -597,7 +599,14 @@ contract DemurrageTokenSingleNocap { changePeriod(); - baseValue = toBaseAmount(_value); + // dex code will attempt uint256max approve, but contract cannot handle that size + // truncate to biggest possible value + if (_value <= VALUE_LIMIT) { + baseValue = toBaseAmount(_value); + } else { + baseValue = VALUE_LIMIT; + } + allowance[msg.sender][_spender] = baseValue; emit Approval(msg.sender, _spender, _value); return true;