commit f1a2a78eb435e0024bd7fc1085445bfc80c061b3
parent 1e24ec1352680a3e77ee4a013913de2c71eec5aa
Author: lash <dev@holbrook.no>
Date: Wed, 2 Mar 2022 09:03:40 +0000
Merge branch 'master' into lash/apply-cli
Diffstat:
14 files changed, 223 insertions(+), 19 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -6,3 +6,5 @@ __pycache__
gmon.out
solidity/*.json
solidity/*.bin
+.venv
+venv
+\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
@@ -0,0 +1,36 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Python.gitlab-ci.yml
+
+# Official language image. Look for the different tagged releases at:
+# https://hub.docker.com/r/library/python/tags/
+image: python:3.8
+
+# Change pip's cache directory to be inside the project directory since we can
+# only cache local items.
+variables:
+ PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+
+# Pip's cache doesn't store the python packages
+# https://pip.pypa.io/en/stable/reference/pip_install/#caching
+#
+# If you want to also cache the installed packages, you have to install
+# them in a virtualenv and cache it as well.
+cache:
+ paths:
+ - .cache/pip
+ - venv/
+
+before_script:
+ - cd ./python
+ - python --version # For debugging
+ - pip install virtualenv
+ - virtualenv venv
+ - source venv/bin/activate
+
+test:
+ script:
+ - pip install -r requirements.txt -r test_requirements.txt --extra-index-url https://pip.grassrootseconomics.net
+ - bash run_tests.sh
+
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin
@@ -1 +1 @@
-610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200077f565b6080908152503480156200003757600080fd5b5060405162003c1238038062003c1283398181016040528101906200005d919062000497565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200077f565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200077f565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000642565b600b819055505050505050505050620009da565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b828054620003329062000861565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000620003eb620003e584620005b1565b62000588565b9050828152602081018484840111156200040a57620004096200095f565b5b620004178482856200082b565b509392505050565b60008151905062000430816200098c565b92915050565b600082601f8301126200044e576200044d6200095a565b5b815162000460848260208601620003d4565b91505092915050565b6000815190506200047a81620009a6565b92915050565b6000815190506200049181620009c0565b92915050565b600080600080600080600060e0888a031215620004b957620004b862000969565b5b600088015167ffffffffffffffff811115620004da57620004d962000964565b5b620004e88a828b0162000436565b975050602088015167ffffffffffffffff8111156200050c576200050b62000964565b5b6200051a8a828b0162000436565b96505060406200052d8a828b0162000480565b9550506060620005408a828b0162000469565b9450506080620005538a828b0162000469565b93505060a0620005668a828b016200041f565b92505060c0620005798a828b0162000469565b91505092959891949750929550565b600062000594620005a7565b9050620005a2828262000897565b919050565b6000604051905090565b600067ffffffffffffffff821115620005cf57620005ce6200092b565b5b620005da826200096e565b9050602081019050919050565b6000808291508390505b60018511156200063957808604811115620006115762000610620008cd565b5b6001851615620006215780820291505b808102905062000631856200097f565b9450620005f1565b94509492505050565b60006200064f8262000814565b91506200065c8362000814565b92506200068b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000693565b905092915050565b600082620006a5576001905062000778565b81620006b5576000905062000778565b8160018114620006ce5760028114620006d9576200070f565b600191505062000778565b60ff841115620006ee57620006ed620008cd565b5b8360020a915084821115620007085762000707620008cd565b5b5062000778565b5060208310610133831016604e8410600b8410161715620007495782820a905083811115620007435762000742620008cd565b5b62000778565b620007588484846001620005e7565b92509050818404811115620007725762000771620008cd565b5b81810290505b9392505050565b60006200078c8262000814565b9150620007998362000814565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007d557620007d4620008cd565b5b828202905092915050565b6000620007ed82620007f4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200084b5780820151818401526020810190506200082e565b838111156200085b576000848401525b50505050565b600060028204905060018216806200087a57607f821691505b60208210811415620008915762000890620008fc565b5b50919050565b620008a2826200096e565b810181811067ffffffffffffffff82111715620008c457620008c36200092b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200099781620007e0565b8114620009a357600080fd5b50565b620009b18162000814565b8114620009bd57600080fd5b50565b620009cb816200081e565b8114620009d757600080fd5b50565b60805160a05160c05160e0516131bf62000a5360003960008181610d3501528181610f90015281816110fb01528181611d9a015281816123aa01526123e201526000818161140201528181611d480152611e3501526000818161142e01528181611e560152611e9b01526000611d2401526131bf6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612a57565b61091c565b6040516102a79190612c35565b60405180910390f35b6102b8610ac7565b6040516102c59190612c6b565b60405180910390f35b6102e860048036038101906102e391906129ea565b610b55565b6040516102f59190612c35565b60405180910390f35b610306610c79565b6040516103139190612ced565b60405180910390f35b610324610c9b565b6040516103319190612d23565b60405180910390f35b610342610ca1565b60405161034f9190612d23565b60405180910390f35b610372600480360381019061036d9190612ade565b610cad565b60405161037f9190612d23565b60405180910390f35b610390610d33565b60405161039d9190612d23565b60405180910390f35b6103c060048036038101906103bb9190612997565b610d57565b6040516103cd9190612c35565b60405180910390f35b6103f060048036038101906103eb919061296a565b610e81565b6040516103fd9190612c35565b60405180910390f35b610420600480360381019061041b9190612ade565b610f74565b60405161042d9190612d23565b60405180910390f35b61043e611025565b60405161044b9190612d23565b60405180910390f35b61046e6004803603810190610469919061296a565b61102b565b60405161047b9190612c35565b60405180910390f35b61049e60048036038101906104999190612ab1565b61122b565b6040516104ab9190612c50565b60405180910390f35b6104ce60048036038101906104c99190612a2a565b61124f565b6040516104db9190612d23565b60405180910390f35b6104fe60048036038101906104f991906129ea565b611280565b60405161050b9190612c35565b60405180910390f35b61052e6004803603810190610529919061296a565b6113a6565b60405161053b9190612d23565b60405180910390f35b61055e60048036038101906105599190612ab1565b6113fe565b60405161056b9190612d23565b60405180910390f35b61058e60048036038101906105899190612ab1565b61145e565b60405161059b9190612d23565b60405180910390f35b6105ac61147f565b6040516105b99190612d23565b60405180910390f35b6105ca611485565b6040516105d79190612d23565b60405180910390f35b6105fa60048036038101906105f59190612ab1565b61148b565b6040516106079190612d23565b60405180910390f35b61062a60048036038101906106259190612ab1565b6114f7565b6040516106379190612d23565b60405180910390f35b61065a6004803603810190610655919061296a565b611518565b6040516106679190612d23565b60405180910390f35b61068a60048036038101906106859190612a2a565b611583565b6040516106979190612d23565b60405180910390f35b6106ba60048036038101906106b5919061296a565b6115b6565b6040516106c79190612d23565b60405180910390f35b6106d861165f565b6040516106e59190612c35565b60405180910390f35b6106f6611781565b6040516107039190612c35565b60405180910390f35b610714611928565b6040516107219190612c1a565b60405180910390f35b61073261194e565b60405161073f9190612c35565b60405180910390f35b610750611b05565b60405161075d9190612d23565b60405180910390f35b61076e611b0b565b60405161077b9190612c6b565b60405180910390f35b61079e6004803603810190610799919061296a565b611b99565b6040516107ab9190612c35565b60405180910390f35b6107ce60048036038101906107c99190612a2a565b611c56565b6040516107db9190612d23565b60405180910390f35b6107fe60048036038101906107f991906129ea565b611c82565b60405161080b9190612c35565b60405180910390f35b61081c611d22565b6040516108299190612d23565b60405180910390f35b61083a611d46565b6040516108479190612d23565b60405180910390f35b61086a60048036038101906108659190612a2a565b611d6a565b6040516108779190612d23565b60405180910390f35b61089a60048036038101906108959190612ade565b611d7e565b6040516108a79190612d23565b60405180910390f35b6108b8611e2f565b6040516108c59190612ced565b60405180910390f35b6108d6611e99565b6040516108e39190612d23565b60405180910390f35b6109066004803603810190610901919061296a565b611ebd565b6040516109139190612c35565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109715760019050610ac2565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c45760019050610ac2565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a175760019050610ac2565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a6a5760019050610ac2565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abd5760019050610ac2565b600090505b919050565b60068054610ad490612f4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090612f4e565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b505050505081565b600080610b6061194e565b50610b6a3361102b565b50610b748361148b565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c029190612d5a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c669190612d23565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b600080600080851415610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90612c8d565b60405180910390fd5b838510610d0157600080fd5b8484610d0d9190612db0565b91508482610d1b9190612de1565b90508084610d299190612e3b565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d6461194e565b50610d6e3361102b565b50610d788461148b565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e0357600080fd5b610e0e868684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e6d9190612d23565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f1357600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb99190612db0565b905060005b8481101561100057620f42408284610fd69190612de1565b610fe09190612db0565b83610feb9190612e3b565b92508080610ff890612f80565b915050610fbe565b50620f424085836110119190612de1565b61101b9190612db0565b9250505092915050565b60085481565b60008060008060008060008061104089611518565b9150600082148061106a5750611054611e2f565b6fffffffffffffffffffffffffffffffff168210155b1561107f576000975050505050505050611226565b600060018361108e9190612e3b565b8154811061109f5761109e613056565b5b906000526020600020015496506110b58761124f565b945060008514156110d0576000975050505050505050611226565b6110d987611c56565b95506110e487611583565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006111249190612db0565b86886111309190612db0565b61113a9190612de1565b6111449190612db0565b9350620f424081856111569190612de1565b6111609190612db0565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111ca8984612003565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516112129190612d23565b60405180910390a360019750505050505050505b919050565b6000818154811061123b57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d957600080fd5b600a54600954846112ea9190612d5a565b11156112f557600080fd5b6112fd61194e565b506113078361148b565b9050826009600082825461131b9190612d5a565b9250508190555061132c8482612003565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161138a9190612d23565b60405180910390a361139a61215f565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261142c9190612de1565b7f00000000000000000000000000000000000000000000000000000000000000006114579190612d5a565b9050919050565b6000603c824261146e9190612e3b565b6114789190612db0565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114dc9190612de1565b6114e69190612de1565b6114f09190612db0565b9050919050565b6000603c82426115079190612e3b565b6115119190612db0565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115c5856113a6565b92506115d260035461145e565b905061160e600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f74565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061163f9190612de1565b828461164b9190612de1565b6116559190612db0565b9350505050919050565b60008060008061167060035461145e565b92506000831415611687576000935050505061177e565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116c48284610f74565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117099190612de1565b6003546117169190612d5a565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161176e9190612d08565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117de57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061196761165f565b506119706121fb565b995060006001028a14156119915760009a5050505050505050505050611b02565b61199a8a611d6a565b97506001886119a99190612d5a565b90506119b4886113fe565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119f2826114f7565b92506000831115611a27576d04ee2d6d415b85acef8100000000611a168685611d7e565b611a209190612db0565b9350611a44565b6d04ee2d6d415b85acef810000000085611a419190612db0565b93505b611a5360008560095484612305565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a878a61124f565b96506000871415611aa257611a9b8a612391565b9550611abc565b611aae87600954610cad565b9550611aba8689612538565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611aeb9190612d23565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b1890612f4e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4490612f4e565b8015611b915780601f10611b6657610100808354040283529160200191611b91565b820191906000526020600020905b815481529060010190602001808311611b7457829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bf557600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c8f61194e565b50611c993361102b565b50611ca38461148b565b9150611cb0338684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d0f9190612d23565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dc39190612db0565b905060005b84811015611e0a57620f42408284611de09190612de1565b611dea9190612db0565b83611df59190612d5a565b92508080611e0290612f80565b915050611dc8565b50620f42408583611e1b9190612de1565b611e259190612db0565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e809190612e3b565b611e8a9190612db0565b611e949190612d5a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f6c8584612622565b50611f778484612003565b50611f80611e2f565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fae575080611fab86611518565b14155b8015611fe657508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611ff757611ff58582612753565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156120645760009350505050612159565b61206d866113a6565b9250848361207b9190612d5a565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290612ccd565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121769190612e3b565b8154811061218757612186613056565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121d49190612e3b565b815481106121e5576121e4613056565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122139190612e3b565b8154811061222457612223613056565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561229357600080fd5b505afa1580156122a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cb9190612a84565b6fffffffffffffffffffffffffffffffff1690506122e882611d6a565b81116122fc57600060010292505050612302565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123a286611c56565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123d49190612de1565b6123de9190612db0565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124109190612de1565b61241a9190612db0565b9050838110156124e65761242d86611d6a565b9250710fffffffff000000000000000000000000001960010260006001856124559190612e3b565b8154811061246657612465613056565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124bd9190612e3b565b815481106124ce576124cd613056565b5b90600052602060002001600082825417925050819055505b61252b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125269190612db0565b612003565b5081945050505050919050565b600080600084141561254e57600091505061261c565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125819190612e3b565b8154811061259257612591613056565b5b90600052602060002001600082825417925050819055506125dc60006001856125bb9190612e3b565b815481106125cc576125cb613056565b5b9060005260206000200154611c56565b9050612615600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126109190612e3b565b612003565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612683576000935050505061274d565b61268c866113a6565b9250848310156126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890612cad565b60405180910390fd5b84836126dd9190612e3b565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254179250508190555061282461282f565b506001905092915050565b600080600080600060016000805490506128499190612e3b565b8154811061285a57612859613056565b5b9060005260206000200154925060016128728461124f565b61287c9190612d5a565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128d89190612e3b565b815481106128e9576128e8613056565b5b90600052602060002001819055506001935050505090565b60008135905061291081613116565b92915050565b6000813590506129258161312d565b92915050565b60008135905061293a81613144565b92915050565b60008151905061294f8161315b565b92915050565b60008135905061296481613172565b92915050565b6000602082840312156129805761297f613085565b5b600061298e84828501612901565b91505092915050565b6000806000606084860312156129b0576129af613085565b5b60006129be86828701612901565b93505060206129cf86828701612901565b92505060406129e086828701612955565b9150509250925092565b60008060408385031215612a0157612a00613085565b5b6000612a0f85828601612901565b9250506020612a2085828601612955565b9150509250929050565b600060208284031215612a4057612a3f613085565b5b6000612a4e84828501612916565b91505092915050565b600060208284031215612a6d57612a6c613085565b5b6000612a7b8482850161292b565b91505092915050565b600060208284031215612a9a57612a99613085565b5b6000612aa884828501612940565b91505092915050565b600060208284031215612ac757612ac6613085565b5b6000612ad584828501612955565b91505092915050565b60008060408385031215612af557612af4613085565b5b6000612b0385828601612955565b9250506020612b1485828601612955565b9150509250929050565b612b2781612e6f565b82525050565b612b3681612e81565b82525050565b612b4581612e8d565b82525050565b6000612b5682612d3e565b612b608185612d49565b9350612b70818560208601612f1b565b612b798161308a565b840191505092915050565b6000612b91601183612d49565b9150612b9c8261309b565b602082019050919050565b6000612bb4600d83612d49565b9150612bbf826130c4565b602082019050919050565b6000612bd7600d83612d49565b9150612be2826130ed565b602082019050919050565b612bf681612ec3565b82525050565b612c0581612f09565b82525050565b612c1481612eff565b82525050565b6000602082019050612c2f6000830184612b1e565b92915050565b6000602082019050612c4a6000830184612b2d565b92915050565b6000602082019050612c656000830184612b3c565b92915050565b60006020820190508181036000830152612c858184612b4b565b905092915050565b60006020820190508181036000830152612ca681612b84565b9050919050565b60006020820190508181036000830152612cc681612ba7565b9050919050565b60006020820190508181036000830152612ce681612bca565b9050919050565b6000602082019050612d026000830184612bed565b92915050565b6000602082019050612d1d6000830184612bfc565b92915050565b6000602082019050612d386000830184612c0b565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d6582612eff565b9150612d7083612eff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612da557612da4612fc9565b5b828201905092915050565b6000612dbb82612eff565b9150612dc683612eff565b925082612dd657612dd5612ff8565b5b828204905092915050565b6000612dec82612eff565b9150612df783612eff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e3057612e2f612fc9565b5b828202905092915050565b6000612e4682612eff565b9150612e5183612eff565b925082821015612e6457612e63612fc9565b5b828203905092915050565b6000612e7a82612edf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612f1482612ec3565b9050919050565b60005b83811015612f39578082015181840152602081019050612f1e565b83811115612f48576000848401525b50505050565b60006002820490506001821680612f6657607f821691505b60208210811415612f7a57612f79613027565b5b50919050565b6000612f8b82612eff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fbe57612fbd612fc9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b61311f81612e6f565b811461312a57600080fd5b50565b61313681612e8d565b811461314157600080fd5b50565b61314d81612e97565b811461315857600080fd5b50565b61316481612ec3565b811461316f57600080fd5b50565b61317b81612eff565b811461318657600080fd5b5056fea26469706673582212200c621ad9197340260f2db5065b66bdbf9ec445dac0d063a7c0757ab6805f955364736f6c63430008060033
-\ No newline at end of file
+610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c1d38038062003c1d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009da565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b60208210811415620009d457620009d362000975565b5b50919050565b60805160a05160c05160e0516131ca62000a5360003960008181610d3501528181610f90015281816110fb01528181611d9a0152818161239b01526123d301526000818161140201528181611d480152611e3501526000818161142e01528181611e560152611e9b01526000611d2401526131ca6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a6004803603810190610295919061294f565b61091c565b6040516102a79190612997565b60405180910390f35b6102b8610ac7565b6040516102c59190612a4b565b60405180910390f35b6102e860048036038101906102e39190612b01565b610b55565b6040516102f59190612997565b60405180910390f35b610306610c79565b6040516103139190612b6c565b60405180910390f35b610324610c9b565b6040516103319190612b96565b60405180910390f35b610342610ca1565b60405161034f9190612b96565b60405180910390f35b610372600480360381019061036d9190612bb1565b610cad565b60405161037f9190612b96565b60405180910390f35b610390610d33565b60405161039d9190612b96565b60405180910390f35b6103c060048036038101906103bb9190612bf1565b610d57565b6040516103cd9190612997565b60405180910390f35b6103f060048036038101906103eb9190612c44565b610e81565b6040516103fd9190612997565b60405180910390f35b610420600480360381019061041b9190612bb1565b610f74565b60405161042d9190612b96565b60405180910390f35b61043e611025565b60405161044b9190612b96565b60405180910390f35b61046e60048036038101906104699190612c44565b61102b565b60405161047b9190612997565b60405180910390f35b61049e60048036038101906104999190612c71565b61122b565b6040516104ab9190612cb7565b60405180910390f35b6104ce60048036038101906104c99190612cfe565b61124f565b6040516104db9190612b96565b60405180910390f35b6104fe60048036038101906104f99190612b01565b611280565b60405161050b9190612997565b60405180910390f35b61052e60048036038101906105299190612c44565b6113a6565b60405161053b9190612b96565b60405180910390f35b61055e60048036038101906105599190612c71565b6113fe565b60405161056b9190612b96565b60405180910390f35b61058e60048036038101906105899190612c71565b61145e565b60405161059b9190612b96565b60405180910390f35b6105ac61147f565b6040516105b99190612b96565b60405180910390f35b6105ca611485565b6040516105d79190612b96565b60405180910390f35b6105fa60048036038101906105f59190612c71565b61148b565b6040516106079190612b96565b60405180910390f35b61062a60048036038101906106259190612c71565b6114f7565b6040516106379190612b96565b60405180910390f35b61065a60048036038101906106559190612c44565b611518565b6040516106679190612b96565b60405180910390f35b61068a60048036038101906106859190612cfe565b611583565b6040516106979190612b96565b60405180910390f35b6106ba60048036038101906106b59190612c44565b6115b6565b6040516106c79190612b96565b60405180910390f35b6106d861165f565b6040516106e59190612997565b60405180910390f35b6106f6611781565b6040516107039190612997565b60405180910390f35b610714611928565b6040516107219190612d3a565b60405180910390f35b61073261194e565b60405161073f9190612997565b60405180910390f35b610750611b05565b60405161075d9190612b96565b60405180910390f35b61076e611b0b565b60405161077b9190612a4b565b60405180910390f35b61079e60048036038101906107999190612c44565b611b99565b6040516107ab9190612997565b60405180910390f35b6107ce60048036038101906107c99190612cfe565b611c56565b6040516107db9190612b96565b60405180910390f35b6107fe60048036038101906107f99190612b01565b611c82565b60405161080b9190612997565b60405180910390f35b61081c611d22565b6040516108299190612b96565b60405180910390f35b61083a611d46565b6040516108479190612b96565b60405180910390f35b61086a60048036038101906108659190612cfe565b611d6a565b6040516108779190612b96565b60405180910390f35b61089a60048036038101906108959190612bb1565b611d7e565b6040516108a79190612b96565b60405180910390f35b6108b8611e2f565b6040516108c59190612b6c565b60405180910390f35b6108d6611e99565b6040516108e39190612b96565b60405180910390f35b61090660048036038101906109019190612c44565b611ebd565b6040516109139190612997565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109715760019050610ac2565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c45760019050610ac2565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a175760019050610ac2565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a6a5760019050610ac2565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abd5760019050610ac2565b600090505b919050565b60068054610ad490612d84565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090612d84565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b505050505081565b600080610b6061194e565b50610b6a3361102b565b50610b748361148b565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c029190612de5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c669190612b96565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b600080600080851415610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90612e87565b60405180910390fd5b838510610d0157600080fd5b8484610d0d9190612ed6565b91508482610d1b9190612f07565b90508084610d299190612f61565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d6461194e565b50610d6e3361102b565b50610d788461148b565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e0357600080fd5b610e0e868684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e6d9190612b96565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f1357600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb99190612ed6565b905060005b8481101561100057620f42408284610fd69190612f07565b610fe09190612ed6565b83610feb9190612f61565b92508080610ff890612f95565b915050610fbe565b50620f424085836110119190612f07565b61101b9190612ed6565b9250505092915050565b60085481565b60008060008060008060008061104089611518565b9150600082148061106a5750611054611e2f565b6fffffffffffffffffffffffffffffffff168210155b1561107f576000975050505050505050611226565b600060018361108e9190612f61565b8154811061109f5761109e612fde565b5b906000526020600020015496506110b58761124f565b945060008514156110d0576000975050505050505050611226565b6110d987611c56565b95506110e487611583565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006111249190612ed6565b86886111309190612ed6565b61113a9190612f07565b6111449190612ed6565b9350620f424081856111569190612f07565b6111609190612ed6565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111ca8984612003565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516112129190612b96565b60405180910390a360019750505050505050505b919050565b6000818154811061123b57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d957600080fd5b600a54600954846112ea9190612de5565b11156112f557600080fd5b6112fd61194e565b506113078361148b565b9050826009600082825461131b9190612de5565b9250508190555061132c8482612003565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161138a9190612b96565b60405180910390a361139a61215f565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261142c9190612f07565b7f00000000000000000000000000000000000000000000000000000000000000006114579190612de5565b9050919050565b6000603c824261146e9190612f61565b6114789190612ed6565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114dc9190612f07565b6114e69190612f07565b6114f09190612ed6565b9050919050565b6000603c82426115079190612f61565b6115119190612ed6565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115c5856113a6565b92506115d260035461145e565b905061160e600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f74565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061163f9190612f07565b828461164b9190612f07565b6116559190612ed6565b9350505050919050565b60008060008061167060035461145e565b92506000831415611687576000935050505061177e565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116c48284610f74565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117099190612f07565b6003546117169190612de5565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161176e9190613048565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117de57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061196761165f565b506119706121fb565b995060006001028a14156119915760009a5050505050505050505050611b02565b61199a8a611d6a565b97506001886119a99190612de5565b90506119b4886113fe565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119f2826114f7565b92506000831115611a27576d04ee2d6d415b85acef8100000000611a168685611d7e565b611a209190612ed6565b9350611a44565b6d04ee2d6d415b85acef810000000085611a419190612ed6565b93505b611a53600085600954846122f6565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a878a61124f565b96506000871415611aa257611a9b8a612382565b9550611abc565b611aae87600954610cad565b9550611aba8689612529565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611aeb9190612b96565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b1890612d84565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4490612d84565b8015611b915780601f10611b6657610100808354040283529160200191611b91565b820191906000526020600020905b815481529060010190602001808311611b7457829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bf557600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c8f61194e565b50611c993361102b565b50611ca38461148b565b9150611cb0338684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d0f9190612b96565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dc39190612ed6565b905060005b84811015611e0a57620f42408284611de09190612f07565b611dea9190612ed6565b83611df59190612de5565b92508080611e0290612f95565b915050611dc8565b50620f42408583611e1b9190612f07565b611e259190612ed6565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e809190612f61565b611e8a9190612ed6565b611e949190612de5565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f6c8584612613565b50611f778484612003565b50611f80611e2f565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fae575080611fab86611518565b14155b8015611fe657508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611ff757611ff58582612744565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156120645760009350505050612159565b61206d866113a6565b9250848361207b9190612de5565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906130af565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121769190612f61565b8154811061218757612186612fde565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121d49190612f61565b815481106121e5576121e4612fde565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122139190612f61565b8154811061222457612223612fde565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc91906130fb565b6fffffffffffffffffffffffffffffffff1690506122d982611d6a565b81116122ed576000600102925050506122f3565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061239386611c56565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123c59190612f07565b6123cf9190612ed6565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124019190612f07565b61240b9190612ed6565b9050838110156124d75761241e86611d6a565b9250710fffffffff000000000000000000000000001960010260006001856124469190612f61565b8154811061245757612456612fde565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124ae9190612f61565b815481106124bf576124be612fde565b5b90600052602060002001600082825417925050819055505b61251c600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125179190612ed6565b612003565b5081945050505050919050565b600080600084141561253f57600091505061260d565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125729190612f61565b8154811061258357612582612fde565b5b90600052602060002001600082825417925050819055506125cd60006001856125ac9190612f61565b815481106125bd576125bc612fde565b5b9060005260206000200154611c56565b9050612606600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126019190612f61565b612003565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612674576000935050505061273e565b61267d866113a6565b9250848310156126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b990613174565b60405180910390fd5b84836126ce9190612f61565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612815612820565b506001905092915050565b6000806000806000600160008054905061283a9190612f61565b8154811061284b5761284a612fde565b5b9060005260206000200154925060016128638461124f565b61286d9190612de5565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128c99190612f61565b815481106128da576128d9612fde565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61292c816128f7565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b600060208284031215612965576129646128f2565b5b60006129738482850161293a565b91505092915050565b60008115159050919050565b6129918161297c565b82525050565b60006020820190506129ac6000830184612988565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ec5780820151818401526020810190506129d1565b838111156129fb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a1d826129b2565b612a2781856129bd565b9350612a378185602086016129ce565b612a4081612a01565b840191505092915050565b60006020820190508181036000830152612a658184612a12565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a9882612a6d565b9050919050565b612aa881612a8d565b8114612ab357600080fd5b50565b600081359050612ac581612a9f565b92915050565b6000819050919050565b612ade81612acb565b8114612ae957600080fd5b50565b600081359050612afb81612ad5565b92915050565b60008060408385031215612b1857612b176128f2565b5b6000612b2685828601612ab6565b9250506020612b3785828601612aec565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b6681612b41565b82525050565b6000602082019050612b816000830184612b5d565b92915050565b612b9081612acb565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b60008060408385031215612bc857612bc76128f2565b5b6000612bd685828601612aec565b9250506020612be785828601612aec565b9150509250929050565b600080600060608486031215612c0a57612c096128f2565b5b6000612c1886828701612ab6565b9350506020612c2986828701612ab6565b9250506040612c3a86828701612aec565b9150509250925092565b600060208284031215612c5a57612c596128f2565b5b6000612c6884828501612ab6565b91505092915050565b600060208284031215612c8757612c866128f2565b5b6000612c9584828501612aec565b91505092915050565b6000819050919050565b612cb181612c9e565b82525050565b6000602082019050612ccc6000830184612ca8565b92915050565b612cdb81612c9e565b8114612ce657600080fd5b50565b600081359050612cf881612cd2565b92915050565b600060208284031215612d1457612d136128f2565b5b6000612d2284828501612ce9565b91505092915050565b612d3481612a8d565b82525050565b6000602082019050612d4f6000830184612d2b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d9c57607f821691505b60208210811415612db057612daf612d55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df082612acb565b9150612dfb83612acb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3057612e2f612db6565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e716011836129bd565b9150612e7c82612e3b565b602082019050919050565b60006020820190508181036000830152612ea081612e64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ee182612acb565b9150612eec83612acb565b925082612efc57612efb612ea7565b5b828204905092915050565b6000612f1282612acb565b9150612f1d83612acb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f5657612f55612db6565b5b828202905092915050565b6000612f6c82612acb565b9150612f7783612acb565b925082821015612f8a57612f89612db6565b5b828203905092915050565b6000612fa082612acb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fd357612fd2612db6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061303261302d61302884612b41565b61300d565b612acb565b9050919050565b61304281613017565b82525050565b600060208201905061305d6000830184613039565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b6000613099600d836129bd565b91506130a482613063565b602082019050919050565b600060208201905081810360008301526130c88161308c565b9050919050565b6130d881612b41565b81146130e357600080fd5b50565b6000815190506130f5816130cf565b92915050565b600060208284031215613111576131106128f2565b5b600061311f848285016130e6565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061315e600d836129bd565b915061316982613128565b602082019050919050565b6000602082019050818103600083015261318d81613151565b905091905056fea2646970667358221220ac7aec2600370aea4fd0eaf84b0dd8139ddc68a1233b4eb187bf642dd42b866b64736f6c634300080b0033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin
@@ -1 +1 @@
-610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000791565b6080908152503480156200003757600080fd5b5060405162003c8938038062003c8983398181016040528101906200005d9190620004c0565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000791565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000791565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000654565b60098190555050505050505050620009ec565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b9062000873565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000620004146200040e84620005c3565b6200059a565b90508281526020810184848401111562000433576200043262000971565b5b620004408482856200083d565b509392505050565b60008151905062000459816200099e565b92915050565b600082601f8301126200047757620004766200096c565b5b815162000489848260208601620003fd565b91505092915050565b600081519050620004a381620009b8565b92915050565b600081519050620004ba81620009d2565b92915050565b60008060008060008060c08789031215620004e057620004df6200097b565b5b600087015167ffffffffffffffff81111562000501576200050062000976565b5b6200050f89828a016200045f565b965050602087015167ffffffffffffffff81111562000533576200053262000976565b5b6200054189828a016200045f565b95505060406200055489828a01620004a9565b94505060606200056789828a0162000492565b93505060806200057a89828a0162000492565b92505060a06200058d89828a0162000448565b9150509295509295509295565b6000620005a6620005b9565b9050620005b48282620008a9565b919050565b6000604051905090565b600067ffffffffffffffff821115620005e157620005e06200093d565b5b620005ec8262000980565b9050602081019050919050565b6000808291508390505b60018511156200064b57808604811115620006235762000622620008df565b5b6001851615620006335780820291505b8081029050620006438562000991565b945062000603565b94509492505050565b6000620006618262000826565b91506200066e8362000826565b92506200069d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620006a5565b905092915050565b600082620006b757600190506200078a565b81620006c757600090506200078a565b8160018114620006e05760028114620006eb5762000721565b60019150506200078a565b60ff8411156200070057620006ff620008df565b5b8360020a9150848211156200071a5762000719620008df565b5b506200078a565b5060208310610133831016604e8410600b84101617156200075b5782820a905083811115620007555762000754620008df565b5b6200078a565b6200076a8484846001620005f9565b92509050818404811115620007845762000783620008df565b5b81810290505b9392505050565b60006200079e8262000826565b9150620007ab8362000826565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007e757620007e6620008df565b5b828202905092915050565b6000620007ff8262000806565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200085d57808201518184015260208101905062000840565b838111156200086d576000848401525b50505050565b600060028204905060018216806200088c57607f821691505b60208210811415620008a357620008a26200090e565b5b50919050565b620008b48262000980565b810181811067ffffffffffffffff82111715620008d657620008d56200093d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6000600282049050919050565b620009a981620007f2565b8114620009b557600080fd5b50565b620009c38162000826565b8114620009cf57600080fd5b50565b620009dd8162000830565b8114620009e957600080fd5b50565b60805160a05160c05160e05161322462000a6560003960008181610cd101528181610f2c0152818161109701528181611dcb015281816123db015261241301526000818161137a01528181611d790152611e660152600081816113a601528181611e870152611ecc01526000611d5501526132246000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612a88565b6108b8565b6040516102919190612c66565b60405180910390f35b6102a2610a63565b6040516102af9190612c9c565b60405180910390f35b6102d260048036038101906102cd9190612a1b565b610af1565b6040516102df9190612c66565b60405180910390f35b6102f0610c15565b6040516102fd9190612d1e565b60405180910390f35b61030e610c37565b60405161031b9190612d54565b60405180910390f35b61032c610c3d565b6040516103399190612d54565b60405180910390f35b61035c60048036038101906103579190612b0f565b610c49565b6040516103699190612d54565b60405180910390f35b61037a610ccf565b6040516103879190612d54565b60405180910390f35b6103aa60048036038101906103a591906129c8565b610cf3565b6040516103b79190612c66565b60405180910390f35b6103da60048036038101906103d5919061299b565b610e1d565b6040516103e79190612c66565b60405180910390f35b61040a60048036038101906104059190612b0f565b610f10565b6040516104179190612d54565b60405180910390f35b610428610fc1565b6040516104359190612d54565b60405180910390f35b6104586004803603810190610453919061299b565b610fc7565b6040516104659190612c66565b60405180910390f35b61048860048036038101906104839190612ae2565b6111c7565b6040516104959190612c81565b60405180910390f35b6104b860048036038101906104b39190612a5b565b6111eb565b6040516104c59190612d54565b60405180910390f35b6104e860048036038101906104e39190612a1b565b61121c565b6040516104f59190612c66565b60405180910390f35b6105186004803603810190610513919061299b565b61131e565b6040516105259190612d54565b60405180910390f35b61054860048036038101906105439190612ae2565b611376565b6040516105559190612d54565b60405180910390f35b6105666113d6565b6040516105739190612d54565b60405180910390f35b61059660048036038101906105919190612ae2565b6113dc565b6040516105a39190612d54565b60405180910390f35b6105c660048036038101906105c19190612ae2565b611448565b6040516105d39190612d54565b60405180910390f35b6105f660048036038101906105f1919061299b565b611469565b6040516106039190612d54565b60405180910390f35b61062660048036038101906106219190612a5b565b6114d4565b6040516106339190612d54565b60405180910390f35b6106566004803603810190610651919061299b565b611507565b6040516106639190612d54565b60405180910390f35b6106746115e8565b6040516106819190612c66565b60405180910390f35b610692611796565b60405161069f9190612c66565b60405180910390f35b6106b061193d565b6040516106bd9190612c4b565b60405180910390f35b6106ce611963565b6040516106db9190612c66565b60405180910390f35b6106ec611b1a565b6040516106f99190612c9c565b60405180910390f35b61071c6004803603810190610717919061299b565b611ba8565b6040516107299190612c66565b60405180910390f35b61074c60048036038101906107479190612a5b565b611c65565b6040516107599190612d54565b60405180910390f35b61076a611c91565b6040516107779190612d1e565b60405180910390f35b61079a60048036038101906107959190612a1b565b611cb3565b6040516107a79190612c66565b60405180910390f35b6107b8611d53565b6040516107c59190612d54565b60405180910390f35b6107d6611d77565b6040516107e39190612d54565b60405180910390f35b61080660048036038101906108019190612a5b565b611d9b565b6040516108139190612d54565b60405180910390f35b61083660048036038101906108319190612b0f565b611daf565b6040516108439190612d54565b60405180910390f35b610854611e60565b6040516108619190612d1e565b60405180910390f35b610872611eca565b60405161087f9190612d54565b60405180910390f35b6108a2600480360381019061089d919061299b565b611eee565b6040516108af9190612c66565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60058054610a7090612fb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612fb3565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc611963565b50610b0633610fc7565b50610b10836113dc565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b9e9190612d8b565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c029190612d54565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890612cbe565b60405180910390fd5b838510610c9d57600080fd5b8484610ca99190612de1565b91508482610cb79190612e12565b90508084610cc59190612ea0565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d00611963565b50610d0a33610fc7565b50610d14846113dc565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9f57600080fd5b610daa868684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e099190612d54565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610eaf57600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f559190612de1565b905060005b84811015610f9c57620f42408284610f729190612e12565b610f7c9190612de1565b83610f879190612ea0565b92508080610f9490612fe5565b915050610f5a565b50620f42408583610fad9190612e12565b610fb79190612de1565b9250505092915050565b60075481565b600080600080600080600080610fdc89611469565b915060008214806110065750610ff0611e60565b6fffffffffffffffffffffffffffffffff168210155b1561101b5760009750505050505050506111c2565b600060018361102a9190612ea0565b8154811061103b5761103a6130bb565b5b90600052602060002001549650611051876111eb565b9450600085141561106c5760009750505050505050506111c2565b61107587611c65565b9550611080876114d4565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110c09190612de1565b86886110cc9190612de1565b6110d69190612e12565b6110e09190612de1565b9350620f424081856110f29190612e12565b6110fc9190612de1565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111668984612034565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111ae9190612d54565b60405180910390a360019750505050505050505b919050565b600081815481106111d757600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661127557600080fd5b61127d611963565b5082905082600860008282546112939190612d8b565b925050819055506112a48482612034565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113029190612d54565b60405180910390a3611312612190565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826113a49190612e12565b7f00000000000000000000000000000000000000000000000000000000000000006113cf9190612d8b565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461142d9190612e12565b6114379190612e12565b6114419190612de1565b9050919050565b6000603c82426114589190612ea0565b6114629190612de1565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115168561131e565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff1661153f611e60565b6115499190612e6c565b6fffffffffffffffffffffffffffffffff169050611597600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f10565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c89190612e12565b82846115d49190612e12565b6115de9190612de1565b9350505050919050565b60008060008060006115f8611e60565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846116249190612e6c565b92506000836fffffffffffffffffffffffffffffffff16141561164e576000945050505050611793565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169d82846fffffffffffffffffffffffffffffffff16610f10565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117829190612d39565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117f357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061197c61222c565b995060006001028a141561199d5760009a5050505050505050505050611b17565b6119a68a611d9b565b97506001886119b59190612d8b565b90506119c088611376565b91506119ca6115e8565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611a0782611448565b92506000831115611a3c576d04ee2d6d415b85acef8100000000611a2b8685611daf565b611a359190612de1565b9350611a59565b6d04ee2d6d415b85acef810000000085611a569190612de1565b93505b611a6860008560085484612336565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a9c8a6111eb565b96506000871415611ab757611ab08a6123c2565b9550611ad1565b611ac387600854610c49565b9550611acf8689612569565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611b009190612d54565b60405180910390a160019a50505050505050505050505b90565b60068054611b2790612fb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5390612fb3565b8015611ba05780601f10611b7557610100808354040283529160200191611ba0565b820191906000526020600020905b815481529060010190602001808311611b8357829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c0457600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cc0611963565b50611cca33610fc7565b50611cd4846113dc565b9150611ce1338684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d409190612d54565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611df49190612de1565b905060005b84811015611e3b57620f42408284611e119190612e12565b611e1b9190612de1565b83611e269190612d8b565b92508080611e3390612fe5565b915050611df9565b50620f42408583611e4c9190612e12565b611e569190612de1565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611eb19190612ea0565b611ebb9190612de1565b611ec59190612d8b565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4a57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f9d8584612653565b50611fa88484612034565b50611fb1611e60565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fdf575080611fdc86611469565b14155b801561201757508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612028576120268582612784565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612095576000935050505061218a565b61209e8661131e565b925084836120ac9190612d8b565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161161211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211390612cfe565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121a79190612ea0565b815481106121b8576121b76130bb565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506122059190612ea0565b81548110612216576122156130bb565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122449190612ea0565b81548110612255576122546130bb565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156122c457600080fd5b505afa1580156122d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fc9190612ab5565b6fffffffffffffffffffffffffffffffff16905061231982611d9b565b811161232d57600060010292505050612333565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123d386611c65565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856124059190612e12565b61240f9190612de1565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124419190612e12565b61244b9190612de1565b9050838110156125175761245e86611d9b565b9250710fffffffff000000000000000000000000001960010260006001856124869190612ea0565b81548110612497576124966130bb565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124ee9190612ea0565b815481106124ff576124fe6130bb565b5b90600052602060002001600082825417925050819055505b61255c600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125579190612de1565b612034565b5081945050505050919050565b600080600084141561257f57600091505061264d565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125b29190612ea0565b815481106125c3576125c26130bb565b5b906000526020600020016000828254179250508190555061260d60006001856125ec9190612ea0565b815481106125fd576125fc6130bb565b5b9060005260206000200154611c65565b9050612646600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126419190612ea0565b612034565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156126b4576000935050505061277e565b6126bd8661131e565b925084831015612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f990612cde565b60405180910390fd5b848361270e9190612ea0565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612855612860565b506001905092915050565b6000806000806000600160008054905061287a9190612ea0565b8154811061288b5761288a6130bb565b5b9060005260206000200154925060016128a3846111eb565b6128ad9190612d8b565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506129099190612ea0565b8154811061291a576129196130bb565b5b90600052602060002001819055506001935050505090565b6000813590506129418161317b565b92915050565b60008135905061295681613192565b92915050565b60008135905061296b816131a9565b92915050565b600081519050612980816131c0565b92915050565b600081359050612995816131d7565b92915050565b6000602082840312156129b1576129b06130ea565b5b60006129bf84828501612932565b91505092915050565b6000806000606084860312156129e1576129e06130ea565b5b60006129ef86828701612932565b9350506020612a0086828701612932565b9250506040612a1186828701612986565b9150509250925092565b60008060408385031215612a3257612a316130ea565b5b6000612a4085828601612932565b9250506020612a5185828601612986565b9150509250929050565b600060208284031215612a7157612a706130ea565b5b6000612a7f84828501612947565b91505092915050565b600060208284031215612a9e57612a9d6130ea565b5b6000612aac8482850161295c565b91505092915050565b600060208284031215612acb57612aca6130ea565b5b6000612ad984828501612971565b91505092915050565b600060208284031215612af857612af76130ea565b5b6000612b0684828501612986565b91505092915050565b60008060408385031215612b2657612b256130ea565b5b6000612b3485828601612986565b9250506020612b4585828601612986565b9150509250929050565b612b5881612ed4565b82525050565b612b6781612ee6565b82525050565b612b7681612ef2565b82525050565b6000612b8782612d6f565b612b918185612d7a565b9350612ba1818560208601612f80565b612baa816130ef565b840191505092915050565b6000612bc2601183612d7a565b9150612bcd82613100565b602082019050919050565b6000612be5600d83612d7a565b9150612bf082613129565b602082019050919050565b6000612c08600d83612d7a565b9150612c1382613152565b602082019050919050565b612c2781612f28565b82525050565b612c3681612f6e565b82525050565b612c4581612f64565b82525050565b6000602082019050612c606000830184612b4f565b92915050565b6000602082019050612c7b6000830184612b5e565b92915050565b6000602082019050612c966000830184612b6d565b92915050565b60006020820190508181036000830152612cb68184612b7c565b905092915050565b60006020820190508181036000830152612cd781612bb5565b9050919050565b60006020820190508181036000830152612cf781612bd8565b9050919050565b60006020820190508181036000830152612d1781612bfb565b9050919050565b6000602082019050612d336000830184612c1e565b92915050565b6000602082019050612d4e6000830184612c2d565b92915050565b6000602082019050612d696000830184612c3c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9682612f64565b9150612da183612f64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dd657612dd561302e565b5b828201905092915050565b6000612dec82612f64565b9150612df783612f64565b925082612e0757612e0661305d565b5b828204905092915050565b6000612e1d82612f64565b9150612e2883612f64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e6157612e6061302e565b5b828202905092915050565b6000612e7782612f28565b9150612e8283612f28565b925082821015612e9557612e9461302e565b5b828203905092915050565b6000612eab82612f64565b9150612eb683612f64565b925082821015612ec957612ec861302e565b5b828203905092915050565b6000612edf82612f44565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612f7982612f28565b9050919050565b60005b83811015612f9e578082015181840152602081019050612f83565b83811115612fad576000848401525b50505050565b60006002820490506001821680612fcb57607f821691505b60208210811415612fdf57612fde61308c565b5b50919050565b6000612ff082612f64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130235761302261302e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b61318481612ed4565b811461318f57600080fd5b50565b61319b81612ef2565b81146131a657600080fd5b50565b6131b281612efc565b81146131bd57600080fd5b50565b6131c981612f28565b81146131d457600080fd5b50565b6131e081612f64565b81146131eb57600080fd5b5056fea264697066735822122080827cc6f04c69ccdcb44890f252e04ca327e092e253bb91e0be8303b52daf7564736f6c63430008060033
-\ No newline at end of file
+610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c9438038062003c9483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009ec565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b60208210811415620009e657620009e562000987565b5b50919050565b60805160a05160c05160e05161322f62000a6560003960008181610cd101528181610f2c0152818161109701528181611dcb015281816123cc015261240401526000818161137a01528181611d790152611e660152600081816113a601528181611e870152611ecc01526000611d55015261322f6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612980565b6108b8565b60405161029191906129c8565b60405180910390f35b6102a2610a63565b6040516102af9190612a7c565b60405180910390f35b6102d260048036038101906102cd9190612b32565b610af1565b6040516102df91906129c8565b60405180910390f35b6102f0610c15565b6040516102fd9190612b9d565b60405180910390f35b61030e610c37565b60405161031b9190612bc7565b60405180910390f35b61032c610c3d565b6040516103399190612bc7565b60405180910390f35b61035c60048036038101906103579190612be2565b610c49565b6040516103699190612bc7565b60405180910390f35b61037a610ccf565b6040516103879190612bc7565b60405180910390f35b6103aa60048036038101906103a59190612c22565b610cf3565b6040516103b791906129c8565b60405180910390f35b6103da60048036038101906103d59190612c75565b610e1d565b6040516103e791906129c8565b60405180910390f35b61040a60048036038101906104059190612be2565b610f10565b6040516104179190612bc7565b60405180910390f35b610428610fc1565b6040516104359190612bc7565b60405180910390f35b61045860048036038101906104539190612c75565b610fc7565b60405161046591906129c8565b60405180910390f35b61048860048036038101906104839190612ca2565b6111c7565b6040516104959190612ce8565b60405180910390f35b6104b860048036038101906104b39190612d2f565b6111eb565b6040516104c59190612bc7565b60405180910390f35b6104e860048036038101906104e39190612b32565b61121c565b6040516104f591906129c8565b60405180910390f35b61051860048036038101906105139190612c75565b61131e565b6040516105259190612bc7565b60405180910390f35b61054860048036038101906105439190612ca2565b611376565b6040516105559190612bc7565b60405180910390f35b6105666113d6565b6040516105739190612bc7565b60405180910390f35b61059660048036038101906105919190612ca2565b6113dc565b6040516105a39190612bc7565b60405180910390f35b6105c660048036038101906105c19190612ca2565b611448565b6040516105d39190612bc7565b60405180910390f35b6105f660048036038101906105f19190612c75565b611469565b6040516106039190612bc7565b60405180910390f35b61062660048036038101906106219190612d2f565b6114d4565b6040516106339190612bc7565b60405180910390f35b61065660048036038101906106519190612c75565b611507565b6040516106639190612bc7565b60405180910390f35b6106746115e8565b60405161068191906129c8565b60405180910390f35b610692611796565b60405161069f91906129c8565b60405180910390f35b6106b061193d565b6040516106bd9190612d6b565b60405180910390f35b6106ce611963565b6040516106db91906129c8565b60405180910390f35b6106ec611b1a565b6040516106f99190612a7c565b60405180910390f35b61071c60048036038101906107179190612c75565b611ba8565b60405161072991906129c8565b60405180910390f35b61074c60048036038101906107479190612d2f565b611c65565b6040516107599190612bc7565b60405180910390f35b61076a611c91565b6040516107779190612b9d565b60405180910390f35b61079a60048036038101906107959190612b32565b611cb3565b6040516107a791906129c8565b60405180910390f35b6107b8611d53565b6040516107c59190612bc7565b60405180910390f35b6107d6611d77565b6040516107e39190612bc7565b60405180910390f35b61080660048036038101906108019190612d2f565b611d9b565b6040516108139190612bc7565b60405180910390f35b61083660048036038101906108319190612be2565b611daf565b6040516108439190612bc7565b60405180910390f35b610854611e60565b6040516108619190612b9d565b60405180910390f35b610872611eca565b60405161087f9190612bc7565b60405180910390f35b6108a2600480360381019061089d9190612c75565b611eee565b6040516108af91906129c8565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60058054610a7090612db5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612db5565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc611963565b50610b0633610fc7565b50610b10836113dc565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b9e9190612e16565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c029190612bc7565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890612eb8565b60405180910390fd5b838510610c9d57600080fd5b8484610ca99190612f07565b91508482610cb79190612f38565b90508084610cc59190612f92565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d00611963565b50610d0a33610fc7565b50610d14846113dc565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9f57600080fd5b610daa868684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e099190612bc7565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610eaf57600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f559190612f07565b905060005b84811015610f9c57620f42408284610f729190612f38565b610f7c9190612f07565b83610f879190612f92565b92508080610f9490612fc6565b915050610f5a565b50620f42408583610fad9190612f38565b610fb79190612f07565b9250505092915050565b60075481565b600080600080600080600080610fdc89611469565b915060008214806110065750610ff0611e60565b6fffffffffffffffffffffffffffffffff168210155b1561101b5760009750505050505050506111c2565b600060018361102a9190612f92565b8154811061103b5761103a61300f565b5b90600052602060002001549650611051876111eb565b9450600085141561106c5760009750505050505050506111c2565b61107587611c65565b9550611080876114d4565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110c09190612f07565b86886110cc9190612f07565b6110d69190612f38565b6110e09190612f07565b9350620f424081856110f29190612f38565b6110fc9190612f07565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111668984612034565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111ae9190612bc7565b60405180910390a360019750505050505050505b919050565b600081815481106111d757600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661127557600080fd5b61127d611963565b5082905082600860008282546112939190612e16565b925050819055506112a48482612034565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113029190612bc7565b60405180910390a3611312612190565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826113a49190612f38565b7f00000000000000000000000000000000000000000000000000000000000000006113cf9190612e16565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461142d9190612f38565b6114379190612f38565b6114419190612f07565b9050919050565b6000603c82426114589190612f92565b6114629190612f07565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115168561131e565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff1661153f611e60565b611549919061303e565b6fffffffffffffffffffffffffffffffff169050611597600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f10565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c89190612f38565b82846115d49190612f38565b6115de9190612f07565b9350505050919050565b60008060008060006115f8611e60565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff1684611624919061303e565b92506000836fffffffffffffffffffffffffffffffff16141561164e576000945050505050611793565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169d82846fffffffffffffffffffffffffffffffff16610f10565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161178291906130ad565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117f357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061197c61222c565b995060006001028a141561199d5760009a5050505050505050505050611b17565b6119a68a611d9b565b97506001886119b59190612e16565b90506119c088611376565b91506119ca6115e8565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611a0782611448565b92506000831115611a3c576d04ee2d6d415b85acef8100000000611a2b8685611daf565b611a359190612f07565b9350611a59565b6d04ee2d6d415b85acef810000000085611a569190612f07565b93505b611a6860008560085484612327565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a9c8a6111eb565b96506000871415611ab757611ab08a6123b3565b9550611ad1565b611ac387600854610c49565b9550611acf868961255a565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611b009190612bc7565b60405180910390a160019a50505050505050505050505b90565b60068054611b2790612db5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5390612db5565b8015611ba05780601f10611b7557610100808354040283529160200191611ba0565b820191906000526020600020905b815481529060010190602001808311611b8357829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c0457600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cc0611963565b50611cca33610fc7565b50611cd4846113dc565b9150611ce1338684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d409190612bc7565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611df49190612f07565b905060005b84811015611e3b57620f42408284611e119190612f38565b611e1b9190612f07565b83611e269190612e16565b92508080611e3390612fc6565b915050611df9565b50620f42408583611e4c9190612f38565b611e569190612f07565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611eb19190612f92565b611ebb9190612f07565b611ec59190612e16565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4a57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f9d8584612644565b50611fa88484612034565b50611fb1611e60565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fdf575080611fdc86611469565b14155b801561201757508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612028576120268582612775565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612095576000935050505061218a565b61209e8661131e565b925084836120ac9190612e16565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161161211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211390613114565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121a79190612f92565b815481106121b8576121b761300f565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506122059190612f92565b815481106122165761221561300f565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122449190612f92565b815481106122555761225461300f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ed9190613160565b6fffffffffffffffffffffffffffffffff16905061230a82611d9b565b811161231e57600060010292505050612324565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123c486611c65565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123f69190612f38565b6124009190612f07565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124329190612f38565b61243c9190612f07565b9050838110156125085761244f86611d9b565b9250710fffffffff000000000000000000000000001960010260006001856124779190612f92565b815481106124885761248761300f565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124df9190612f92565b815481106124f0576124ef61300f565b5b90600052602060002001600082825417925050819055505b61254d600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125489190612f07565b612034565b5081945050505050919050565b600080600084141561257057600091505061263e565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125a39190612f92565b815481106125b4576125b361300f565b5b90600052602060002001600082825417925050819055506125fe60006001856125dd9190612f92565b815481106125ee576125ed61300f565b5b9060005260206000200154611c65565b9050612637600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126329190612f92565b612034565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156126a5576000935050505061276f565b6126ae8661131e565b9250848310156126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea906131d9565b60405180910390fd5b84836126ff9190612f92565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612846612851565b506001905092915050565b6000806000806000600160008054905061286b9190612f92565b8154811061287c5761287b61300f565b5b906000526020600020015492506001612894846111eb565b61289e9190612e16565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128fa9190612f92565b8154811061290b5761290a61300f565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61295d81612928565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b60006020828403121561299657612995612923565b5b60006129a48482850161296b565b91505092915050565b60008115159050919050565b6129c2816129ad565b82525050565b60006020820190506129dd60008301846129b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a4e826129e3565b612a5881856129ee565b9350612a688185602086016129ff565b612a7181612a32565b840191505092915050565b60006020820190508181036000830152612a968184612a43565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ac982612a9e565b9050919050565b612ad981612abe565b8114612ae457600080fd5b50565b600081359050612af681612ad0565b92915050565b6000819050919050565b612b0f81612afc565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060408385031215612b4957612b48612923565b5b6000612b5785828601612ae7565b9250506020612b6885828601612b1d565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b9781612b72565b82525050565b6000602082019050612bb26000830184612b8e565b92915050565b612bc181612afc565b82525050565b6000602082019050612bdc6000830184612bb8565b92915050565b60008060408385031215612bf957612bf8612923565b5b6000612c0785828601612b1d565b9250506020612c1885828601612b1d565b9150509250929050565b600080600060608486031215612c3b57612c3a612923565b5b6000612c4986828701612ae7565b9350506020612c5a86828701612ae7565b9250506040612c6b86828701612b1d565b9150509250925092565b600060208284031215612c8b57612c8a612923565b5b6000612c9984828501612ae7565b91505092915050565b600060208284031215612cb857612cb7612923565b5b6000612cc684828501612b1d565b91505092915050565b6000819050919050565b612ce281612ccf565b82525050565b6000602082019050612cfd6000830184612cd9565b92915050565b612d0c81612ccf565b8114612d1757600080fd5b50565b600081359050612d2981612d03565b92915050565b600060208284031215612d4557612d44612923565b5b6000612d5384828501612d1a565b91505092915050565b612d6581612abe565b82525050565b6000602082019050612d806000830184612d5c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dcd57607f821691505b60208210811415612de157612de0612d86565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e2182612afc565b9150612e2c83612afc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e6157612e60612de7565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612ea26011836129ee565b9150612ead82612e6c565b602082019050919050565b60006020820190508181036000830152612ed181612e95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f1282612afc565b9150612f1d83612afc565b925082612f2d57612f2c612ed8565b5b828204905092915050565b6000612f4382612afc565b9150612f4e83612afc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f8757612f86612de7565b5b828202905092915050565b6000612f9d82612afc565b9150612fa883612afc565b925082821015612fbb57612fba612de7565b5b828203905092915050565b6000612fd182612afc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300457613003612de7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061304982612b72565b915061305483612b72565b92508282101561306757613066612de7565b5b828203905092915050565b6000819050919050565b600061309761309261308d84612b72565b613072565b612afc565b9050919050565b6130a78161307c565b82525050565b60006020820190506130c2600083018461309e565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130fe600d836129ee565b9150613109826130c8565b602082019050919050565b6000602082019050818103600083015261312d816130f1565b9050919050565b61313d81612b72565b811461314857600080fd5b50565b60008151905061315a81613134565b92915050565b60006020828403121561317657613175612923565b5b60006131848482850161314b565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131c3600d836129ee565b91506131ce8261318d565b602082019050919050565b600060208201905081810360008301526131f2816131b6565b905091905056fea2646970667358221220f9f5ec32eaff12f6c840b25f6687670a3f4334b19d564468870872734c2e758664736f6c634300080b0033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin
@@ -1 +1 @@
-61010060405264e8d4a510006a52b7d2dcc80cd2e4000000620000239190620007a3565b6080908152503480156200003657600080fd5b50604051620035233803806200352383398181016040528101906200005c9190620004bb565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c83620001739190620007a3565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b0919062000666565b600b81905550505050505050505062000a34565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620008a1565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000620003f8620003f284620005d5565b620005ac565b9050828152602081018484840111156200041757620004166200099f565b5b620004248482856200086b565b509392505050565b6000815190506200043d81620009cc565b92915050565b600082601f8301126200045b576200045a6200099a565b5b81516200046d848260208601620003e1565b91505092915050565b6000815190506200048781620009e6565b92915050565b6000815190506200049e8162000a00565b92915050565b600081519050620004b58162000a1a565b92915050565b600080600080600080600060e0888a031215620004dd57620004dc620009a9565b5b600088015167ffffffffffffffff811115620004fe57620004fd620009a4565b5b6200050c8a828b0162000443565b975050602088015167ffffffffffffffff81111562000530576200052f620009a4565b5b6200053e8a828b0162000443565b9650506040620005518a828b01620004a4565b9550506060620005648a828b0162000476565b9450506080620005778a828b016200048d565b93505060a06200058a8a828b016200042c565b92505060c06200059d8a828b016200048d565b91505092959891949750929550565b6000620005b8620005cb565b9050620005c68282620008d7565b919050565b6000604051905090565b600067ffffffffffffffff821115620005f357620005f26200096b565b5b620005fe82620009ae565b9050602081019050919050565b6000808291508390505b60018511156200065d578086048111156200063557620006346200090d565b5b6001851615620006455780820291505b80810290506200065585620009bf565b945062000615565b94509492505050565b6000620006738262000854565b9150620006808362000854565b9250620006af7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620006b7565b905092915050565b600082620006c957600190506200079c565b81620006d957600090506200079c565b8160018114620006f25760028114620006fd5762000733565b60019150506200079c565b60ff8411156200071257620007116200090d565b5b8360020a9150848211156200072c576200072b6200090d565b5b506200079c565b5060208310610133831016604e8410600b84101617156200076d5782820a9050838111156200076757620007666200090d565b5b6200079c565b6200077c84848460016200060b565b925090508184048111156200079657620007956200090d565b5b81810290505b9392505050565b6000620007b08262000854565b9150620007bd8362000854565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007f957620007f86200090d565b5b828202905092915050565b6000620008118262000834565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200088b5780820151818401526020810190506200086e565b838111156200089b576000848401525b50505050565b60006002820490506001821680620008ba57607f821691505b60208210811415620008d157620008d06200093c565b5b50919050565b620008e282620009ae565b810181811067ffffffffffffffff821117156200090457620009036200096b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6000600282049050919050565b620009d78162000804565b8114620009e357600080fd5b50565b620009f18162000818565b8114620009fd57600080fd5b50565b62000a0b8162000854565b811462000a1757600080fd5b50565b62000a25816200085e565b811462000a3157600080fd5b50565b60805160a05160c05160e051612a7662000aad60003960008181610c6a01528181610eba0152611ae701526000818161115c01528181611a960152611b8601526000818161118801528181611ba70152611bec0152600081816111fb01528181611233015281816112ab0152611a720152612a766000f3fe608060405234801561001057600080fd5b5060043610610270576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610163578063983b2d56116100e0578063e3ab207a116100a4578063e3ab207a146107e5578063e54d63f714610815578063e809529514610845578063eda4e6d614610863578063f2fde38b14610881578063f83da35d146108b157610270565b8063983b2d56146107195780639da7d8ba14610749578063a9059cbb14610779578063ab28cea0146107a9578063b470aade146107c757610270565b80638d34855a116101275780638d34855a146106715780638da5cb5b146106a15780638f1df6bc146106bf5780638f770ad0146106dd57806395d89b41146106fb57610270565b80636a2d094e146105a55780636ffa8a05146105d557806370a0823114610605578063731f237c1461063557806379ba50971461065357610270565b8063313ce567116101f157806351b4541c116101b557806351b4541c146104d9578063573cc5071461050957806358b2833b146105275780636721d4ef146105455780636787a9be1461057557610270565b8063313ce567146103fb57806340452d9114610419578063449a52f81461044957806347a50517146104795780634abfbba2146104a957610270565b80631989c6a8116102385780631989c6a81461032f578063229ba1971461034d57806323b872dd1461036b5780633092afd51461039b57806331333487146103cb57610270565b806301ffc9a71461027557806306fdde03146102a5578063095ea7b3146102c357806309f28f3c146102f357806318160ddd14610311575b600080fd5b61028f600480360381019061028a919061225d565b6108e1565b60405161029c91906124a2565b60405180910390f35b6102ad610a8c565b6040516102ba91906124d8565b60405180910390f35b6102dd60048036038101906102d891906121f0565b610b1a565b6040516102ea91906124a2565b60405180910390f35b6102fb610c34565b604051610308919061255a565b60405180910390f35b610319610c56565b6040516103269190612590565b60405180910390f35b610337610c5c565b6040516103449190612590565b60405180910390f35b610355610c68565b6040516103629190612590565b60405180910390f35b6103856004803603810190610380919061219d565b610c8c565b60405161039291906124a2565b60405180910390f35b6103b560048036038101906103b09190612170565b610dac565b6040516103c291906124a2565b60405180910390f35b6103e560048036038101906103e091906122e4565b610e9f565b6040516103f29190612590565b60405180910390f35b610403610f53565b6040516104109190612590565b60405180910390f35b610433600480360381019061042e91906122b7565b610f59565b60405161044091906124bd565b60405180910390f35b610463600480360381019061045e91906121f0565b610f7d565b60405161047091906124a2565b60405180910390f35b610493600480360381019061048e9190612170565b61110f565b6040516104a09190612590565b60405180910390f35b6104c360048036038101906104be91906122b7565b611158565b6040516104d09190612590565b60405180910390f35b6104f360048036038101906104ee91906122b7565b6111b8565b6040516105009190612590565b60405180910390f35b6105116111d9565b60405161051e9190612590565b60405180910390f35b61052f6111df565b60405161053c9190612590565b60405180910390f35b61055f600480360381019061055a91906122e4565b6111e5565b60405161056c9190612590565b60405180910390f35b61058f600480360381019061058a91906122b7565b611266565b60405161059c9190612590565b60405180910390f35b6105bf60048036038101906105ba91906122b7565b6112e6565b6040516105cc9190612590565b60405180910390f35b6105ef60048036038101906105ea9190612230565b611307565b6040516105fc9190612590565b60405180910390f35b61061f600480360381019061061a9190612170565b611341565b60405161062c9190612590565b60405180910390f35b61063d6113f9565b60405161064a91906124a2565b60405180910390f35b61065b611518565b60405161066891906124a2565b60405180910390f35b61068b60048036038101906106869190612230565b6116bf565b6040516106989190612590565b60405180910390f35b6106a96116ed565b6040516106b69190612487565b60405180910390f35b6106c7611713565b6040516106d491906124a2565b60405180910390f35b6106e561185d565b6040516106f29190612590565b60405180910390f35b610703611863565b60405161071091906124d8565b60405180910390f35b610733600480360381019061072e9190612170565b6118f1565b60405161074091906124a2565b60405180910390f35b610763600480360381019061075e9190612230565b6119ae565b6040516107709190612590565b60405180910390f35b610793600480360381019061078e91906121f0565b6119da565b6040516107a091906124a2565b60405180910390f35b6107b1611a70565b6040516107be9190612590565b60405180910390f35b6107cf611a94565b6040516107dc9190612590565b60405180910390f35b6107ff60048036038101906107fa9190612230565b611ab8565b60405161080c9190612590565b60405180910390f35b61082f600480360381019061082a91906122e4565b611acc565b60405161083c9190612590565b60405180910390f35b61084d611b80565b60405161085a919061255a565b60405180910390f35b61086b611bea565b6040516108789190612590565b60405180910390f35b61089b60048036038101906108969190612170565b611c0e565b6040516108a891906124a2565b60405180910390f35b6108cb60048036038101906108c69190612324565b611cb0565b6040516108d891906124bd565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109365760019050610a87565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109895760019050610a87565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109dc5760019050610a87565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a2f5760019050610a87565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a825760019050610a87565b600090505b919050565b60068054610a9990612805565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac590612805565b8015610b125780601f10610ae757610100808354040283529160200191610b12565b820191906000526020600020905b815481529060010190602001808311610af557829003601f168201915b505050505081565b600080610b25611713565b50610b2f83611266565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bbd91906125c7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c219190612590565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610c99611713565b50610ca384611266565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d2e57600080fd5b610d39868684611d1d565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610d989190612590565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e3557503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e3e57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610ee3919061261d565b905060005b84811015610f2c5764e8d4a510008284610f029190612698565b610f0c919061261d565b83610f1791906126f2565b92508080610f2490612837565b915050610ee8565b5064e8d4a510008583610f3f9190612698565b610f49919061261d565b9250505092915050565b60085481565b60008181548110610f6957600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661100c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110039061251a565b60405180910390fd5b600a546009548461101d91906125c7565b111561105e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611055906124fa565b60405180910390fd5b611066611713565b5061107083611266565b9050826009600082825461108491906125c7565b925050819055506110958482611d42565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110f39190612590565b60405180910390a3611103611e07565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111869190612698565b7f00000000000000000000000000000000000000000000000000000000000000006111b191906125c7565b9050919050565b6000603c82426111c891906126f2565b6111d2919061261d565b9050919050565b600b5481565b60035481565b6000806402540be400836111f99190612698565b7f000000000000000000000000000000000000000000000000000000000000000061122491906126f2565b8461122f9190612698565b90507f00000000000000000000000000000000000000000000000000000000000000008161125d919061261d565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff16611297919061264e565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112d59190612698565b6112df919061261d565b9050919050565b6000603c82426112f691906126f2565b611300919061261d565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113508561110f565b925061135d6003546111b8565b90506113a96402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff16611391919061264e565b6fffffffffffffffffffffffffffffffff1682610e9f565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113d99190612698565b82846113e59190612698565b6113ef919061261d565b9350505050919050565b60008060006114096003546111b8565b9150600082141561141f57600092505050611515565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905061145c8183610e9f565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c826114a19190612698565b6003546114ae91906125c7565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516115069190612575565b60405180910390a46001925050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461157557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006116cd846119ae565b91506116d884611307565b90506116e482826111e5565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060006117296113f9565b50611732611ea9565b975060006001028814156117515760009850505050505050505061185a565b61175a88611ab8565b955060018661176991906125c7565b905061177486611158565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506117b2826112e6565b925060008311156117ce576117c78584611acc565b93506117d2565b8493505b6117e160008560095484611cb0565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561181587611fb3565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516118459190612590565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461187090612805565b80601f016020809104026020016040519081016040528092919081815260200182805461189c90612805565b80156118e95780601f106118be576101008083540402835291602001916118e9565b820191906000526020600020905b8154815290600101906020018083116118cc57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461194d57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119e7611713565b506119f184611266565b91506119fe338684611d1d565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a5d9190612590565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611b10919061261d565b905060005b84811015611b595764e8d4a510008284611b2f9190612698565b611b39919061261d565b83611b4491906125c7565b92508080611b5190612837565b915050611b15565b5064e8d4a510008583611b6c9190612698565b611b76919061261d565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611bd191906126f2565b611bdb919061261d565b611be591906125c7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c6a57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611d2a8584611fff565b50611d358484611d42565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611d9f5760009350505050611e01565b611da88661110f565b92508483611db691906125c7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611e2591906126f2565b81548110611e3657611e3561290d565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611e8191906126f2565b81548110611e9257611e9161290d565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611ec191906126f2565b81548110611ed257611ed161290d565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611f4157600080fd5b505afa158015611f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f79919061228a565b6fffffffffffffffffffffffffffffffff169050611f9682611ab8565b8111611faa57600060010292505050611fb0565b81925050505b90565b600080611fbf836116bf565b9050611ff5600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611ff083611266565b611d42565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085141561205c5760009350505050612101565b6120658661110f565b9250848310156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a19061253a565b60405180910390fd5b84836120b691906126f2565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600081359050612116816129cd565b92915050565b60008135905061212b816129e4565b92915050565b600081359050612140816129fb565b92915050565b60008151905061215581612a12565b92915050565b60008135905061216a81612a29565b92915050565b6000602082840312156121865761218561293c565b5b600061219484828501612107565b91505092915050565b6000806000606084860312156121b6576121b561293c565b5b60006121c486828701612107565b93505060206121d586828701612107565b92505060406121e68682870161215b565b9150509250925092565b600080604083850312156122075761220661293c565b5b600061221585828601612107565b92505060206122268582860161215b565b9150509250929050565b6000602082840312156122465761224561293c565b5b60006122548482850161211c565b91505092915050565b6000602082840312156122735761227261293c565b5b600061228184828501612131565b91505092915050565b6000602082840312156122a05761229f61293c565b5b60006122ae84828501612146565b91505092915050565b6000602082840312156122cd576122cc61293c565b5b60006122db8482850161215b565b91505092915050565b600080604083850312156122fb576122fa61293c565b5b60006123098582860161215b565b925050602061231a8582860161215b565b9150509250929050565b6000806000806080858703121561233e5761233d61293c565b5b600061234c8782880161215b565b945050602061235d8782880161215b565b935050604061236e8782880161215b565b925050606061237f8782880161215b565b91505092959194509250565b61239481612726565b82525050565b6123a381612738565b82525050565b6123b281612744565b82525050565b60006123c3826125ab565b6123cd81856125b6565b93506123dd8185602086016127d2565b6123e681612941565b840191505092915050565b60006123fe6007836125b6565b915061240982612952565b602082019050919050565b6000612421600a836125b6565b915061242c8261297b565b602082019050919050565b6000612444600d836125b6565b915061244f826129a4565b602082019050919050565b6124638161277a565b82525050565b612472816127c0565b82525050565b612481816127b6565b82525050565b600060208201905061249c600083018461238b565b92915050565b60006020820190506124b7600083018461239a565b92915050565b60006020820190506124d260008301846123a9565b92915050565b600060208201905081810360008301526124f281846123b8565b905092915050565b60006020820190508181036000830152612513816123f1565b9050919050565b6000602082019050818103600083015261253381612414565b9050919050565b6000602082019050818103600083015261255381612437565b9050919050565b600060208201905061256f600083018461245a565b92915050565b600060208201905061258a6000830184612469565b92915050565b60006020820190506125a56000830184612478565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125d2826127b6565b91506125dd836127b6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561261257612611612880565b5b828201905092915050565b6000612628826127b6565b9150612633836127b6565b925082612643576126426128af565b5b828204905092915050565b60006126598261277a565b91506126648361277a565b9250816fffffffffffffffffffffffffffffffff048311821515161561268d5761268c612880565b5b828202905092915050565b60006126a3826127b6565b91506126ae836127b6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126e7576126e6612880565b5b828202905092915050565b60006126fd826127b6565b9150612708836127b6565b92508282101561271b5761271a612880565b5b828203905092915050565b600061273182612796565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006127cb8261277a565b9050919050565b60005b838110156127f05780820151818401526020810190506127d5565b838111156127ff576000848401525b50505050565b6000600282049050600182168061281d57607f821691505b60208210811415612831576128306128de565b5b50919050565b6000612842826127b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561287557612874612880565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6129d681612726565b81146129e157600080fd5b50565b6129ed81612744565b81146129f857600080fd5b50565b612a048161274e565b8114612a0f57600080fd5b50565b612a1b8161277a565b8114612a2657600080fd5b50565b612a32816127b6565b8114612a3d57600080fd5b5056fea2646970667358221220a05805516603df124489787db617c41878e13744c9a77eccffdff95f9456f41964736f6c63430008060033
-\ No newline at end of file
+61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b50604051620036593803806200365983398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a34565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b6020821081141562000a2e5762000a2d620009cf565b5b50919050565b60805160a05160c05160e051612bac62000aad60003960008181610ccc01528181610f1c0152611c120152600081816111be01528181611a880152611cb10152600081816111ea01528181611cd20152611d1701526000818161125d015281816112950152818161130d0152611a640152612bac6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612280565b610943565b6040516102b291906122c8565b60405180910390f35b6102c3610aee565b6040516102d0919061237c565b60405180910390f35b6102f360048036038101906102ee9190612432565b610b7c565b60405161030091906122c8565b60405180910390f35b610311610c96565b60405161031e919061249d565b60405180910390f35b61032f610cb8565b60405161033c91906124c7565b60405180910390f35b61034d610cbe565b60405161035a91906124c7565b60405180910390f35b61036b610cca565b60405161037891906124c7565b60405180910390f35b61039b600480360381019061039691906124e2565b610cee565b6040516103a891906122c8565b60405180910390f35b6103cb60048036038101906103c69190612535565b610e0e565b6040516103d891906122c8565b60405180910390f35b6103fb60048036038101906103f69190612562565b610f01565b60405161040891906124c7565b60405180910390f35b610419610fb5565b60405161042691906124c7565b60405180910390f35b610449600480360381019061044491906125a2565b610fbb565b60405161045691906125e8565b60405180910390f35b61047960048036038101906104749190612432565b610fdf565b60405161048691906122c8565b60405180910390f35b6104a960048036038101906104a49190612535565b611171565b6040516104b691906124c7565b60405180910390f35b6104d960048036038101906104d491906125a2565b6111ba565b6040516104e691906124c7565b60405180910390f35b610509600480360381019061050491906125a2565b61121a565b60405161051691906124c7565b60405180910390f35b61052761123b565b60405161053491906124c7565b60405180910390f35b610545611241565b60405161055291906124c7565b60405180910390f35b61057560048036038101906105709190612562565b611247565b60405161058291906124c7565b60405180910390f35b6105a560048036038101906105a091906125a2565b6112c8565b6040516105b291906124c7565b60405180910390f35b6105d560048036038101906105d091906125a2565b611348565b6040516105e291906124c7565b60405180910390f35b6106056004803603810190610600919061262f565b611369565b60405161061291906124c7565b60405180910390f35b61063560048036038101906106309190612535565b6113a3565b60405161064291906124c7565b60405180910390f35b61065361145b565b60405161066091906122c8565b60405180910390f35b61067161146c565b60405161067e91906122c8565b60405180910390f35b6106a1600480360381019061069c919061262f565b611613565b6040516106ae91906124c7565b60405180910390f35b6106bf611641565b6040516106cc919061266b565b60405180910390f35b6106ef60048036038101906106ea9190612535565b611667565b005b6106f9611705565b60405161070691906122c8565b60405180910390f35b61071761184f565b60405161072491906124c7565b60405180910390f35b610735611855565b604051610742919061237c565b60405180910390f35b61076560048036038101906107609190612535565b6118e3565b60405161077291906122c8565b60405180910390f35b6107956004803603810190610790919061262f565b6119a0565b6040516107a291906124c7565b60405180910390f35b6107c560048036038101906107c09190612432565b6119cc565b6040516107d291906122c8565b60405180910390f35b6107e3611a62565b6040516107f091906124c7565b60405180910390f35b610801611a86565b60405161080e91906124c7565b60405180910390f35b610831600480360381019061082c91906125a2565b611aaa565b60405161083e91906122c8565b60405180910390f35b610861600480360381019061085c919061262f565b611be3565b60405161086e91906124c7565b60405180910390f35b610891600480360381019061088c9190612562565b611bf7565b60405161089e91906124c7565b60405180910390f35b6108af611cab565b6040516108bc919061249d565b60405180910390f35b6108cd611d15565b6040516108da91906124c7565b60405180910390f35b6108fd60048036038101906108f89190612535565b611d39565b60405161090a91906122c8565b60405180910390f35b61092d60048036038101906109289190612686565b611ddb565b60405161093a91906125e8565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109985760019050610ae9565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109eb5760019050610ae9565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a3e5760019050610ae9565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a915760019050610ae9565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ae45760019050610ae9565b600090505b919050565b60068054610afb9061271c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b279061271c565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b505050505081565b600080610b87611705565b50610b91836112c8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1f919061277d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c8391906124c7565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfb611705565b50610d05846112c8565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9057600080fd5b610d9b868684611e48565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dfa91906124c7565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea057600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f459190612802565b905060005b84811015610f8e5764e8d4a510008284610f649190612833565b610f6e9190612802565b83610f79919061288d565b92508080610f86906128c1565b915050610f4a565b5064e8d4a510008583610fa19190612833565b610fab9190612802565b9250505092915050565b60085481565b60008181548110610fcb57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590612956565b60405180910390fd5b600a546009548461107f919061277d565b11156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b7906129c2565b60405180910390fd5b6110c8611705565b506110d2836112c8565b905082600960008282546110e6919061277d565b925050819055506110f78482611e6d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115591906124c7565b60405180910390a3611165611f32565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e89190612833565b7f0000000000000000000000000000000000000000000000000000000000000000611213919061277d565b9050919050565b6000603c824261122a919061288d565b6112349190612802565b9050919050565b600b5481565b60035481565b6000806402540be4008361125b9190612833565b7f0000000000000000000000000000000000000000000000000000000000000000611286919061288d565b846112919190612833565b90507f0000000000000000000000000000000000000000000000000000000000000000816112bf9190612802565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f991906129e2565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113379190612833565b6113419190612802565b9050919050565b6000603c8242611358919061288d565b6113629190612802565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113b285611171565b92506113bf60035461121a565b905061140b6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113f391906129e2565b6fffffffffffffffffffffffffffffffff1682610f01565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061143b9190612833565b82846114479190612833565b6114519190612802565b9350505050919050565b60006114676000611aaa565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b6000806000611621846119a0565b915061162c84611369565b90506116388282611247565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c157600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080600061171b61145b565b50611724611fd4565b975060006001028814156117435760009850505050505050505061184c565b61174c88611be3565b955060018661175b919061277d565b9050611766866111ba565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506117a482611348565b925060008311156117c0576117b98584611bf7565b93506117c4565b8493505b6117d360008560095484611ddb565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611807876120cf565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183791906124c7565b60405180910390a16001985050505050505050505b90565b600a5481565b600780546118629061271c565b80601f016020809104026020016040519081016040528092919081815260200182805461188e9061271c565b80156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193f57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d9611705565b506119e3846112c8565b91506119f0338684611e48565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4f91906124c7565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aba60035461121a565b91506000821415611ad057600092505050611bde565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b1257508184105b15611b1b578391505b611b258183610f01565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b6a9190612833565b600354611b77919061277d565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bcf9190612a67565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3b9190612802565b905060005b84811015611c845764e8d4a510008284611c5a9190612833565b611c649190612802565b83611c6f919061277d565b92508080611c7c906128c1565b915050611c40565b5064e8d4a510008583611c979190612833565b611ca19190612802565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cfc919061288d565b611d069190612802565b611d10919061277d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d9557600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e55858461211b565b50611e608484611e6d565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611eca5760009350505050611f2c565b611ed386611171565b92508483611ee1919061277d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f50919061288d565b81548110611f6157611f60612a82565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fac919061288d565b81548110611fbd57611fbc612a82565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fec919061288d565b81548110611ffd57611ffc612a82565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120959190612add565b6fffffffffffffffffffffffffffffffff1690506120b282611be3565b81116120c6576000600102925050506120cc565b81925050505b90565b6000806120db83611613565b9050612111600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661210c836112c8565b611e6d565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415612178576000935050505061221d565b61218186611171565b9250848310156121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd90612b56565b60405180910390fd5b84836121d2919061288d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61225d81612228565b811461226857600080fd5b50565b60008135905061227a81612254565b92915050565b60006020828403121561229657612295612223565b5b60006122a48482850161226b565b91505092915050565b60008115159050919050565b6122c2816122ad565b82525050565b60006020820190506122dd60008301846122b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561231d578082015181840152602081019050612302565b8381111561232c576000848401525b50505050565b6000601f19601f8301169050919050565b600061234e826122e3565b61235881856122ee565b93506123688185602086016122ff565b61237181612332565b840191505092915050565b600060208201905081810360008301526123968184612343565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c98261239e565b9050919050565b6123d9816123be565b81146123e457600080fd5b50565b6000813590506123f6816123d0565b92915050565b6000819050919050565b61240f816123fc565b811461241a57600080fd5b50565b60008135905061242c81612406565b92915050565b6000806040838503121561244957612448612223565b5b6000612457858286016123e7565b92505060206124688582860161241d565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61249781612472565b82525050565b60006020820190506124b2600083018461248e565b92915050565b6124c1816123fc565b82525050565b60006020820190506124dc60008301846124b8565b92915050565b6000806000606084860312156124fb576124fa612223565b5b6000612509868287016123e7565b935050602061251a868287016123e7565b925050604061252b8682870161241d565b9150509250925092565b60006020828403121561254b5761254a612223565b5b6000612559848285016123e7565b91505092915050565b6000806040838503121561257957612578612223565b5b60006125878582860161241d565b92505060206125988582860161241d565b9150509250929050565b6000602082840312156125b8576125b7612223565b5b60006125c68482850161241d565b91505092915050565b6000819050919050565b6125e2816125cf565b82525050565b60006020820190506125fd60008301846125d9565b92915050565b61260c816125cf565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b60006020828403121561264557612644612223565b5b60006126538482850161261a565b91505092915050565b612665816123be565b82525050565b6000602082019050612680600083018461265c565b92915050565b600080600080608085870312156126a05761269f612223565b5b60006126ae8782880161241d565b94505060206126bf8782880161241d565b93505060406126d08782880161241d565b92505060606126e18782880161241d565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061273457607f821691505b60208210811415612748576127476126ed565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612788826123fc565b9150612793836123fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127c8576127c761274e565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061280d826123fc565b9150612818836123fc565b925082612828576128276127d3565b5b828204905092915050565b600061283e826123fc565b9150612849836123fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128825761288161274e565b5b828202905092915050565b6000612898826123fc565b91506128a3836123fc565b9250828210156128b6576128b561274e565b5b828203905092915050565b60006128cc826123fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156128ff576128fe61274e565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612940600a836122ee565b915061294b8261290a565b602082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129ac6007836122ee565b91506129b782612976565b602082019050919050565b600060208201905081810360008301526129db8161299f565b9050919050565b60006129ed82612472565b91506129f883612472565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a2157612a2061274e565b5b828202905092915050565b6000819050919050565b6000612a51612a4c612a4784612472565b612a2c565b6123fc565b9050919050565b612a6181612a36565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aba81612472565b8114612ac557600080fd5b50565b600081519050612ad781612ab1565b92915050565b600060208284031215612af357612af2612223565b5b6000612b0184828501612ac8565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b40600d836122ee565b9150612b4b82612b0a565b602082019050919050565b60006020820190508181036000830152612b6f81612b33565b905091905056fea2646970667358221220100682493d588dd205f0e53bc131ba668867313a64e728c35307651637c6757a64736f6c634300080b0033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.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"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"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":"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":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"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":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin
@@ -1 +1 @@
-61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000784565b6080908152503480156200003657600080fd5b50604051620034073803806200340783398181016040528101906200005c9190620004b3565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f92919062000329565b5084600790805190602001906200014892919062000329565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000784565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002bc640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002a9919062000647565b600a819055505050505050505062000a15565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b828054620003379062000882565b90600052602060002090601f0160209004810192826200035b5760008555620003a7565b82601f106200037657805160ff1916838001178555620003a7565b82800160010185558215620003a7579182015b82811115620003a657825182559160200191906001019062000389565b5b509050620003b69190620003ba565b5090565b5b80821115620003d5576000816000905550600101620003bb565b5090565b6000620003f0620003ea84620005b6565b6200058d565b9050828152602081018484840111156200040f576200040e62000980565b5b6200041c8482856200084c565b509392505050565b6000815190506200043581620009ad565b92915050565b600082601f8301126200045357620004526200097b565b5b815162000465848260208601620003d9565b91505092915050565b6000815190506200047f81620009c7565b92915050565b6000815190506200049681620009e1565b92915050565b600081519050620004ad81620009fb565b92915050565b60008060008060008060c08789031215620004d357620004d26200098a565b5b600087015167ffffffffffffffff811115620004f457620004f362000985565b5b6200050289828a016200043b565b965050602087015167ffffffffffffffff81111562000526576200052562000985565b5b6200053489828a016200043b565b95505060406200054789828a016200049c565b94505060606200055a89828a016200046e565b93505060806200056d89828a0162000485565b92505060a06200058089828a0162000424565b9150509295509295509295565b600062000599620005ac565b9050620005a78282620008b8565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d457620005d36200094c565b5b620005df826200098f565b9050602081019050919050565b6000808291508390505b60018511156200063e57808604811115620006165762000615620008ee565b5b6001851615620006265780820291505b80810290506200063685620009a0565b9450620005f6565b94509492505050565b6000620006548262000835565b9150620006618362000835565b9250620006907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000698565b905092915050565b600082620006aa57600190506200077d565b81620006ba57600090506200077d565b8160018114620006d35760028114620006de5762000714565b60019150506200077d565b60ff841115620006f357620006f2620008ee565b5b8360020a9150848211156200070d576200070c620008ee565b5b506200077d565b5060208310610133831016604e8410600b84101617156200074e5782820a905083811115620007485762000747620008ee565b5b6200077d565b6200075d8484846001620005ec565b92509050818404811115620007775762000776620008ee565b5b81810290505b9392505050565b6000620007918262000835565b91506200079e8362000835565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007da57620007d9620008ee565b5b828202905092915050565b6000620007f28262000815565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200086c5780820151818401526020810190506200084f565b838111156200087c576000848401525b50505050565b600060028204905060018216806200089b57607f821691505b60208210811415620008b257620008b16200091d565b5b50919050565b620008c3826200098f565b810181811067ffffffffffffffff82111715620008e557620008e46200094c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6000600282049050919050565b620009b881620007e5565b8114620009c457600080fd5b50565b620009d281620007f9565b8114620009de57600080fd5b50565b620009ec8162000835565b8114620009f857600080fd5b50565b62000a06816200083f565b811462000a1257600080fd5b50565b60805160a05160c05160e05161297962000a8e60003960008181610c4101528181610e910152611a560152600081816110e101528181611a050152611af501526000818161110d01528181611b160152611b5b015260008181611170015281816111a80152818161122001526119e101526129796000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e54d63f711610099578063e54d63f7146107ec578063e80952951461081c578063eda4e6d61461083a578063f2fde38b14610858578063f83da35d1461088857610265565b80639da7d8ba14610720578063a9059cbb14610750578063ab28cea014610780578063b470aade1461079e578063e3ab207a146107bc57610265565b80638d34855a1161011c5780638d34855a146106665780638da5cb5b146106965780638f1df6bc146106b457806395d89b41146106d2578063983b2d56146106f057610265565b80636a2d094e1461059a5780636ffa8a05146105ca57806370a08231146105fa578063731f237c1461062a57806379ba50971461064857610265565b8063313ce567116101e657806351b4541c116101aa57806351b4541c146104ce578063573cc507146104fe57806358b2833b1461051c5780636721d4ef1461053a5780636787a9be1461056a57610265565b8063313ce567146103f057806340452d911461040e578063449a52f81461043e57806347a505171461046e5780634abfbba21461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063229ba1971461034257806323b872dd146103605780633092afd51461039057806331333487146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f91906121cc565b6108b8565b60405161029191906123ee565b60405180910390f35b6102a2610a63565b6040516102af9190612424565b60405180910390f35b6102d260048036038101906102cd919061215f565b610af1565b6040516102df91906123ee565b60405180910390f35b6102f0610c0b565b6040516102fd9190612486565b60405180910390f35b61030e610c2d565b60405161031b91906124bc565b60405180910390f35b61032c610c33565b60405161033991906124bc565b60405180910390f35b61034a610c3f565b60405161035791906124bc565b60405180910390f35b61037a6004803603810190610375919061210c565b610c63565b60405161038791906123ee565b60405180910390f35b6103aa60048036038101906103a591906120df565b610d83565b6040516103b791906123ee565b60405180910390f35b6103da60048036038101906103d59190612253565b610e76565b6040516103e791906124bc565b60405180910390f35b6103f8610f2a565b60405161040591906124bc565b60405180910390f35b61042860048036038101906104239190612226565b610f30565b6040516104359190612409565b60405180910390f35b6104586004803603810190610453919061215f565b610f54565b60405161046591906123ee565b60405180910390f35b610488600480360381019061048391906120df565b611094565b60405161049591906124bc565b60405180910390f35b6104b860048036038101906104b39190612226565b6110dd565b6040516104c591906124bc565b60405180910390f35b6104e860048036038101906104e39190612226565b61113d565b6040516104f591906124bc565b60405180910390f35b61050661115e565b60405161051391906124bc565b60405180910390f35b610524611164565b60405161053191906124bc565b60405180910390f35b610554600480360381019061054f9190612253565b61116a565b60405161056191906124bc565b60405180910390f35b610584600480360381019061057f9190612226565b6111db565b60405161059191906124bc565b60405180910390f35b6105b460048036038101906105af9190612226565b61125b565b6040516105c191906124bc565b60405180910390f35b6105e460048036038101906105df919061219f565b61127c565b6040516105f191906124bc565b60405180910390f35b610614600480360381019061060f91906120df565b6112b6565b60405161062191906124bc565b60405180910390f35b61063261136e565b60405161063f91906123ee565b60405180910390f35b61065061148d565b60405161065d91906123ee565b60405180910390f35b610680600480360381019061067b919061219f565b611634565b60405161068d91906124bc565b60405180910390f35b61069e611662565b6040516106ab91906123d3565b60405180910390f35b6106bc611688565b6040516106c991906123ee565b60405180910390f35b6106da6117d2565b6040516106e79190612424565b60405180910390f35b61070a600480360381019061070591906120df565b611860565b60405161071791906123ee565b60405180910390f35b61073a6004803603810190610735919061219f565b61191d565b60405161074791906124bc565b60405180910390f35b61076a6004803603810190610765919061215f565b611949565b60405161077791906123ee565b60405180910390f35b6107886119df565b60405161079591906124bc565b60405180910390f35b6107a6611a03565b6040516107b391906124bc565b60405180910390f35b6107d660048036038101906107d1919061219f565b611a27565b6040516107e391906124bc565b60405180910390f35b61080660048036038101906108019190612253565b611a3b565b60405161081391906124bc565b60405180910390f35b610824611aef565b6040516108319190612486565b60405180910390f35b610842611b59565b60405161084f91906124bc565b60405180910390f35b610872600480360381019061086d91906120df565b611b7d565b60405161087f91906123ee565b60405180910390f35b6108a2600480360381019061089d9190612293565b611c1f565b6040516108af9190612409565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60068054610a7090612731565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612731565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc611688565b50610b06836111db565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b9491906124f3565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bf891906124bc565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610c70611688565b50610c7a846111db565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d0557600080fd5b610d10868684611c8c565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610d6f91906124bc565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e0c57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e1557600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610eba9190612549565b905060005b84811015610f035764e8d4a510008284610ed991906125c4565b610ee39190612549565b83610eee919061261e565b92508080610efb90612763565b915050610ebf565b5064e8d4a510008583610f1691906125c4565b610f209190612549565b9250505092915050565b60085481565b60008181548110610f4057600080fd5b906000526020600020016000915090505481565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90612446565b60405180910390fd5b610feb611688565b50610ff5836111db565b9050826009600082825461100991906124f3565b9250508190555061101a8482611cb1565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161107891906124bc565b60405180910390a3611088611d76565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261110b91906125c4565b7f000000000000000000000000000000000000000000000000000000000000000061113691906124f3565b9050919050565b6000603c824261114d919061261e565b6111579190612549565b9050919050565b600a5481565b60035481565b600080827f0000000000000000000000000000000000000000000000000000000000000000611199919061261e565b846111a491906125c4565b90507f0000000000000000000000000000000000000000000000000000000000000000816111d29190612549565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661120c919061257a565b6fffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008361124a91906125c4565b6112549190612549565b9050919050565b6000603c824261126b919061261e565b6112759190612549565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806112c585611094565b92506112d260035461113d565b905061131e6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff16611306919061257a565b6fffffffffffffffffffffffffffffffff1682610e76565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061134e91906125c4565b828461135a91906125c4565b6113649190612549565b9350505050919050565b600080600061137e60035461113d565b915060008214156113945760009250505061148a565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506113d18183610e76565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261141691906125c4565b60035461142391906124f3565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161147b91906124a1565b60405180910390a46001925050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ea57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006116428461191d565b915061164d8461127c565b9050611659828261116a565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600061169e61136e565b506116a7611e18565b975060006001028814156116c6576000985050505050505050506117cf565b6116cf88611a27565b95506001866116de91906124f3565b90506116e9866110dd565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506117278261125b565b925060008311156117435761173c8584611a3b565b9350611747565b8493505b61175660008560095484611c1f565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561178a87611f22565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117ba91906124bc565b60405180910390a16001985050505050505050505b90565b600780546117df90612731565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90612731565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118bc57600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611956611688565b50611960846111db565b915061196d338684611c8c565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119cc91906124bc565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611a7f9190612549565b905060005b84811015611ac85764e8d4a510008284611a9e91906125c4565b611aa89190612549565b83611ab391906124f3565b92508080611ac090612763565b915050611a84565b5064e8d4a510008583611adb91906125c4565b611ae59190612549565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611b40919061261e565b611b4a9190612549565b611b5491906124f3565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611c998584611f6e565b50611ca48484611cb1565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611d0e5760009350505050611d70565b611d1786611094565b92508483611d2591906124f3565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611d94919061261e565b81548110611da557611da4612839565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611df0919061261e565b81548110611e0157611e00612839565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611e30919061261e565b81548110611e4157611e40612839565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611eb057600080fd5b505afa158015611ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee891906121f9565b6fffffffffffffffffffffffffffffffff169050611f0582611a27565b8111611f1957600060010292505050611f1f565b81925050505b90565b600080611f2e83611634565b9050611f64600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f5f836111db565b611cb1565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611fcb5760009350505050612070565b611fd486611094565b925084831015612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201090612466565b60405180910390fd5b8483612025919061261e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600081359050612085816128d0565b92915050565b60008135905061209a816128e7565b92915050565b6000813590506120af816128fe565b92915050565b6000815190506120c481612915565b92915050565b6000813590506120d98161292c565b92915050565b6000602082840312156120f5576120f4612868565b5b600061210384828501612076565b91505092915050565b60008060006060848603121561212557612124612868565b5b600061213386828701612076565b935050602061214486828701612076565b9250506040612155868287016120ca565b9150509250925092565b6000806040838503121561217657612175612868565b5b600061218485828601612076565b9250506020612195858286016120ca565b9150509250929050565b6000602082840312156121b5576121b4612868565b5b60006121c38482850161208b565b91505092915050565b6000602082840312156121e2576121e1612868565b5b60006121f0848285016120a0565b91505092915050565b60006020828403121561220f5761220e612868565b5b600061221d848285016120b5565b91505092915050565b60006020828403121561223c5761223b612868565b5b600061224a848285016120ca565b91505092915050565b6000806040838503121561226a57612269612868565b5b6000612278858286016120ca565b9250506020612289858286016120ca565b9150509250929050565b600080600080608085870312156122ad576122ac612868565b5b60006122bb878288016120ca565b94505060206122cc878288016120ca565b93505060406122dd878288016120ca565b92505060606122ee878288016120ca565b91505092959194509250565b61230381612652565b82525050565b61231281612664565b82525050565b61232181612670565b82525050565b6000612332826124d7565b61233c81856124e2565b935061234c8185602086016126fe565b6123558161286d565b840191505092915050565b600061236d600a836124e2565b91506123788261287e565b602082019050919050565b6000612390600d836124e2565b915061239b826128a7565b602082019050919050565b6123af816126a6565b82525050565b6123be816126ec565b82525050565b6123cd816126e2565b82525050565b60006020820190506123e860008301846122fa565b92915050565b60006020820190506124036000830184612309565b92915050565b600060208201905061241e6000830184612318565b92915050565b6000602082019050818103600083015261243e8184612327565b905092915050565b6000602082019050818103600083015261245f81612360565b9050919050565b6000602082019050818103600083015261247f81612383565b9050919050565b600060208201905061249b60008301846123a6565b92915050565b60006020820190506124b660008301846123b5565b92915050565b60006020820190506124d160008301846123c4565b92915050565b600081519050919050565b600082825260208201905092915050565b60006124fe826126e2565b9150612509836126e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561253e5761253d6127ac565b5b828201905092915050565b6000612554826126e2565b915061255f836126e2565b92508261256f5761256e6127db565b5b828204905092915050565b6000612585826126a6565b9150612590836126a6565b9250816fffffffffffffffffffffffffffffffff04831182151516156125b9576125b86127ac565b5b828202905092915050565b60006125cf826126e2565b91506125da836126e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612613576126126127ac565b5b828202905092915050565b6000612629826126e2565b9150612634836126e2565b925082821015612647576126466127ac565b5b828203905092915050565b600061265d826126c2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006126f7826126a6565b9050919050565b60005b8381101561271c578082015181840152602081019050612701565b8381111561272b576000848401525b50505050565b6000600282049050600182168061274957607f821691505b6020821081141561275d5761275c61280a565b5b50919050565b600061276e826126e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156127a1576127a06127ac565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6128d981612652565b81146128e457600080fd5b50565b6128f081612670565b81146128fb57600080fd5b50565b6129078161267a565b811461291257600080fd5b50565b61291e816126a6565b811461292957600080fd5b50565b612935816126e2565b811461294057600080fd5b5056fea2646970667358221220506af7cce8538f8bf81ce72a793781d256501344a476482cd8afe1722dc273ba64736f6c63430008060033
-\ No newline at end of file
+61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000412565b6080908152503480156200003657600080fd5b506040516200354d3803806200354d83398181016040528101906200005c919062000731565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f92919062000329565b5084600790805190602001906200014892919062000329565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000412565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002bc640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002a991906200095f565b600a819055505050505050505062000a15565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033790620009df565b90600052602060002090601f0160209004810192826200035b5760008555620003a7565b82601f106200037657805160ff1916838001178555620003a7565b82800160010185558215620003a7579182015b82811115620003a657825182559160200191906001019062000389565b5b509050620003b69190620003ba565b5090565b5b80821115620003d5576000816000905550600101620003bb565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041f82620003d9565b91506200042c83620003d9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004685762000467620003e3565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004dc8262000491565b810181811067ffffffffffffffff82111715620004fe57620004fd620004a2565b5b80604052505050565b60006200051362000473565b9050620005218282620004d1565b919050565b600067ffffffffffffffff821115620005445762000543620004a2565b5b6200054f8262000491565b9050602081019050919050565b60005b838110156200057c5780820151818401526020810190506200055f565b838111156200058c576000848401525b50505050565b6000620005a9620005a38462000526565b62000507565b905082815260208101848484011115620005c857620005c76200048c565b5b620005d58482856200055c565b509392505050565b600082601f830112620005f557620005f462000487565b5b81516200060784826020860162000592565b91505092915050565b600060ff82169050919050565b620006288162000610565b81146200063457600080fd5b50565b60008151905062000648816200061d565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b62000675816200064e565b81146200068157600080fd5b50565b60008151905062000695816200066a565b92915050565b620006a681620003d9565b8114620006b257600080fd5b50565b600081519050620006c6816200069b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006f982620006cc565b9050919050565b6200070b81620006ec565b81146200071757600080fd5b50565b6000815190506200072b8162000700565b92915050565b60008060008060008060c087890312156200075157620007506200047d565b5b600087015167ffffffffffffffff81111562000772576200077162000482565b5b6200078089828a01620005dd565b965050602087015167ffffffffffffffff811115620007a457620007a362000482565b5b620007b289828a01620005dd565b9550506040620007c589828a0162000637565b9450506060620007d889828a0162000684565b9350506080620007eb89828a01620006b5565b92505060a0620007fe89828a016200071a565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b60018511156200086a57808604811115620008425762000841620003e3565b5b6001851615620008525780820291505b808102905062000862856200080b565b945062000822565b94509492505050565b60008262000885576001905062000958565b8162000895576000905062000958565b8160018114620008ae5760028114620008b957620008ef565b600191505062000958565b60ff841115620008ce57620008cd620003e3565b5b8360020a915084821115620008e857620008e7620003e3565b5b5062000958565b5060208310610133831016604e8410600b8410161715620009295782820a905083811115620009235762000922620003e3565b5b62000958565b62000938848484600162000818565b92509050818404811115620009525762000951620003e3565b5b81810290505b9392505050565b60006200096c82620003d9565b91506200097983620003d9565b9250620009a87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000873565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009f857607f821691505b6020821081141562000a0f5762000a0e620009b0565b5b50919050565b60805160a05160c05160e051612abf62000a8e60003960008181610ca301528181610ef30152611b9101526000818161114301528181611a070152611c3001526000818161116f01528181611c510152611c960152600081816111e20152818161121a0152818161129201526119e30152612abf6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a05116101635780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a1461081e578063e54d63f71461084e578063e80952951461087e578063eda4e6d61461089c578063f2fde38b146108ba578063f83da35d146108ea5761027b565b80639da7d8ba14610752578063a9059cbb14610782578063ab28cea0146107b2578063b470aade146107d0578063c0ab7077146107ee5761027b565b80638da5cb5b116101275780638da5cb5b146106ac5780638f0b2d5d146106ca5780638f1df6bc146106e657806395d89b4114610704578063983b2d56146107225761027b565b80636ffa8a05146105e057806370a0823114610610578063731f237c1461064057806379ba50971461065e5780638d34855a1461067c5761027b565b8063313ce567116101fc57806351b4541c116101c057806351b4541c146104e4578063573cc5071461051457806358b2833b146105325780636721d4ef146105505780636787a9be146105805780636a2d094e146105b05761027b565b8063313ce5671461040657806340452d9114610424578063449a52f81461045457806347a50517146104845780634abfbba2146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063229ba1971461035857806323b872dd146103765780633092afd5146103a657806331333487146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a600480360381019061029591906121ff565b61091a565b6040516102a79190612247565b60405180910390f35b6102b8610ac5565b6040516102c591906122fb565b60405180910390f35b6102e860048036038101906102e391906123b1565b610b53565b6040516102f59190612247565b60405180910390f35b610306610c6d565b604051610313919061241c565b60405180910390f35b610324610c8f565b6040516103319190612446565b60405180910390f35b610342610c95565b60405161034f9190612446565b60405180910390f35b610360610ca1565b60405161036d9190612446565b60405180910390f35b610390600480360381019061038b9190612461565b610cc5565b60405161039d9190612247565b60405180910390f35b6103c060048036038101906103bb91906124b4565b610de5565b6040516103cd9190612247565b60405180910390f35b6103f060048036038101906103eb91906124e1565b610ed8565b6040516103fd9190612446565b60405180910390f35b61040e610f8c565b60405161041b9190612446565b60405180910390f35b61043e60048036038101906104399190612521565b610f92565b60405161044b9190612567565b60405180910390f35b61046e600480360381019061046991906123b1565b610fb6565b60405161047b9190612247565b60405180910390f35b61049e600480360381019061049991906124b4565b6110f6565b6040516104ab9190612446565b60405180910390f35b6104ce60048036038101906104c99190612521565b61113f565b6040516104db9190612446565b60405180910390f35b6104fe60048036038101906104f99190612521565b61119f565b60405161050b9190612446565b60405180910390f35b61051c6111c0565b6040516105299190612446565b60405180910390f35b61053a6111c6565b6040516105479190612446565b60405180910390f35b61056a600480360381019061056591906124e1565b6111cc565b6040516105779190612446565b60405180910390f35b61059a60048036038101906105959190612521565b61124d565b6040516105a79190612446565b60405180910390f35b6105ca60048036038101906105c59190612521565b6112cd565b6040516105d79190612446565b60405180910390f35b6105fa60048036038101906105f591906125ae565b6112ee565b6040516106079190612446565b60405180910390f35b61062a600480360381019061062591906124b4565b611328565b6040516106379190612446565b60405180910390f35b6106486113e0565b6040516106559190612247565b60405180910390f35b6106666113f1565b6040516106739190612247565b60405180910390f35b610696600480360381019061069191906125ae565b611598565b6040516106a39190612446565b60405180910390f35b6106b46115c6565b6040516106c191906125ea565b60405180910390f35b6106e460048036038101906106df91906124b4565b6115ec565b005b6106ee61168a565b6040516106fb9190612247565b60405180910390f35b61070c6117d4565b60405161071991906122fb565b60405180910390f35b61073c600480360381019061073791906124b4565b611862565b6040516107499190612247565b60405180910390f35b61076c600480360381019061076791906125ae565b61191f565b6040516107799190612446565b60405180910390f35b61079c600480360381019061079791906123b1565b61194b565b6040516107a99190612247565b60405180910390f35b6107ba6119e1565b6040516107c79190612446565b60405180910390f35b6107d8611a05565b6040516107e59190612446565b60405180910390f35b61080860048036038101906108039190612521565b611a29565b6040516108159190612247565b60405180910390f35b610838600480360381019061083391906125ae565b611b62565b6040516108459190612446565b60405180910390f35b610868600480360381019061086391906124e1565b611b76565b6040516108759190612446565b60405180910390f35b610886611c2a565b604051610893919061241c565b60405180910390f35b6108a4611c94565b6040516108b19190612446565b60405180910390f35b6108d460048036038101906108cf91906124b4565b611cb8565b6040516108e19190612247565b60405180910390f35b61090460048036038101906108ff9190612605565b611d5a565b6040516109119190612567565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561096f5760019050610ac0565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c25760019050610ac0565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a155760019050610ac0565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a685760019050610ac0565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abb5760019050610ac0565b600090505b919050565b60068054610ad29061269b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afe9061269b565b8015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b505050505081565b600080610b5e61168a565b50610b688361124d565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bf691906126fc565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c5a9190612446565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cd261168a565b50610cdc8461124d565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d6757600080fd5b610d72868684611dc7565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dd19190612446565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e6e57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e7757600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f1c9190612781565b905060005b84811015610f655764e8d4a510008284610f3b91906127b2565b610f459190612781565b83610f50919061280c565b92508080610f5d90612840565b915050610f21565b5064e8d4a510008583610f7891906127b2565b610f829190612781565b9250505092915050565b60085481565b60008181548110610fa257600080fd5b906000526020600020016000915090505481565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906128d5565b60405180910390fd5b61104d61168a565b506110578361124d565b9050826009600082825461106b91906126fc565b9250508190555061107c8482611dec565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110da9190612446565b60405180910390a36110ea611eb1565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261116d91906127b2565b7f000000000000000000000000000000000000000000000000000000000000000061119891906126fc565b9050919050565b6000603c82426111af919061280c565b6111b99190612781565b9050919050565b600a5481565b60035481565b6000806402540be400836111e091906127b2565b7f000000000000000000000000000000000000000000000000000000000000000061120b919061280c565b8461121691906127b2565b90507f0000000000000000000000000000000000000000000000000000000000000000816112449190612781565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661127e91906128f5565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112bc91906127b2565b6112c69190612781565b9050919050565b6000603c82426112dd919061280c565b6112e79190612781565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600080611337856110f6565b925061134460035461119f565b90506113906402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661137891906128f5565b6fffffffffffffffffffffffffffffffff1682610ed8565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113c091906127b2565b82846113cc91906127b2565b6113d69190612781565b9350505050919050565b60006113ec6000611a29565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461144e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115a68461191f565b91506115b1846112ee565b90506115bd82826111cc565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164657600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116a06113e0565b506116a9611f53565b975060006001028814156116c8576000985050505050505050506117d1565b6116d188611b62565b95506001866116e091906126fc565b90506116eb8661113f565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611729826112cd565b925060008311156117455761173e8584611b76565b9350611749565b8493505b61175860008560095484611d5a565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561178c8761204e565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117bc9190612446565b60405180910390a16001985050505050505050505b90565b600780546117e19061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461180d9061269b565b801561185a5780601f1061182f5761010080835404028352916020019161185a565b820191906000526020600020905b81548152906001019060200180831161183d57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118be57600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061195861168a565b506119628461124d565b915061196f338684611dc7565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119ce9190612446565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a3960035461119f565b91506000821415611a4f57600092505050611b5d565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611a9157508184105b15611a9a578391505b611aa48183610ed8565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611ae991906127b2565b600354611af691906126fc565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b4e919061297a565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611bba9190612781565b905060005b84811015611c035764e8d4a510008284611bd991906127b2565b611be39190612781565b83611bee91906126fc565b92508080611bfb90612840565b915050611bbf565b5064e8d4a510008583611c1691906127b2565b611c209190612781565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611c7b919061280c565b611c859190612781565b611c8f91906126fc565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d1457600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611dd4858461209a565b50611ddf8484611dec565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611e495760009350505050611eab565b611e52866110f6565b92508483611e6091906126fc565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611ecf919061280c565b81548110611ee057611edf612995565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f2b919061280c565b81548110611f3c57611f3b612995565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611f6b919061280c565b81548110611f7c57611f7b612995565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201491906129f0565b6fffffffffffffffffffffffffffffffff16905061203182611b62565b81116120455760006001029250505061204b565b81925050505b90565b60008061205a83611598565b9050612090600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661208b8361124d565b611dec565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008514156120f7576000935050505061219c565b612100866110f6565b925084831015612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90612a69565b60405180910390fd5b8483612151919061280c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121dc816121a7565b81146121e757600080fd5b50565b6000813590506121f9816121d3565b92915050565b600060208284031215612215576122146121a2565b5b6000612223848285016121ea565b91505092915050565b60008115159050919050565b6122418161222c565b82525050565b600060208201905061225c6000830184612238565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561229c578082015181840152602081019050612281565b838111156122ab576000848401525b50505050565b6000601f19601f8301169050919050565b60006122cd82612262565b6122d7818561226d565b93506122e781856020860161227e565b6122f0816122b1565b840191505092915050565b6000602082019050818103600083015261231581846122c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123488261231d565b9050919050565b6123588161233d565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b6000819050919050565b61238e8161237b565b811461239957600080fd5b50565b6000813590506123ab81612385565b92915050565b600080604083850312156123c8576123c76121a2565b5b60006123d685828601612366565b92505060206123e78582860161239c565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612416816123f1565b82525050565b6000602082019050612431600083018461240d565b92915050565b6124408161237b565b82525050565b600060208201905061245b6000830184612437565b92915050565b60008060006060848603121561247a576124796121a2565b5b600061248886828701612366565b935050602061249986828701612366565b92505060406124aa8682870161239c565b9150509250925092565b6000602082840312156124ca576124c96121a2565b5b60006124d884828501612366565b91505092915050565b600080604083850312156124f8576124f76121a2565b5b60006125068582860161239c565b92505060206125178582860161239c565b9150509250929050565b600060208284031215612537576125366121a2565b5b60006125458482850161239c565b91505092915050565b6000819050919050565b6125618161254e565b82525050565b600060208201905061257c6000830184612558565b92915050565b61258b8161254e565b811461259657600080fd5b50565b6000813590506125a881612582565b92915050565b6000602082840312156125c4576125c36121a2565b5b60006125d284828501612599565b91505092915050565b6125e48161233d565b82525050565b60006020820190506125ff60008301846125db565b92915050565b6000806000806080858703121561261f5761261e6121a2565b5b600061262d8782880161239c565b945050602061263e8782880161239c565b935050604061264f8782880161239c565b92505060606126608782880161239c565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126b357607f821691505b602082108114156126c7576126c661266c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127078261237b565b91506127128361237b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612747576127466126cd565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061278c8261237b565b91506127978361237b565b9250826127a7576127a6612752565b5b828204905092915050565b60006127bd8261237b565b91506127c88361237b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612801576128006126cd565b5b828202905092915050565b60006128178261237b565b91506128228361237b565b925082821015612835576128346126cd565b5b828203905092915050565b600061284b8261237b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561287e5761287d6126cd565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006128bf600a8361226d565b91506128ca82612889565b602082019050919050565b600060208201905081810360008301526128ee816128b2565b9050919050565b6000612900826123f1565b915061290b836123f1565b9250816fffffffffffffffffffffffffffffffff0483118215151615612934576129336126cd565b5b828202905092915050565b6000819050919050565b600061296461295f61295a846123f1565b61293f565b61237b565b9050919050565b61297481612949565b82525050565b600060208201905061298f600083018461296b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6129cd816123f1565b81146129d857600080fd5b50565b6000815190506129ea816129c4565b92915050565b600060208284031215612a0657612a056121a2565b5b6000612a14848285016129db565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612a53600d8361226d565b9150612a5e82612a1d565b602082019050919050565b60006020820190508181036000830152612a8281612a46565b905091905056fea264697066735822122040c7b82458bb5e6e45df5d826444d591ea75814bd7cd674b11c9026417e4d59064736f6c634300080b0033
+\ No newline at end of file
diff --git 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":"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":"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":"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"}]
diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py
@@ -325,8 +325,19 @@ class DemurrageToken(ERC20):
return o
- def apply_demurrage(self, contract_address, sender_address):
- return self.transact_noarg('applyDemurrage', contract_address, sender_address)
+ def apply_demurrage(self, contract_address, sender_address, limit=0, tx_format=TxFormat.JSONRPC):
+ if limit == 0:
+ return self.transact_noarg('applyDemurrage', contract_address, sender_address)
+
+ enc = ABIContractEncoder()
+ enc.method('applyDemurrageLimited')
+ enc.typ(ABIContractType.UINT256)
+ enc.uint256(limit)
+ data = enc.get()
+ tx = self.template(sender_address, contract_address, use_nonce=True)
+ tx = self.set_code(tx, data)
+ tx = self.finalize(tx, tx_format)
+ return tx
def change_period(self, contract_address, sender_address):
diff --git a/python/requirements.txt b/python/requirements.txt
@@ -1,3 +1,3 @@
-chainlib-eth~=0.0.15
-eth-erc20~=0.1.5
-funga-eth~=0.5.1
+chainlib-eth~=0.0.27
+eth-erc20~=0.1.10
+funga-eth~=0.5.6
diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py
@@ -54,6 +54,32 @@ class TestBasic(TestDemurrageDefault):
self.assertEqual(balance, 1024)
+ def test_apply_demurrage_limited(self):
+ modifier = (10 ** 28)
+
+ nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
+ c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+
+ o = c.demurrage_amount(self.address, sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ demurrage_amount = c.parse_demurrage_amount(r)
+ self.assertEqual(modifier, demurrage_amount)
+
+ self.backend.time_travel(self.start_time + 120)
+ (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0], limit=1)
+ r = self.rpc.do(o)
+ o = receipt(tx_hash)
+ r = self.rpc.do(o)
+ self.assertEqual(r['status'], 1)
+
+ o = c.demurrage_amount(self.address, sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ demurrage_amount = c.parse_demurrage_amount(r)
+ modifier_base = 1000000 - self.tax_level
+ modifier = int(modifier_base * (10 ** 22)) # 38 decimal places minus 6 (1000000)
+ self.assertEqual(modifier, demurrage_amount)
+
+
def test_apply_demurrage(self):
modifier = (10 ** 28)
@@ -93,7 +119,6 @@ class TestBasic(TestDemurrageDefault):
r = self.rpc.do(o)
demurrage_amount = c.parse_demurrage_amount(r)
modifier_base = 1000000 - self.tax_level
- logg.debug('modifier base {}'.format(modifier_base))
modifier = int(modifier_base * (10 ** 22)) # 38 decimal places minus 6 (1000000)
self.assertEqual(modifier, demurrage_amount)
@@ -107,10 +132,11 @@ class TestBasic(TestDemurrageDefault):
r = self.rpc.do(o)
demurrage_amount = c.parse_demurrage_amount(r)
modifier_base = ((1000000 - self.tax_level) / 1000000) ** 10
+ logg.warning('mod base {}'.format(modifier_base))
modifier = int(modifier_base * (10 ** 12))
rounding_tolerance_nano = 4000000 # 0.000004% precision
- demurrage_amount_truncate = int(demurrage_amount / (10 ** 26)) # equals 12 decimal places
+ demurrage_amount_truncate = int(demurrage_amount / (10 ** 16)) # equals 38 decimal places - 14 for the modifier magniture - 2 for percent int calc + 6 for token decimals <- TODO verify this calc
self.assertGreaterEqual(modifier, demurrage_amount_truncate - rounding_tolerance_nano)
self.assertLessEqual(modifier, demurrage_amount_truncate)
diff --git a/python/tests/test_period.py b/python/tests/test_period.py
@@ -7,7 +7,15 @@ 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.tx import (
+ receipt,
+ TxFactory,
+ TxFormat,
+ )
+from chainlib.eth.contract import (
+ ABIContractEncoder,
+ ABIContractType,
+ )
# local imports
from erc20_demurrage_token import DemurrageToken
@@ -103,5 +111,90 @@ class TestPeriod(TestDemurrageDefault):
self.assertEqual(modifier, period)
+ def test_change_sink(self):
+ nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
+ c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+
+ o = c.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ balance = c.parse_balance_of(r)
+ self.assertEqual(balance, 0)
+
+ (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 102400000000)
+ r = self.rpc.do(o)
+ o = receipt(tx_hash)
+ r = self.rpc.do(o)
+ self.assertEqual(r['status'], 1)
+
+ self.backend.time_travel(self.start_time + self.period_seconds + 1)
+
+ c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+ (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.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ balance = c.parse_balance_of(r)
+ self.assertGreater(balance, 0)
+ old_sink_balance = balance
+
+ o = c.balance_of(self.address, self.accounts[3], sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ balance = c.parse_balance_of(r)
+ self.assertEqual(balance, 0)
+
+ nonce_oracle = RPCNonceOracle(self.accounts[5], self.rpc)
+ c = TxFactory(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+ enc = ABIContractEncoder()
+ enc.method('setSinkAddress')
+ enc.typ(ABIContractType.ADDRESS)
+ enc.address(self.accounts[3])
+ data = enc.get()
+ o = c.template(self.accounts[5], self.address, use_nonce=True)
+ o = c.set_code(o, data)
+ (tx_hash, o) = c.finalize(o, TxFormat.JSONRPC)
+ r = self.rpc.do(o)
+ o = receipt(tx_hash)
+ r = self.rpc.do(o)
+ self.assertEqual(r['status'], 0)
+
+ nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
+ c = TxFactory(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+ enc = ABIContractEncoder()
+ enc.method('setSinkAddress')
+ enc.typ(ABIContractType.ADDRESS)
+ enc.address(self.accounts[3])
+ data = enc.get()
+ o = c.template(self.accounts[0], self.address, use_nonce=True)
+ o = c.set_code(o, data)
+ (tx_hash, o) = c.finalize(o, TxFormat.JSONRPC)
+ r = self.rpc.do(o)
+ o = receipt(tx_hash)
+ r = self.rpc.do(o)
+ self.assertEqual(r['status'], 1)
+
+ self.backend.time_travel(self.start_time + (self.period_seconds * 2) + 1)
+
+ c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+ (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.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ balance = c.parse_balance_of(r)
+ self.assertLess(balance, old_sink_balance)
+
+ o = c.balance_of(self.address, self.accounts[3], sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ balance = c.parse_balance_of(r)
+ self.assertGreater(balance, 0)
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/solidity/DemurrageTokenSingleCap.sol b/solidity/DemurrageTokenSingleCap.sol
@@ -128,6 +128,12 @@ contract DemurrageTokenSingleCap {
minimumParticipantSpend = 10 ** uint256(_decimals);
}
+ // Change sink address for redistribution
+ function setSinkAddress(address _sinkAddress) public {
+ require(msg.sender == owner);
+ sinkAddress = _sinkAddress;
+ }
+
// Given address will be allowed to call the mintTo() function
function addMinter(address _minter) public returns (bool) {
require(msg.sender == owner);
@@ -311,6 +317,10 @@ contract DemurrageTokenSingleCap {
// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
function applyDemurrage() public returns (bool) {
+ return applyDemurrageLimited(0);
+ }
+
+ function applyDemurrageLimited(uint256 _rounds) public returns (bool) {
//uint128 epochPeriodCount;
uint256 periodCount;
uint256 lastDemurrageAmount;
@@ -323,6 +333,12 @@ contract DemurrageTokenSingleCap {
return false;
}
lastDemurrageAmount = demurrageAmount;
+ // safety limit for exponential calculation to ensure that we can always
+ // execute this code no matter how much time passes.
+ if (_rounds > 0 && _rounds < periodCount) {
+ periodCount = _rounds;
+ }
+
demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount));
//demurragePeriod = epochPeriodCount;
demurrageTimestamp = demurrageTimestamp + (periodCount * 60);
diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -124,6 +124,13 @@ contract DemurrageTokenSingleCap {
minimumParticipantSpend = 10 ** uint256(_decimals);
}
+
+ // Change sink address for redistribution
+ function setSinkAddress(address _sinkAddress) public {
+ require(msg.sender == owner);
+ sinkAddress = _sinkAddress;
+ }
+
// Given address will be allowed to call the mintTo() function
function addMinter(address _minter) public returns (bool) {
require(msg.sender == owner);
@@ -278,7 +285,8 @@ 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); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider));
+ difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider));
return difference / resolutionFactor;
}
@@ -307,6 +315,10 @@ contract DemurrageTokenSingleCap {
// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
function applyDemurrage() public returns (bool) {
+ return applyDemurrageLimited(0);
+ }
+
+ function applyDemurrageLimited(uint256 _rounds) public returns (bool) {
//uint128 epochPeriodCount;
uint256 periodCount;
uint256 lastDemurrageAmount;
@@ -319,6 +331,13 @@ contract DemurrageTokenSingleCap {
return false;
}
lastDemurrageAmount = demurrageAmount;
+
+ // safety limit for exponential calculation to ensure that we can always
+ // execute this code no matter how much time passes.
+ if (_rounds > 0 && _rounds < periodCount) {
+ periodCount = _rounds;
+ }
+
demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount));
//demurragePeriod = epochPeriodCount;
demurrageTimestamp = demurrageTimestamp + (periodCount * 60);