From 20e3a783fd8ac1dabeaac71388f7de3bd9aa079f Mon Sep 17 00:00:00 2001 From: Louis Holbrook Date: Mon, 30 May 2022 07:53:22 +0000 Subject: [PATCH] Runaway redistribution --- python/CHANGELOG | 4 + .../data/DemurrageTokenMultiCap.bin | 2 +- .../data/DemurrageTokenMultiNocap.bin | 2 +- .../data/DemurrageTokenSingleCap.bin | 2 +- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- .../erc20_demurrage_token/runnable/apply.py | 90 +++++++-- python/erc20_demurrage_token/token.py | 13 ++ python/erc20_demurrage_token/unittest/base.py | 25 ++- python/requirements.txt | 6 +- python/run_tests.sh | 7 +- python/setup.cfg | 5 +- python/tests/test_redistribution.py | 2 + python/tests/test_redistribution_single.py | 185 ++++++++++++++++++ python/tests/test_redistribution_unit.py | 25 ++- solidity/DemurrageTokenSingleNocap.sol | 37 ++-- 16 files changed, 338 insertions(+), 71 deletions(-) create mode 100644 python/tests/test_redistribution_single.py diff --git a/python/CHANGELOG b/python/CHANGELOG index 3602f2b..8f54da5 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,7 @@ +- 0.1.1 + * Settable demurrage steps for apply demurrage cli tool +- 0.1.0 + * Dependency upgrades - 0.0.11 * Apply demurrage cli tool - 0.0.10 diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin index f38361b..66b6ceb 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c1d38038062003c1d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009da565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b60208210811415620009d457620009d362000975565b5b50919050565b60805160a05160c05160e0516131ca62000a5360003960008181610d3501528181610f90015281816110fb01528181611d9a0152818161239b01526123d301526000818161140201528181611d480152611e3501526000818161142e01528181611e560152611e9b01526000611d2401526131ca6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a6004803603810190610295919061294f565b61091c565b6040516102a79190612997565b60405180910390f35b6102b8610ac7565b6040516102c59190612a4b565b60405180910390f35b6102e860048036038101906102e39190612b01565b610b55565b6040516102f59190612997565b60405180910390f35b610306610c79565b6040516103139190612b6c565b60405180910390f35b610324610c9b565b6040516103319190612b96565b60405180910390f35b610342610ca1565b60405161034f9190612b96565b60405180910390f35b610372600480360381019061036d9190612bb1565b610cad565b60405161037f9190612b96565b60405180910390f35b610390610d33565b60405161039d9190612b96565b60405180910390f35b6103c060048036038101906103bb9190612bf1565b610d57565b6040516103cd9190612997565b60405180910390f35b6103f060048036038101906103eb9190612c44565b610e81565b6040516103fd9190612997565b60405180910390f35b610420600480360381019061041b9190612bb1565b610f74565b60405161042d9190612b96565b60405180910390f35b61043e611025565b60405161044b9190612b96565b60405180910390f35b61046e60048036038101906104699190612c44565b61102b565b60405161047b9190612997565b60405180910390f35b61049e60048036038101906104999190612c71565b61122b565b6040516104ab9190612cb7565b60405180910390f35b6104ce60048036038101906104c99190612cfe565b61124f565b6040516104db9190612b96565b60405180910390f35b6104fe60048036038101906104f99190612b01565b611280565b60405161050b9190612997565b60405180910390f35b61052e60048036038101906105299190612c44565b6113a6565b60405161053b9190612b96565b60405180910390f35b61055e60048036038101906105599190612c71565b6113fe565b60405161056b9190612b96565b60405180910390f35b61058e60048036038101906105899190612c71565b61145e565b60405161059b9190612b96565b60405180910390f35b6105ac61147f565b6040516105b99190612b96565b60405180910390f35b6105ca611485565b6040516105d79190612b96565b60405180910390f35b6105fa60048036038101906105f59190612c71565b61148b565b6040516106079190612b96565b60405180910390f35b61062a60048036038101906106259190612c71565b6114f7565b6040516106379190612b96565b60405180910390f35b61065a60048036038101906106559190612c44565b611518565b6040516106679190612b96565b60405180910390f35b61068a60048036038101906106859190612cfe565b611583565b6040516106979190612b96565b60405180910390f35b6106ba60048036038101906106b59190612c44565b6115b6565b6040516106c79190612b96565b60405180910390f35b6106d861165f565b6040516106e59190612997565b60405180910390f35b6106f6611781565b6040516107039190612997565b60405180910390f35b610714611928565b6040516107219190612d3a565b60405180910390f35b61073261194e565b60405161073f9190612997565b60405180910390f35b610750611b05565b60405161075d9190612b96565b60405180910390f35b61076e611b0b565b60405161077b9190612a4b565b60405180910390f35b61079e60048036038101906107999190612c44565b611b99565b6040516107ab9190612997565b60405180910390f35b6107ce60048036038101906107c99190612cfe565b611c56565b6040516107db9190612b96565b60405180910390f35b6107fe60048036038101906107f99190612b01565b611c82565b60405161080b9190612997565b60405180910390f35b61081c611d22565b6040516108299190612b96565b60405180910390f35b61083a611d46565b6040516108479190612b96565b60405180910390f35b61086a60048036038101906108659190612cfe565b611d6a565b6040516108779190612b96565b60405180910390f35b61089a60048036038101906108959190612bb1565b611d7e565b6040516108a79190612b96565b60405180910390f35b6108b8611e2f565b6040516108c59190612b6c565b60405180910390f35b6108d6611e99565b6040516108e39190612b96565b60405180910390f35b61090660048036038101906109019190612c44565b611ebd565b6040516109139190612997565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109715760019050610ac2565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c45760019050610ac2565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a175760019050610ac2565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a6a5760019050610ac2565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abd5760019050610ac2565b600090505b919050565b60068054610ad490612d84565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090612d84565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b505050505081565b600080610b6061194e565b50610b6a3361102b565b50610b748361148b565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c029190612de5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c669190612b96565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b600080600080851415610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90612e87565b60405180910390fd5b838510610d0157600080fd5b8484610d0d9190612ed6565b91508482610d1b9190612f07565b90508084610d299190612f61565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d6461194e565b50610d6e3361102b565b50610d788461148b565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e0357600080fd5b610e0e868684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e6d9190612b96565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f1357600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb99190612ed6565b905060005b8481101561100057620f42408284610fd69190612f07565b610fe09190612ed6565b83610feb9190612f61565b92508080610ff890612f95565b915050610fbe565b50620f424085836110119190612f07565b61101b9190612ed6565b9250505092915050565b60085481565b60008060008060008060008061104089611518565b9150600082148061106a5750611054611e2f565b6fffffffffffffffffffffffffffffffff168210155b1561107f576000975050505050505050611226565b600060018361108e9190612f61565b8154811061109f5761109e612fde565b5b906000526020600020015496506110b58761124f565b945060008514156110d0576000975050505050505050611226565b6110d987611c56565b95506110e487611583565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006111249190612ed6565b86886111309190612ed6565b61113a9190612f07565b6111449190612ed6565b9350620f424081856111569190612f07565b6111609190612ed6565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111ca8984612003565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516112129190612b96565b60405180910390a360019750505050505050505b919050565b6000818154811061123b57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d957600080fd5b600a54600954846112ea9190612de5565b11156112f557600080fd5b6112fd61194e565b506113078361148b565b9050826009600082825461131b9190612de5565b9250508190555061132c8482612003565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161138a9190612b96565b60405180910390a361139a61215f565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261142c9190612f07565b7f00000000000000000000000000000000000000000000000000000000000000006114579190612de5565b9050919050565b6000603c824261146e9190612f61565b6114789190612ed6565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114dc9190612f07565b6114e69190612f07565b6114f09190612ed6565b9050919050565b6000603c82426115079190612f61565b6115119190612ed6565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115c5856113a6565b92506115d260035461145e565b905061160e600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f74565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061163f9190612f07565b828461164b9190612f07565b6116559190612ed6565b9350505050919050565b60008060008061167060035461145e565b92506000831415611687576000935050505061177e565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116c48284610f74565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117099190612f07565b6003546117169190612de5565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161176e9190613048565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117de57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061196761165f565b506119706121fb565b995060006001028a14156119915760009a5050505050505050505050611b02565b61199a8a611d6a565b97506001886119a99190612de5565b90506119b4886113fe565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119f2826114f7565b92506000831115611a27576d04ee2d6d415b85acef8100000000611a168685611d7e565b611a209190612ed6565b9350611a44565b6d04ee2d6d415b85acef810000000085611a419190612ed6565b93505b611a53600085600954846122f6565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a878a61124f565b96506000871415611aa257611a9b8a612382565b9550611abc565b611aae87600954610cad565b9550611aba8689612529565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611aeb9190612b96565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b1890612d84565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4490612d84565b8015611b915780601f10611b6657610100808354040283529160200191611b91565b820191906000526020600020905b815481529060010190602001808311611b7457829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bf557600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c8f61194e565b50611c993361102b565b50611ca38461148b565b9150611cb0338684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d0f9190612b96565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dc39190612ed6565b905060005b84811015611e0a57620f42408284611de09190612f07565b611dea9190612ed6565b83611df59190612de5565b92508080611e0290612f95565b915050611dc8565b50620f42408583611e1b9190612f07565b611e259190612ed6565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e809190612f61565b611e8a9190612ed6565b611e949190612de5565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f6c8584612613565b50611f778484612003565b50611f80611e2f565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fae575080611fab86611518565b14155b8015611fe657508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611ff757611ff58582612744565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156120645760009350505050612159565b61206d866113a6565b9250848361207b9190612de5565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906130af565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121769190612f61565b8154811061218757612186612fde565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121d49190612f61565b815481106121e5576121e4612fde565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122139190612f61565b8154811061222457612223612fde565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc91906130fb565b6fffffffffffffffffffffffffffffffff1690506122d982611d6a565b81116122ed576000600102925050506122f3565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061239386611c56565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123c59190612f07565b6123cf9190612ed6565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124019190612f07565b61240b9190612ed6565b9050838110156124d75761241e86611d6a565b9250710fffffffff000000000000000000000000001960010260006001856124469190612f61565b8154811061245757612456612fde565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124ae9190612f61565b815481106124bf576124be612fde565b5b90600052602060002001600082825417925050819055505b61251c600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125179190612ed6565b612003565b5081945050505050919050565b600080600084141561253f57600091505061260d565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125729190612f61565b8154811061258357612582612fde565b5b90600052602060002001600082825417925050819055506125cd60006001856125ac9190612f61565b815481106125bd576125bc612fde565b5b9060005260206000200154611c56565b9050612606600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126019190612f61565b612003565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612674576000935050505061273e565b61267d866113a6565b9250848310156126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b990613174565b60405180910390fd5b84836126ce9190612f61565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612815612820565b506001905092915050565b6000806000806000600160008054905061283a9190612f61565b8154811061284b5761284a612fde565b5b9060005260206000200154925060016128638461124f565b61286d9190612de5565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128c99190612f61565b815481106128da576128d9612fde565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61292c816128f7565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b600060208284031215612965576129646128f2565b5b60006129738482850161293a565b91505092915050565b60008115159050919050565b6129918161297c565b82525050565b60006020820190506129ac6000830184612988565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ec5780820151818401526020810190506129d1565b838111156129fb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a1d826129b2565b612a2781856129bd565b9350612a378185602086016129ce565b612a4081612a01565b840191505092915050565b60006020820190508181036000830152612a658184612a12565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a9882612a6d565b9050919050565b612aa881612a8d565b8114612ab357600080fd5b50565b600081359050612ac581612a9f565b92915050565b6000819050919050565b612ade81612acb565b8114612ae957600080fd5b50565b600081359050612afb81612ad5565b92915050565b60008060408385031215612b1857612b176128f2565b5b6000612b2685828601612ab6565b9250506020612b3785828601612aec565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b6681612b41565b82525050565b6000602082019050612b816000830184612b5d565b92915050565b612b9081612acb565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b60008060408385031215612bc857612bc76128f2565b5b6000612bd685828601612aec565b9250506020612be785828601612aec565b9150509250929050565b600080600060608486031215612c0a57612c096128f2565b5b6000612c1886828701612ab6565b9350506020612c2986828701612ab6565b9250506040612c3a86828701612aec565b9150509250925092565b600060208284031215612c5a57612c596128f2565b5b6000612c6884828501612ab6565b91505092915050565b600060208284031215612c8757612c866128f2565b5b6000612c9584828501612aec565b91505092915050565b6000819050919050565b612cb181612c9e565b82525050565b6000602082019050612ccc6000830184612ca8565b92915050565b612cdb81612c9e565b8114612ce657600080fd5b50565b600081359050612cf881612cd2565b92915050565b600060208284031215612d1457612d136128f2565b5b6000612d2284828501612ce9565b91505092915050565b612d3481612a8d565b82525050565b6000602082019050612d4f6000830184612d2b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d9c57607f821691505b60208210811415612db057612daf612d55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df082612acb565b9150612dfb83612acb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3057612e2f612db6565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e716011836129bd565b9150612e7c82612e3b565b602082019050919050565b60006020820190508181036000830152612ea081612e64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ee182612acb565b9150612eec83612acb565b925082612efc57612efb612ea7565b5b828204905092915050565b6000612f1282612acb565b9150612f1d83612acb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f5657612f55612db6565b5b828202905092915050565b6000612f6c82612acb565b9150612f7783612acb565b925082821015612f8a57612f89612db6565b5b828203905092915050565b6000612fa082612acb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fd357612fd2612db6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061303261302d61302884612b41565b61300d565b612acb565b9050919050565b61304281613017565b82525050565b600060208201905061305d6000830184613039565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b6000613099600d836129bd565b91506130a482613063565b602082019050919050565b600060208201905081810360008301526130c88161308c565b9050919050565b6130d881612b41565b81146130e357600080fd5b50565b6000815190506130f5816130cf565b92915050565b600060208284031215613111576131106128f2565b5b600061311f848285016130e6565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061315e600d836129bd565b915061316982613128565b602082019050919050565b6000602082019050818103600083015261318d81613151565b905091905056fea2646970667358221220ac7aec2600370aea4fd0eaf84b0dd8139ddc68a1233b4eb187bf642dd42b866b64736f6c634300080b0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c0d38038062003c0d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009d9565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b602082108103620009d357620009d262000975565b5b50919050565b60805160a05160c05160e0516131bb62000a5260003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131bb6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a3e565b60405180910390f35b6102e860048036038101906102e39190612af4565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b5f565b60405180910390f35b610324610c96565b6040516103319190612b89565b60405180910390f35b610342610c9c565b60405161034f9190612b89565b60405180910390f35b610372600480360381019061036d9190612ba4565b610ca8565b60405161037f9190612b89565b60405180910390f35b610390610d2d565b60405161039d9190612b89565b60405180910390f35b6103c060048036038101906103bb9190612be4565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c37565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612ba4565b610f6e565b60405161042d9190612b89565b60405180910390f35b61043e61101f565b60405161044b9190612b89565b60405180910390f35b61046e60048036038101906104699190612c37565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c64565b611224565b6040516104ab9190612caa565b60405180910390f35b6104ce60048036038101906104c99190612cf1565b611248565b6040516104db9190612b89565b60405180910390f35b6104fe60048036038101906104f99190612af4565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c37565b61139f565b60405161053b9190612b89565b60405180910390f35b61055e60048036038101906105599190612c64565b6113f7565b60405161056b9190612b89565b60405180910390f35b61058e60048036038101906105899190612c64565b611457565b60405161059b9190612b89565b60405180910390f35b6105ac611478565b6040516105b99190612b89565b60405180910390f35b6105ca61147e565b6040516105d79190612b89565b60405180910390f35b6105fa60048036038101906105f59190612c64565b611484565b6040516106079190612b89565b60405180910390f35b61062a60048036038101906106259190612c64565b6114f0565b6040516106379190612b89565b60405180910390f35b61065a60048036038101906106559190612c37565b611511565b6040516106679190612b89565b60405180910390f35b61068a60048036038101906106859190612cf1565b61157c565b6040516106979190612b89565b60405180910390f35b6106ba60048036038101906106b59190612c37565b6115af565b6040516106c79190612b89565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d2d565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b89565b60405180910390f35b61076e611b01565b60405161077b9190612a3e565b60405180910390f35b61079e60048036038101906107999190612c37565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612cf1565b611c4c565b6040516107db9190612b89565b60405180910390f35b6107fe60048036038101906107f99190612af4565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b89565b60405180910390f35b61083a611d3c565b6040516108479190612b89565b60405180910390f35b61086a60048036038101906108659190612cf1565b611d60565b6040516108779190612b89565b60405180910390f35b61089a60048036038101906108959190612ba4565b611d74565b6040516108a79190612b89565b60405180910390f35b6108b8611e25565b6040516108c59190612b5f565b60405180910390f35b6108d6611e8f565b6040516108e39190612b89565b60405180910390f35b61090660048036038101906109019190612c37565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d77565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dd7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b89565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e79565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612ec8565b91508482610d159190612ef9565b90508084610d239190612f53565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b89565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612ec8565b905060005b84811015610ffa57620f42408284610fd09190612ef9565b610fda9190612ec8565b83610fe59190612f53565b92508080610ff290612f87565b915050610fb8565b50620f4240858361100b9190612ef9565b6110159190612ec8565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f53565b8154811061109957611098612fcf565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612ec8565b86886111299190612ec8565b6111339190612ef9565b61113d9190612ec8565b9350620f4240818561114f9190612ef9565b6111599190612ec8565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b89565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dd7565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dd7565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b89565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ef9565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dd7565b9050919050565b6000603c82426114679190612f53565b6114719190612ec8565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ef9565b6114df9190612ef9565b6114e99190612ec8565b9050919050565b6000603c82426115009190612f53565b61150a9190612ec8565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ef9565b82846116449190612ef9565b61164e9190612ec8565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ef9565b60035461170e9190612dd7565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190613039565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dd7565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612ec8565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612ec8565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b89565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d77565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b89565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612ec8565b905060005b84811015611e0057620f42408284611dd69190612ef9565b611de09190612ec8565b83611deb9190612dd7565b92508080611df890612f87565b915050611dbe565b50620f42408583611e119190612ef9565b611e1b9190612ec8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f53565b611e809190612ec8565b611e8a9190612dd7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dd7565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906130a0565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f53565b8154811061217c5761217b612fcf565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f53565b815481106121da576121d9612fcf565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f53565b8154811061221957612218612fcf565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130ec565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ef9565b6123c49190612ec8565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ef9565b6124009190612ec8565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f53565b8154811061244c5761244b612fcf565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f53565b815481106124b4576124b3612fcf565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612ec8565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f53565b8154811061257757612576612fcf565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f53565b815481106125b1576125b0612fcf565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f53565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613165565b60405180910390fd5b84836126c19190612f53565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f53565b8154811061283e5761283d612fcf565b5b90600052602060002001549250600161285684611248565b6128609190612dd7565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f53565b815481106128cd576128cc612fcf565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b838111156129ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a10826129a5565b612a1a81856129b0565b9350612a2a8185602086016129c1565b612a33816129f4565b840191505092915050565b60006020820190508181036000830152612a588184612a05565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8b82612a60565b9050919050565b612a9b81612a80565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b6000819050919050565b612ad181612abe565b8114612adc57600080fd5b50565b600081359050612aee81612ac8565b92915050565b60008060408385031215612b0b57612b0a6128e5565b5b6000612b1985828601612aa9565b9250506020612b2a85828601612adf565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5981612b34565b82525050565b6000602082019050612b746000830184612b50565b92915050565b612b8381612abe565b82525050565b6000602082019050612b9e6000830184612b7a565b92915050565b60008060408385031215612bbb57612bba6128e5565b5b6000612bc985828601612adf565b9250506020612bda85828601612adf565b9150509250929050565b600080600060608486031215612bfd57612bfc6128e5565b5b6000612c0b86828701612aa9565b9350506020612c1c86828701612aa9565b9250506040612c2d86828701612adf565b9150509250925092565b600060208284031215612c4d57612c4c6128e5565b5b6000612c5b84828501612aa9565b91505092915050565b600060208284031215612c7a57612c796128e5565b5b6000612c8884828501612adf565b91505092915050565b6000819050919050565b612ca481612c91565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c91565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b600060208284031215612d0757612d066128e5565b5b6000612d1584828501612cdc565b91505092915050565b612d2781612a80565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8f57607f821691505b602082108103612da257612da1612d48565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de282612abe565b9150612ded83612abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2257612e21612da8565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e636011836129b0565b9150612e6e82612e2d565b602082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed382612abe565b9150612ede83612abe565b925082612eee57612eed612e99565b5b828204905092915050565b6000612f0482612abe565b9150612f0f83612abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f4857612f47612da8565b5b828202905092915050565b6000612f5e82612abe565b9150612f6983612abe565b925082821015612f7c57612f7b612da8565b5b828203905092915050565b6000612f9282612abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc457612fc3612da8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061302361301e61301984612b34565b612ffe565b612abe565b9050919050565b61303381613008565b82525050565b600060208201905061304e600083018461302a565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b600061308a600d836129b0565b915061309582613054565b602082019050919050565b600060208201905081810360008301526130b98161307d565b9050919050565b6130c981612b34565b81146130d457600080fd5b50565b6000815190506130e6816130c0565b92915050565b600060208284031215613102576131016128e5565b5b6000613110848285016130d7565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061314f600d836129b0565b915061315a82613119565b602082019050919050565b6000602082019050818103600083015261317e81613142565b905091905056fea2646970667358221220584c6761a6f53a48d12b32828df80bf173ed868c2802527ff2ebbdb3cc94fd7664736f6c634300080d0033 \ 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 0e2a6fe..229aa27 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c9438038062003c9483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009ec565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b60208210811415620009e657620009e562000987565b5b50919050565b60805160a05160c05160e05161322f62000a6560003960008181610cd101528181610f2c0152818161109701528181611dcb015281816123cc015261240401526000818161137a01528181611d790152611e660152600081816113a601528181611e870152611ecc01526000611d55015261322f6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612980565b6108b8565b60405161029191906129c8565b60405180910390f35b6102a2610a63565b6040516102af9190612a7c565b60405180910390f35b6102d260048036038101906102cd9190612b32565b610af1565b6040516102df91906129c8565b60405180910390f35b6102f0610c15565b6040516102fd9190612b9d565b60405180910390f35b61030e610c37565b60405161031b9190612bc7565b60405180910390f35b61032c610c3d565b6040516103399190612bc7565b60405180910390f35b61035c60048036038101906103579190612be2565b610c49565b6040516103699190612bc7565b60405180910390f35b61037a610ccf565b6040516103879190612bc7565b60405180910390f35b6103aa60048036038101906103a59190612c22565b610cf3565b6040516103b791906129c8565b60405180910390f35b6103da60048036038101906103d59190612c75565b610e1d565b6040516103e791906129c8565b60405180910390f35b61040a60048036038101906104059190612be2565b610f10565b6040516104179190612bc7565b60405180910390f35b610428610fc1565b6040516104359190612bc7565b60405180910390f35b61045860048036038101906104539190612c75565b610fc7565b60405161046591906129c8565b60405180910390f35b61048860048036038101906104839190612ca2565b6111c7565b6040516104959190612ce8565b60405180910390f35b6104b860048036038101906104b39190612d2f565b6111eb565b6040516104c59190612bc7565b60405180910390f35b6104e860048036038101906104e39190612b32565b61121c565b6040516104f591906129c8565b60405180910390f35b61051860048036038101906105139190612c75565b61131e565b6040516105259190612bc7565b60405180910390f35b61054860048036038101906105439190612ca2565b611376565b6040516105559190612bc7565b60405180910390f35b6105666113d6565b6040516105739190612bc7565b60405180910390f35b61059660048036038101906105919190612ca2565b6113dc565b6040516105a39190612bc7565b60405180910390f35b6105c660048036038101906105c19190612ca2565b611448565b6040516105d39190612bc7565b60405180910390f35b6105f660048036038101906105f19190612c75565b611469565b6040516106039190612bc7565b60405180910390f35b61062660048036038101906106219190612d2f565b6114d4565b6040516106339190612bc7565b60405180910390f35b61065660048036038101906106519190612c75565b611507565b6040516106639190612bc7565b60405180910390f35b6106746115e8565b60405161068191906129c8565b60405180910390f35b610692611796565b60405161069f91906129c8565b60405180910390f35b6106b061193d565b6040516106bd9190612d6b565b60405180910390f35b6106ce611963565b6040516106db91906129c8565b60405180910390f35b6106ec611b1a565b6040516106f99190612a7c565b60405180910390f35b61071c60048036038101906107179190612c75565b611ba8565b60405161072991906129c8565b60405180910390f35b61074c60048036038101906107479190612d2f565b611c65565b6040516107599190612bc7565b60405180910390f35b61076a611c91565b6040516107779190612b9d565b60405180910390f35b61079a60048036038101906107959190612b32565b611cb3565b6040516107a791906129c8565b60405180910390f35b6107b8611d53565b6040516107c59190612bc7565b60405180910390f35b6107d6611d77565b6040516107e39190612bc7565b60405180910390f35b61080660048036038101906108019190612d2f565b611d9b565b6040516108139190612bc7565b60405180910390f35b61083660048036038101906108319190612be2565b611daf565b6040516108439190612bc7565b60405180910390f35b610854611e60565b6040516108619190612b9d565b60405180910390f35b610872611eca565b60405161087f9190612bc7565b60405180910390f35b6108a2600480360381019061089d9190612c75565b611eee565b6040516108af91906129c8565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60058054610a7090612db5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612db5565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc611963565b50610b0633610fc7565b50610b10836113dc565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b9e9190612e16565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c029190612bc7565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890612eb8565b60405180910390fd5b838510610c9d57600080fd5b8484610ca99190612f07565b91508482610cb79190612f38565b90508084610cc59190612f92565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d00611963565b50610d0a33610fc7565b50610d14846113dc565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9f57600080fd5b610daa868684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e099190612bc7565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610eaf57600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f559190612f07565b905060005b84811015610f9c57620f42408284610f729190612f38565b610f7c9190612f07565b83610f879190612f92565b92508080610f9490612fc6565b915050610f5a565b50620f42408583610fad9190612f38565b610fb79190612f07565b9250505092915050565b60075481565b600080600080600080600080610fdc89611469565b915060008214806110065750610ff0611e60565b6fffffffffffffffffffffffffffffffff168210155b1561101b5760009750505050505050506111c2565b600060018361102a9190612f92565b8154811061103b5761103a61300f565b5b90600052602060002001549650611051876111eb565b9450600085141561106c5760009750505050505050506111c2565b61107587611c65565b9550611080876114d4565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110c09190612f07565b86886110cc9190612f07565b6110d69190612f38565b6110e09190612f07565b9350620f424081856110f29190612f38565b6110fc9190612f07565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111668984612034565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111ae9190612bc7565b60405180910390a360019750505050505050505b919050565b600081815481106111d757600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661127557600080fd5b61127d611963565b5082905082600860008282546112939190612e16565b925050819055506112a48482612034565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113029190612bc7565b60405180910390a3611312612190565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826113a49190612f38565b7f00000000000000000000000000000000000000000000000000000000000000006113cf9190612e16565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461142d9190612f38565b6114379190612f38565b6114419190612f07565b9050919050565b6000603c82426114589190612f92565b6114629190612f07565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115168561131e565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff1661153f611e60565b611549919061303e565b6fffffffffffffffffffffffffffffffff169050611597600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f10565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c89190612f38565b82846115d49190612f38565b6115de9190612f07565b9350505050919050565b60008060008060006115f8611e60565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff1684611624919061303e565b92506000836fffffffffffffffffffffffffffffffff16141561164e576000945050505050611793565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169d82846fffffffffffffffffffffffffffffffff16610f10565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161178291906130ad565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117f357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061197c61222c565b995060006001028a141561199d5760009a5050505050505050505050611b17565b6119a68a611d9b565b97506001886119b59190612e16565b90506119c088611376565b91506119ca6115e8565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611a0782611448565b92506000831115611a3c576d04ee2d6d415b85acef8100000000611a2b8685611daf565b611a359190612f07565b9350611a59565b6d04ee2d6d415b85acef810000000085611a569190612f07565b93505b611a6860008560085484612327565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a9c8a6111eb565b96506000871415611ab757611ab08a6123b3565b9550611ad1565b611ac387600854610c49565b9550611acf868961255a565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611b009190612bc7565b60405180910390a160019a50505050505050505050505b90565b60068054611b2790612db5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5390612db5565b8015611ba05780601f10611b7557610100808354040283529160200191611ba0565b820191906000526020600020905b815481529060010190602001808311611b8357829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c0457600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cc0611963565b50611cca33610fc7565b50611cd4846113dc565b9150611ce1338684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d409190612bc7565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611df49190612f07565b905060005b84811015611e3b57620f42408284611e119190612f38565b611e1b9190612f07565b83611e269190612e16565b92508080611e3390612fc6565b915050611df9565b50620f42408583611e4c9190612f38565b611e569190612f07565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611eb19190612f92565b611ebb9190612f07565b611ec59190612e16565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4a57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f9d8584612644565b50611fa88484612034565b50611fb1611e60565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fdf575080611fdc86611469565b14155b801561201757508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612028576120268582612775565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612095576000935050505061218a565b61209e8661131e565b925084836120ac9190612e16565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161161211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211390613114565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121a79190612f92565b815481106121b8576121b761300f565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506122059190612f92565b815481106122165761221561300f565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122449190612f92565b815481106122555761225461300f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ed9190613160565b6fffffffffffffffffffffffffffffffff16905061230a82611d9b565b811161231e57600060010292505050612324565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123c486611c65565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123f69190612f38565b6124009190612f07565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124329190612f38565b61243c9190612f07565b9050838110156125085761244f86611d9b565b9250710fffffffff000000000000000000000000001960010260006001856124779190612f92565b815481106124885761248761300f565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124df9190612f92565b815481106124f0576124ef61300f565b5b90600052602060002001600082825417925050819055505b61254d600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125489190612f07565b612034565b5081945050505050919050565b600080600084141561257057600091505061263e565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125a39190612f92565b815481106125b4576125b361300f565b5b90600052602060002001600082825417925050819055506125fe60006001856125dd9190612f92565b815481106125ee576125ed61300f565b5b9060005260206000200154611c65565b9050612637600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126329190612f92565b612034565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156126a5576000935050505061276f565b6126ae8661131e565b9250848310156126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea906131d9565b60405180910390fd5b84836126ff9190612f92565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612846612851565b506001905092915050565b6000806000806000600160008054905061286b9190612f92565b8154811061287c5761287b61300f565b5b906000526020600020015492506001612894846111eb565b61289e9190612e16565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128fa9190612f92565b8154811061290b5761290a61300f565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61295d81612928565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b60006020828403121561299657612995612923565b5b60006129a48482850161296b565b91505092915050565b60008115159050919050565b6129c2816129ad565b82525050565b60006020820190506129dd60008301846129b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a4e826129e3565b612a5881856129ee565b9350612a688185602086016129ff565b612a7181612a32565b840191505092915050565b60006020820190508181036000830152612a968184612a43565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ac982612a9e565b9050919050565b612ad981612abe565b8114612ae457600080fd5b50565b600081359050612af681612ad0565b92915050565b6000819050919050565b612b0f81612afc565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060408385031215612b4957612b48612923565b5b6000612b5785828601612ae7565b9250506020612b6885828601612b1d565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b9781612b72565b82525050565b6000602082019050612bb26000830184612b8e565b92915050565b612bc181612afc565b82525050565b6000602082019050612bdc6000830184612bb8565b92915050565b60008060408385031215612bf957612bf8612923565b5b6000612c0785828601612b1d565b9250506020612c1885828601612b1d565b9150509250929050565b600080600060608486031215612c3b57612c3a612923565b5b6000612c4986828701612ae7565b9350506020612c5a86828701612ae7565b9250506040612c6b86828701612b1d565b9150509250925092565b600060208284031215612c8b57612c8a612923565b5b6000612c9984828501612ae7565b91505092915050565b600060208284031215612cb857612cb7612923565b5b6000612cc684828501612b1d565b91505092915050565b6000819050919050565b612ce281612ccf565b82525050565b6000602082019050612cfd6000830184612cd9565b92915050565b612d0c81612ccf565b8114612d1757600080fd5b50565b600081359050612d2981612d03565b92915050565b600060208284031215612d4557612d44612923565b5b6000612d5384828501612d1a565b91505092915050565b612d6581612abe565b82525050565b6000602082019050612d806000830184612d5c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dcd57607f821691505b60208210811415612de157612de0612d86565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e2182612afc565b9150612e2c83612afc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e6157612e60612de7565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612ea26011836129ee565b9150612ead82612e6c565b602082019050919050565b60006020820190508181036000830152612ed181612e95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f1282612afc565b9150612f1d83612afc565b925082612f2d57612f2c612ed8565b5b828204905092915050565b6000612f4382612afc565b9150612f4e83612afc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f8757612f86612de7565b5b828202905092915050565b6000612f9d82612afc565b9150612fa883612afc565b925082821015612fbb57612fba612de7565b5b828203905092915050565b6000612fd182612afc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300457613003612de7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061304982612b72565b915061305483612b72565b92508282101561306757613066612de7565b5b828203905092915050565b6000819050919050565b600061309761309261308d84612b72565b613072565b612afc565b9050919050565b6130a78161307c565b82525050565b60006020820190506130c2600083018461309e565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130fe600d836129ee565b9150613109826130c8565b602082019050919050565b6000602082019050818103600083015261312d816130f1565b9050919050565b61313d81612b72565b811461314857600080fd5b50565b60008151905061315a81613134565b92915050565b60006020828403121561317657613175612923565b5b60006131848482850161314b565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131c3600d836129ee565b91506131ce8261318d565b602082019050919050565b600060208201905081810360008301526131f2816131b6565b905091905056fea2646970667358221220f9f5ec32eaff12f6c840b25f6687670a3f4334b19d564468870872734c2e758664736f6c634300080b0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c8438038062003c8483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009eb565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b602082108103620009e557620009e462000987565b5b50919050565b60805160a05160c05160e05161322062000a6460003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526132206000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a6f565b60405180910390f35b6102d260048036038101906102cd9190612b25565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b90565b60405180910390f35b61030e610c32565b60405161031b9190612bba565b60405180910390f35b61032c610c38565b6040516103399190612bba565b60405180910390f35b61035c60048036038101906103579190612bd5565b610c44565b6040516103699190612bba565b60405180910390f35b61037a610cc9565b6040516103879190612bba565b60405180910390f35b6103aa60048036038101906103a59190612c15565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c68565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bd5565b610f0a565b6040516104179190612bba565b60405180910390f35b610428610fbb565b6040516104359190612bba565b60405180910390f35b61045860048036038101906104539190612c68565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c95565b6111c0565b6040516104959190612cdb565b60405180910390f35b6104b860048036038101906104b39190612d22565b6111e4565b6040516104c59190612bba565b60405180910390f35b6104e860048036038101906104e39190612b25565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c68565b611317565b6040516105259190612bba565b60405180910390f35b61054860048036038101906105439190612c95565b61136f565b6040516105559190612bba565b60405180910390f35b6105666113cf565b6040516105739190612bba565b60405180910390f35b61059660048036038101906105919190612c95565b6113d5565b6040516105a39190612bba565b60405180910390f35b6105c660048036038101906105c19190612c95565b611441565b6040516105d39190612bba565b60405180910390f35b6105f660048036038101906105f19190612c68565b611462565b6040516106039190612bba565b60405180910390f35b61062660048036038101906106219190612d22565b6114cd565b6040516106339190612bba565b60405180910390f35b61065660048036038101906106519190612c68565b611500565b6040516106639190612bba565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d5e565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a6f565b60405180910390f35b61071c60048036038101906107179190612c68565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d22565b611c5b565b6040516107599190612bba565b60405180910390f35b61076a611c87565b6040516107779190612b90565b60405180910390f35b61079a60048036038101906107959190612b25565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bba565b60405180910390f35b6107d6611d6d565b6040516107e39190612bba565b60405180910390f35b61080660048036038101906108019190612d22565b611d91565b6040516108139190612bba565b60405180910390f35b61083660048036038101906108319190612bd5565b611da5565b6040516108439190612bba565b60405180910390f35b610854611e56565b6040516108619190612b90565b60405180910390f35b610872611ec0565b60405161087f9190612bba565b60405180910390f35b6108a2600480360381019061089d9190612c68565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612da8565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612e08565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bba565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612eaa565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ef9565b91508482610cb19190612f2a565b90508084610cbf9190612f84565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bba565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ef9565b905060005b84811015610f9657620f42408284610f6c9190612f2a565b610f769190612ef9565b83610f819190612f84565b92508080610f8e90612fb8565b915050610f54565b50620f42408583610fa79190612f2a565b610fb19190612ef9565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f84565b8154811061103557611034613000565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ef9565b86886110c59190612ef9565b6110cf9190612f2a565b6110d99190612ef9565b9350620f424081856110eb9190612f2a565b6110f59190612ef9565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bba565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612e08565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bba565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612f2a565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612e08565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612f2a565b6114309190612f2a565b61143a9190612ef9565b9050919050565b6000603c82426114519190612f84565b61145b9190612ef9565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b611542919061302f565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612f2a565b82846115cd9190612f2a565b6115d79190612ef9565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d919061302f565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061309e565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612e08565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ef9565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ef9565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bba565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612da8565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bba565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ef9565b905060005b84811015611e3157620f42408284611e079190612f2a565b611e119190612ef9565b83611e1c9190612e08565b92508080611e2990612fb8565b915050611def565b50620f42408583611e429190612f2a565b611e4c9190612ef9565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f84565b611eb19190612ef9565b611ebb9190612e08565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612e08565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890613105565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f84565b815481106121ad576121ac613000565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f84565b8154811061220b5761220a613000565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f84565b8154811061224a57612249613000565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190613151565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612f2a565b6123f59190612ef9565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612f2a565b6124319190612ef9565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f84565b8154811061247d5761247c613000565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f84565b815481106124e5576124e4613000565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ef9565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f84565b815481106125a8576125a7613000565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f84565b815481106125e2576125e1613000565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f84565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906131ca565b60405180910390fd5b84836126f29190612f84565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f84565b8154811061286f5761286e613000565b5b906000526020600020015492506001612887846111e4565b6128919190612e08565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f84565b815481106128fe576128fd613000565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b8114612ad757600080fd5b50565b600081359050612ae981612ac3565b92915050565b6000819050919050565b612b0281612aef565b8114612b0d57600080fd5b50565b600081359050612b1f81612af9565b92915050565b60008060408385031215612b3c57612b3b612916565b5b6000612b4a85828601612ada565b9250506020612b5b85828601612b10565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8a81612b65565b82525050565b6000602082019050612ba56000830184612b81565b92915050565b612bb481612aef565b82525050565b6000602082019050612bcf6000830184612bab565b92915050565b60008060408385031215612bec57612beb612916565b5b6000612bfa85828601612b10565b9250506020612c0b85828601612b10565b9150509250929050565b600080600060608486031215612c2e57612c2d612916565b5b6000612c3c86828701612ada565b9350506020612c4d86828701612ada565b9250506040612c5e86828701612b10565b9150509250925092565b600060208284031215612c7e57612c7d612916565b5b6000612c8c84828501612ada565b91505092915050565b600060208284031215612cab57612caa612916565b5b6000612cb984828501612b10565b91505092915050565b6000819050919050565b612cd581612cc2565b82525050565b6000602082019050612cf06000830184612ccc565b92915050565b612cff81612cc2565b8114612d0a57600080fd5b50565b600081359050612d1c81612cf6565b92915050565b600060208284031215612d3857612d37612916565b5b6000612d4684828501612d0d565b91505092915050565b612d5881612ab1565b82525050565b6000602082019050612d736000830184612d4f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dc057607f821691505b602082108103612dd357612dd2612d79565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e1382612aef565b9150612e1e83612aef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5357612e52612dd9565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e946011836129e1565b9150612e9f82612e5e565b602082019050919050565b60006020820190508181036000830152612ec381612e87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f0482612aef565b9150612f0f83612aef565b925082612f1f57612f1e612eca565b5b828204905092915050565b6000612f3582612aef565b9150612f4083612aef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f7957612f78612dd9565b5b828202905092915050565b6000612f8f82612aef565b9150612f9a83612aef565b925082821015612fad57612fac612dd9565b5b828203905092915050565b6000612fc382612aef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff557612ff4612dd9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061303a82612b65565b915061304583612b65565b92508282101561305857613057612dd9565b5b828203905092915050565b6000819050919050565b600061308861308361307e84612b65565b613063565b612aef565b9050919050565b6130988161306d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130ef600d836129e1565b91506130fa826130b9565b602082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b61312e81612b65565b811461313957600080fd5b50565b60008151905061314b81613125565b92915050565b60006020828403121561316757613166612916565b5b60006131758482850161313c565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131b4600d836129e1565b91506131bf8261317e565b602082019050919050565b600060208201905081810360008301526131e3816131a7565b905091905056fea2646970667358221220264f607b835653f036df7c03346e36a25ca6aaeba8bb51495b6669a847b0b5b164736f6c634300080d0033 \ 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 b1d17a5..06e6bd2 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b50604051620036593803806200365983398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a34565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b6020821081141562000a2e5762000a2d620009cf565b5b50919050565b60805160a05160c05160e051612bac62000aad60003960008181610ccc01528181610f1c0152611c120152600081816111be01528181611a880152611cb10152600081816111ea01528181611cd20152611d1701526000818161125d015281816112950152818161130d0152611a640152612bac6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612280565b610943565b6040516102b291906122c8565b60405180910390f35b6102c3610aee565b6040516102d0919061237c565b60405180910390f35b6102f360048036038101906102ee9190612432565b610b7c565b60405161030091906122c8565b60405180910390f35b610311610c96565b60405161031e919061249d565b60405180910390f35b61032f610cb8565b60405161033c91906124c7565b60405180910390f35b61034d610cbe565b60405161035a91906124c7565b60405180910390f35b61036b610cca565b60405161037891906124c7565b60405180910390f35b61039b600480360381019061039691906124e2565b610cee565b6040516103a891906122c8565b60405180910390f35b6103cb60048036038101906103c69190612535565b610e0e565b6040516103d891906122c8565b60405180910390f35b6103fb60048036038101906103f69190612562565b610f01565b60405161040891906124c7565b60405180910390f35b610419610fb5565b60405161042691906124c7565b60405180910390f35b610449600480360381019061044491906125a2565b610fbb565b60405161045691906125e8565b60405180910390f35b61047960048036038101906104749190612432565b610fdf565b60405161048691906122c8565b60405180910390f35b6104a960048036038101906104a49190612535565b611171565b6040516104b691906124c7565b60405180910390f35b6104d960048036038101906104d491906125a2565b6111ba565b6040516104e691906124c7565b60405180910390f35b610509600480360381019061050491906125a2565b61121a565b60405161051691906124c7565b60405180910390f35b61052761123b565b60405161053491906124c7565b60405180910390f35b610545611241565b60405161055291906124c7565b60405180910390f35b61057560048036038101906105709190612562565b611247565b60405161058291906124c7565b60405180910390f35b6105a560048036038101906105a091906125a2565b6112c8565b6040516105b291906124c7565b60405180910390f35b6105d560048036038101906105d091906125a2565b611348565b6040516105e291906124c7565b60405180910390f35b6106056004803603810190610600919061262f565b611369565b60405161061291906124c7565b60405180910390f35b61063560048036038101906106309190612535565b6113a3565b60405161064291906124c7565b60405180910390f35b61065361145b565b60405161066091906122c8565b60405180910390f35b61067161146c565b60405161067e91906122c8565b60405180910390f35b6106a1600480360381019061069c919061262f565b611613565b6040516106ae91906124c7565b60405180910390f35b6106bf611641565b6040516106cc919061266b565b60405180910390f35b6106ef60048036038101906106ea9190612535565b611667565b005b6106f9611705565b60405161070691906122c8565b60405180910390f35b61071761184f565b60405161072491906124c7565b60405180910390f35b610735611855565b604051610742919061237c565b60405180910390f35b61076560048036038101906107609190612535565b6118e3565b60405161077291906122c8565b60405180910390f35b6107956004803603810190610790919061262f565b6119a0565b6040516107a291906124c7565b60405180910390f35b6107c560048036038101906107c09190612432565b6119cc565b6040516107d291906122c8565b60405180910390f35b6107e3611a62565b6040516107f091906124c7565b60405180910390f35b610801611a86565b60405161080e91906124c7565b60405180910390f35b610831600480360381019061082c91906125a2565b611aaa565b60405161083e91906122c8565b60405180910390f35b610861600480360381019061085c919061262f565b611be3565b60405161086e91906124c7565b60405180910390f35b610891600480360381019061088c9190612562565b611bf7565b60405161089e91906124c7565b60405180910390f35b6108af611cab565b6040516108bc919061249d565b60405180910390f35b6108cd611d15565b6040516108da91906124c7565b60405180910390f35b6108fd60048036038101906108f89190612535565b611d39565b60405161090a91906122c8565b60405180910390f35b61092d60048036038101906109289190612686565b611ddb565b60405161093a91906125e8565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109985760019050610ae9565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109eb5760019050610ae9565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a3e5760019050610ae9565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a915760019050610ae9565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ae45760019050610ae9565b600090505b919050565b60068054610afb9061271c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b279061271c565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b505050505081565b600080610b87611705565b50610b91836112c8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1f919061277d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c8391906124c7565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfb611705565b50610d05846112c8565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9057600080fd5b610d9b868684611e48565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dfa91906124c7565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea057600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f459190612802565b905060005b84811015610f8e5764e8d4a510008284610f649190612833565b610f6e9190612802565b83610f79919061288d565b92508080610f86906128c1565b915050610f4a565b5064e8d4a510008583610fa19190612833565b610fab9190612802565b9250505092915050565b60085481565b60008181548110610fcb57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590612956565b60405180910390fd5b600a546009548461107f919061277d565b11156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b7906129c2565b60405180910390fd5b6110c8611705565b506110d2836112c8565b905082600960008282546110e6919061277d565b925050819055506110f78482611e6d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115591906124c7565b60405180910390a3611165611f32565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e89190612833565b7f0000000000000000000000000000000000000000000000000000000000000000611213919061277d565b9050919050565b6000603c824261122a919061288d565b6112349190612802565b9050919050565b600b5481565b60035481565b6000806402540be4008361125b9190612833565b7f0000000000000000000000000000000000000000000000000000000000000000611286919061288d565b846112919190612833565b90507f0000000000000000000000000000000000000000000000000000000000000000816112bf9190612802565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f991906129e2565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113379190612833565b6113419190612802565b9050919050565b6000603c8242611358919061288d565b6113629190612802565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113b285611171565b92506113bf60035461121a565b905061140b6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113f391906129e2565b6fffffffffffffffffffffffffffffffff1682610f01565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061143b9190612833565b82846114479190612833565b6114519190612802565b9350505050919050565b60006114676000611aaa565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b6000806000611621846119a0565b915061162c84611369565b90506116388282611247565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c157600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080600061171b61145b565b50611724611fd4565b975060006001028814156117435760009850505050505050505061184c565b61174c88611be3565b955060018661175b919061277d565b9050611766866111ba565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506117a482611348565b925060008311156117c0576117b98584611bf7565b93506117c4565b8493505b6117d360008560095484611ddb565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611807876120cf565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183791906124c7565b60405180910390a16001985050505050505050505b90565b600a5481565b600780546118629061271c565b80601f016020809104026020016040519081016040528092919081815260200182805461188e9061271c565b80156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193f57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d9611705565b506119e3846112c8565b91506119f0338684611e48565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4f91906124c7565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aba60035461121a565b91506000821415611ad057600092505050611bde565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b1257508184105b15611b1b578391505b611b258183610f01565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b6a9190612833565b600354611b77919061277d565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bcf9190612a67565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3b9190612802565b905060005b84811015611c845764e8d4a510008284611c5a9190612833565b611c649190612802565b83611c6f919061277d565b92508080611c7c906128c1565b915050611c40565b5064e8d4a510008583611c979190612833565b611ca19190612802565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cfc919061288d565b611d069190612802565b611d10919061277d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d9557600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e55858461211b565b50611e608484611e6d565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611eca5760009350505050611f2c565b611ed386611171565b92508483611ee1919061277d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f50919061288d565b81548110611f6157611f60612a82565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fac919061288d565b81548110611fbd57611fbc612a82565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fec919061288d565b81548110611ffd57611ffc612a82565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120959190612add565b6fffffffffffffffffffffffffffffffff1690506120b282611be3565b81116120c6576000600102925050506120cc565b81925050505b90565b6000806120db83611613565b9050612111600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661210c836112c8565b611e6d565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415612178576000935050505061221d565b61218186611171565b9250848310156121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd90612b56565b60405180910390fd5b84836121d2919061288d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61225d81612228565b811461226857600080fd5b50565b60008135905061227a81612254565b92915050565b60006020828403121561229657612295612223565b5b60006122a48482850161226b565b91505092915050565b60008115159050919050565b6122c2816122ad565b82525050565b60006020820190506122dd60008301846122b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561231d578082015181840152602081019050612302565b8381111561232c576000848401525b50505050565b6000601f19601f8301169050919050565b600061234e826122e3565b61235881856122ee565b93506123688185602086016122ff565b61237181612332565b840191505092915050565b600060208201905081810360008301526123968184612343565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c98261239e565b9050919050565b6123d9816123be565b81146123e457600080fd5b50565b6000813590506123f6816123d0565b92915050565b6000819050919050565b61240f816123fc565b811461241a57600080fd5b50565b60008135905061242c81612406565b92915050565b6000806040838503121561244957612448612223565b5b6000612457858286016123e7565b92505060206124688582860161241d565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61249781612472565b82525050565b60006020820190506124b2600083018461248e565b92915050565b6124c1816123fc565b82525050565b60006020820190506124dc60008301846124b8565b92915050565b6000806000606084860312156124fb576124fa612223565b5b6000612509868287016123e7565b935050602061251a868287016123e7565b925050604061252b8682870161241d565b9150509250925092565b60006020828403121561254b5761254a612223565b5b6000612559848285016123e7565b91505092915050565b6000806040838503121561257957612578612223565b5b60006125878582860161241d565b92505060206125988582860161241d565b9150509250929050565b6000602082840312156125b8576125b7612223565b5b60006125c68482850161241d565b91505092915050565b6000819050919050565b6125e2816125cf565b82525050565b60006020820190506125fd60008301846125d9565b92915050565b61260c816125cf565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b60006020828403121561264557612644612223565b5b60006126538482850161261a565b91505092915050565b612665816123be565b82525050565b6000602082019050612680600083018461265c565b92915050565b600080600080608085870312156126a05761269f612223565b5b60006126ae8782880161241d565b94505060206126bf8782880161241d565b93505060406126d08782880161241d565b92505060606126e18782880161241d565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061273457607f821691505b60208210811415612748576127476126ed565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612788826123fc565b9150612793836123fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127c8576127c761274e565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061280d826123fc565b9150612818836123fc565b925082612828576128276127d3565b5b828204905092915050565b600061283e826123fc565b9150612849836123fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128825761288161274e565b5b828202905092915050565b6000612898826123fc565b91506128a3836123fc565b9250828210156128b6576128b561274e565b5b828203905092915050565b60006128cc826123fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156128ff576128fe61274e565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612940600a836122ee565b915061294b8261290a565b602082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129ac6007836122ee565b91506129b782612976565b602082019050919050565b600060208201905081810360008301526129db8161299f565b9050919050565b60006129ed82612472565b91506129f883612472565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a2157612a2061274e565b5b828202905092915050565b6000819050919050565b6000612a51612a4c612a4784612472565b612a2c565b6123fc565b9050919050565b612a6181612a36565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aba81612472565b8114612ac557600080fd5b50565b600081519050612ad781612ab1565b92915050565b600060208284031215612af357612af2612223565b5b6000612b0184828501612ac8565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b40600d836122ee565b9150612b4b82612b0a565b602082019050919050565b60006020820190508181036000830152612b6f81612b33565b905091905056fea2646970667358221220100682493d588dd205f0e53bc131ba668867313a64e728c35307651637c6757a64736f6c634300080b0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b506040516200364d3803806200364d83398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a33565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b60208210810362000a2d5762000a2c620009cf565b5b50919050565b60805160a05160c05160e051612ba162000aac60003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612ba16000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d09190612373565b60405180910390f35b6102f360048036038101906102ee9190612429565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e9190612494565b60405180910390f35b61032f610cb3565b60405161033c91906124be565b60405180910390f35b61034d610cb9565b60405161035a91906124be565b60405180910390f35b61036b610cc5565b60405161037891906124be565b60405180910390f35b61039b600480360381019061039691906124d9565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c6919061252c565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612559565b610efc565b60405161040891906124be565b60405180910390f35b610419610fb0565b60405161042691906124be565b60405180910390f35b61044960048036038101906104449190612599565b610fb6565b60405161045691906125df565b60405180910390f35b61047960048036038101906104749190612429565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a4919061252c565b61116c565b6040516104b691906124be565b60405180910390f35b6104d960048036038101906104d49190612599565b6111b5565b6040516104e691906124be565b60405180910390f35b61050960048036038101906105049190612599565b611215565b60405161051691906124be565b60405180910390f35b610527611236565b60405161053491906124be565b60405180910390f35b61054561123c565b60405161055291906124be565b60405180910390f35b61057560048036038101906105709190612559565b611242565b60405161058291906124be565b60405180910390f35b6105a560048036038101906105a09190612599565b6112c3565b6040516105b291906124be565b60405180910390f35b6105d560048036038101906105d09190612599565b611343565b6040516105e291906124be565b60405180910390f35b61060560048036038101906106009190612626565b611364565b60405161061291906124be565b60405180910390f35b6106356004803603810190610630919061252c565b61139e565b60405161064291906124be565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c9190612626565b61160e565b6040516106ae91906124be565b60405180910390f35b6106bf61163c565b6040516106cc9190612662565b60405180910390f35b6106ef60048036038101906106ea919061252c565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124be565b60405180910390f35b61073561184f565b6040516107429190612373565b60405180910390f35b6107656004803603810190610760919061252c565b6118dd565b60405161077291906122bf565b60405180910390f35b61079560048036038101906107909190612626565b61199a565b6040516107a291906124be565b60405180910390f35b6107c560048036038101906107c09190612429565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124be565b60405180910390f35b610801611a80565b60405161080e91906124be565b60405180910390f35b610831600480360381019061082c9190612599565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c9190612626565b611bdc565b60405161086e91906124be565b60405180910390f35b610891600480360381019061088c9190612559565b611bf0565b60405161089e91906124be565b60405180910390f35b6108af611ca4565b6040516108bc9190612494565b60405180910390f35b6108cd611d0e565b6040516108da91906124be565b60405180910390f35b6108fd60048036038101906108f8919061252c565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d6004803603810190610928919061267d565b611dd4565b60405161093a91906125df565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af690612713565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612713565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612773565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124be565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124be565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127f8565b905060005b84811015610f895764e8d4a510008284610f5f9190612829565b610f6991906127f8565b83610f749190612883565b92508080610f81906128b7565b915050610f45565b5064e8d4a510008583610f9c9190612829565b610fa691906127f8565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110609061294b565b60405180910390fd5b600a546009548461107a9190612773565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906129b7565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e19190612773565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124be565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e39190612829565b7f000000000000000000000000000000000000000000000000000000000000000061120e9190612773565b9050919050565b6000603c82426112259190612883565b61122f91906127f8565b9050919050565b600b5481565b60035481565b6000806402540be400836112569190612829565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612883565b8461128c9190612829565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127f8565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f491906129d7565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113329190612829565b61133c91906127f8565b9050919050565b6000603c82426113539190612883565b61135d91906127f8565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee91906129d7565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006114369190612829565b82846114429190612829565b61144c91906127f8565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b95506001866117559190612773565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124be565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c90612713565b80601f016020809104026020016040519081016040528092919081815260200182805461188890612713565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124be565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b639190612829565b600354611b709190612773565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a5c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127f8565b905060005b84811015611c7d5764e8d4a510008284611c539190612829565b611c5d91906127f8565b83611c689190612773565b92508080611c75906128b7565b915050611c39565b5064e8d4a510008583611c909190612829565b611c9a91906127f8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612883565b611cff91906127f8565b611d099190612773565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed99190612773565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612883565b81548110611f5957611f58612a77565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612883565b81548110611fb557611fb4612a77565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612883565b81548110611ff557611ff4612a77565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612ad2565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612b4b565b60405180910390fd5b84836121c99190612883565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b83811115612323576000848401525b50505050565b6000601f19601f8301169050919050565b6000612345826122da565b61234f81856122e5565b935061235f8185602086016122f6565b61236881612329565b840191505092915050565b6000602082019050818103600083015261238d818461233a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c082612395565b9050919050565b6123d0816123b5565b81146123db57600080fd5b50565b6000813590506123ed816123c7565b92915050565b6000819050919050565b612406816123f3565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b600080604083850312156124405761243f61221a565b5b600061244e858286016123de565b925050602061245f85828601612414565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248e81612469565b82525050565b60006020820190506124a96000830184612485565b92915050565b6124b8816123f3565b82525050565b60006020820190506124d360008301846124af565b92915050565b6000806000606084860312156124f2576124f161221a565b5b6000612500868287016123de565b9350506020612511868287016123de565b925050604061252286828701612414565b9150509250925092565b6000602082840312156125425761254161221a565b5b6000612550848285016123de565b91505092915050565b600080604083850312156125705761256f61221a565b5b600061257e85828601612414565b925050602061258f85828601612414565b9150509250929050565b6000602082840312156125af576125ae61221a565b5b60006125bd84828501612414565b91505092915050565b6000819050919050565b6125d9816125c6565b82525050565b60006020820190506125f460008301846125d0565b92915050565b612603816125c6565b811461260e57600080fd5b50565b600081359050612620816125fa565b92915050565b60006020828403121561263c5761263b61221a565b5b600061264a84828501612611565b91505092915050565b61265c816123b5565b82525050565b60006020820190506126776000830184612653565b92915050565b600080600080608085870312156126975761269661221a565b5b60006126a587828801612414565b94505060206126b687828801612414565b93505060406126c787828801612414565b92505060606126d887828801612414565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272b57607f821691505b60208210810361273e5761273d6126e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061277e826123f3565b9150612789836123f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127be576127bd612744565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612803826123f3565b915061280e836123f3565b92508261281e5761281d6127c9565b5b828204905092915050565b6000612834826123f3565b915061283f836123f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287857612877612744565b5b828202905092915050565b600061288e826123f3565b9150612899836123f3565b9250828210156128ac576128ab612744565b5b828203905092915050565b60006128c2826123f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128f4576128f3612744565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612935600a836122e5565b9150612940826128ff565b602082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129a16007836122e5565b91506129ac8261296b565b602082019050919050565b600060208201905081810360008301526129d081612994565b9050919050565b60006129e282612469565b91506129ed83612469565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a1657612a15612744565b5b828202905092915050565b6000819050919050565b6000612a46612a41612a3c84612469565b612a21565b6123f3565b9050919050565b612a5681612a2b565b82525050565b6000602082019050612a716000830184612a4d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aaf81612469565b8114612aba57600080fd5b50565b600081519050612acc81612aa6565b92915050565b600060208284031215612ae857612ae761221a565b5b6000612af684828501612abd565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b35600d836122e5565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b905091905056fea264697066735822122062c31e95bd6895f83a0143b8b2662ee1e29e96dcc6cdf00d59c085ca9228ddc264736f6c634300080d0033 \ 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 ec2299a..2828c3b 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000412565b6080908152503480156200003657600080fd5b506040516200354d3803806200354d83398181016040528101906200005c919062000731565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f92919062000329565b5084600790805190602001906200014892919062000329565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000412565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002bc640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002a991906200095f565b600a819055505050505050505062000a15565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033790620009df565b90600052602060002090601f0160209004810192826200035b5760008555620003a7565b82601f106200037657805160ff1916838001178555620003a7565b82800160010185558215620003a7579182015b82811115620003a657825182559160200191906001019062000389565b5b509050620003b69190620003ba565b5090565b5b80821115620003d5576000816000905550600101620003bb565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041f82620003d9565b91506200042c83620003d9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004685762000467620003e3565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004dc8262000491565b810181811067ffffffffffffffff82111715620004fe57620004fd620004a2565b5b80604052505050565b60006200051362000473565b9050620005218282620004d1565b919050565b600067ffffffffffffffff821115620005445762000543620004a2565b5b6200054f8262000491565b9050602081019050919050565b60005b838110156200057c5780820151818401526020810190506200055f565b838111156200058c576000848401525b50505050565b6000620005a9620005a38462000526565b62000507565b905082815260208101848484011115620005c857620005c76200048c565b5b620005d58482856200055c565b509392505050565b600082601f830112620005f557620005f462000487565b5b81516200060784826020860162000592565b91505092915050565b600060ff82169050919050565b620006288162000610565b81146200063457600080fd5b50565b60008151905062000648816200061d565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b62000675816200064e565b81146200068157600080fd5b50565b60008151905062000695816200066a565b92915050565b620006a681620003d9565b8114620006b257600080fd5b50565b600081519050620006c6816200069b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006f982620006cc565b9050919050565b6200070b81620006ec565b81146200071757600080fd5b50565b6000815190506200072b8162000700565b92915050565b60008060008060008060c087890312156200075157620007506200047d565b5b600087015167ffffffffffffffff81111562000772576200077162000482565b5b6200078089828a01620005dd565b965050602087015167ffffffffffffffff811115620007a457620007a362000482565b5b620007b289828a01620005dd565b9550506040620007c589828a0162000637565b9450506060620007d889828a0162000684565b9350506080620007eb89828a01620006b5565b92505060a0620007fe89828a016200071a565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b60018511156200086a57808604811115620008425762000841620003e3565b5b6001851615620008525780820291505b808102905062000862856200080b565b945062000822565b94509492505050565b60008262000885576001905062000958565b8162000895576000905062000958565b8160018114620008ae5760028114620008b957620008ef565b600191505062000958565b60ff841115620008ce57620008cd620003e3565b5b8360020a915084821115620008e857620008e7620003e3565b5b5062000958565b5060208310610133831016604e8410600b8410161715620009295782820a905083811115620009235762000922620003e3565b5b62000958565b62000938848484600162000818565b92509050818404811115620009525762000951620003e3565b5b81810290505b9392505050565b60006200096c82620003d9565b91506200097983620003d9565b9250620009a87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000873565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009f857607f821691505b6020821081141562000a0f5762000a0e620009b0565b5b50919050565b60805160a05160c05160e051612abf62000a8e60003960008181610ca301528181610ef30152611b9101526000818161114301528181611a070152611c3001526000818161116f01528181611c510152611c960152600081816111e20152818161121a0152818161129201526119e30152612abf6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a05116101635780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a1461081e578063e54d63f71461084e578063e80952951461087e578063eda4e6d61461089c578063f2fde38b146108ba578063f83da35d146108ea5761027b565b80639da7d8ba14610752578063a9059cbb14610782578063ab28cea0146107b2578063b470aade146107d0578063c0ab7077146107ee5761027b565b80638da5cb5b116101275780638da5cb5b146106ac5780638f0b2d5d146106ca5780638f1df6bc146106e657806395d89b4114610704578063983b2d56146107225761027b565b80636ffa8a05146105e057806370a0823114610610578063731f237c1461064057806379ba50971461065e5780638d34855a1461067c5761027b565b8063313ce567116101fc57806351b4541c116101c057806351b4541c146104e4578063573cc5071461051457806358b2833b146105325780636721d4ef146105505780636787a9be146105805780636a2d094e146105b05761027b565b8063313ce5671461040657806340452d9114610424578063449a52f81461045457806347a50517146104845780634abfbba2146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063229ba1971461035857806323b872dd146103765780633092afd5146103a657806331333487146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a600480360381019061029591906121ff565b61091a565b6040516102a79190612247565b60405180910390f35b6102b8610ac5565b6040516102c591906122fb565b60405180910390f35b6102e860048036038101906102e391906123b1565b610b53565b6040516102f59190612247565b60405180910390f35b610306610c6d565b604051610313919061241c565b60405180910390f35b610324610c8f565b6040516103319190612446565b60405180910390f35b610342610c95565b60405161034f9190612446565b60405180910390f35b610360610ca1565b60405161036d9190612446565b60405180910390f35b610390600480360381019061038b9190612461565b610cc5565b60405161039d9190612247565b60405180910390f35b6103c060048036038101906103bb91906124b4565b610de5565b6040516103cd9190612247565b60405180910390f35b6103f060048036038101906103eb91906124e1565b610ed8565b6040516103fd9190612446565b60405180910390f35b61040e610f8c565b60405161041b9190612446565b60405180910390f35b61043e60048036038101906104399190612521565b610f92565b60405161044b9190612567565b60405180910390f35b61046e600480360381019061046991906123b1565b610fb6565b60405161047b9190612247565b60405180910390f35b61049e600480360381019061049991906124b4565b6110f6565b6040516104ab9190612446565b60405180910390f35b6104ce60048036038101906104c99190612521565b61113f565b6040516104db9190612446565b60405180910390f35b6104fe60048036038101906104f99190612521565b61119f565b60405161050b9190612446565b60405180910390f35b61051c6111c0565b6040516105299190612446565b60405180910390f35b61053a6111c6565b6040516105479190612446565b60405180910390f35b61056a600480360381019061056591906124e1565b6111cc565b6040516105779190612446565b60405180910390f35b61059a60048036038101906105959190612521565b61124d565b6040516105a79190612446565b60405180910390f35b6105ca60048036038101906105c59190612521565b6112cd565b6040516105d79190612446565b60405180910390f35b6105fa60048036038101906105f591906125ae565b6112ee565b6040516106079190612446565b60405180910390f35b61062a600480360381019061062591906124b4565b611328565b6040516106379190612446565b60405180910390f35b6106486113e0565b6040516106559190612247565b60405180910390f35b6106666113f1565b6040516106739190612247565b60405180910390f35b610696600480360381019061069191906125ae565b611598565b6040516106a39190612446565b60405180910390f35b6106b46115c6565b6040516106c191906125ea565b60405180910390f35b6106e460048036038101906106df91906124b4565b6115ec565b005b6106ee61168a565b6040516106fb9190612247565b60405180910390f35b61070c6117d4565b60405161071991906122fb565b60405180910390f35b61073c600480360381019061073791906124b4565b611862565b6040516107499190612247565b60405180910390f35b61076c600480360381019061076791906125ae565b61191f565b6040516107799190612446565b60405180910390f35b61079c600480360381019061079791906123b1565b61194b565b6040516107a99190612247565b60405180910390f35b6107ba6119e1565b6040516107c79190612446565b60405180910390f35b6107d8611a05565b6040516107e59190612446565b60405180910390f35b61080860048036038101906108039190612521565b611a29565b6040516108159190612247565b60405180910390f35b610838600480360381019061083391906125ae565b611b62565b6040516108459190612446565b60405180910390f35b610868600480360381019061086391906124e1565b611b76565b6040516108759190612446565b60405180910390f35b610886611c2a565b604051610893919061241c565b60405180910390f35b6108a4611c94565b6040516108b19190612446565b60405180910390f35b6108d460048036038101906108cf91906124b4565b611cb8565b6040516108e19190612247565b60405180910390f35b61090460048036038101906108ff9190612605565b611d5a565b6040516109119190612567565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561096f5760019050610ac0565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c25760019050610ac0565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a155760019050610ac0565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a685760019050610ac0565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abb5760019050610ac0565b600090505b919050565b60068054610ad29061269b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afe9061269b565b8015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b505050505081565b600080610b5e61168a565b50610b688361124d565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bf691906126fc565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c5a9190612446565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cd261168a565b50610cdc8461124d565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d6757600080fd5b610d72868684611dc7565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dd19190612446565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e6e57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e7757600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f1c9190612781565b905060005b84811015610f655764e8d4a510008284610f3b91906127b2565b610f459190612781565b83610f50919061280c565b92508080610f5d90612840565b915050610f21565b5064e8d4a510008583610f7891906127b2565b610f829190612781565b9250505092915050565b60085481565b60008181548110610fa257600080fd5b906000526020600020016000915090505481565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906128d5565b60405180910390fd5b61104d61168a565b506110578361124d565b9050826009600082825461106b91906126fc565b9250508190555061107c8482611dec565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110da9190612446565b60405180910390a36110ea611eb1565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261116d91906127b2565b7f000000000000000000000000000000000000000000000000000000000000000061119891906126fc565b9050919050565b6000603c82426111af919061280c565b6111b99190612781565b9050919050565b600a5481565b60035481565b6000806402540be400836111e091906127b2565b7f000000000000000000000000000000000000000000000000000000000000000061120b919061280c565b8461121691906127b2565b90507f0000000000000000000000000000000000000000000000000000000000000000816112449190612781565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661127e91906128f5565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112bc91906127b2565b6112c69190612781565b9050919050565b6000603c82426112dd919061280c565b6112e79190612781565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600080611337856110f6565b925061134460035461119f565b90506113906402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661137891906128f5565b6fffffffffffffffffffffffffffffffff1682610ed8565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113c091906127b2565b82846113cc91906127b2565b6113d69190612781565b9350505050919050565b60006113ec6000611a29565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461144e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115a68461191f565b91506115b1846112ee565b90506115bd82826111cc565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164657600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116a06113e0565b506116a9611f53565b975060006001028814156116c8576000985050505050505050506117d1565b6116d188611b62565b95506001866116e091906126fc565b90506116eb8661113f565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611729826112cd565b925060008311156117455761173e8584611b76565b9350611749565b8493505b61175860008560095484611d5a565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561178c8761204e565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117bc9190612446565b60405180910390a16001985050505050505050505b90565b600780546117e19061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461180d9061269b565b801561185a5780601f1061182f5761010080835404028352916020019161185a565b820191906000526020600020905b81548152906001019060200180831161183d57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118be57600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061195861168a565b506119628461124d565b915061196f338684611dc7565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119ce9190612446565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a3960035461119f565b91506000821415611a4f57600092505050611b5d565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611a9157508184105b15611a9a578391505b611aa48183610ed8565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611ae991906127b2565b600354611af691906126fc565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b4e919061297a565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611bba9190612781565b905060005b84811015611c035764e8d4a510008284611bd991906127b2565b611be39190612781565b83611bee91906126fc565b92508080611bfb90612840565b915050611bbf565b5064e8d4a510008583611c1691906127b2565b611c209190612781565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611c7b919061280c565b611c859190612781565b611c8f91906126fc565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d1457600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611dd4858461209a565b50611ddf8484611dec565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611e495760009350505050611eab565b611e52866110f6565b92508483611e6091906126fc565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611ecf919061280c565b81548110611ee057611edf612995565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f2b919061280c565b81548110611f3c57611f3b612995565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611f6b919061280c565b81548110611f7c57611f7b612995565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201491906129f0565b6fffffffffffffffffffffffffffffffff16905061203182611b62565b81116120455760006001029250505061204b565b81925050505b90565b60008061205a83611598565b9050612090600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661208b8361124d565b611dec565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008514156120f7576000935050505061219c565b612100866110f6565b925084831015612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90612a69565b60405180910390fd5b8483612151919061280c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121dc816121a7565b81146121e757600080fd5b50565b6000813590506121f9816121d3565b92915050565b600060208284031215612215576122146121a2565b5b6000612223848285016121ea565b91505092915050565b60008115159050919050565b6122418161222c565b82525050565b600060208201905061225c6000830184612238565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561229c578082015181840152602081019050612281565b838111156122ab576000848401525b50505050565b6000601f19601f8301169050919050565b60006122cd82612262565b6122d7818561226d565b93506122e781856020860161227e565b6122f0816122b1565b840191505092915050565b6000602082019050818103600083015261231581846122c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123488261231d565b9050919050565b6123588161233d565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b6000819050919050565b61238e8161237b565b811461239957600080fd5b50565b6000813590506123ab81612385565b92915050565b600080604083850312156123c8576123c76121a2565b5b60006123d685828601612366565b92505060206123e78582860161239c565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612416816123f1565b82525050565b6000602082019050612431600083018461240d565b92915050565b6124408161237b565b82525050565b600060208201905061245b6000830184612437565b92915050565b60008060006060848603121561247a576124796121a2565b5b600061248886828701612366565b935050602061249986828701612366565b92505060406124aa8682870161239c565b9150509250925092565b6000602082840312156124ca576124c96121a2565b5b60006124d884828501612366565b91505092915050565b600080604083850312156124f8576124f76121a2565b5b60006125068582860161239c565b92505060206125178582860161239c565b9150509250929050565b600060208284031215612537576125366121a2565b5b60006125458482850161239c565b91505092915050565b6000819050919050565b6125618161254e565b82525050565b600060208201905061257c6000830184612558565b92915050565b61258b8161254e565b811461259657600080fd5b50565b6000813590506125a881612582565b92915050565b6000602082840312156125c4576125c36121a2565b5b60006125d284828501612599565b91505092915050565b6125e48161233d565b82525050565b60006020820190506125ff60008301846125db565b92915050565b6000806000806080858703121561261f5761261e6121a2565b5b600061262d8782880161239c565b945050602061263e8782880161239c565b935050604061264f8782880161239c565b92505060606126608782880161239c565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126b357607f821691505b602082108114156126c7576126c661266c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127078261237b565b91506127128361237b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612747576127466126cd565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061278c8261237b565b91506127978361237b565b9250826127a7576127a6612752565b5b828204905092915050565b60006127bd8261237b565b91506127c88361237b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612801576128006126cd565b5b828202905092915050565b60006128178261237b565b91506128228361237b565b925082821015612835576128346126cd565b5b828203905092915050565b600061284b8261237b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561287e5761287d6126cd565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006128bf600a8361226d565b91506128ca82612889565b602082019050919050565b600060208201905081810360008301526128ee816128b2565b9050919050565b6000612900826123f1565b915061290b836123f1565b9250816fffffffffffffffffffffffffffffffff0483118215151615612934576129336126cd565b5b828202905092915050565b6000819050919050565b600061296461295f61295a846123f1565b61293f565b61237b565b9050919050565b61297481612949565b82525050565b600060208201905061298f600083018461296b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6129cd816123f1565b81146129d857600080fd5b50565b6000815190506129ea816129c4565b92915050565b600060208284031215612a0657612a056121a2565b5b6000612a14848285016129db565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612a53600d8361226d565b9150612a5e82612a1d565b602082019050919050565b60006020820190508181036000830152612a8281612a46565b905091905056fea264697066735822122040c7b82458bb5e6e45df5d826444d591ea75814bd7cd674b11c9026417e4d59064736f6c634300080b0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034973803806200349783398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b696200092e60003960008181610cf001528181610f400152611c0801526000818161119001528181611a790152611ca70152600081816111bc01528181611cc80152611d0d01526000818161122901528181611261015281816112d90152611a550152612b696000f3fe608060405234801561001057600080fd5b5060043610610291576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b8063731f237c1461063857806374bedb951461065657806379ba50971461067457806384dde4af146106925780638d34855a146106b057610291565b806340452d911161020757806358b2833b116101cb57806358b2833b1461052a5780636721d4ef146105485780636787a9be146105785780636a2d094e146105a85780636ffa8a05146105d857806370a082311461060857610291565b806340452d911461043a578063449a52f81461046a57806347a505171461049a5780634abfbba2146104ca57806351b4541c146104fa57610291565b80631989c6a8116102595780631989c6a814610350578063229ba1971461036e57806323b872dd1461038c5780633092afd5146103bc57806331333487146103ec578063313ce5671461041c57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c1461031457806318160ddd14610332575b600080fd5b6102b060048036038101906102ab91906122ab565b61096c565b6040516102bd91906122f3565b60405180910390f35b6102ce610b12565b6040516102db91906123a7565b60405180910390f35b6102fe60048036038101906102f9919061245d565b610ba0565b60405161030b91906122f3565b60405180910390f35b61031c610cba565b60405161032991906124c8565b60405180910390f35b61033a610cdc565b60405161034791906124f2565b60405180910390f35b610358610ce2565b60405161036591906124f2565b60405180910390f35b610376610cee565b60405161038391906124f2565b60405180910390f35b6103a660048036038101906103a1919061250d565b610d12565b6040516103b391906122f3565b60405180910390f35b6103d660048036038101906103d19190612560565b610e32565b6040516103e391906122f3565b60405180910390f35b6104066004803603810190610401919061258d565b610f25565b60405161041391906124f2565b60405180910390f35b610424610fd9565b60405161043191906124f2565b60405180910390f35b610454600480360381019061044f91906125cd565b610fdf565b6040516104619190612613565b60405180910390f35b610484600480360381019061047f919061245d565b611003565b60405161049191906122f3565b60405180910390f35b6104b460048036038101906104af9190612560565b611143565b6040516104c191906124f2565b60405180910390f35b6104e460048036038101906104df91906125cd565b61118c565b6040516104f191906124f2565b60405180910390f35b610514600480360381019061050f91906125cd565b6111ec565b60405161052191906124f2565b60405180910390f35b61053261120d565b60405161053f91906124f2565b60405180910390f35b610562600480360381019061055d919061258d565b611213565b60405161056f91906124f2565b60405180910390f35b610592600480360381019061058d91906125cd565b611294565b60405161059f91906124f2565b60405180910390f35b6105c260048036038101906105bd91906125cd565b611314565b6040516105cf91906124f2565b60405180910390f35b6105f260048036038101906105ed919061265a565b611335565b6040516105ff91906124f2565b60405180910390f35b610622600480360381019061061d9190612560565b61136f565b60405161062f91906124f2565b60405180910390f35b610640611427565b60405161064d91906122f3565b60405180910390f35b61065e611438565b60405161066b91906124f2565b60405180910390f35b61067c61143e565b60405161068991906122f3565b60405180910390f35b61069a6115e5565b6040516106a79190612696565b60405180910390f35b6106ca60048036038101906106c5919061265a565b61160b565b6040516106d791906124f2565b60405180910390f35b6106e8611639565b6040516106f59190612696565b60405180910390f35b61071860048036038101906107139190612560565b61165f565b005b6107226116fd565b60405161072f91906122f3565b60405180910390f35b610740611846565b60405161074d91906123a7565b60405180910390f35b610770600480360381019061076b9190612560565b6118d4565b60405161077d91906122f3565b60405180910390f35b6107a0600480360381019061079b919061265a565b611991565b6040516107ad91906124f2565b60405180910390f35b6107d060048036038101906107cb919061245d565b6119bd565b6040516107dd91906122f3565b60405180910390f35b6107ee611a53565b6040516107fb91906124f2565b60405180910390f35b61080c611a77565b60405161081991906124f2565b60405180910390f35b61083c600480360381019061083791906125cd565b611a9b565b60405161084991906122f3565b60405180910390f35b61085a611bd3565b60405161086791906124f2565b60405180910390f35b61088a6004803603810190610885919061265a565b611bd9565b60405161089791906124f2565b60405180910390f35b6108ba60048036038101906108b5919061258d565b611bed565b6040516108c791906124f2565b60405180910390f35b6108d8611ca1565b6040516108e591906124c8565b60405180910390f35b6108f6611d0b565b60405161090391906124f2565b60405180910390f35b61092660048036038101906109219190612560565b611d2f565b60405161093391906122f3565b60405180910390f35b610956600480360381019061095191906126b1565b611dd1565b6040516109639190612613565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60068054610b1f90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612747565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116fd565b50610bb583611294565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4391906127a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124f2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d1f6116fd565b50610d2984611294565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610db457600080fd5b610dbf868684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e1e91906124f2565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ebb57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ec457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f69919061282c565b905060005b84811015610fb25764e8d4a510008284610f88919061285d565b610f92919061282c565b83610f9d91906128b7565b92508080610faa906128eb565b915050610f6e565b5064e8d4a510008583610fc5919061285d565b610fcf919061282c565b9250505092915050565b60085481565b60008181548110610fef57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061297f565b60405180910390fd5b61109a6116fd565b506110a483611294565b905082600960008282546110b891906127a7565b925050819055506110c98482611e63565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112791906124f2565b60405180910390a3611137611f27565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111ba919061285d565b7f00000000000000000000000000000000000000000000000000000000000000006111e591906127a7565b9050919050565b6000603c82426111fc91906128b7565b611206919061282c565b9050919050565b60035481565b6000806402540be40083611227919061285d565b7f000000000000000000000000000000000000000000000000000000000000000061125291906128b7565b8461125d919061285d565b90507f00000000000000000000000000000000000000000000000000000000000000008161128b919061282c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112c5919061299f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611303919061285d565b61130d919061282c565b9050919050565b6000603c824261132491906128b7565b61132e919061282c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061137e85611143565b925061138b6003546111ec565b90506113d76402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113bf919061299f565b6fffffffffffffffffffffffffffffffff1682610f25565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e4000000611407919061285d565b8284611413919061285d565b61141d919061282c565b9350505050919050565b60006114336000611a9b565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061161984611991565b915061162484611335565b90506116308282611213565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116b957600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611713611427565b5061171c611fc9565b97506000600102880361173a57600098505050505050505050611843565b61174388611bd9565b955060018661175291906127a7565b905061175d8661118c565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179b82611314565b925060008311156117b7576117b08584611bed565b93506117bb565b8493505b6117ca60008560095484611dd1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117fe876120b5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161182e91906124f2565b60405180910390a16001985050505050505050505b90565b6007805461185390612747565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612747565b80156118cc5780601f106118a1576101008083540402835291602001916118cc565b820191906000526020600020905b8154815290600101906020018083116118af57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193057600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119ca6116fd565b506119d484611294565b91506119e1338684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4091906124f2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aab6003546111ec565b915060008203611ac057600092505050611bce565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0257508184105b15611b0b578391505b611b158183610f25565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b5a919061285d565b600354611b6791906127a7565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bbf9190612a24565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c31919061282c565b905060005b84811015611c7a5764e8d4a510008284611c50919061285d565b611c5a919061282c565b83611c6591906127a7565b92508080611c72906128eb565b915050611c36565b5064e8d4a510008583611c8d919061285d565b611c97919061282c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf291906128b7565b611cfc919061282c565b611d0691906127a7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4b8584612147565b50611e568484611e63565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ebf5760009350505050611f21565b611ec886611143565b92508483611ed691906127a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f4591906128b7565b81548110611f5657611f55612a3f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa191906128b7565b81548110611fb257611fb1612a3f565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611fe357611fe2612a3f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190612a9a565b6fffffffffffffffffffffffffffffffff16905061209882611bd9565b81116120ac576000600102925050506120b2565b81925050505b90565b60008060006120c38461160b565b9150600b546120d183611294565b6120db91906128b7565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e63565b506001600a600082825461211d91906127a7565b9250508190555080600b600082825461213691906127a7565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121a35760009350505050612248565b6121ac86611143565b9250848310156121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890612b13565b60405180910390fd5b84836121fd91906128b7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61228881612253565b811461229357600080fd5b50565b6000813590506122a58161227f565b92915050565b6000602082840312156122c1576122c061224e565b5b60006122cf84828501612296565b91505092915050565b60008115159050919050565b6122ed816122d8565b82525050565b600060208201905061230860008301846122e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561234857808201518184015260208101905061232d565b83811115612357576000848401525b50505050565b6000601f19601f8301169050919050565b60006123798261230e565b6123838185612319565b935061239381856020860161232a565b61239c8161235d565b840191505092915050565b600060208201905081810360008301526123c1818461236e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f4826123c9565b9050919050565b612404816123e9565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000819050919050565b61243a81612427565b811461244557600080fd5b50565b60008135905061245781612431565b92915050565b600080604083850312156124745761247361224e565b5b600061248285828601612412565b925050602061249385828601612448565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124c28161249d565b82525050565b60006020820190506124dd60008301846124b9565b92915050565b6124ec81612427565b82525050565b600060208201905061250760008301846124e3565b92915050565b6000806000606084860312156125265761252561224e565b5b600061253486828701612412565b935050602061254586828701612412565b925050604061255686828701612448565b9150509250925092565b6000602082840312156125765761257561224e565b5b600061258484828501612412565b91505092915050565b600080604083850312156125a4576125a361224e565b5b60006125b285828601612448565b92505060206125c385828601612448565b9150509250929050565b6000602082840312156125e3576125e261224e565b5b60006125f184828501612448565b91505092915050565b6000819050919050565b61260d816125fa565b82525050565b60006020820190506126286000830184612604565b92915050565b612637816125fa565b811461264257600080fd5b50565b6000813590506126548161262e565b92915050565b6000602082840312156126705761266f61224e565b5b600061267e84828501612645565b91505092915050565b612690816123e9565b82525050565b60006020820190506126ab6000830184612687565b92915050565b600080600080608085870312156126cb576126ca61224e565b5b60006126d987828801612448565b94505060206126ea87828801612448565b93505060406126fb87828801612448565b925050606061270c87828801612448565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275f57607f821691505b60208210810361277257612771612718565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127b282612427565b91506127bd83612427565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127f2576127f1612778565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283782612427565b915061284283612427565b925082612852576128516127fd565b5b828204905092915050565b600061286882612427565b915061287383612427565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128ac576128ab612778565b5b828202905092915050565b60006128c282612427565b91506128cd83612427565b9250828210156128e0576128df612778565b5b828203905092915050565b60006128f682612427565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361292857612927612778565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612969600a83612319565b915061297482612933565b602082019050919050565b600060208201905081810360008301526129988161295c565b9050919050565b60006129aa8261249d565b91506129b58361249d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129de576129dd612778565b5b828202905092915050565b6000819050919050565b6000612a0e612a09612a048461249d565b6129e9565b612427565b9050919050565b612a1e816129f3565b82525050565b6000602082019050612a396000830184612a15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a778161249d565b8114612a8257600080fd5b50565b600081519050612a9481612a6e565b92915050565b600060208284031215612ab057612aaf61224e565b5b6000612abe84828501612a85565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612afd600d83612319565b9150612b0882612ac7565b602082019050919050565b60006020820190508181036000830152612b2c81612af0565b905091905056fea264697066735822122065b90287fa7f2775639ada07b04e464a1dddb8f8c5f37cf825ec850b55ac7deb64736f6c634300080d0033 \ 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 558cd99..d4ed49d 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":"minimumParticipantSpend","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":[{"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":"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":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"}] diff --git a/python/erc20_demurrage_token/runnable/apply.py b/python/erc20_demurrage_token/runnable/apply.py index 91008fb..270c0f4 100644 --- a/python/erc20_demurrage_token/runnable/apply.py +++ b/python/erc20_demurrage_token/runnable/apply.py @@ -11,6 +11,8 @@ import os import json import argparse import logging +import datetime +import math # external imports import confini @@ -25,10 +27,16 @@ from chainlib.eth.gas import ( RPCGasOracle, OverrideGasOracle, ) +from chainlib.eth.block import ( + block_latest, + block_by_number, + Block, + ) from chainlib.eth.connection import EthHTTPConnection from chainlib.eth.tx import receipt from chainlib.eth.constant import ZERO_ADDRESS import chainlib.eth.cli +from hexathon import to_int as hex_to_int # local imports import erc20_demurrage_token @@ -47,8 +55,11 @@ config_dir = os.path.join(data_dir, 'config') arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +argparser.add_argument('--steps', type=int, default=0, help='Max demurrage steps to apply per round') args = argparser.parse_args() config = chainlib.eth.cli.Config.from_args(args, arg_flags, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) +config.add(args.steps, '_STEPS', False) +logg.debug('config loaded:\n{}'.format(config)) wallet = chainlib.eth.cli.Wallet() wallet.from_config(config) @@ -60,30 +71,73 @@ chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) def main(): - signer = rpc.get_signer() - signer_address = rpc.get_sender_address() + o = block_latest() + r = conn.do(o) + + block_start_number = None + try: + block_start_number = hex_to_int(r) + except TypeError: + block_start_number = int(r) + + o = block_by_number(block_start_number) + r = conn.do(o) + + block_start = Block(r) + block_start_timestamp = block_start.timestamp + block_start_datetime = datetime.datetime.fromtimestamp(block_start_timestamp) gas_oracle = rpc.get_gas_oracle() - nonce_oracle = rpc.get_nonce_oracle() + c = DemurrageToken(chain_spec, gas_oracle=gas_oracle) + o = c.demurrage_timestamp(config.get('_EXEC_ADDRESS')) + r = conn.do(o) - c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) - (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address) - if config.get('_RPC_SEND'): - conn.do(o) - if config.get('_WAIT'): - r = conn.wait(tx_hash_hex) - if r['status'] == 0: - sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') - sys.exit(1) - # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase) - address = r['contractAddress'] + demurrage_timestamp = None + try: + demurrage_timestamp = hex_to_int(r) + except TypeError: + demurrage_timestamp = int(r) + demurrage_datetime = datetime.datetime.fromtimestamp(demurrage_timestamp) - print(address) - else: + total_seconds = block_start_timestamp - demurrage_timestamp + total_steps = total_seconds / 60 + + if total_steps < 1.0: + logg.error('only {} seconds since last demurrage application, skipping'.format(total_seconds)) + return + + logg.debug('block start is at {} demurrage is at {} -> {} minutes'.format( + block_start_datetime, + demurrage_datetime, + total_steps, + )) + + rounds = 1 + if config.get('_STEPS') > 0: + rounds = math.ceil(total_steps / config.get('_STEPS')) + + logg.info('will perform {} rounds of {} steps'.format(rounds, config.get('_STEPS'))) + + last_tx_hash = None + for i in range(rounds): + signer = rpc.get_signer() + signer_address = rpc.get_sender_address() + + nonce_oracle = rpc.get_nonce_oracle() + + c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) + (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address, limit=config.get('_STEPS')) + if config.get('_RPC_SEND'): print(tx_hash_hex) + conn.do(o) + if config.get('_WAIT_ALL') or (i == rounds - 1 and config.get('_WAIT')): + r = conn.wait(tx_hash_hex) + if r['status'] == 0: + sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') + sys.exit(1) + else: + print(o) - else: - print(o) if __name__ == '__main__': diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 4b16df8..e098451 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -38,6 +38,15 @@ class DemurrageTokenSettings: self.sink_address = None + def __str__(self): + return 'name {} demurrage level {} period minutes {} sink address {}'.format( + self.name, + self.demurrage_level, + self.period_minutes, + self.sink_address, + ) + + class DemurrageToken(ERC20): __abi = {} @@ -380,6 +389,10 @@ class DemurrageToken(ERC20): return self.call_noarg('demurrageAmount', contract_address, sender_address=sender_address) + def demurrage_timestamp(self, contract_address, sender_address=ZERO_ADDRESS): + return self.call_noarg('demurrageTimestamp', contract_address, sender_address=sender_address) + + def supply_cap(self, contract_address, sender_address=ZERO_ADDRESS): return self.call_noarg('supplyCap', contract_address, sender_address=sender_address) diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index 39aafe8..c7eda7c 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -32,18 +32,19 @@ PERIOD = 10 class TestTokenDeploy: - def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12): - self.tax_level = TAX_LEVEL - self.period_seconds = PERIOD * 60 + def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12, tax_level=TAX_LEVEL, period=PERIOD): + self.tax_level = tax_level + self.period_seconds = period * 60 self.settings = DemurrageTokenSettings() self.settings.name = token_name self.settings.symbol = token_symbol self.settings.decimals = 6 - self.settings.demurrage_level = TAX_LEVEL * (10 ** 32) - self.settings.period_minutes = PERIOD + self.settings.demurrage_level = tax_level * (10 ** 32) + self.settings.period_minutes = period self.settings.sink_address = sink_address self.sink_address = self.settings.sink_address + logg.debug('using demurrage token settings: {}'.format(self.settings)) o = block_latest() self.start_block = rpc.do(o) @@ -101,7 +102,12 @@ class TestDemurrage(EthTesterCase): # self.start_time = token_deploy.start_time # self.default_supply = self.default_supply # self.default_supply_cap = self.default_supply_cap - self.deployer = TestTokenDeploy(self.rpc) + period = PERIOD + try: + period = getattr(self, 'period') + except AttributeError as e: + pass + self.deployer = TestTokenDeploy(self.rpc, period=period) self.default_supply = self.deployer.default_supply self.default_supply_cap = self.deployer.default_supply_cap self.start_block = None @@ -203,10 +209,11 @@ class TestDemurrageCap(TestDemurrage): class TestDemurrageUnit(TestDemurrage): def setUp(self): - super(TestDemurrage, self).setUp() + self.period = 1 + self.period_seconds = self.period * 60 + self.tax_level = TAX_LEVEL - self.tax_level = 50 - self.period_seconds = 60 + super(TestDemurrageUnit, self).setUp() nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) self.settings = DemurrageTokenSettings() diff --git a/python/requirements.txt b/python/requirements.txt index cea12ee..59502b2 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,3 +1,3 @@ -chainlib-eth~=0.0.27 -eth-erc20~=0.1.10 -funga-eth~=0.5.6 +chainlib-eth>=0.1.0,<0.2.0 +eth-erc20~=0.3.0 +funga-eth~=0.6.0 diff --git a/python/run_tests.sh b/python/run_tests.sh index cc4d28d..4f3e2de 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -17,7 +17,12 @@ done modes=(SingleCap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py -# ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py +done + +modes=(SingleNocap) # other contracts need to be updted +for m in ${modes[@]}; do + ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py + ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py done modes=(MultiCap SingleCap) diff --git a/python/setup.cfg b/python/setup.cfg index 0536298..dd9ec7d 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.0.11 +version = 0.1.1 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no @@ -25,12 +25,13 @@ licence_files = [options] include_package_data = True -python_requires = >= 3.6 +python_requires = >= 3.7 packages = erc20_demurrage_token erc20_demurrage_token.runnable erc20_demurrage_token.data erc20_demurrage_token.sim + erc20_demurrage_token.unittest [options.package_data] * = diff --git a/python/tests/test_redistribution.py b/python/tests/test_redistribution.py index 4bc6d16..7da30cc 100644 --- a/python/tests/test_redistribution.py +++ b/python/tests/test_redistribution.py @@ -31,6 +31,8 @@ testdir = os.path.dirname(__file__) class TestRedistribution(TestDemurrageDefault): + + def test_whole_is_parts(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py new file mode 100644 index 0000000..a980d9b --- /dev/null +++ b/python/tests/test_redistribution_single.py @@ -0,0 +1,185 @@ +# standard imports +import os +import unittest +import json +import logging + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) +from chainlib.eth.address import to_checksum_address +from hexathon import ( + strip_0x, + add_0x, + ) + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from erc20_demurrage_token.unittest.base import TestDemurrageDefault + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + +class TestRedistribution(TestDemurrageDefault): + + + def test_redistribution_periods(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + supply = self.default_supply + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) + self.rpc.do(o) + + for i in range(1, 10): + logg.debug('execute time travel to period {}'.format(i)) + self.backend.time_travel(self.start_time + (self.period_seconds * i)) + (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) + + o = c.redistributions(self.address, i, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) + + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage = c.parse_to_redistribution_item(r) + + o = c.redistributions(self.address, i-1, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) + + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_previous = c.parse_to_redistribution_item(r) + + 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) + + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + + self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + + + def test_redistribution_catchup_periods(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + supply = self.default_supply + + (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)) + + for i in range(1, 11): + logg.debug('checking period {}'.format(i)) + + (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.redistributions(self.address, i, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) + + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage = c.parse_to_redistribution_item(r) + + o = c.redistributions(self.address, i-1, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) + + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_previous = c.parse_to_redistribution_item(r) + + 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) + + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + + self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + + +# def test_redistribution_boundaries(self): +# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) +# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) +# +# demurrage = (1 - (self.tax_level / 1000000)) * (10**28) +# supply = self.default_supply +# +# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) +# self.rpc.do(o) +# +# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# balance = c.parse_balance(r) +# logg.debug('balance before {} supply {}'.format(balance, supply)) +# +# self.backend.time_travel(self.start_time + self.period_seconds) +# (tx_hash, o) = c.change_period(self.address, self.accounts[0]) +# r = self.rpc.do(o) +# +# o = receipt(tx_hash) +# r = self.rpc.do(o) +# self.assertEqual(r['status'], 1) +# +# o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# +# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# balance = c.parse_balance(r) +# +# self.backend.time_travel(self.start_time + self.period_seconds * 2 + 1) +# (tx_hash, o) = c.change_period(self.address, self.accounts[0]) +# r = self.rpc.do(o) +# +# o = receipt(tx_hash) +# r = self.rpc.do(o) +# self.assertEqual(r['status'], 1) +# +# o = c.redistributions(self.address, 2, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# +# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# balance = c.parse_balance(r) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index 8a2694d..fdd2f9c 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -31,12 +31,12 @@ testdir = os.path.dirname(__file__) class TestRedistribution(TestDemurrageUnit): + # TODO: move to "pure" test file when getdistribution is implemented in all contracts - def test_distribution(self): + def test_distribution_direct(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - #demurrage = (1 - (self.tax_level / 1000000)) * (10**38) demurrage = (1 - (self.tax_level / 1000000)) * (10**28) supply = self.default_supply @@ -51,21 +51,23 @@ class TestRedistribution(TestDemurrageUnit): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - #demurrage = (1 - (self.tax_level / 1000000)) * (10**38) - demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + demurrage = (1 - (self.tax_level / 100000)) * (10**28) + + logg.debug('demurrage {}'.format(demurrage)) supply = self.default_supply - o = c.to_redistribution(self.address, 0, demurrage, supply, 1, sender_address=self.accounts[0]) + o = c.to_redistribution(self.address, 0, demurrage, supply, 2, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) o = c.get_distribution_from_redistribution(self.address, redistribution, self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) - expected_distribution = self.default_supply * (self.tax_level / 1000000) + expected_distribution = (self.default_supply * self.tax_level) / 100000 + logg.debug('distribution {} supply {}'.format(distribution, self.default_supply)) self.assert_within_lower(distribution, expected_distribution, 1000) - def test_single_step(self): + def test_single_step_basic(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -81,6 +83,12 @@ class TestRedistribution(TestDemurrageUnit): expected_balance = int(mint_amount - ((self.tax_level / 1000000) * mint_amount)) + o = c.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + logg.debug('balance {}'.format(balance)) + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) @@ -175,9 +183,6 @@ class TestRedistribution(TestDemurrageUnit): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) demurrage = c.parse_to_redistribution_item(r) -# o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# demurrage = c.parse_demurrage_amount(r) logg.debug('\nrediistribution {}\ndemurrage {}\nsupply {}'.format(redistribution, demurrage, supply)) expected_balance = int(supply * (self.tax_level / 1000000)) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 2eea9f0..e4cc11c 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -20,8 +20,6 @@ contract DemurrageTokenSingleCap { // Cached demurrage amount, ppm with 38 digit resolution uint128 public demurrageAmount; - // Cached demurrage period; the period for which demurrageAmount was calculated - //uint128 public demurragePeriod; // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated uint256 public demurrageTimestamp; @@ -42,8 +40,11 @@ contract DemurrageTokenSingleCap { // Implements ERC20 uint256 public totalSupply; - // Minimum amount of (demurraged) tokens an account must spend to participate in redistribution for a particular period - uint256 public minimumParticipantSpend; + // Last executed period + uint256 public lastPeriod; + + // Last sink redistribution amount + uint256 public totalSink; // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) @@ -71,7 +72,7 @@ contract DemurrageTokenSingleCap { mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage) // Address to send unallocated redistribution tokens - address sinkAddress; + address public sinkAddress; // Implements ERC20 event Transfer(address indexed _from, address indexed _to, uint256 _value); @@ -111,17 +112,13 @@ contract DemurrageTokenSingleCap { demurrageTimestamp = block.timestamp; periodStart = demurrageTimestamp; periodDuration = _periodMinutes * 60; - //demurrageAmount = 100000000000000000000000000000000000000 - _taxLevelMinute; // Represents 38 decimal places, same as resolutionFactor - //demurrageAmount = 100000000000000000000000000000000000000; - demurrageAmount = 10000000000000000000000000000; - //demurragePeriod = 1; + demurrageAmount = uint128(nanoDivider) * 100; taxLevel = _taxLevelMinute; // Represents 38 decimal places bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); // Misc settings sinkAddress = _defaultSinkAddress; - minimumParticipantSpend = 10 ** uint256(_decimals); } @@ -153,10 +150,8 @@ contract DemurrageTokenSingleCap { baseBalance = baseBalanceOf(_account); - //periodCount = actualPeriod() - demurragePeriod; periodCount = getMinutesDelta(demurrageTimestamp); - //currentDemurragedAmount = uint128(decayBy(demurrageAmount, periodCount)); currentDemurragedAmount = uint128(decayBy(demurrageAmount * 10000000000, periodCount)); return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); @@ -254,7 +249,6 @@ contract DemurrageTokenSingleCap { uint256 currentRedistribution; uint256 grownSupply; - //grownSupply = growBy(totalSupply, 1); grownSupply = totalSupply; currentRedistribution = uint256(redistributions[redistributions.length-1]); currentRedistribution &= (~maskRedistributionValue); @@ -274,7 +268,7 @@ contract DemurrageTokenSingleCap { bytes32 lastRedistribution; uint256 currentPeriod; - lastRedistribution = redistributions[redistributions.length-1]; + lastRedistribution = redistributions[lastPeriod]; currentPeriod = this.actualPeriod(); if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { return bytes32(0x00); @@ -285,8 +279,7 @@ contract DemurrageTokenSingleCap { function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { uint256 difference; - //difference = _supply * (resolutionFactor - _demurrageAmount); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider)); - difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider)); + difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); return difference / resolutionFactor; } @@ -302,9 +295,13 @@ contract DemurrageTokenSingleCap { // Returns the amount sent to the sink address function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { uint256 unit; + uint256 baseUnit; unit = getDistributionFromRedistribution(_redistribution); - increaseBaseBalance(sinkAddress, toBaseAmount(unit)); + baseUnit = toBaseAmount(unit) - totalSink; + increaseBaseBalance(sinkAddress, baseUnit); + lastPeriod += 1; + totalSink += baseUnit; return unit; } @@ -319,13 +316,9 @@ contract DemurrageTokenSingleCap { } function applyDemurrageLimited(uint256 _rounds) public returns (bool) { - //uint128 epochPeriodCount; uint256 periodCount; uint256 lastDemurrageAmount; - //epochPeriodCount = actualPeriod(); - //periodCount = epochPeriodCount - demurragePeriod; - periodCount = getMinutesDelta(demurrageTimestamp); if (periodCount == 0) { return false; @@ -423,7 +416,6 @@ contract DemurrageTokenSingleCap { // Inflates the given amount according to the current demurrage modifier function toBaseAmount(uint256 _value) public view returns (uint256) { - //return (_value * resolutionFactor) / demurrageAmount; return (_value * resolutionFactor) / (demurrageAmount * 10000000000); } @@ -474,7 +466,6 @@ contract DemurrageTokenSingleCap { decreaseBaseBalance(_from, _value); increaseBaseBalance(_to, _value); - //period = actualPeriod(); return true; }