From 84b1a5b439f59340caddb7feee134e28213654c0 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 8 Feb 2023 08:44:37 +0000 Subject: [PATCH] Return redistributions type correctly --- .../data/DemurrageTokenMultiCap.bin | 2 +- .../data/DemurrageTokenMultiNocap.bin | 2 +- .../data/DemurrageTokenSingleCap.bin | 2 +- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/demurrage.py | 3 +- python/erc20_demurrage_token/token.py | 173 +++++++++--- python/run_tests.sh | 9 +- python/tests/test_basic.py | 53 +++- python/tests/test_growth.py | 36 +-- python/tests/test_redistribution_single.py | 25 +- python/tests/test_redistribution_unit.py | 1 + solidity/DemurrageTokenSingleNocap.sol | 259 +++++++++++++----- 13 files changed, 420 insertions(+), 149 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin index 66b6ceb..98b7c28 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c0d38038062003c0d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009d9565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b602082108103620009d357620009d262000975565b5b50919050565b60805160a05160c05160e0516131bb62000a5260003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131bb6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a3e565b60405180910390f35b6102e860048036038101906102e39190612af4565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b5f565b60405180910390f35b610324610c96565b6040516103319190612b89565b60405180910390f35b610342610c9c565b60405161034f9190612b89565b60405180910390f35b610372600480360381019061036d9190612ba4565b610ca8565b60405161037f9190612b89565b60405180910390f35b610390610d2d565b60405161039d9190612b89565b60405180910390f35b6103c060048036038101906103bb9190612be4565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c37565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612ba4565b610f6e565b60405161042d9190612b89565b60405180910390f35b61043e61101f565b60405161044b9190612b89565b60405180910390f35b61046e60048036038101906104699190612c37565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c64565b611224565b6040516104ab9190612caa565b60405180910390f35b6104ce60048036038101906104c99190612cf1565b611248565b6040516104db9190612b89565b60405180910390f35b6104fe60048036038101906104f99190612af4565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c37565b61139f565b60405161053b9190612b89565b60405180910390f35b61055e60048036038101906105599190612c64565b6113f7565b60405161056b9190612b89565b60405180910390f35b61058e60048036038101906105899190612c64565b611457565b60405161059b9190612b89565b60405180910390f35b6105ac611478565b6040516105b99190612b89565b60405180910390f35b6105ca61147e565b6040516105d79190612b89565b60405180910390f35b6105fa60048036038101906105f59190612c64565b611484565b6040516106079190612b89565b60405180910390f35b61062a60048036038101906106259190612c64565b6114f0565b6040516106379190612b89565b60405180910390f35b61065a60048036038101906106559190612c37565b611511565b6040516106679190612b89565b60405180910390f35b61068a60048036038101906106859190612cf1565b61157c565b6040516106979190612b89565b60405180910390f35b6106ba60048036038101906106b59190612c37565b6115af565b6040516106c79190612b89565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d2d565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b89565b60405180910390f35b61076e611b01565b60405161077b9190612a3e565b60405180910390f35b61079e60048036038101906107999190612c37565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612cf1565b611c4c565b6040516107db9190612b89565b60405180910390f35b6107fe60048036038101906107f99190612af4565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b89565b60405180910390f35b61083a611d3c565b6040516108479190612b89565b60405180910390f35b61086a60048036038101906108659190612cf1565b611d60565b6040516108779190612b89565b60405180910390f35b61089a60048036038101906108959190612ba4565b611d74565b6040516108a79190612b89565b60405180910390f35b6108b8611e25565b6040516108c59190612b5f565b60405180910390f35b6108d6611e8f565b6040516108e39190612b89565b60405180910390f35b61090660048036038101906109019190612c37565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d77565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dd7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b89565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e79565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612ec8565b91508482610d159190612ef9565b90508084610d239190612f53565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b89565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612ec8565b905060005b84811015610ffa57620f42408284610fd09190612ef9565b610fda9190612ec8565b83610fe59190612f53565b92508080610ff290612f87565b915050610fb8565b50620f4240858361100b9190612ef9565b6110159190612ec8565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f53565b8154811061109957611098612fcf565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612ec8565b86886111299190612ec8565b6111339190612ef9565b61113d9190612ec8565b9350620f4240818561114f9190612ef9565b6111599190612ec8565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b89565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dd7565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dd7565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b89565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ef9565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dd7565b9050919050565b6000603c82426114679190612f53565b6114719190612ec8565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ef9565b6114df9190612ef9565b6114e99190612ec8565b9050919050565b6000603c82426115009190612f53565b61150a9190612ec8565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ef9565b82846116449190612ef9565b61164e9190612ec8565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ef9565b60035461170e9190612dd7565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190613039565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dd7565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612ec8565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612ec8565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b89565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d77565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b89565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612ec8565b905060005b84811015611e0057620f42408284611dd69190612ef9565b611de09190612ec8565b83611deb9190612dd7565b92508080611df890612f87565b915050611dbe565b50620f42408583611e119190612ef9565b611e1b9190612ec8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f53565b611e809190612ec8565b611e8a9190612dd7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dd7565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906130a0565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f53565b8154811061217c5761217b612fcf565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f53565b815481106121da576121d9612fcf565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f53565b8154811061221957612218612fcf565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130ec565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ef9565b6123c49190612ec8565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ef9565b6124009190612ec8565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f53565b8154811061244c5761244b612fcf565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f53565b815481106124b4576124b3612fcf565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612ec8565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f53565b8154811061257757612576612fcf565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f53565b815481106125b1576125b0612fcf565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f53565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613165565b60405180910390fd5b84836126c19190612f53565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f53565b8154811061283e5761283d612fcf565b5b90600052602060002001549250600161285684611248565b6128609190612dd7565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f53565b815481106128cd576128cc612fcf565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b838111156129ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a10826129a5565b612a1a81856129b0565b9350612a2a8185602086016129c1565b612a33816129f4565b840191505092915050565b60006020820190508181036000830152612a588184612a05565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8b82612a60565b9050919050565b612a9b81612a80565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b6000819050919050565b612ad181612abe565b8114612adc57600080fd5b50565b600081359050612aee81612ac8565b92915050565b60008060408385031215612b0b57612b0a6128e5565b5b6000612b1985828601612aa9565b9250506020612b2a85828601612adf565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5981612b34565b82525050565b6000602082019050612b746000830184612b50565b92915050565b612b8381612abe565b82525050565b6000602082019050612b9e6000830184612b7a565b92915050565b60008060408385031215612bbb57612bba6128e5565b5b6000612bc985828601612adf565b9250506020612bda85828601612adf565b9150509250929050565b600080600060608486031215612bfd57612bfc6128e5565b5b6000612c0b86828701612aa9565b9350506020612c1c86828701612aa9565b9250506040612c2d86828701612adf565b9150509250925092565b600060208284031215612c4d57612c4c6128e5565b5b6000612c5b84828501612aa9565b91505092915050565b600060208284031215612c7a57612c796128e5565b5b6000612c8884828501612adf565b91505092915050565b6000819050919050565b612ca481612c91565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c91565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b600060208284031215612d0757612d066128e5565b5b6000612d1584828501612cdc565b91505092915050565b612d2781612a80565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8f57607f821691505b602082108103612da257612da1612d48565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de282612abe565b9150612ded83612abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2257612e21612da8565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e636011836129b0565b9150612e6e82612e2d565b602082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed382612abe565b9150612ede83612abe565b925082612eee57612eed612e99565b5b828204905092915050565b6000612f0482612abe565b9150612f0f83612abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f4857612f47612da8565b5b828202905092915050565b6000612f5e82612abe565b9150612f6983612abe565b925082821015612f7c57612f7b612da8565b5b828203905092915050565b6000612f9282612abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc457612fc3612da8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061302361301e61301984612b34565b612ffe565b612abe565b9050919050565b61303381613008565b82525050565b600060208201905061304e600083018461302a565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b600061308a600d836129b0565b915061309582613054565b602082019050919050565b600060208201905081810360008301526130b98161307d565b9050919050565b6130c981612b34565b81146130d457600080fd5b50565b6000815190506130e6816130c0565b92915050565b600060208284031215613102576131016128e5565b5b6000613110848285016130d7565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061314f600d836129b0565b915061315a82613119565b602082019050919050565b6000602082019050818103600083015261317e81613142565b905091905056fea2646970667358221220584c6761a6f53a48d12b32828df80bf173ed868c2802527ff2ebbdb3cc94fd7664736f6c634300080d0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200034f565b6080908152503480156200003757600080fd5b5060405162003db638038062003db683398181016040528101906200005d919062000601565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000129919062000939565b5085600790816200013b919062000939565b508460ff166008819055504260038190555060035460a08181525050603c836200016691906200034f565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200018c91906200034f565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001f16000620f4240600060016200028a640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000276919062000b74565b600b81905550505050505050505062000bc5565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200035c8262000316565b9150620003698362000316565b9250828202620003798162000316565b9150828204841483151762000393576200039262000320565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040382620003b8565b810181811067ffffffffffffffff82111715620004255762000424620003c9565b5b80604052505050565b60006200043a6200039a565b9050620004488282620003f8565b919050565b600067ffffffffffffffff8211156200046b576200046a620003c9565b5b6200047682620003b8565b9050602081019050919050565b60005b83811015620004a357808201518184015260208101905062000486565b60008484015250505050565b6000620004c6620004c0846200044d565b6200042e565b905082815260208101848484011115620004e557620004e4620003b3565b5b620004f284828562000483565b509392505050565b600082601f830112620005125762000511620003ae565b5b815162000524848260208601620004af565b91505092915050565b600060ff82169050919050565b62000545816200052d565b81146200055157600080fd5b50565b60008151905062000565816200053a565b92915050565b620005768162000316565b81146200058257600080fd5b50565b60008151905062000596816200056b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005c9826200059c565b9050919050565b620005db81620005bc565b8114620005e757600080fd5b50565b600081519050620005fb81620005d0565b92915050565b600080600080600080600060e0888a031215620006235762000622620003a4565b5b600088015167ffffffffffffffff811115620006445762000643620003a9565b5b620006528a828b01620004fa565b975050602088015167ffffffffffffffff811115620006765762000675620003a9565b5b620006848a828b01620004fa565b9650506040620006978a828b0162000554565b9550506060620006aa8a828b0162000585565b9450506080620006bd8a828b0162000585565b93505060a0620006d08a828b01620005ea565b92505060c0620006e38a828b0162000585565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074557607f821691505b6020821081036200075b576200075a620006fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620007c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000786565b620007d4868362000786565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000817620008116200080b8462000316565b620007ec565b62000316565b9050919050565b6000819050919050565b6200083383620007f6565b6200084b62000842826200081e565b84845462000796565b825550505050565b600090565b6200086262000853565b6200086f81848462000828565b505050565b5b8181101562000897576200088b60008262000858565b60018101905062000875565b5050565b601f821115620008e657620008b08162000761565b620008bb8462000776565b81016020851015620008cb578190505b620008e3620008da8562000776565b83018262000874565b50505b505050565b60008160020a8304905092915050565b60006200090e60001984600802620008eb565b1980831691505092915050565b6000620009298383620008fb565b9150826002028217905092915050565b6200094482620006f2565b67ffffffffffffffff81111562000960576200095f620003c9565b5b6200096c82546200072c565b620009798282856200089b565b600060209050601f831160018114620009b157600084156200099c578287015190505b620009a885826200091b565b86555062000a18565b601f198416620009c18662000761565b60005b82811015620009eb57848901518255600182019150602085019450602081019050620009c4565b8683101562000a0b578489015162000a07601f891682620008fb565b8355505b6001600288020188555050505b505050505050565b6000600282049050919050565b6000808291508390505b600185111562000a7f5780860481111562000a575762000a5662000320565b5b600185161562000a675780820291505b808102905062000a778562000a20565b945062000a37565b94509492505050565b60008262000a9a576001905062000b6d565b8162000aaa576000905062000b6d565b816001811462000ac3576002811462000ace5762000b04565b600191505062000b6d565b60ff84111562000ae35762000ae262000320565b5b8360020a91508482111562000afd5762000afc62000320565b5b5062000b6d565b5060208310610133831016604e8410600b841016171562000b3e5782820a90508381111562000b385762000b3762000320565b5b62000b6d565b62000b4d848484600162000a2d565b9250905081840481111562000b675762000b6662000320565b5b81810290505b9392505050565b600062000b818262000316565b915062000b8e8362000316565b925062000bbd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000a88565b905092915050565b60805160a05160c05160e05161317862000c3e60003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131786000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a35565b60405180910390f35b6102e860048036038101906102e39190612aeb565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b56565b60405180910390f35b610324610c96565b6040516103319190612b80565b60405180910390f35b610342610c9c565b60405161034f9190612b80565b60405180910390f35b610372600480360381019061036d9190612b9b565b610ca8565b60405161037f9190612b80565b60405180910390f35b610390610d2d565b60405161039d9190612b80565b60405180910390f35b6103c060048036038101906103bb9190612bdb565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c2e565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612b9b565b610f6e565b60405161042d9190612b80565b60405180910390f35b61043e61101f565b60405161044b9190612b80565b60405180910390f35b61046e60048036038101906104699190612c2e565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c5b565b611224565b6040516104ab9190612ca1565b60405180910390f35b6104ce60048036038101906104c99190612ce8565b611248565b6040516104db9190612b80565b60405180910390f35b6104fe60048036038101906104f99190612aeb565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c2e565b61139f565b60405161053b9190612b80565b60405180910390f35b61055e60048036038101906105599190612c5b565b6113f7565b60405161056b9190612b80565b60405180910390f35b61058e60048036038101906105899190612c5b565b611457565b60405161059b9190612b80565b60405180910390f35b6105ac611478565b6040516105b99190612b80565b60405180910390f35b6105ca61147e565b6040516105d79190612b80565b60405180910390f35b6105fa60048036038101906105f59190612c5b565b611484565b6040516106079190612b80565b60405180910390f35b61062a60048036038101906106259190612c5b565b6114f0565b6040516106379190612b80565b60405180910390f35b61065a60048036038101906106559190612c2e565b611511565b6040516106679190612b80565b60405180910390f35b61068a60048036038101906106859190612ce8565b61157c565b6040516106979190612b80565b60405180910390f35b6106ba60048036038101906106b59190612c2e565b6115af565b6040516106c79190612b80565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d24565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b80565b60405180910390f35b61076e611b01565b60405161077b9190612a35565b60405180910390f35b61079e60048036038101906107999190612c2e565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612ce8565b611c4c565b6040516107db9190612b80565b60405180910390f35b6107fe60048036038101906107f99190612aeb565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b80565b60405180910390f35b61083a611d3c565b6040516108479190612b80565b60405180910390f35b61086a60048036038101906108659190612ce8565b611d60565b6040516108779190612b80565b60405180910390f35b61089a60048036038101906108959190612b9b565b611d74565b6040516108a79190612b80565b60405180910390f35b6108b8611e25565b6040516108c59190612b56565b60405180910390f35b6108d6611e8f565b6040516108e39190612b80565b60405180910390f35b61090660048036038101906109019190612c2e565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d6e565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d6e565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dce565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b80565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e4e565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612e9d565b91508482610d159190612ece565b90508084610d239190612f10565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b80565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612e9d565b905060005b84811015610ffa57620f42408284610fd09190612ece565b610fda9190612e9d565b83610fe59190612f10565b92508080610ff290612f44565b915050610fb8565b50620f4240858361100b9190612ece565b6110159190612e9d565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f10565b8154811061109957611098612f8c565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612e9d565b86886111299190612e9d565b6111339190612ece565b61113d9190612e9d565b9350620f4240818561114f9190612ece565b6111599190612e9d565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b80565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dce565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dce565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b80565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ece565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dce565b9050919050565b6000603c82426114679190612f10565b6114719190612e9d565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ece565b6114df9190612ece565b6114e99190612e9d565b9050919050565b6000603c82426115009190612f10565b61150a9190612e9d565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ece565b82846116449190612ece565b61164e9190612e9d565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ece565b60035461170e9190612dce565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190612ff6565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dce565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612e9d565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612e9d565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b80565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d6e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d6e565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b80565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612e9d565b905060005b84811015611e0057620f42408284611dd69190612ece565b611de09190612e9d565b83611deb9190612dce565b92508080611df890612f44565b915050611dbe565b50620f42408583611e119190612ece565b611e1b9190612e9d565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f10565b611e809190612e9d565b611e8a9190612dce565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dce565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79061305d565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f10565b8154811061217c5761217b612f8c565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f10565b815481106121da576121d9612f8c565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f10565b8154811061221957612218612f8c565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130a9565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ece565b6123c49190612e9d565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ece565b6124009190612e9d565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f10565b8154811061244c5761244b612f8c565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f10565b815481106124b4576124b3612f8c565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612e9d565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f10565b8154811061257757612576612f8c565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f10565b815481106125b1576125b0612f8c565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f10565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613122565b60405180910390fd5b84836126c19190612f10565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f10565b8154811061283e5761283d612f8c565b5b90600052602060002001549250600161285684611248565b6128609190612dce565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f10565b815481106128cd576128cc612f8c565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a07826129a5565b612a1181856129b0565b9350612a218185602086016129c1565b612a2a816129eb565b840191505092915050565b60006020820190508181036000830152612a4f81846129fc565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8282612a57565b9050919050565b612a9281612a77565b8114612a9d57600080fd5b50565b600081359050612aaf81612a89565b92915050565b6000819050919050565b612ac881612ab5565b8114612ad357600080fd5b50565b600081359050612ae581612abf565b92915050565b60008060408385031215612b0257612b016128e5565b5b6000612b1085828601612aa0565b9250506020612b2185828601612ad6565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5081612b2b565b82525050565b6000602082019050612b6b6000830184612b47565b92915050565b612b7a81612ab5565b82525050565b6000602082019050612b956000830184612b71565b92915050565b60008060408385031215612bb257612bb16128e5565b5b6000612bc085828601612ad6565b9250506020612bd185828601612ad6565b9150509250929050565b600080600060608486031215612bf457612bf36128e5565b5b6000612c0286828701612aa0565b9350506020612c1386828701612aa0565b9250506040612c2486828701612ad6565b9150509250925092565b600060208284031215612c4457612c436128e5565b5b6000612c5284828501612aa0565b91505092915050565b600060208284031215612c7157612c706128e5565b5b6000612c7f84828501612ad6565b91505092915050565b6000819050919050565b612c9b81612c88565b82525050565b6000602082019050612cb66000830184612c92565b92915050565b612cc581612c88565b8114612cd057600080fd5b50565b600081359050612ce281612cbc565b92915050565b600060208284031215612cfe57612cfd6128e5565b5b6000612d0c84828501612cd3565b91505092915050565b612d1e81612a77565b82525050565b6000602082019050612d396000830184612d15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8657607f821691505b602082108103612d9957612d98612d3f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612dd982612ab5565b9150612de483612ab5565b9250828201905080821115612dfc57612dfb612d9f565b5b92915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e386011836129b0565b9150612e4382612e02565b602082019050919050565b60006020820190508181036000830152612e6781612e2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ea882612ab5565b9150612eb383612ab5565b925082612ec357612ec2612e6e565b5b828204905092915050565b6000612ed982612ab5565b9150612ee483612ab5565b9250828202612ef281612ab5565b91508282048414831517612f0957612f08612d9f565b5b5092915050565b6000612f1b82612ab5565b9150612f2683612ab5565b9250828203905081811115612f3e57612f3d612d9f565b5b92915050565b6000612f4f82612ab5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f8157612f80612d9f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000612fe0612fdb612fd684612b2b565b612fbb565b612ab5565b9050919050565b612ff081612fc5565b82525050565b600060208201905061300b6000830184612fe7565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b6000613047600d836129b0565b915061305282613011565b602082019050919050565b600060208201905081810360008301526130768161303a565b9050919050565b61308681612b2b565b811461309157600080fd5b50565b6000815190506130a38161307d565b92915050565b6000602082840312156130bf576130be6128e5565b5b60006130cd84828501613094565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061310c600d836129b0565b9150613117826130d6565b602082019050919050565b6000602082019050818103600083015261313b816130ff565b905091905056fea2646970667358221220f6c3f7ce7176aeb3def8a31a0be044e8d2b1243b776f0138f0c813c02be2c1e364736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin index 229aa27..e094bfe 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c8438038062003c8483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009eb565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b602082108103620009e557620009e462000987565b5b50919050565b60805160a05160c05160e05161322062000a6460003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526132206000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a6f565b60405180910390f35b6102d260048036038101906102cd9190612b25565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b90565b60405180910390f35b61030e610c32565b60405161031b9190612bba565b60405180910390f35b61032c610c38565b6040516103399190612bba565b60405180910390f35b61035c60048036038101906103579190612bd5565b610c44565b6040516103699190612bba565b60405180910390f35b61037a610cc9565b6040516103879190612bba565b60405180910390f35b6103aa60048036038101906103a59190612c15565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c68565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bd5565b610f0a565b6040516104179190612bba565b60405180910390f35b610428610fbb565b6040516104359190612bba565b60405180910390f35b61045860048036038101906104539190612c68565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c95565b6111c0565b6040516104959190612cdb565b60405180910390f35b6104b860048036038101906104b39190612d22565b6111e4565b6040516104c59190612bba565b60405180910390f35b6104e860048036038101906104e39190612b25565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c68565b611317565b6040516105259190612bba565b60405180910390f35b61054860048036038101906105439190612c95565b61136f565b6040516105559190612bba565b60405180910390f35b6105666113cf565b6040516105739190612bba565b60405180910390f35b61059660048036038101906105919190612c95565b6113d5565b6040516105a39190612bba565b60405180910390f35b6105c660048036038101906105c19190612c95565b611441565b6040516105d39190612bba565b60405180910390f35b6105f660048036038101906105f19190612c68565b611462565b6040516106039190612bba565b60405180910390f35b61062660048036038101906106219190612d22565b6114cd565b6040516106339190612bba565b60405180910390f35b61065660048036038101906106519190612c68565b611500565b6040516106639190612bba565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d5e565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a6f565b60405180910390f35b61071c60048036038101906107179190612c68565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d22565b611c5b565b6040516107599190612bba565b60405180910390f35b61076a611c87565b6040516107779190612b90565b60405180910390f35b61079a60048036038101906107959190612b25565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bba565b60405180910390f35b6107d6611d6d565b6040516107e39190612bba565b60405180910390f35b61080660048036038101906108019190612d22565b611d91565b6040516108139190612bba565b60405180910390f35b61083660048036038101906108319190612bd5565b611da5565b6040516108439190612bba565b60405180910390f35b610854611e56565b6040516108619190612b90565b60405180910390f35b610872611ec0565b60405161087f9190612bba565b60405180910390f35b6108a2600480360381019061089d9190612c68565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612da8565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612e08565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bba565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612eaa565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ef9565b91508482610cb19190612f2a565b90508084610cbf9190612f84565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bba565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ef9565b905060005b84811015610f9657620f42408284610f6c9190612f2a565b610f769190612ef9565b83610f819190612f84565b92508080610f8e90612fb8565b915050610f54565b50620f42408583610fa79190612f2a565b610fb19190612ef9565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f84565b8154811061103557611034613000565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ef9565b86886110c59190612ef9565b6110cf9190612f2a565b6110d99190612ef9565b9350620f424081856110eb9190612f2a565b6110f59190612ef9565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bba565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612e08565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bba565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612f2a565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612e08565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612f2a565b6114309190612f2a565b61143a9190612ef9565b9050919050565b6000603c82426114519190612f84565b61145b9190612ef9565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b611542919061302f565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612f2a565b82846115cd9190612f2a565b6115d79190612ef9565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d919061302f565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061309e565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612e08565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ef9565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ef9565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bba565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612da8565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bba565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ef9565b905060005b84811015611e3157620f42408284611e079190612f2a565b611e119190612ef9565b83611e1c9190612e08565b92508080611e2990612fb8565b915050611def565b50620f42408583611e429190612f2a565b611e4c9190612ef9565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f84565b611eb19190612ef9565b611ebb9190612e08565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612e08565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890613105565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f84565b815481106121ad576121ac613000565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f84565b8154811061220b5761220a613000565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f84565b8154811061224a57612249613000565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190613151565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612f2a565b6123f59190612ef9565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612f2a565b6124319190612ef9565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f84565b8154811061247d5761247c613000565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f84565b815481106124e5576124e4613000565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ef9565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f84565b815481106125a8576125a7613000565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f84565b815481106125e2576125e1613000565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f84565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906131ca565b60405180910390fd5b84836126f29190612f84565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f84565b8154811061286f5761286e613000565b5b906000526020600020015492506001612887846111e4565b6128919190612e08565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f84565b815481106128fe576128fd613000565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b8114612ad757600080fd5b50565b600081359050612ae981612ac3565b92915050565b6000819050919050565b612b0281612aef565b8114612b0d57600080fd5b50565b600081359050612b1f81612af9565b92915050565b60008060408385031215612b3c57612b3b612916565b5b6000612b4a85828601612ada565b9250506020612b5b85828601612b10565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8a81612b65565b82525050565b6000602082019050612ba56000830184612b81565b92915050565b612bb481612aef565b82525050565b6000602082019050612bcf6000830184612bab565b92915050565b60008060408385031215612bec57612beb612916565b5b6000612bfa85828601612b10565b9250506020612c0b85828601612b10565b9150509250929050565b600080600060608486031215612c2e57612c2d612916565b5b6000612c3c86828701612ada565b9350506020612c4d86828701612ada565b9250506040612c5e86828701612b10565b9150509250925092565b600060208284031215612c7e57612c7d612916565b5b6000612c8c84828501612ada565b91505092915050565b600060208284031215612cab57612caa612916565b5b6000612cb984828501612b10565b91505092915050565b6000819050919050565b612cd581612cc2565b82525050565b6000602082019050612cf06000830184612ccc565b92915050565b612cff81612cc2565b8114612d0a57600080fd5b50565b600081359050612d1c81612cf6565b92915050565b600060208284031215612d3857612d37612916565b5b6000612d4684828501612d0d565b91505092915050565b612d5881612ab1565b82525050565b6000602082019050612d736000830184612d4f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dc057607f821691505b602082108103612dd357612dd2612d79565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e1382612aef565b9150612e1e83612aef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5357612e52612dd9565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e946011836129e1565b9150612e9f82612e5e565b602082019050919050565b60006020820190508181036000830152612ec381612e87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f0482612aef565b9150612f0f83612aef565b925082612f1f57612f1e612eca565b5b828204905092915050565b6000612f3582612aef565b9150612f4083612aef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f7957612f78612dd9565b5b828202905092915050565b6000612f8f82612aef565b9150612f9a83612aef565b925082821015612fad57612fac612dd9565b5b828203905092915050565b6000612fc382612aef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff557612ff4612dd9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061303a82612b65565b915061304583612b65565b92508282101561305857613057612dd9565b5b828203905092915050565b6000819050919050565b600061308861308361307e84612b65565b613063565b612aef565b9050919050565b6130988161306d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130ef600d836129e1565b91506130fa826130b9565b602082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b61312e81612b65565b811461313957600080fd5b50565b60008151905061314b81613125565b92915050565b60006020828403121561316757613166612916565b5b60006131758482850161313c565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131b4600d836129e1565b91506131bf8261317e565b602082019050919050565b600060208201905081810360008301526131e3816131a7565b905091905056fea2646970667358221220264f607b835653f036df7c03346e36a25ca6aaeba8bb51495b6669a847b0b5b164736f6c634300080d0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000378565b6080908152503480156200003757600080fd5b5060405162003e3d38038062003e3d83398181016040528101906200005d91906200062a565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590816200012991906200094b565b5084600690816200013b91906200094b565b508360ff166007819055504260a08181525050603c826200015d919062000378565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000183919062000378565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002226000620f424060006001620002b3640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002a0919062000b86565b6009819055505050505050505062000bd7565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000385826200033f565b915062000392836200033f565b9250828202620003a2816200033f565b91508282048414831517620003bc57620003bb62000349565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200042c82620003e1565b810181811067ffffffffffffffff821117156200044e576200044d620003f2565b5b80604052505050565b600062000463620003c3565b905062000471828262000421565b919050565b600067ffffffffffffffff821115620004945762000493620003f2565b5b6200049f82620003e1565b9050602081019050919050565b60005b83811015620004cc578082015181840152602081019050620004af565b60008484015250505050565b6000620004ef620004e98462000476565b62000457565b9050828152602081018484840111156200050e576200050d620003dc565b5b6200051b848285620004ac565b509392505050565b600082601f8301126200053b576200053a620003d7565b5b81516200054d848260208601620004d8565b91505092915050565b600060ff82169050919050565b6200056e8162000556565b81146200057a57600080fd5b50565b6000815190506200058e8162000563565b92915050565b6200059f816200033f565b8114620005ab57600080fd5b50565b600081519050620005bf8162000594565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f282620005c5565b9050919050565b6200060481620005e5565b81146200061057600080fd5b50565b6000815190506200062481620005f9565b92915050565b60008060008060008060c087890312156200064a5762000649620003cd565b5b600087015167ffffffffffffffff8111156200066b576200066a620003d2565b5b6200067989828a0162000523565b965050602087015167ffffffffffffffff8111156200069d576200069c620003d2565b5b620006ab89828a0162000523565b9550506040620006be89828a016200057d565b9450506060620006d189828a01620005ae565b9350506080620006e489828a01620005ae565b92505060a0620006f789828a0162000613565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200075757607f821691505b6020821081036200076d576200076c6200070f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620007da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000798565b620007e6868362000798565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000829620008236200081d846200033f565b620007fe565b6200033f565b9050919050565b6000819050919050565b620008458362000808565b6200085d620008548262000830565b848454620007a8565b825550505050565b600090565b6200087462000865565b620008818184846200083a565b505050565b5b81811015620008a9576200089d6000826200086a565b60018101905062000887565b5050565b601f821115620008f857620008c28162000773565b620008cd8462000788565b81016020851015620008dd578190505b620008f5620008ec8562000788565b83018262000886565b50505b505050565b60008160020a8304905092915050565b60006200092060001984600802620008fd565b1980831691505092915050565b60006200093b83836200090d565b9150826002028217905092915050565b620009568262000704565b67ffffffffffffffff811115620009725762000971620003f2565b5b6200097e82546200073e565b6200098b828285620008ad565b600060209050601f831160018114620009c35760008415620009ae578287015190505b620009ba85826200092d565b86555062000a2a565b601f198416620009d38662000773565b60005b82811015620009fd57848901518255600182019150602085019450602081019050620009d6565b8683101562000a1d578489015162000a19601f8916826200090d565b8355505b6001600288020188555050505b505050505050565b6000600282049050919050565b6000808291508390505b600185111562000a915780860481111562000a695762000a6862000349565b5b600185161562000a795780820291505b808102905062000a898562000a32565b945062000a49565b94509492505050565b60008262000aac576001905062000b7f565b8162000abc576000905062000b7f565b816001811462000ad5576002811462000ae05762000b16565b600191505062000b7f565b60ff84111562000af55762000af462000349565b5b8360020a91508482111562000b0f5762000b0e62000349565b5b5062000b7f565b5060208310610133831016604e8410600b841016171562000b505782820a90508381111562000b4a5762000b4962000349565b5b62000b7f565b62000b5f848484600162000a3f565b9250905081840481111562000b795762000b7862000349565b5b81810290505b9392505050565b600062000b93826200033f565b915062000ba0836200033f565b925062000bcf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000a9a565b905092915050565b60805160a05160c05160e0516131ed62000c5060003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526131ed6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a66565b60405180910390f35b6102d260048036038101906102cd9190612b1c565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b87565b60405180910390f35b61030e610c32565b60405161031b9190612bb1565b60405180910390f35b61032c610c38565b6040516103399190612bb1565b60405180910390f35b61035c60048036038101906103579190612bcc565b610c44565b6040516103699190612bb1565b60405180910390f35b61037a610cc9565b6040516103879190612bb1565b60405180910390f35b6103aa60048036038101906103a59190612c0c565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c5f565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bcc565b610f0a565b6040516104179190612bb1565b60405180910390f35b610428610fbb565b6040516104359190612bb1565b60405180910390f35b61045860048036038101906104539190612c5f565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c8c565b6111c0565b6040516104959190612cd2565b60405180910390f35b6104b860048036038101906104b39190612d19565b6111e4565b6040516104c59190612bb1565b60405180910390f35b6104e860048036038101906104e39190612b1c565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c5f565b611317565b6040516105259190612bb1565b60405180910390f35b61054860048036038101906105439190612c8c565b61136f565b6040516105559190612bb1565b60405180910390f35b6105666113cf565b6040516105739190612bb1565b60405180910390f35b61059660048036038101906105919190612c8c565b6113d5565b6040516105a39190612bb1565b60405180910390f35b6105c660048036038101906105c19190612c8c565b611441565b6040516105d39190612bb1565b60405180910390f35b6105f660048036038101906105f19190612c5f565b611462565b6040516106039190612bb1565b60405180910390f35b61062660048036038101906106219190612d19565b6114cd565b6040516106339190612bb1565b60405180910390f35b61065660048036038101906106519190612c5f565b611500565b6040516106639190612bb1565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d55565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a66565b60405180910390f35b61071c60048036038101906107179190612c5f565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d19565b611c5b565b6040516107599190612bb1565b60405180910390f35b61076a611c87565b6040516107779190612b87565b60405180910390f35b61079a60048036038101906107959190612b1c565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bb1565b60405180910390f35b6107d6611d6d565b6040516107e39190612bb1565b60405180910390f35b61080660048036038101906108019190612d19565b611d91565b6040516108139190612bb1565b60405180910390f35b61083660048036038101906108319190612bcc565b611da5565b6040516108439190612bb1565b60405180910390f35b610854611e56565b6040516108619190612b87565b60405180910390f35b610872611ec0565b60405161087f9190612bb1565b60405180910390f35b6108a2600480360381019061089d9190612c5f565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612d9f565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612dff565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bb1565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612e7f565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ece565b91508482610cb19190612eff565b90508084610cbf9190612f41565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bb1565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ece565b905060005b84811015610f9657620f42408284610f6c9190612eff565b610f769190612ece565b83610f819190612f41565b92508080610f8e90612f75565b915050610f54565b50620f42408583610fa79190612eff565b610fb19190612ece565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f41565b8154811061103557611034612fbd565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ece565b86886110c59190612ece565b6110cf9190612eff565b6110d99190612ece565b9350620f424081856110eb9190612eff565b6110f59190612ece565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bb1565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612dff565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bb1565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612eff565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612dff565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612eff565b6114309190612eff565b61143a9190612ece565b9050919050565b6000603c82426114519190612f41565b61145b9190612ece565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b6115429190612fec565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612eff565b82846115cd9190612eff565b6115d79190612ece565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d9190612fec565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061306b565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612dff565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ece565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ece565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bb1565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612d9f565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bb1565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ece565b905060005b84811015611e3157620f42408284611e079190612eff565b611e119190612ece565b83611e1c9190612dff565b92508080611e2990612f75565b915050611def565b50620f42408583611e429190612eff565b611e4c9190612ece565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f41565b611eb19190612ece565b611ebb9190612dff565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612dff565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612108906130d2565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f41565b815481106121ad576121ac612fbd565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f41565b8154811061220b5761220a612fbd565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f41565b8154811061224a57612249612fbd565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e2919061311e565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612eff565b6123f59190612ece565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612eff565b6124319190612ece565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f41565b8154811061247d5761247c612fbd565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f41565b815481106124e5576124e4612fbd565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ece565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f41565b815481106125a8576125a7612fbd565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f41565b815481106125e2576125e1612fbd565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f41565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd90613197565b60405180910390fd5b84836126f29190612f41565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f41565b8154811061286f5761286e612fbd565b5b906000526020600020015492506001612887846111e4565b6128919190612dff565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f41565b815481106128fe576128fd612fbd565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a38826129d6565b612a4281856129e1565b9350612a528185602086016129f2565b612a5b81612a1c565b840191505092915050565b60006020820190508181036000830152612a808184612a2d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ab382612a88565b9050919050565b612ac381612aa8565b8114612ace57600080fd5b50565b600081359050612ae081612aba565b92915050565b6000819050919050565b612af981612ae6565b8114612b0457600080fd5b50565b600081359050612b1681612af0565b92915050565b60008060408385031215612b3357612b32612916565b5b6000612b4185828601612ad1565b9250506020612b5285828601612b07565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8181612b5c565b82525050565b6000602082019050612b9c6000830184612b78565b92915050565b612bab81612ae6565b82525050565b6000602082019050612bc66000830184612ba2565b92915050565b60008060408385031215612be357612be2612916565b5b6000612bf185828601612b07565b9250506020612c0285828601612b07565b9150509250929050565b600080600060608486031215612c2557612c24612916565b5b6000612c3386828701612ad1565b9350506020612c4486828701612ad1565b9250506040612c5586828701612b07565b9150509250925092565b600060208284031215612c7557612c74612916565b5b6000612c8384828501612ad1565b91505092915050565b600060208284031215612ca257612ca1612916565b5b6000612cb084828501612b07565b91505092915050565b6000819050919050565b612ccc81612cb9565b82525050565b6000602082019050612ce76000830184612cc3565b92915050565b612cf681612cb9565b8114612d0157600080fd5b50565b600081359050612d1381612ced565b92915050565b600060208284031215612d2f57612d2e612916565b5b6000612d3d84828501612d04565b91505092915050565b612d4f81612aa8565b82525050565b6000602082019050612d6a6000830184612d46565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612db757607f821691505b602082108103612dca57612dc9612d70565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e0a82612ae6565b9150612e1583612ae6565b9250828201905080821115612e2d57612e2c612dd0565b5b92915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e696011836129e1565b9150612e7482612e33565b602082019050919050565b60006020820190508181036000830152612e9881612e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed982612ae6565b9150612ee483612ae6565b925082612ef457612ef3612e9f565b5b828204905092915050565b6000612f0a82612ae6565b9150612f1583612ae6565b9250828202612f2381612ae6565b91508282048414831517612f3a57612f39612dd0565b5b5092915050565b6000612f4c82612ae6565b9150612f5783612ae6565b9250828203905081811115612f6f57612f6e612dd0565b5b92915050565b6000612f8082612ae6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fb257612fb1612dd0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ff782612b5c565b915061300283612b5c565b925082820390506fffffffffffffffffffffffffffffffff81111561302a57613029612dd0565b5b92915050565b6000819050919050565b600061305561305061304b84612b5c565b613030565b612ae6565b9050919050565b6130658161303a565b82525050565b6000602082019050613080600083018461305c565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130bc600d836129e1565b91506130c782613086565b602082019050919050565b600060208201905081810360008301526130eb816130af565b9050919050565b6130fb81612b5c565b811461310657600080fd5b50565b600081519050613118816130f2565b92915050565b60006020828403121561313457613133612916565b5b600061314284828501613109565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000613181600d836129e1565b915061318c8261314b565b602082019050919050565b600060208201905081810360008301526131b081613174565b905091905056fea2646970667358221220f2d0778aaedf04ef72fd5734950fa534481c2c6e30df88849802da83cc11813664736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin index 06e6bd2..c831e0c 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b506040516200364d3803806200364d83398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a33565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b60208210810362000a2d5762000a2c620009cf565b5b50919050565b60805160a05160c05160e051612ba162000aac60003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612ba16000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d09190612373565b60405180910390f35b6102f360048036038101906102ee9190612429565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e9190612494565b60405180910390f35b61032f610cb3565b60405161033c91906124be565b60405180910390f35b61034d610cb9565b60405161035a91906124be565b60405180910390f35b61036b610cc5565b60405161037891906124be565b60405180910390f35b61039b600480360381019061039691906124d9565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c6919061252c565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612559565b610efc565b60405161040891906124be565b60405180910390f35b610419610fb0565b60405161042691906124be565b60405180910390f35b61044960048036038101906104449190612599565b610fb6565b60405161045691906125df565b60405180910390f35b61047960048036038101906104749190612429565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a4919061252c565b61116c565b6040516104b691906124be565b60405180910390f35b6104d960048036038101906104d49190612599565b6111b5565b6040516104e691906124be565b60405180910390f35b61050960048036038101906105049190612599565b611215565b60405161051691906124be565b60405180910390f35b610527611236565b60405161053491906124be565b60405180910390f35b61054561123c565b60405161055291906124be565b60405180910390f35b61057560048036038101906105709190612559565b611242565b60405161058291906124be565b60405180910390f35b6105a560048036038101906105a09190612599565b6112c3565b6040516105b291906124be565b60405180910390f35b6105d560048036038101906105d09190612599565b611343565b6040516105e291906124be565b60405180910390f35b61060560048036038101906106009190612626565b611364565b60405161061291906124be565b60405180910390f35b6106356004803603810190610630919061252c565b61139e565b60405161064291906124be565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c9190612626565b61160e565b6040516106ae91906124be565b60405180910390f35b6106bf61163c565b6040516106cc9190612662565b60405180910390f35b6106ef60048036038101906106ea919061252c565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124be565b60405180910390f35b61073561184f565b6040516107429190612373565b60405180910390f35b6107656004803603810190610760919061252c565b6118dd565b60405161077291906122bf565b60405180910390f35b61079560048036038101906107909190612626565b61199a565b6040516107a291906124be565b60405180910390f35b6107c560048036038101906107c09190612429565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124be565b60405180910390f35b610801611a80565b60405161080e91906124be565b60405180910390f35b610831600480360381019061082c9190612599565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c9190612626565b611bdc565b60405161086e91906124be565b60405180910390f35b610891600480360381019061088c9190612559565b611bf0565b60405161089e91906124be565b60405180910390f35b6108af611ca4565b6040516108bc9190612494565b60405180910390f35b6108cd611d0e565b6040516108da91906124be565b60405180910390f35b6108fd60048036038101906108f8919061252c565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d6004803603810190610928919061267d565b611dd4565b60405161093a91906125df565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af690612713565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612713565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612773565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124be565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124be565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127f8565b905060005b84811015610f895764e8d4a510008284610f5f9190612829565b610f6991906127f8565b83610f749190612883565b92508080610f81906128b7565b915050610f45565b5064e8d4a510008583610f9c9190612829565b610fa691906127f8565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110609061294b565b60405180910390fd5b600a546009548461107a9190612773565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906129b7565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e19190612773565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124be565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e39190612829565b7f000000000000000000000000000000000000000000000000000000000000000061120e9190612773565b9050919050565b6000603c82426112259190612883565b61122f91906127f8565b9050919050565b600b5481565b60035481565b6000806402540be400836112569190612829565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612883565b8461128c9190612829565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127f8565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f491906129d7565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113329190612829565b61133c91906127f8565b9050919050565b6000603c82426113539190612883565b61135d91906127f8565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee91906129d7565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006114369190612829565b82846114429190612829565b61144c91906127f8565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b95506001866117559190612773565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124be565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c90612713565b80601f016020809104026020016040519081016040528092919081815260200182805461188890612713565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124be565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b639190612829565b600354611b709190612773565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a5c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127f8565b905060005b84811015611c7d5764e8d4a510008284611c539190612829565b611c5d91906127f8565b83611c689190612773565b92508080611c75906128b7565b915050611c39565b5064e8d4a510008583611c909190612829565b611c9a91906127f8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612883565b611cff91906127f8565b611d099190612773565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed99190612773565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612883565b81548110611f5957611f58612a77565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612883565b81548110611fb557611fb4612a77565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612883565b81548110611ff557611ff4612a77565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612ad2565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612b4b565b60405180910390fd5b84836121c99190612883565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b83811115612323576000848401525b50505050565b6000601f19601f8301169050919050565b6000612345826122da565b61234f81856122e5565b935061235f8185602086016122f6565b61236881612329565b840191505092915050565b6000602082019050818103600083015261238d818461233a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c082612395565b9050919050565b6123d0816123b5565b81146123db57600080fd5b50565b6000813590506123ed816123c7565b92915050565b6000819050919050565b612406816123f3565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b600080604083850312156124405761243f61221a565b5b600061244e858286016123de565b925050602061245f85828601612414565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248e81612469565b82525050565b60006020820190506124a96000830184612485565b92915050565b6124b8816123f3565b82525050565b60006020820190506124d360008301846124af565b92915050565b6000806000606084860312156124f2576124f161221a565b5b6000612500868287016123de565b9350506020612511868287016123de565b925050604061252286828701612414565b9150509250925092565b6000602082840312156125425761254161221a565b5b6000612550848285016123de565b91505092915050565b600080604083850312156125705761256f61221a565b5b600061257e85828601612414565b925050602061258f85828601612414565b9150509250929050565b6000602082840312156125af576125ae61221a565b5b60006125bd84828501612414565b91505092915050565b6000819050919050565b6125d9816125c6565b82525050565b60006020820190506125f460008301846125d0565b92915050565b612603816125c6565b811461260e57600080fd5b50565b600081359050612620816125fa565b92915050565b60006020828403121561263c5761263b61221a565b5b600061264a84828501612611565b91505092915050565b61265c816123b5565b82525050565b60006020820190506126776000830184612653565b92915050565b600080600080608085870312156126975761269661221a565b5b60006126a587828801612414565b94505060206126b687828801612414565b93505060406126c787828801612414565b92505060606126d887828801612414565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272b57607f821691505b60208210810361273e5761273d6126e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061277e826123f3565b9150612789836123f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127be576127bd612744565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612803826123f3565b915061280e836123f3565b92508261281e5761281d6127c9565b5b828204905092915050565b6000612834826123f3565b915061283f836123f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287857612877612744565b5b828202905092915050565b600061288e826123f3565b9150612899836123f3565b9250828210156128ac576128ab612744565b5b828203905092915050565b60006128c2826123f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128f4576128f3612744565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612935600a836122e5565b9150612940826128ff565b602082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129a16007836122e5565b91506129ac8261296b565b602082019050919050565b600060208201905081810360008301526129d081612994565b9050919050565b60006129e282612469565b91506129ed83612469565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a1657612a15612744565b5b828202905092915050565b6000819050919050565b6000612a46612a41612a3c84612469565b612a21565b6123f3565b9050919050565b612a5681612a2b565b82525050565b6000602082019050612a716000830184612a4d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aaf81612469565b8114612aba57600080fd5b50565b600081519050612acc81612aa6565b92915050565b600060208284031215612ae857612ae761221a565b5b6000612af684828501612abd565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b35600d836122e5565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b905091905056fea264697066735822122062c31e95bd6895f83a0143b8b2662ee1e29e96dcc6cdf00d59c085ca9228ddc264736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200035c565b6080908152503480156200003657600080fd5b50604051620037e9380380620037e983398181016040528101906200005c91906200065b565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000128919062000993565b5085600790816200013a919062000993565b508460ff166008819055504260038190555060035460a08181525050603c836200016591906200035c565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200021d6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b6640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002a2919062000bce565b600b81905550505050505050505062000c1f565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003698262000323565b9150620003768362000323565b9250828202620003868162000323565b91508282048414831517620003a0576200039f6200032d565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200041082620003c5565b810181811067ffffffffffffffff82111715620004325762000431620003d6565b5b80604052505050565b600062000447620003a7565b905062000455828262000405565b919050565b600067ffffffffffffffff821115620004785762000477620003d6565b5b6200048382620003c5565b9050602081019050919050565b60005b83811015620004b057808201518184015260208101905062000493565b60008484015250505050565b6000620004d3620004cd846200045a565b6200043b565b905082815260208101848484011115620004f257620004f1620003c0565b5b620004ff84828562000490565b509392505050565b600082601f8301126200051f576200051e620003bb565b5b815162000531848260208601620004bc565b91505092915050565b600060ff82169050919050565b62000552816200053a565b81146200055e57600080fd5b50565b600081519050620005728162000547565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200059f8162000578565b8114620005ab57600080fd5b50565b600081519050620005bf8162000594565b92915050565b620005d08162000323565b8114620005dc57600080fd5b50565b600081519050620005f081620005c5565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200062382620005f6565b9050919050565b620006358162000616565b81146200064157600080fd5b50565b60008151905062000655816200062a565b92915050565b600080600080600080600060e0888a0312156200067d576200067c620003b1565b5b600088015167ffffffffffffffff8111156200069e576200069d620003b6565b5b620006ac8a828b0162000507565b975050602088015167ffffffffffffffff811115620006d057620006cf620003b6565b5b620006de8a828b0162000507565b9650506040620006f18a828b0162000561565b9550506060620007048a828b01620005ae565b9450506080620007178a828b01620005df565b93505060a06200072a8a828b0162000644565b92505060c06200073d8a828b01620005df565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200079f57607f821691505b602082108103620007b557620007b462000757565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008227fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e0565b6200082e8683620007e0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008716200086b620008658462000323565b62000846565b62000323565b9050919050565b6000819050919050565b6200088d8362000850565b620008a56200089c8262000878565b848454620007f0565b825550505050565b600090565b620008bc620008ad565b620008c981848462000882565b505050565b5b81811015620008f157620008e5600082620008b2565b600181019050620008cf565b5050565b601f82111562000940576200090a81620007bb565b6200091584620007d0565b8101602085101562000925578190505b6200093d6200093485620007d0565b830182620008ce565b50505b505050565b60008160020a8304905092915050565b6000620009686000198460080262000945565b1980831691505092915050565b600062000983838362000955565b9150826002028217905092915050565b6200099e826200074c565b67ffffffffffffffff811115620009ba57620009b9620003d6565b5b620009c6825462000786565b620009d3828285620008f5565b600060209050601f83116001811462000a0b5760008415620009f6578287015190505b62000a02858262000975565b86555062000a72565b601f19841662000a1b86620007bb565b60005b8281101562000a455784890151825560018201915060208501945060208101905062000a1e565b8683101562000a65578489015162000a61601f89168262000955565b8355505b6001600288020188555050505b505050505050565b6000600282049050919050565b6000808291508390505b600185111562000ad95780860481111562000ab15762000ab06200032d565b5b600185161562000ac15780820291505b808102905062000ad18562000a7a565b945062000a91565b94509492505050565b60008262000af4576001905062000bc7565b8162000b04576000905062000bc7565b816001811462000b1d576002811462000b285762000b5e565b600191505062000bc7565b60ff84111562000b3d5762000b3c6200032d565b5b8360020a91508482111562000b575762000b566200032d565b5b5062000bc7565b5060208310610133831016604e8410600b841016171562000b985782820a90508381111562000b925762000b916200032d565b5b62000bc7565b62000ba7848484600162000a87565b9250905081840481111562000bc15762000bc06200032d565b5b81810290505b9392505050565b600062000bdb8262000323565b915062000be88362000323565b925062000c177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ae2565b905092915050565b60805160a05160c05160e051612b5162000c9860003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612b516000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d0919061236a565b60405180910390f35b6102f360048036038101906102ee9190612420565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e919061248b565b60405180910390f35b61032f610cb3565b60405161033c91906124b5565b60405180910390f35b61034d610cb9565b60405161035a91906124b5565b60405180910390f35b61036b610cc5565b60405161037891906124b5565b60405180910390f35b61039b600480360381019061039691906124d0565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c69190612523565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612550565b610efc565b60405161040891906124b5565b60405180910390f35b610419610fb0565b60405161042691906124b5565b60405180910390f35b61044960048036038101906104449190612590565b610fb6565b60405161045691906125d6565b60405180910390f35b61047960048036038101906104749190612420565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a49190612523565b61116c565b6040516104b691906124b5565b60405180910390f35b6104d960048036038101906104d49190612590565b6111b5565b6040516104e691906124b5565b60405180910390f35b61050960048036038101906105049190612590565b611215565b60405161051691906124b5565b60405180910390f35b610527611236565b60405161053491906124b5565b60405180910390f35b61054561123c565b60405161055291906124b5565b60405180910390f35b61057560048036038101906105709190612550565b611242565b60405161058291906124b5565b60405180910390f35b6105a560048036038101906105a09190612590565b6112c3565b6040516105b291906124b5565b60405180910390f35b6105d560048036038101906105d09190612590565b611343565b6040516105e291906124b5565b60405180910390f35b6106056004803603810190610600919061261d565b611364565b60405161061291906124b5565b60405180910390f35b61063560048036038101906106309190612523565b61139e565b60405161064291906124b5565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c919061261d565b61160e565b6040516106ae91906124b5565b60405180910390f35b6106bf61163c565b6040516106cc9190612659565b60405180910390f35b6106ef60048036038101906106ea9190612523565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124b5565b60405180910390f35b61073561184f565b604051610742919061236a565b60405180910390f35b61076560048036038101906107609190612523565b6118dd565b60405161077291906122bf565b60405180910390f35b6107956004803603810190610790919061261d565b61199a565b6040516107a291906124b5565b60405180910390f35b6107c560048036038101906107c09190612420565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124b5565b60405180910390f35b610801611a80565b60405161080e91906124b5565b60405180910390f35b610831600480360381019061082c9190612590565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c919061261d565b611bdc565b60405161086e91906124b5565b60405180910390f35b610891600480360381019061088c9190612550565b611bf0565b60405161089e91906124b5565b60405180910390f35b6108af611ca4565b6040516108bc919061248b565b60405180910390f35b6108cd611d0e565b6040516108da91906124b5565b60405180910390f35b6108fd60048036038101906108f89190612523565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d60048036038101906109289190612674565b611dd4565b60405161093a91906125d6565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af69061270a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b229061270a565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a919061276a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124b5565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124b5565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127cd565b905060005b84811015610f895764e8d4a510008284610f5f91906127fe565b610f6991906127cd565b83610f749190612840565b92508080610f8190612874565b915050610f45565b5064e8d4a510008583610f9c91906127fe565b610fa691906127cd565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090612908565b60405180910390fd5b600a546009548461107a919061276a565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290612974565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e1919061276a565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124b5565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e391906127fe565b7f000000000000000000000000000000000000000000000000000000000000000061120e919061276a565b9050919050565b6000603c82426112259190612840565b61122f91906127cd565b9050919050565b600b5481565b60035481565b6000806402540be4008361125691906127fe565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612840565b8461128c91906127fe565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127cd565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f49190612994565b6fffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008361133291906127fe565b61133c91906127cd565b9050919050565b6000603c82426113539190612840565b61135d91906127cd565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee9190612994565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061143691906127fe565b828461144291906127fe565b61144c91906127cd565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b9550600186611755919061276a565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124b5565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c9061270a565b80601f01602080910402602001604051908101604052809291908181526020018280546118889061270a565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124b5565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b6391906127fe565b600354611b70919061276a565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a0c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127cd565b905060005b84811015611c7d5764e8d4a510008284611c5391906127fe565b611c5d91906127cd565b83611c68919061276a565b92508080611c7590612874565b915050611c39565b5064e8d4a510008583611c9091906127fe565b611c9a91906127cd565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612840565b611cff91906127cd565b611d09919061276a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed9919061276a565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612840565b81548110611f5957611f58612a27565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612840565b81548110611fb557611fb4612a27565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612840565b81548110611ff557611ff4612a27565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612a82565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612afb565b60405180910390fd5b84836121c99190612840565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061233c826122da565b61234681856122e5565b93506123568185602086016122f6565b61235f81612320565b840191505092915050565b600060208201905081810360008301526123848184612331565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123b78261238c565b9050919050565b6123c7816123ac565b81146123d257600080fd5b50565b6000813590506123e4816123be565b92915050565b6000819050919050565b6123fd816123ea565b811461240857600080fd5b50565b60008135905061241a816123f4565b92915050565b600080604083850312156124375761243661221a565b5b6000612445858286016123d5565b92505060206124568582860161240b565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248581612460565b82525050565b60006020820190506124a0600083018461247c565b92915050565b6124af816123ea565b82525050565b60006020820190506124ca60008301846124a6565b92915050565b6000806000606084860312156124e9576124e861221a565b5b60006124f7868287016123d5565b9350506020612508868287016123d5565b92505060406125198682870161240b565b9150509250925092565b6000602082840312156125395761253861221a565b5b6000612547848285016123d5565b91505092915050565b600080604083850312156125675761256661221a565b5b60006125758582860161240b565b92505060206125868582860161240b565b9150509250929050565b6000602082840312156125a6576125a561221a565b5b60006125b48482850161240b565b91505092915050565b6000819050919050565b6125d0816125bd565b82525050565b60006020820190506125eb60008301846125c7565b92915050565b6125fa816125bd565b811461260557600080fd5b50565b600081359050612617816125f1565b92915050565b6000602082840312156126335761263261221a565b5b600061264184828501612608565b91505092915050565b612653816123ac565b82525050565b600060208201905061266e600083018461264a565b92915050565b6000806000806080858703121561268e5761268d61221a565b5b600061269c8782880161240b565b94505060206126ad8782880161240b565b93505060406126be8782880161240b565b92505060606126cf8782880161240b565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272257607f821691505b602082108103612735576127346126db565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612775826123ea565b9150612780836123ea565b92508282019050808211156127985761279761273b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127d8826123ea565b91506127e3836123ea565b9250826127f3576127f261279e565b5b828204905092915050565b6000612809826123ea565b9150612814836123ea565b9250828202612822816123ea565b915082820484148315176128395761283861273b565b5b5092915050565b600061284b826123ea565b9150612856836123ea565b925082820390508181111561286e5761286d61273b565b5b92915050565b600061287f826123ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128b1576128b061273b565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006128f2600a836122e5565b91506128fd826128bc565b602082019050919050565b60006020820190508181036000830152612921816128e5565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b600061295e6007836122e5565b915061296982612928565b602082019050919050565b6000602082019050818103600083015261298d81612951565b9050919050565b600061299f82612460565b91506129aa83612460565b92508282026129b881612460565b91508082146129ca576129c961273b565b5b5092915050565b6000819050919050565b60006129f66129f16129ec84612460565b6129d1565b6123ea565b9050919050565b612a06816129db565b82525050565b6000602082019050612a2160008301846129fd565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a5f81612460565b8114612a6a57600080fd5b50565b600081519050612a7c81612a56565b92915050565b600060208284031215612a9857612a9761221a565b5b6000612aa684828501612a6d565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612ae5600d836122e5565b9150612af082612aaf565b602082019050919050565b60006020820190508181036000830152612b1481612ad8565b905091905056fea26469706673582212205a3fc58caf4d1c522f4f61ec2bbe096063676ac1ce8fe3918ede741dfb777b8164736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 2828c3b..855f028 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034973803806200349783398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b696200092e60003960008181610cf001528181610f400152611c0801526000818161119001528181611a790152611ca70152600081816111bc01528181611cc80152611d0d01526000818161122901528181611261015281816112d90152611a550152612b696000f3fe608060405234801561001057600080fd5b5060043610610291576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b8063731f237c1461063857806374bedb951461065657806379ba50971461067457806384dde4af146106925780638d34855a146106b057610291565b806340452d911161020757806358b2833b116101cb57806358b2833b1461052a5780636721d4ef146105485780636787a9be146105785780636a2d094e146105a85780636ffa8a05146105d857806370a082311461060857610291565b806340452d911461043a578063449a52f81461046a57806347a505171461049a5780634abfbba2146104ca57806351b4541c146104fa57610291565b80631989c6a8116102595780631989c6a814610350578063229ba1971461036e57806323b872dd1461038c5780633092afd5146103bc57806331333487146103ec578063313ce5671461041c57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c1461031457806318160ddd14610332575b600080fd5b6102b060048036038101906102ab91906122ab565b61096c565b6040516102bd91906122f3565b60405180910390f35b6102ce610b12565b6040516102db91906123a7565b60405180910390f35b6102fe60048036038101906102f9919061245d565b610ba0565b60405161030b91906122f3565b60405180910390f35b61031c610cba565b60405161032991906124c8565b60405180910390f35b61033a610cdc565b60405161034791906124f2565b60405180910390f35b610358610ce2565b60405161036591906124f2565b60405180910390f35b610376610cee565b60405161038391906124f2565b60405180910390f35b6103a660048036038101906103a1919061250d565b610d12565b6040516103b391906122f3565b60405180910390f35b6103d660048036038101906103d19190612560565b610e32565b6040516103e391906122f3565b60405180910390f35b6104066004803603810190610401919061258d565b610f25565b60405161041391906124f2565b60405180910390f35b610424610fd9565b60405161043191906124f2565b60405180910390f35b610454600480360381019061044f91906125cd565b610fdf565b6040516104619190612613565b60405180910390f35b610484600480360381019061047f919061245d565b611003565b60405161049191906122f3565b60405180910390f35b6104b460048036038101906104af9190612560565b611143565b6040516104c191906124f2565b60405180910390f35b6104e460048036038101906104df91906125cd565b61118c565b6040516104f191906124f2565b60405180910390f35b610514600480360381019061050f91906125cd565b6111ec565b60405161052191906124f2565b60405180910390f35b61053261120d565b60405161053f91906124f2565b60405180910390f35b610562600480360381019061055d919061258d565b611213565b60405161056f91906124f2565b60405180910390f35b610592600480360381019061058d91906125cd565b611294565b60405161059f91906124f2565b60405180910390f35b6105c260048036038101906105bd91906125cd565b611314565b6040516105cf91906124f2565b60405180910390f35b6105f260048036038101906105ed919061265a565b611335565b6040516105ff91906124f2565b60405180910390f35b610622600480360381019061061d9190612560565b61136f565b60405161062f91906124f2565b60405180910390f35b610640611427565b60405161064d91906122f3565b60405180910390f35b61065e611438565b60405161066b91906124f2565b60405180910390f35b61067c61143e565b60405161068991906122f3565b60405180910390f35b61069a6115e5565b6040516106a79190612696565b60405180910390f35b6106ca60048036038101906106c5919061265a565b61160b565b6040516106d791906124f2565b60405180910390f35b6106e8611639565b6040516106f59190612696565b60405180910390f35b61071860048036038101906107139190612560565b61165f565b005b6107226116fd565b60405161072f91906122f3565b60405180910390f35b610740611846565b60405161074d91906123a7565b60405180910390f35b610770600480360381019061076b9190612560565b6118d4565b60405161077d91906122f3565b60405180910390f35b6107a0600480360381019061079b919061265a565b611991565b6040516107ad91906124f2565b60405180910390f35b6107d060048036038101906107cb919061245d565b6119bd565b6040516107dd91906122f3565b60405180910390f35b6107ee611a53565b6040516107fb91906124f2565b60405180910390f35b61080c611a77565b60405161081991906124f2565b60405180910390f35b61083c600480360381019061083791906125cd565b611a9b565b60405161084991906122f3565b60405180910390f35b61085a611bd3565b60405161086791906124f2565b60405180910390f35b61088a6004803603810190610885919061265a565b611bd9565b60405161089791906124f2565b60405180910390f35b6108ba60048036038101906108b5919061258d565b611bed565b6040516108c791906124f2565b60405180910390f35b6108d8611ca1565b6040516108e591906124c8565b60405180910390f35b6108f6611d0b565b60405161090391906124f2565b60405180910390f35b61092660048036038101906109219190612560565b611d2f565b60405161093391906122f3565b60405180910390f35b610956600480360381019061095191906126b1565b611dd1565b6040516109639190612613565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60068054610b1f90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612747565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116fd565b50610bb583611294565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4391906127a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124f2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d1f6116fd565b50610d2984611294565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610db457600080fd5b610dbf868684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e1e91906124f2565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ebb57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ec457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f69919061282c565b905060005b84811015610fb25764e8d4a510008284610f88919061285d565b610f92919061282c565b83610f9d91906128b7565b92508080610faa906128eb565b915050610f6e565b5064e8d4a510008583610fc5919061285d565b610fcf919061282c565b9250505092915050565b60085481565b60008181548110610fef57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061297f565b60405180910390fd5b61109a6116fd565b506110a483611294565b905082600960008282546110b891906127a7565b925050819055506110c98482611e63565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112791906124f2565b60405180910390a3611137611f27565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111ba919061285d565b7f00000000000000000000000000000000000000000000000000000000000000006111e591906127a7565b9050919050565b6000603c82426111fc91906128b7565b611206919061282c565b9050919050565b60035481565b6000806402540be40083611227919061285d565b7f000000000000000000000000000000000000000000000000000000000000000061125291906128b7565b8461125d919061285d565b90507f00000000000000000000000000000000000000000000000000000000000000008161128b919061282c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112c5919061299f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611303919061285d565b61130d919061282c565b9050919050565b6000603c824261132491906128b7565b61132e919061282c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061137e85611143565b925061138b6003546111ec565b90506113d76402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113bf919061299f565b6fffffffffffffffffffffffffffffffff1682610f25565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e4000000611407919061285d565b8284611413919061285d565b61141d919061282c565b9350505050919050565b60006114336000611a9b565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061161984611991565b915061162484611335565b90506116308282611213565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116b957600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611713611427565b5061171c611fc9565b97506000600102880361173a57600098505050505050505050611843565b61174388611bd9565b955060018661175291906127a7565b905061175d8661118c565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179b82611314565b925060008311156117b7576117b08584611bed565b93506117bb565b8493505b6117ca60008560095484611dd1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117fe876120b5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161182e91906124f2565b60405180910390a16001985050505050505050505b90565b6007805461185390612747565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612747565b80156118cc5780601f106118a1576101008083540402835291602001916118cc565b820191906000526020600020905b8154815290600101906020018083116118af57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193057600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119ca6116fd565b506119d484611294565b91506119e1338684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4091906124f2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aab6003546111ec565b915060008203611ac057600092505050611bce565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0257508184105b15611b0b578391505b611b158183610f25565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b5a919061285d565b600354611b6791906127a7565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bbf9190612a24565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c31919061282c565b905060005b84811015611c7a5764e8d4a510008284611c50919061285d565b611c5a919061282c565b83611c6591906127a7565b92508080611c72906128eb565b915050611c36565b5064e8d4a510008583611c8d919061285d565b611c97919061282c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf291906128b7565b611cfc919061282c565b611d0691906127a7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4b8584612147565b50611e568484611e63565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ebf5760009350505050611f21565b611ec886611143565b92508483611ed691906127a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f4591906128b7565b81548110611f5657611f55612a3f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa191906128b7565b81548110611fb257611fb1612a3f565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611fe357611fe2612a3f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190612a9a565b6fffffffffffffffffffffffffffffffff16905061209882611bd9565b81116120ac576000600102925050506120b2565b81925050505b90565b60008060006120c38461160b565b9150600b546120d183611294565b6120db91906128b7565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e63565b506001600a600082825461211d91906127a7565b9250508190555080600b600082825461213691906127a7565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121a35760009350505050612248565b6121ac86611143565b9250848310156121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890612b13565b60405180910390fd5b84836121fd91906128b7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61228881612253565b811461229357600080fd5b50565b6000813590506122a58161227f565b92915050565b6000602082840312156122c1576122c061224e565b5b60006122cf84828501612296565b91505092915050565b60008115159050919050565b6122ed816122d8565b82525050565b600060208201905061230860008301846122e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561234857808201518184015260208101905061232d565b83811115612357576000848401525b50505050565b6000601f19601f8301169050919050565b60006123798261230e565b6123838185612319565b935061239381856020860161232a565b61239c8161235d565b840191505092915050565b600060208201905081810360008301526123c1818461236e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f4826123c9565b9050919050565b612404816123e9565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000819050919050565b61243a81612427565b811461244557600080fd5b50565b60008135905061245781612431565b92915050565b600080604083850312156124745761247361224e565b5b600061248285828601612412565b925050602061249385828601612448565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124c28161249d565b82525050565b60006020820190506124dd60008301846124b9565b92915050565b6124ec81612427565b82525050565b600060208201905061250760008301846124e3565b92915050565b6000806000606084860312156125265761252561224e565b5b600061253486828701612412565b935050602061254586828701612412565b925050604061255686828701612448565b9150509250925092565b6000602082840312156125765761257561224e565b5b600061258484828501612412565b91505092915050565b600080604083850312156125a4576125a361224e565b5b60006125b285828601612448565b92505060206125c385828601612448565b9150509250929050565b6000602082840312156125e3576125e261224e565b5b60006125f184828501612448565b91505092915050565b6000819050919050565b61260d816125fa565b82525050565b60006020820190506126286000830184612604565b92915050565b612637816125fa565b811461264257600080fd5b50565b6000813590506126548161262e565b92915050565b6000602082840312156126705761266f61224e565b5b600061267e84828501612645565b91505092915050565b612690816123e9565b82525050565b60006020820190506126ab6000830184612687565b92915050565b600080600080608085870312156126cb576126ca61224e565b5b60006126d987828801612448565b94505060206126ea87828801612448565b93505060406126fb87828801612448565b925050606061270c87828801612448565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275f57607f821691505b60208210810361277257612771612718565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127b282612427565b91506127bd83612427565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127f2576127f1612778565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283782612427565b915061284283612427565b925082612852576128516127fd565b5b828204905092915050565b600061286882612427565b915061287383612427565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128ac576128ab612778565b5b828202905092915050565b60006128c282612427565b91506128cd83612427565b9250828210156128e0576128df612778565b5b828203905092915050565b60006128f682612427565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361292857612927612778565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612969600a83612319565b915061297482612933565b602082019050919050565b600060208201905081810360008301526129988161295c565b9050919050565b60006129aa8261249d565b91506129b58361249d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129de576129dd612778565b5b828202905092915050565b6000819050919050565b6000612a0e612a09612a048461249d565b6129e9565b612427565b9050919050565b612a1e816129f3565b82525050565b6000602082019050612a396000830184612a15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a778161249d565b8114612a8257600080fd5b50565b600081519050612a9481612a6e565b92915050565b600060208284031215612ab057612aaf61224e565b5b6000612abe84828501612a85565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612afd600d83612319565b9150612b0882612ac7565b602082019050919050565b60006020820190508181036000830152612b2c81612af0565b905091905056fea264697066735822122065b90287fa7f2775639ada07b04e464a1dddb8f8c5f37cf825ec850b55ac7deb64736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043b565b6080908152503480156200003657600080fd5b506040516200448a3803806200448a83398181016040528101906200005c91906200073a565b62000066620003c1565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000132919062000a5b565b50856007908162000144919062000a5b565b508460ff166008819055504260038190555060035460a08181525050603c836200016f91906200043b565b60c0818152505060646a52b7d2dcc80cd2e400000062000190919062000b42565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e08181525050620002326000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600060016200033d640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550505081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000b88565b62000347620003c1565b62000351620003c1565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004488262000402565b9150620004558362000402565b9250828202620004658162000402565b915082820484148315176200047f576200047e6200040c565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004ef82620004a4565b810181811067ffffffffffffffff82111715620005115762000510620004b5565b5b80604052505050565b60006200052662000486565b9050620005348282620004e4565b919050565b600067ffffffffffffffff821115620005575762000556620004b5565b5b6200056282620004a4565b9050602081019050919050565b60005b838110156200058f57808201518184015260208101905062000572565b60008484015250505050565b6000620005b2620005ac8462000539565b6200051a565b905082815260208101848484011115620005d157620005d06200049f565b5b620005de8482856200056f565b509392505050565b600082601f830112620005fe57620005fd6200049a565b5b8151620006108482602086016200059b565b91505092915050565b600060ff82169050919050565b620006318162000619565b81146200063d57600080fd5b50565b600081519050620006518162000626565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067e8162000657565b81146200068a57600080fd5b50565b6000815190506200069e8162000673565b92915050565b620006af8162000402565b8114620006bb57600080fd5b50565b600081519050620006cf81620006a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070282620006d5565b9050919050565b6200071481620006f5565b81146200072057600080fd5b50565b600081519050620007348162000709565b92915050565b60008060008060008060c087890312156200075a576200075962000490565b5b600087015167ffffffffffffffff8111156200077b576200077a62000495565b5b6200078989828a01620005e6565b965050602087015167ffffffffffffffff811115620007ad57620007ac62000495565b5b620007bb89828a01620005e6565b9550506040620007ce89828a0162000640565b9450506060620007e189828a016200068d565b9350506080620007f489828a01620006be565b92505060a06200080789828a0162000723565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086757607f821691505b6020821081036200087d576200087c6200081f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a8565b620008f68683620008a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000939620009336200092d8462000402565b6200090e565b62000402565b9050919050565b6000819050919050565b620009558362000918565b6200096d620009648262000940565b848454620008b8565b825550505050565b600090565b6200098462000975565b620009918184846200094a565b505050565b5b81811015620009b957620009ad6000826200097a565b60018101905062000997565b5050565b601f82111562000a0857620009d28162000883565b620009dd8462000898565b81016020851015620009ed578190505b62000a05620009fc8562000898565b83018262000996565b50505b505050565b60008160020a8304905092915050565b600062000a306000198460080262000a0d565b1980831691505092915050565b600062000a4b838362000a1d565b9150826002028217905092915050565b62000a668262000814565b67ffffffffffffffff81111562000a825762000a81620004b5565b5b62000a8e82546200084e565b62000a9b828285620009bd565b600060209050601f83116001811462000ad3576000841562000abe578287015190505b62000aca858262000a3d565b86555062000b3a565b601f19841662000ae38662000883565b60005b8281101562000b0d5784890151825560018201915060208501945060208101905062000ae6565b8683101562000b2d578489015162000b29601f89168262000a1d565b8355505b6001600288020188555050505b505050505050565b600062000b4f8262000657565b915062000b5c8362000657565b925082820262000b6c8162000657565b915080821462000b815762000b806200040c565b5b5092915050565b60805160a05160c05160e05161388962000c0160003960008181610eb9015261119c01526000818161170001528181611dbe0152818161236b015261250801526000818161172c01528181612529015261256e0152600081816118060152818161183e015281816118b6015261234701526138896000f3fe608060405234801561001057600080fd5b50600436106102d8576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161019f578063a9059cbb11610106578063d397de60116100bf578063eda4e6d611610099578063eda4e6d6146109bf578063f2fde38b146109dd578063f83da35d14610a0d578063f84e521314610a3d576102d8565b8063d397de6014610953578063d89135cd14610983578063e8095295146109a1576102d8565b8063a9059cbb14610869578063ab28cea014610899578063b470aade146108b7578063c0ab7077146108d5578063c7a7f89a14610905578063d340ef8a14610935576102d8565b80638f0b2d5d116101585780638f0b2d5d146107815780638f1df6bc1461079d578063936d9e7a146107bb57806395d89b41146107eb578063983b2d5614610809578063a457c2d714610839576102d8565b8063731f237c146106cd57806373f42561146106eb57806374bedb951461070957806379ba50971461072757806384dde4af146107455780638da5cb5b14610763576102d8565b806340452d911161024357806351b4541c116101fc57806351b4541c146105bf57806358b2833b146105ef5780636721d4ef1461060d5780636787a9be1461063d5780636a2d094e1461066d57806370a082311461069d576102d8565b806340452d91146104b157806342966c68146104e3578063449a52f8146104ff57806347a505171461052f5780634abfbba21461055f5780634d0df4fd1461058f576102d8565b8063229ba19711610295578063229ba197146103b557806323b872dd146103d35780633092afd5146104035780633133348714610433578063313ce567146104635780633950935114610481576102d8565b806301ffc9a7146102dd57806306fdde031461030d578063095ea7b31461032b57806309f28f3c1461035b57806318160ddd146103795780631989c6a814610397575b600080fd5b6102f760048036038101906102f29190612d7b565b610a6d565b6040516103049190612dc3565b60405180910390f35b610315610c13565b6040516103229190612e6e565b60405180910390f35b61034560048036038101906103409190612f24565b610ca1565b6040516103529190612dc3565b60405180910390f35b610363610e72565b6040516103709190612f8f565b60405180910390f35b610381610e94565b60405161038e9190612fb9565b60405180910390f35b61039f610eab565b6040516103ac9190612fb9565b60405180910390f35b6103bd610eb7565b6040516103ca9190612fb9565b60405180910390f35b6103ed60048036038101906103e89190612fd4565b610edb565b6040516103fa9190612dc3565b60405180910390f35b61041d60048036038101906104189190613027565b61108e565b60405161042a9190612dc3565b60405180910390f35b61044d60048036038101906104489190613054565b611181565b60405161045a9190612fb9565b60405180910390f35b61046b611235565b6040516104789190612fb9565b60405180910390f35b61049b60048036038101906104969190612f24565b61123b565b6040516104a89190612dc3565b60405180910390f35b6104cb60048036038101906104c69190613094565b6113d1565b6040516104da9392919061312c565b60405180910390f35b6104fd60048036038101906104f89190613094565b611445565b005b61051960048036038101906105149190612f24565b611573565b6040516105269190612dc3565b60405180910390f35b61054960048036038101906105449190613027565b6116b3565b6040516105569190612fb9565b60405180910390f35b61057960048036038101906105749190613094565b6116fc565b6040516105869190612fb9565b60405180910390f35b6105a960048036038101906105a491906132cb565b61175c565b6040516105b69190612dc3565b60405180910390f35b6105d960048036038101906105d49190613094565b6117c9565b6040516105e69190612fb9565b60405180910390f35b6105f76117ea565b6040516106049190612fb9565b60405180910390f35b61062760048036038101906106229190613054565b6117f0565b6040516106349190612fb9565b60405180910390f35b61065760048036038101906106529190613094565b611871565b6040516106649190612fb9565b60405180910390f35b61068760048036038101906106829190613094565b6118f1565b6040516106949190612fb9565b60405180910390f35b6106b760048036038101906106b29190613027565b611912565b6040516106c49190612fb9565b60405180910390f35b6106d56119ca565b6040516106e29190612dc3565b60405180910390f35b6106f36119db565b6040516107009190612fb9565b60405180910390f35b6107116119e1565b60405161071e9190612fb9565b60405180910390f35b61072f6119e7565b60405161073c9190612dc3565b60405180910390f35b61074d611b8e565b60405161075a9190613307565b60405180910390f35b61076b611bb4565b6040516107789190613307565b60405180910390f35b61079b60048036038101906107969190613027565b611bda565b005b6107a5611c78565b6040516107b29190612dc3565b60405180910390f35b6107d560048036038101906107d091906132cb565b611f17565b6040516107e29190612fb9565b60405180910390f35b6107f3611f45565b6040516108009190612e6e565b60405180910390f35b610823600480360381019061081e9190613027565b611fd3565b6040516108309190612dc3565b60405180910390f35b610853600480360381019061084e9190612f24565b612090565b6040516108609190612dc3565b60405180910390f35b610883600480360381019061087e9190612f24565b6122af565b6040516108909190612dc3565b60405180910390f35b6108a1612345565b6040516108ae9190612fb9565b60405180910390f35b6108bf612369565b6040516108cc9190612fb9565b60405180910390f35b6108ef60048036038101906108ea9190613094565b61238d565b6040516108fc9190612dc3565b60405180910390f35b61091f600480360381019061091a91906132cb565b6124c5565b60405161092c9190612fb9565b60405180910390f35b61093d6124de565b60405161094a9190612fb9565b60405180910390f35b61096d600480360381019061096891906132cb565b6124e4565b60405161097a9190612fb9565b60405180910390f35b61098b6124f8565b6040516109989190612fb9565b60405180910390f35b6109a9612502565b6040516109b69190612f8f565b60405180910390f35b6109c761256c565b6040516109d49190612fb9565b60405180910390f35b6109f760048036038101906109f29190613027565b612590565b604051610a049190612dc3565b60405180910390f35b610a276004803603810190610a229190613322565b612632565b604051610a3491906133f8565b60405180910390f35b610a576004803603810190610a5291906132cb565b6126b2565b604051610a649190612fb9565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ac15760019050610c0e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b135760019050610c0e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b655760019050610c0e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb75760019050610c0e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c095760019050610c0e565b600090505b919050565b60068054610c2090613442565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c90613442565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b505050505081565b6000806000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d6d5760008314610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906134bf565b60405180910390fd5b5b610d75611c78565b50610d7f83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e5f9190612fb9565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000600c54600954610ea6919061350e565b905090565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ee8611c78565b50610ef284611871565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f7d57600080fd5b81600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611009919061350e565b9250508190555061101b8686846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161107a9190612fb9565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061111757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61112057600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006111c59190613571565b905060005b8481101561120e5764e8d4a5100082846111e491906135a2565b6111ee9190613571565b836111f9919061350e565b92508080611206906135e4565b9150506111ca565b5064e8d4a51000858361122191906135a2565b61122b9190613571565b9250505092915050565b60085481565b600080611246611c78565b5061125083611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061362c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516113be9190612fb9565b60405180910390a3600191505092915050565b600081815481106113e157600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff16905083565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661149b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156114e757600080fd5b60006114f282611871565b90506114fc6119ca565b5061150733826126f4565b5081600c600082825461151a919061362c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115679190612fb9565b60405180910390a25050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906136ac565b60405180910390fd5b61160a611c78565b5061161483611871565b90508260096000828254611628919061362c565b9250508190555061163984826127fb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116979190612fb9565b60405180910390a36116a76128bf565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261172a91906135a2565b7f0000000000000000000000000000000000000000000000000000000000000000611755919061362c565b9050919050565b600080826000015163ffffffff16111561177957600090506117c4565b6000826020015168ffffffffffffffffff16111561179a57600090506117c4565b600082604001516cffffffffffffffffffffffffff1611156117bf57600090506117c4565b600190505b919050565b6000603c82426117d9919061350e565b6117e39190613571565b9050919050565b60035481565b6000806402540be4008361180491906135a2565b7f000000000000000000000000000000000000000000000000000000000000000061182f919061350e565b8461183a91906135a2565b90507f0000000000000000000000000000000000000000000000000000000000000000816118689190613571565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166118a291906136cc565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836118e091906135a2565b6118ea9190613571565b9050919050565b6000603c8242611901919061350e565b61190b9190613571565b9050919050565b600080600080611921856116b3565b925061192e6003546117c9565b905061197a6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661196291906136cc565b6fffffffffffffffffffffffffffffffff1682611181565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006119aa91906135a2565b82846119b691906135a2565b6119c09190613571565b9350505050919050565b60006119d6600061238d565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3457600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c82612cd3565b611c8a612cd3565b611c92612cd3565b6000806000806000611ca26119ca565b50611cab612a9c565b9750611cb68861175c565b15611ccc57600098505050505050505050611f14565b6000600a5481548110611ce257611ce1613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff16815250509550611d9e886124e4565b9450600185611dad919061362c565b9050611db8866126b2565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611de79190613571565b9150611df38483611181565b9250611e09600084611e03610e94565b84612632565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff1602179055505050611ecf87612c41565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611eff9190612fb9565b60405180910390a16001985050505050505050505b90565b6000806000611f25846124c5565b9150611f30846126b2565b9050611f3c82826117f0565b92505050919050565b60078054611f5290613442565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90613442565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461202f57600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061209c83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212757600080fd5b61212f611c78565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bc919061350e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161229c9190612fb9565b60405180910390a3600191505092915050565b60008060006122bc611c78565b506122c684611871565b91506122d33386846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516123329190612fb9565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061239d6003546117c9565b9150600082036123b2576000925050506124c0565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000841180156123f457508184105b156123fd578391505b6124078183611181565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261244c91906135a2565b600354612459919061362c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516124b19190613773565b60405180910390a46001925050505b919050565b6000816020015168ffffffffffffffffff169050919050565b600a5481565b6000816000015163ffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612553919061350e565b61255d9190613571565b612567919061362c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ec57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61263a612cd3565b612642612cd3565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b600081604001516cffffffffffffffffffffffffff169050919050565b6000806126dc85846126f4565b506126e784846127fb565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361275057600093505050506127f5565b612759866116b3565b92508483101561279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906137da565b60405180910390fd5b84836127aa919061350e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361285757600093505050506128b9565b612860866116b3565b9250848361286e919061362c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006128c9612cd3565b60006128d3610e94565b9050600060016000805490506128e9919061350e565b815481106128fa576128f9613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506129e4919061350e565b815481106129f5576129f4613709565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff16021790555090505060019250505090565b612aa4612cd3565b612aac612cd3565b612ab4612cd3565b600080600a5481548110612acb57612aca613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c099190613826565b6fffffffffffffffffffffffffffffffff169050612c26836124e4565b8111612c3757819350505050612c3e565b8293505050505b90565b6000806000612c4f84611f17565b9150600b54612c5d83611871565b612c67919061350e565b9050612c95600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127fb565b506001600a6000828254612ca9919061362c565b9250508190555080600b6000828254612cc2919061362c565b925050819055508192505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5881612d23565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b600060208284031215612d9157612d90612d1e565b5b6000612d9f84828501612d66565b91505092915050565b60008115159050919050565b612dbd81612da8565b82525050565b6000602082019050612dd86000830184612db4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e18578082015181840152602081019050612dfd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4082612dde565b612e4a8185612de9565b9350612e5a818560208601612dfa565b612e6381612e24565b840191505092915050565b60006020820190508181036000830152612e888184612e35565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ebb82612e90565b9050919050565b612ecb81612eb0565b8114612ed657600080fd5b50565b600081359050612ee881612ec2565b92915050565b6000819050919050565b612f0181612eee565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d1e565b5b6000612f4985828601612ed9565b9250506020612f5a85828601612f0f565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612f8981612f64565b82525050565b6000602082019050612fa46000830184612f80565b92915050565b612fb381612eee565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b600080600060608486031215612fed57612fec612d1e565b5b6000612ffb86828701612ed9565b935050602061300c86828701612ed9565b925050604061301d86828701612f0f565b9150509250925092565b60006020828403121561303d5761303c612d1e565b5b600061304b84828501612ed9565b91505092915050565b6000806040838503121561306b5761306a612d1e565b5b600061307985828601612f0f565b925050602061308a85828601612f0f565b9150509250929050565b6000602082840312156130aa576130a9612d1e565b5b60006130b884828501612f0f565b91505092915050565b600063ffffffff82169050919050565b6130da816130c1565b82525050565b600068ffffffffffffffffff82169050919050565b6130fe816130e0565b82525050565b60006cffffffffffffffffffffffffff82169050919050565b61312681613104565b82525050565b600060608201905061314160008301866130d1565b61314e60208301856130f5565b61315b604083018461311d565b949350505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131a082612e24565b810181811067ffffffffffffffff821117156131bf576131be613168565b5b80604052505050565b60006131d2612d14565b90506131de8282613197565b919050565b6131ec816130c1565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b613218816130e0565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b61324481613104565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006060828403121561327d5761327c613163565b5b61328760606131c8565b90506000613297848285016131fa565b60008301525060206132ab84828501613226565b60208301525060406132bf84828501613252565b60408301525092915050565b6000606082840312156132e1576132e0612d1e565b5b60006132ef84828501613267565b91505092915050565b61330181612eb0565b82525050565b600060208201905061331c60008301846132f8565b92915050565b6000806000806080858703121561333c5761333b612d1e565b5b600061334a87828801612f0f565b945050602061335b87828801612f0f565b935050604061336c87828801612f0f565b925050606061337d87828801612f0f565b91505092959194509250565b613392816130c1565b82525050565b6133a1816130e0565b82525050565b6133b081613104565b82525050565b6060820160008201516133cc6000850182613389565b5060208201516133df6020850182613398565b5060408201516133f260408501826133a7565b50505050565b600060608201905061340d60008301846133b6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061345a57607f821691505b60208210810361346d5761346c613413565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006134a9600a83612de9565b91506134b482613473565b602082019050919050565b600060208201905081810360008301526134d88161349c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351982612eee565b915061352483612eee565b925082820390508181111561353c5761353b6134df565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061357c82612eee565b915061358783612eee565b92508261359757613596613542565b5b828204905092915050565b60006135ad82612eee565b91506135b883612eee565b92508282026135c681612eee565b915082820484148315176135dd576135dc6134df565b5b5092915050565b60006135ef82612eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613621576136206134df565b5b600182019050919050565b600061363782612eee565b915061364283612eee565b925082820190508082111561365a576136596134df565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000613696600a83612de9565b91506136a182613660565b602082019050919050565b600060208201905081810360008301526136c581613689565b9050919050565b60006136d782612f64565b91506136e283612f64565b92508282026136f081612f64565b9150808214613702576137016134df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061375d61375861375384612f64565b613738565b612eee565b9050919050565b61376d81613742565b82525050565b60006020820190506137886000830184613764565b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006137c4600d83612de9565b91506137cf8261378e565b602082019050919050565b600060208201905081810360008301526137f3816137b7565b9050919050565b61380381612f64565b811461380e57600080fd5b50565b600081519050613820816137fa565b92915050565b60006020828403121561383c5761383b612d1e565b5b600061384a84828501613811565b9150509291505056fea2646970667358221220a45105fb2aa83528b6489fb5be816bc33624d5fca0a1d7bf35e11168aaa4858964736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index d4ed49d..202030e 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"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":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","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":"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":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"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":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"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":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","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":"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":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"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":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint104","name":"demurrage","type":"uint104"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"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":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","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":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.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":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.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":"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"}] diff --git a/python/erc20_demurrage_token/demurrage.py b/python/erc20_demurrage_token/demurrage.py index 7941ee2..50bad93 100644 --- a/python/erc20_demurrage_token/demurrage.py +++ b/python/erc20_demurrage_token/demurrage.py @@ -9,8 +9,7 @@ from chainlib.eth.constant import ZERO_ADDRESS # local imports from .token import DemurrageToken -logging.basicConfig(level=logging.DEBUG) -logg = logging.getLogger() +logg = logging.getLogger(__name__) class DemurrageCalculator: diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index e098451..cb2d33c 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -10,6 +10,7 @@ from chainlib.eth.tx import ( from chainlib.hash import keccak256_string_to_hex from chainlib.eth.contract import ( ABIContractEncoder, + ABIContractDecoder, ABIContractType, abi_decode_single, ) @@ -117,6 +118,34 @@ class DemurrageToken(ERC20): return DemurrageToken.__bytecode[name] + def increase_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('increaseAllowance') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def decrease_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('decreaseAllowance') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() enc.method('addMinter') @@ -155,6 +184,33 @@ class DemurrageToken(ERC20): return tx + def burn(self, contract_address, sender_address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('burn') + enc.typ(ABIContractType.UINT256) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def total_burned(self, contract_address, sender_address=ZERO_ADDRESS, id_generator=None): + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('totalBurned') + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + o = j.finalize(o) + return o + + def to_base_amount(self, contract_address, value, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() @@ -255,8 +311,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistributionPeriod') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -266,22 +325,26 @@ class DemurrageToken(ERC20): return o - def to_redistribution_participants(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): - j = JSONRPCRequest(id_generator) - o = j.template() - o['method'] = 'eth_call' - enc = ABIContractEncoder() - enc.method('toRedistributionParticipants') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) - data = add_0x(enc.get()) - tx = self.template(sender_address, contract_address) - tx = self.set_code(tx, data) - o['params'].append(self.normalize(tx)) - o['params'].append('latest') - o = j.finalize(o) - return o - +# def to_redistribution_participants(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): +# j = JSONRPCRequest(id_generator) +# o = j.template() +# o['method'] = 'eth_call' +# enc = ABIContractEncoder() +# enc.method('toRedistributionParticipants') +# v = strip_0x(redistribution) +# enc.typ_literal('(uint32,uint72,uint104)') +# #enc.typ(ABIContractType.BYTES32) +# enc.bytes32(v[:64]) +# enc.bytes32(v[64:128]) +# enc.bytes32(v[128:192]) +# data = add_0x(enc.get()) +# tx = self.template(sender_address, contract_address) +# tx = self.set_code(tx, data) +# o['params'].append(self.normalize(tx)) +# o['params'].append('latest') +# o = j.finalize(o) +# return o +# def to_redistribution_supply(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) @@ -289,8 +352,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistributionSupply') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -306,8 +372,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistributionDemurrageModifier') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -397,24 +466,24 @@ class DemurrageToken(ERC20): return self.call_noarg('supplyCap', contract_address, sender_address=sender_address) - def grow_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): - j = JSONRPCRequest(id_generator) - o = j.template() - o['method'] = 'eth_call' - enc = ABIContractEncoder() - enc.method('growBy') - enc.typ(ABIContractType.UINT256) - enc.typ(ABIContractType.UINT256) - enc.uint256(value) - enc.uint256(period) - data = add_0x(enc.get()) - tx = self.template(sender_address, contract_address) - tx = self.set_code(tx, data) - o['params'].append(self.normalize(tx)) - o['params'].append('latest') - o = j.finalize(o) - return o - +# def grow_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): +# j = JSONRPCRequest(id_generator) +# o = j.template() +# o['method'] = 'eth_call' +# enc = ABIContractEncoder() +# enc.method('growBy') +# enc.typ(ABIContractType.UINT256) +# enc.typ(ABIContractType.UINT256) +# enc.uint256(value) +# enc.uint256(period) +# data = add_0x(enc.get()) +# tx = self.template(sender_address, contract_address) +# tx = self.set_code(tx, data) +# o['params'].append(self.normalize(tx)) +# o['params'].append('latest') +# o = j.finalize(o) +# return o +# def decay_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) @@ -460,8 +529,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('getDistributionFromRedistribution') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -504,7 +576,16 @@ class DemurrageToken(ERC20): @classmethod def parse_redistributions(self, v): - return abi_decode_single(ABIContractType.BYTES32, v) + d = ABIContractDecoder() + v = strip_0x(v) + d.typ(ABIContractType.BYTES32) + d.typ(ABIContractType.BYTES32) + d.typ(ABIContractType.BYTES32) + d.val(v[:64]) + d.val(v[64:128]) + d.val(v[128:192]) + r = d.decode() + return ''.join(r) @classmethod @@ -526,6 +607,7 @@ class DemurrageToken(ERC20): def parse_supply_cap(self, v): return abi_decode_single(ABIContractType.UINT256, v) + @classmethod def parse_grow_by(self, v): return abi_decode_single(ABIContractType.UINT256, v) @@ -549,3 +631,8 @@ class DemurrageToken(ERC20): @classmethod def parse_resolution_factor(self, v): return abi_decode_single(ABIContractType.UINT256, v) + + + @classmethod + def parse_total_burned(self, v): + return abi_decode_single(ABIContractType.UINT256, v) diff --git a/python/run_tests.sh b/python/run_tests.sh index 4f3e2de..80affd3 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -6,7 +6,8 @@ set -e export PYTHONPATH=. #modes=(MultiNocap MultiCap SingleCap SingleNocap) -modes=(SingleCap SingleNocap) # other contracts need to be updted +#modes=(SingleCap SingleNocap) # other contracts need to be updted +modes=(SingleNocap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_basic.py ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_growth.py @@ -14,7 +15,8 @@ for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_single.py done -modes=(SingleCap) # other contracts need to be updted +#modes=(SingleCap) # other contracts need to be updted +modes=() for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py done @@ -25,7 +27,8 @@ for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py done -modes=(MultiCap SingleCap) +#modes=(MultiCap SingleCap) +modes=() for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_cap.py done diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index 44fc556..52221d6 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -276,7 +276,52 @@ class TestBasic(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) - + + def test_approve(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], 500) + 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], 600) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + (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) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.increase_allowance(self.address, self.accounts[0], self.accounts[1], 200) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.decrease_allowance(self.address, self.accounts[0], self.accounts[1], 800) + 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], 42) + 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) @@ -315,6 +360,12 @@ class TestBasic(TestDemurrageDefault): balance = c.parse_balance_of(r) self.assertEqual(balance, 500) + (tx_hash, o) = c.transfer_from(self.address, self.accounts[2], self.accounts[1], self.accounts[3], 1) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_growth.py b/python/tests/test_growth.py index 9412e90..dafca13 100644 --- a/python/tests/test_growth.py +++ b/python/tests/test_growth.py @@ -28,23 +28,23 @@ testdir = os.path.dirname(__file__) class TestGrowth(TestDemurrageDefault): - def test_grow_by(self): - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - growth_factor = (1000000 + self.tax_level) / 1000000 - v = 1000000000 - o = c.grow_by(self.address, v, 1, sender_address=self.accounts[0]) - r = self.rpc.do(o) - g = c.parse_grow_by(r) - self.assertEqual(int(v * growth_factor), g) - - period = 10 - growth_factor = (1 + (self.tax_level) / 1000000) ** period - o = c.grow_by(self.address, v, period, sender_address=self.accounts[0]) - r = self.rpc.do(o) - g = c.parse_grow_by(r) - self.assertEqual(int(v * growth_factor), g) +# def test_grow_by(self): +# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) +# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) +# +# growth_factor = (1000000 + self.tax_level) / 1000000 +# v = 1000000000 +# o = c.grow_by(self.address, v, 1, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# g = c.parse_grow_by(r) +# self.assertEqual(int(v * growth_factor), g) +# +# period = 10 +# growth_factor = (1 + (self.tax_level) / 1000000) ** period +# o = c.grow_by(self.address, v, period, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# g = c.parse_grow_by(r) +# self.assertEqual(int(v * growth_factor), g) def test_decay_by(self): @@ -63,7 +63,7 @@ class TestGrowth(TestDemurrageDefault): o = c.decay_by(self.address, v, period, sender_address=self.accounts[0]) r = self.rpc.do(o) g = c.parse_decay_by(r) - self.assertEqual(int(v * growth_factor), g) + self.assertEqual(int(v * growth_factor), g) if __name__ == '__main__': diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index a980d9b..b911cab 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -24,7 +24,7 @@ from erc20_demurrage_token import DemurrageToken # test imports from erc20_demurrage_token.unittest.base import TestDemurrageDefault -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) logg = logging.getLogger() testdir = os.path.dirname(__file__) @@ -88,18 +88,31 @@ class TestRedistribution(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) self.rpc.do(o) - self.backend.time_travel(self.start_time + (self.period_seconds * 10)) + self.backend.time_travel(self.start_time + (self.period_seconds * 100)) - for i in range(1, 11): - logg.debug('checking period {}'.format(i)) + balance_minter = None + balance_sink = None + real_supply = None + for i in range(1, 101): (tx_hash, o) = c.change_period(self.address, self.accounts[0]) self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) - i = 10 + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_sink = c.parse_balance(r) + + o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_minter = c.parse_balance(r) + + real_supply = balance_sink + balance_minter + logg.info('period {} testing sink {} mint {} adds up to supply {} of original {} (delta {})'.format(i, balance_sink, balance_minter, real_supply, supply, supply - real_supply)) + + i = 100 o = c.redistributions(self.address, i, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) @@ -122,7 +135,7 @@ class TestRedistribution(TestDemurrageDefault): r = self.rpc.do(o) balance_minter = c.parse_balance(r) - logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, real_supply, demurrage_previous, demurrage)) self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index fdd2f9c..11b88ea 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -177,6 +177,7 @@ class TestRedistribution(TestDemurrageUnit): o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) + logg.debug('redistribution {}'.format(redistribution)) o = c.to_redistribution_supply(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) supply = c.parse_to_redistribution_item(r) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index e4cc11c..81aeba0 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -1,18 +1,24 @@ -pragma solidity > 0.6.11; +pragma solidity >= 0.8.0; + // SPDX-License-Identifier: GPL-3.0-or-later - contract DemurrageTokenSingleCap { + struct redistributionItem { + uint32 period; + uint72 value; + uint104 demurrage; + } + redistributionItem[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) // Redistribution bit field, with associated shifts and masks // (Uses sub-byte boundaries) - bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - uint8 constant shiftRedistributionPeriod = 0; - uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 - uint8 constant shiftRedistributionValue = 32; - uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 - uint8 constant shiftRedistributionDemurrage = 104; - uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 20) - 1) << 140 +// bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) +// uint8 constant shiftRedistributionPeriod = 0; +// uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 +// uint8 constant shiftRedistributionValue = 32; +// uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 +// uint8 constant shiftRedistributionDemurrage = 104; +// uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 36) - 1) << 140 // Account balances mapping (address => uint256) account; @@ -38,7 +44,8 @@ contract DemurrageTokenSingleCap { uint256 public decimals; // Implements ERC20 - uint256 public totalSupply; + //uint256 public totalSupply; + uint256 supply; // Last executed period uint256 public lastPeriod; @@ -46,6 +53,9 @@ contract DemurrageTokenSingleCap { // Last sink redistribution amount uint256 public totalSink; + // Value of burnt tokens (burnt tokens do not decay) + uint256 public burned; + // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less @@ -95,10 +105,15 @@ contract DemurrageTokenSingleCap { // Temporary event used in development, will be removed on prod event Debug(bytes32 _foo); + // Emitted when tokens are burned + event Burn(address indexed _burner, uint256 _value); + // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 constructor(string memory _name, string memory _symbol, uint8 _decimals, uint128 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public { + redistributionItem memory initialRedistribution; + // ACL setup owner = msg.sender; minter[owner] = true; @@ -114,7 +129,7 @@ contract DemurrageTokenSingleCap { periodDuration = _periodMinutes * 60; demurrageAmount = uint128(nanoDivider) * 100; taxLevel = _taxLevelMinute; // Represents 38 decimal places - bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); + initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); // Misc settings @@ -206,7 +221,7 @@ contract DemurrageTokenSingleCap { changePeriod(); baseAmount = toBaseAmount(_amount); - totalSupply += _amount; + supply += _amount; increaseBaseBalance(_beneficiary, baseAmount); emit Mint(msg.sender, _beneficiary, _amount); saveRedistributionSupply(); @@ -215,46 +230,82 @@ contract DemurrageTokenSingleCap { // Deserializes the redistribution word // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) { - bytes32 redistribution; +// function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) { +// bytes32 redistribution; +// +// redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); +// redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); +// redistribution |= bytes32(_period & maskRedistributionPeriod); +// return redistribution; +// } - redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); - redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); - redistribution |= bytes32(_period & maskRedistributionPeriod); + function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { + redistributionItem memory redistribution; + + redistribution.period = uint32(_period); + redistribution.value = uint72(_value); + redistribution.demurrage = uint104(_demurrageModifierPpm); return redistribution; + + } +// +// // Serializes the demurrage period part of the redistribution word +// function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { +// return uint256(redistribution) & maskRedistributionPeriod; +// } +// + + function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.period); } - // Serializes the demurrage period part of the redistribution word - function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { - return uint256(redistribution) & maskRedistributionPeriod; +// // Serializes the supply part of the redistribution word +// function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { +// return (uint256(redistribution) & kkRedistributionValue) >> shiftRedistributionValue; +// } + + function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.value); } - // Serializes the supply part of the redistribution word - function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionValue) >> shiftRedistributionValue; +// +// // Serializes the number of participants part of the redistribution word +// function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { +// return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; +// } + + function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.demurrage); } - // Serializes the number of participants part of the redistribution word - function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; - } // Client accessor to the redistributions array length function redistributionCount() public view returns (uint256) { return redistributions.length; } - - // Save the current total supply amount to the current redistribution period +// +// // Save the current total supply amount to the current redistribution period +// function saveRedistributionSupply() private returns (bool) { +// uint256 currentRedistribution; +// uint256 grownSupply; +// +// grownSupply = totalSupply(); +// currentRedistribution = uint256(redistributions[redistributions.length-1]); +// currentRedistribution &= (~maskRedistributionValue); +// currentRedistribution |= (grownSupply << shiftRedistributionValue); +// +// redistributions[redistributions.length-1] = bytes32(currentRedistribution); +// return true; +// } function saveRedistributionSupply() private returns (bool) { - uint256 currentRedistribution; + redistributionItem memory currentRedistribution; uint256 grownSupply; - grownSupply = totalSupply; - currentRedistribution = uint256(redistributions[redistributions.length-1]); - currentRedistribution &= (~maskRedistributionValue); - currentRedistribution |= (grownSupply << shiftRedistributionValue); + grownSupply = totalSupply(); + currentRedistribution = redistributions[redistributions.length-1]; + currentRedistribution.value = uint72(grownSupply); - redistributions[redistributions.length-1] = bytes32(currentRedistribution); + redistributions[redistributions.length-1] = currentRedistribution; return true; } @@ -263,15 +314,16 @@ contract DemurrageTokenSingleCap { return uint128((block.timestamp - periodStart) / periodDuration + 1); } - // Add an entered demurrage period to the redistribution array - function checkPeriod() private view returns (bytes32) { - bytes32 lastRedistribution; + // Retrieve next redistribution if the period threshold has been crossed + function checkPeriod() private view returns (redistributionItem memory) { + redistributionItem memory lastRedistribution; + redistributionItem memory emptyRedistribution; uint256 currentPeriod; lastRedistribution = redistributions[lastPeriod]; currentPeriod = this.actualPeriod(); if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { - return bytes32(0x00); + return emptyRedistribution; } return lastRedistribution; } @@ -283,7 +335,7 @@ contract DemurrageTokenSingleCap { return difference / resolutionFactor; } - function getDistributionFromRedistribution(bytes32 _redistribution) public returns (uint256) { + function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { uint256 redistributionSupply; uint256 redistributionDemurrage; @@ -293,7 +345,7 @@ contract DemurrageTokenSingleCap { } // Returns the amount sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { + function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) { uint256 unit; uint256 baseUnit; @@ -348,37 +400,46 @@ contract DemurrageTokenSingleCap { return (block.timestamp - _target) / 60; } + function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) { + if (_redistribution.period > 0) { + return false; + } + if (_redistribution.value > 0) { + return false; + } + if (_redistribution.demurrage > 0) { + return false; + } + return true; + } + // Recalculate the demurrage modifier for the new period + // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. function changePeriod() public returns (bool) { - bytes32 currentRedistribution; - bytes32 nextRedistribution; + redistributionItem memory currentRedistribution; + redistributionItem memory nextRedistribution; + redistributionItem memory lastRedistribution; uint256 currentPeriod; - uint256 currentDemurrageAmount; + uint256 lastDemurrageAmount; uint256 nextRedistributionDemurrage; uint256 demurrageCounts; - uint256 periodTimestamp; uint256 nextPeriod; applyDemurrage(); currentRedistribution = checkPeriod(); - if (currentRedistribution == bytes32(0x00)) { + if (isEmptyRedistribution(currentRedistribution)) { return false; } + // calculate the decay from previous redistributino + lastRedistribution = redistributions[lastPeriod]; currentPeriod = toRedistributionPeriod(currentRedistribution); nextPeriod = currentPeriod + 1; - periodTimestamp = getPeriodTimeDelta(currentPeriod); - - currentDemurrageAmount = demurrageAmount; - - demurrageCounts = demurrageCycles(periodTimestamp); - if (demurrageCounts > 0) { - nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts); - } else { - nextRedistributionDemurrage = currentDemurrageAmount; - } - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); + lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); + demurrageCounts = periodDuration / 60; + nextRedistributionDemurrage = decayBy(lastDemurrageAmount, demurrageCounts); + + nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); redistributions.push(nextRedistribution); applyDefaultRedistribution(nextRedistribution); @@ -387,18 +448,18 @@ contract DemurrageTokenSingleCap { } // Reverse a value reduced by demurrage by the given period to its original value - function growBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = growthResolutionFactor; - truncatedTaxLevel = taxLevel / nanoDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); - } - return (valueFactor * _value) / growthResolutionFactor; - } +// function growBy(uint256 _value, uint256 _period) public view returns (uint256) { +// uint256 valueFactor; +// uint256 truncatedTaxLevel; +// +// valueFactor = growthResolutionFactor; +// truncatedTaxLevel = taxLevel / nanoDivider; +// +// for (uint256 i = 0; i < _period; i++) { +// valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); +// } +// return (valueFactor * _value) / growthResolutionFactor; +// } // Calculate a value reduced by demurrage by the given period function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { @@ -423,14 +484,45 @@ contract DemurrageTokenSingleCap { function approve(address _spender, uint256 _value) public returns (bool) { uint256 baseValue; + if (allowance[msg.sender][_spender] > 0) { + require(_value == 0, 'ZERO_FIRST'); + } + changePeriod(); baseValue = toBaseAmount(_value); - allowance[msg.sender][_spender] += baseValue; + allowance[msg.sender][_spender] = baseValue; emit Approval(msg.sender, _spender, _value); return true; } + // Reduce allowance by amount + function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + baseValue = toBaseAmount(_value); + require(allowance[msg.sender][_spender] >= baseValue); + + changePeriod(); + + allowance[msg.sender][_spender] -= baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + + // Increase allowance by amount + function increaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + changePeriod(); + + baseValue = toBaseAmount(_value); + + allowance[msg.sender][_spender] += baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + // Implements ERC20, triggers tax and/or redistribution function transfer(address _to, uint256 _value) public returns (bool) { uint256 baseValue; @@ -454,7 +546,9 @@ contract DemurrageTokenSingleCap { baseValue = toBaseAmount(_value); require(allowance[_from][msg.sender] >= baseValue); + allowance[_from][msg.sender] -= baseValue; result = transferBase(_from, _to, baseValue); + emit Transfer(_from, _to, _value); return result; } @@ -486,6 +580,29 @@ contract DemurrageTokenSingleCap { emit OwnershipTransferred(oldOwner, owner); } + // Explicitly and irretrievably burn tokens + // Only token minters can burn tokens + function burn(uint256 _value) public { + require(minter[msg.sender]); + require(_value <= account[msg.sender]); + uint256 _delta = toBaseAmount(_value); + + applyDemurrage(); + decreaseBaseBalance(msg.sender, _delta); + burned += _value; + emit Burn(msg.sender, _value); + } + + // Implements ERC20 + function totalSupply() public view returns (uint256) { + return supply - burned; + } + + // Return total number of burned tokens + function totalBurned() public view returns (uint256) { + return burned; + } + // Implements EIP165 function supportsInterface(bytes4 _sum) public pure returns (bool) { if (_sum == 0xc6bb4b70) { // ERC20