commit 2123341fe93f417dcce11be77d377613d12115ca
parent 606b8d62389613bac026ed6ecf7161ea53340034
Author: nolash <dev@holbrook.no>
Date: Tue, 8 Jun 2021 16:38:45 +0200
Rehabilitate single nocap contract
Diffstat:
6 files changed, 94 insertions(+), 62 deletions(-)
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin
@@ -1 +1 @@
-61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200078b565b6080908152503480156200003657600080fd5b50604051620034473803806200344783398181016040528101906200005c9190620004b5565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000337565b5085600790805190602001906200014892919062000337565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200078b565b60c081815250506f4b3b4ca85a86c47a098a224000000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c8640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b491906200064e565b600b81905550505050505050505062000a08565b6000807cffffffffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b828054620003459062000889565b90600052602060002090601f016020900481019282620003695760008555620003b5565b82601f106200038457805160ff1916838001178555620003b5565b82800160010185558215620003b5579182015b82811115620003b457825182559160200191906001019062000397565b5b509050620003c49190620003c8565b5090565b5b80821115620003e3576000816000905550600101620003c9565b5090565b6000620003fe620003f884620005bd565b62000594565b9050828152602081018484840111156200041757600080fd5b6200042484828562000853565b509392505050565b6000815190506200043d81620009a0565b92915050565b600082601f8301126200045557600080fd5b815162000467848260208601620003e7565b91505092915050565b6000815190506200048181620009ba565b92915050565b6000815190506200049881620009d4565b92915050565b600081519050620004af81620009ee565b92915050565b600080600080600080600060e0888a031215620004d157600080fd5b600088015167ffffffffffffffff811115620004ec57600080fd5b620004fa8a828b0162000443565b975050602088015167ffffffffffffffff8111156200051857600080fd5b620005268a828b0162000443565b9650506040620005398a828b016200049e565b95505060606200054c8a828b0162000470565b94505060806200055f8a828b0162000487565b93505060a0620005728a828b016200042c565b92505060c0620005858a828b0162000487565b91505092959891949750929550565b6000620005a0620005b3565b9050620005ae8282620008bf565b919050565b6000604051905090565b600067ffffffffffffffff821115620005db57620005da62000953565b5b620005e68262000982565b9050602081019050919050565b6000808291508390505b600185111562000645578086048111156200061d576200061c620008f5565b5b60018516156200062d5780820291505b80810290506200063d8562000993565b9450620005fd565b94509492505050565b60006200065b826200083c565b915062000668836200083c565b9250620006977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200069f565b905092915050565b600082620006b1576001905062000784565b81620006c1576000905062000784565b8160018114620006da5760028114620006e5576200071b565b600191505062000784565b60ff841115620006fa57620006f9620008f5565b5b8360020a915084821115620007145762000713620008f5565b5b5062000784565b5060208310610133831016604e8410600b8410161715620007555782820a9050838111156200074f576200074e620008f5565b5b62000784565b620007648484846001620005f3565b925090508184048111156200077e576200077d620008f5565b5b81810290505b9392505050565b600062000798826200083c565b9150620007a5836200083c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007e157620007e0620008f5565b5b828202905092915050565b6000620007f9826200081c565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200087357808201518184015260208101905062000856565b8381111562000883576000848401525b50505050565b60006002820490506001821680620008a257607f821691505b60208210811415620008b957620008b862000924565b5b50919050565b620008ca8262000982565b810181811067ffffffffffffffff82111715620008ec57620008eb62000953565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b620009ab81620007ec565b8114620009b757600080fd5b50565b620009c58162000800565b8114620009d157600080fd5b50565b620009df816200083c565b8114620009eb57600080fd5b50565b620009f98162000846565b811462000a0557600080fd5b50565b60805160a05160c05160e0516129cd62000a7a60003960008181610c4101528181610e910152611a6c01526000818161113301528181611a1b0152611b0b01526000818161115f01528181611b2c0152611b710152600081816111c2015281816111fa015261126201526129cd6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610158578063983b2d56116100d5578063e54d63f711610099578063e54d63f7146107ec578063e80952951461081c578063eda4e6d61461083a578063f2fde38b14610858578063f83da35d1461088857610265565b8063983b2d561461070e5780639da7d8ba1461073e578063a9059cbb1461076e578063b470aade1461079e578063e3ab207a146107bc57610265565b80638d34855a1161011c5780638d34855a146106665780638da5cb5b146106965780638f1df6bc146106b45780638f770ad0146106d257806395d89b41146106f057610265565b80636a2d094e1461059a5780636ffa8a05146105ca57806370a08231146105fa578063731f237c1461062a57806379ba50971461064857610265565b8063313ce567116101e657806351b4541c116101aa57806351b4541c146104ce578063573cc507146104fe57806358b2833b1461051c5780636721d4ef1461053a5780636787a9be1461056a57610265565b8063313ce567146103f057806340452d911461040e578063449a52f81461043e57806347a505171461046e5780634abfbba21461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063229ba1971461034257806323b872dd146103605780633092afd51461039057806331333487146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612246565b6108b8565b6040516102919190612477565b60405180910390f35b6102a2610a63565b6040516102af91906124ad565b60405180910390f35b6102d260048036038101906102cd91906121e1565b610af1565b6040516102df9190612477565b60405180910390f35b6102f0610c0b565b6040516102fd919061252f565b60405180910390f35b61030e610c2d565b60405161031b9190612565565b60405180910390f35b61032c610c33565b6040516103399190612565565b60405180910390f35b61034a610c3f565b6040516103579190612565565b60405180910390f35b61037a60048036038101906103759190612192565b610c63565b6040516103879190612477565b60405180910390f35b6103aa60048036038101906103a59190612169565b610d83565b6040516103b79190612477565b60405180910390f35b6103da60048036038101906103d591906122c1565b610e76565b6040516103e79190612565565b60405180910390f35b6103f8610f2a565b6040516104059190612565565b60405180910390f35b61042860048036038101906104239190612298565b610f30565b6040516104359190612492565b60405180910390f35b610458600480360381019061045391906121e1565b610f54565b6040516104659190612477565b60405180910390f35b61048860048036038101906104839190612169565b6110e6565b6040516104959190612565565b60405180910390f35b6104b860048036038101906104b39190612298565b61112f565b6040516104c59190612565565b60405180910390f35b6104e860048036038101906104e39190612298565b61118f565b6040516104f59190612565565b60405180910390f35b6105066111b0565b6040516105139190612565565b60405180910390f35b6105246111b6565b6040516105319190612565565b60405180910390f35b610554600480360381019061054f91906122c1565b6111bc565b6040516105619190612565565b60405180910390f35b610584600480360381019061057f9190612298565b61122d565b6040516105919190612565565b60405180910390f35b6105b460048036038101906105af9190612298565b61129d565b6040516105c19190612565565b60405180910390f35b6105e460048036038101906105df919061221d565b6112be565b6040516105f19190612565565b60405180910390f35b610614600480360381019061060f9190612169565b6112fa565b6040516106219190612565565b60405180910390f35b6106326113a2565b60405161063f9190612477565b60405180910390f35b6106506114c1565b60405161065d9190612477565b60405180910390f35b610680600480360381019061067b919061221d565b611668565b60405161068d9190612565565b60405180910390f35b61069e611696565b6040516106ab919061245c565b60405180910390f35b6106bc6116bc565b6040516106c99190612477565b60405180910390f35b6106da611806565b6040516106e79190612565565b60405180910390f35b6106f861180c565b60405161070591906124ad565b60405180910390f35b61072860048036038101906107239190612169565b61189a565b6040516107359190612477565b60405180910390f35b6107586004803603810190610753919061221d565b611957565b6040516107659190612565565b60405180910390f35b610788600480360381019061078391906121e1565b611983565b6040516107959190612477565b60405180910390f35b6107a6611a19565b6040516107b39190612565565b60405180910390f35b6107d660048036038101906107d1919061221d565b611a3d565b6040516107e39190612565565b60405180910390f35b610806600480360381019061080191906122c1565b611a51565b6040516108139190612565565b60405180910390f35b610824611b05565b604051610831919061252f565b60405180910390f35b610842611b6f565b60405161084f9190612565565b60405180910390f35b610872600480360381019061086d9190612169565b611b93565b60405161087f9190612477565b60405180910390f35b6108a2600480360381019061089d91906122fd565b611c35565b6040516108af9190612492565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60068054610a7090612790565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612790565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc6116bc565b50610b068361122d565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b94919061259c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bf89190612565565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610c706116bc565b50610c7a8461122d565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d0557600080fd5b610d10868684611ca4565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610d6f9190612565565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e0c57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e1557600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610eba91906125f2565b905060005b84811015610f035764e8d4a510008284610ed99190612623565b610ee391906125f2565b83610eee919061267d565b92508080610efb906127c2565b915050610ebf565b5064e8d4a510008583610f169190612623565b610f2091906125f2565b9250505092915050565b60085481565b60008181548110610f4057600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda906124ef565b60405180910390fd5b600a5460095484610ff4919061259c565b1115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c906124cf565b60405180910390fd5b61103d6116bc565b506110478361122d565b9050826009600082825461105b919061259c565b9250508190555061106c8482611cc9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110ca9190612565565b60405180910390a36110da611d8e565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261115d9190612623565b7f0000000000000000000000000000000000000000000000000000000000000000611188919061259c565b9050919050565b6000603c824261119f919061267d565b6111a991906125f2565b9050919050565b600b5481565b60035481565b600080827f00000000000000000000000000000000000000000000000000000000000000006111eb919061267d565b846111f69190612623565b90507f00000000000000000000000000000000000000000000000000000000000000008161122491906125f2565b91505092915050565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008361128c9190612623565b61129691906125f2565b9050919050565b6000603c82426112ad919061267d565b6112b791906125f2565b9050919050565b6000606860ff167cffffffffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600080611309856110e6565b925061131660035461118f565b9050611352600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610e76565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113829190612623565b828461138e9190612623565b61139891906125f2565b9350505050919050565b60008060006113b260035461118f565b915060008214156113c8576000925050506114be565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506114058183610e76565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261144a9190612623565b600354611457919061259c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516114af919061254a565b60405180910390a46001925050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061167684611957565b9150611681846112be565b905061168d82826111bc565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060006116d26113a2565b506116db611e7c565b975060006001028814156116fa57600098505050505050505050611803565b61170388611a3d565b9550600186611712919061259c565b905061171d8661112f565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061175b8261129d565b92506000831115611777576117708584611a51565b935061177b565b8493505b61178a60008560095484611c35565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117be87611fac565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117ee9190612565565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461181990612790565b80601f016020809104026020016040519081016040528092919081815260200182805461184590612790565b80156118925780601f1061186757610100808354040283529160200191611892565b820191906000526020600020905b81548152906001019060200180831161187557829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f657600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119906116bc565b5061199a8461122d565b91506119a7338684611ca4565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a069190612565565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611a9591906125f2565b905060005b84811015611ade5764e8d4a510008284611ab49190612623565b611abe91906125f2565b83611ac9919061259c565b92508080611ad6906127c2565b915050611a9a565b5064e8d4a510008583611af19190612623565b611afb91906125f2565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611b56919061267d565b611b6091906125f2565b611b6a919061259c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bef57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807cffffffffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611cb18584611ff8565b50611cbc8484611cc9565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611d265760009350505050611d88565b611d2f866110e6565b92508483611d3d919061259c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611dac919061267d565b81548110611de3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611e2e919061267d565b81548110611e65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555060019250505090565b6000806000806001600080549050611e94919061267d565b81548110611ecb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611f3a57600080fd5b505afa158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f72919061226f565b6fffffffffffffffffffffffffffffffff169050611f8f82611a3d565b8111611fa357600060010292505050611fa9565b81925050505b90565b600080611fb883611668565b9050611fee600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611fe98361122d565b611cc9565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085141561205557600093505050506120fa565b61205e866110e6565b9250848310156120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a9061250f565b60405180910390fd5b84836120af919061267d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008135905061210f81612924565b92915050565b6000813590506121248161293b565b92915050565b60008135905061213981612952565b92915050565b60008151905061214e81612969565b92915050565b60008135905061216381612980565b92915050565b60006020828403121561217b57600080fd5b600061218984828501612100565b91505092915050565b6000806000606084860312156121a757600080fd5b60006121b586828701612100565b93505060206121c686828701612100565b92505060406121d786828701612154565b9150509250925092565b600080604083850312156121f457600080fd5b600061220285828601612100565b925050602061221385828601612154565b9150509250929050565b60006020828403121561222f57600080fd5b600061223d84828501612115565b91505092915050565b60006020828403121561225857600080fd5b60006122668482850161212a565b91505092915050565b60006020828403121561228157600080fd5b600061228f8482850161213f565b91505092915050565b6000602082840312156122aa57600080fd5b60006122b884828501612154565b91505092915050565b600080604083850312156122d457600080fd5b60006122e285828601612154565b92505060206122f385828601612154565b9150509250929050565b6000806000806080858703121561231357600080fd5b600061232187828801612154565b945050602061233287828801612154565b935050604061234387828801612154565b925050606061235487828801612154565b91505092959194509250565b612369816126b1565b82525050565b612378816126c3565b82525050565b612387816126cf565b82525050565b600061239882612580565b6123a2818561258b565b93506123b281856020860161275d565b6123bb81612898565b840191505092915050565b60006123d360078361258b565b91506123de826128a9565b602082019050919050565b60006123f6600a8361258b565b9150612401826128d2565b602082019050919050565b6000612419600d8361258b565b9150612424826128fb565b602082019050919050565b61243881612705565b82525050565b6124478161274b565b82525050565b61245681612741565b82525050565b60006020820190506124716000830184612360565b92915050565b600060208201905061248c600083018461236f565b92915050565b60006020820190506124a7600083018461237e565b92915050565b600060208201905081810360008301526124c7818461238d565b905092915050565b600060208201905081810360008301526124e8816123c6565b9050919050565b60006020820190508181036000830152612508816123e9565b9050919050565b600060208201905081810360008301526125288161240c565b9050919050565b6000602082019050612544600083018461242f565b92915050565b600060208201905061255f600083018461243e565b92915050565b600060208201905061257a600083018461244d565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125a782612741565b91506125b283612741565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125e7576125e661280b565b5b828201905092915050565b60006125fd82612741565b915061260883612741565b9250826126185761261761283a565b5b828204905092915050565b600061262e82612741565b915061263983612741565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126725761267161280b565b5b828202905092915050565b600061268882612741565b915061269383612741565b9250828210156126a6576126a561280b565b5b828203905092915050565b60006126bc82612721565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061275682612705565b9050919050565b60005b8381101561277b578082015181840152602081019050612760565b8381111561278a576000848401525b50505050565b600060028204905060018216806127a857607f821691505b602082108114156127bc576127bb612869565b5b50919050565b60006127cd82612741565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612800576127ff61280b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b61292d816126b1565b811461293857600080fd5b50565b612944816126cf565b811461294f57600080fd5b50565b61295b816126d9565b811461296657600080fd5b50565b61297281612705565b811461297d57600080fd5b50565b61298981612741565b811461299457600080fd5b5056fea2646970667358221220a0b0ae39c2929b7971b684f430dd1f261c823daa5d9ce75cfbe68e234fd9a3ca64736f6c63430008040033
-\ No newline at end of file
+61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200078b565b6080908152503480156200003657600080fd5b50604051620034473803806200344783398181016040528101906200005c9190620004b5565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000337565b5085600790805190602001906200014892919062000337565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200078b565b60c081815250506f4b3b4ca85a86c47a098a224000000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c8640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b491906200064e565b600b81905550505050505050505062000a08565b6000807cffffffffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b828054620003459062000889565b90600052602060002090601f016020900481019282620003695760008555620003b5565b82601f106200038457805160ff1916838001178555620003b5565b82800160010185558215620003b5579182015b82811115620003b457825182559160200191906001019062000397565b5b509050620003c49190620003c8565b5090565b5b80821115620003e3576000816000905550600101620003c9565b5090565b6000620003fe620003f884620005bd565b62000594565b9050828152602081018484840111156200041757600080fd5b6200042484828562000853565b509392505050565b6000815190506200043d81620009a0565b92915050565b600082601f8301126200045557600080fd5b815162000467848260208601620003e7565b91505092915050565b6000815190506200048181620009ba565b92915050565b6000815190506200049881620009d4565b92915050565b600081519050620004af81620009ee565b92915050565b600080600080600080600060e0888a031215620004d157600080fd5b600088015167ffffffffffffffff811115620004ec57600080fd5b620004fa8a828b0162000443565b975050602088015167ffffffffffffffff8111156200051857600080fd5b620005268a828b0162000443565b9650506040620005398a828b016200049e565b95505060606200054c8a828b0162000470565b94505060806200055f8a828b0162000487565b93505060a0620005728a828b016200042c565b92505060c0620005858a828b0162000487565b91505092959891949750929550565b6000620005a0620005b3565b9050620005ae8282620008bf565b919050565b6000604051905090565b600067ffffffffffffffff821115620005db57620005da62000953565b5b620005e68262000982565b9050602081019050919050565b6000808291508390505b600185111562000645578086048111156200061d576200061c620008f5565b5b60018516156200062d5780820291505b80810290506200063d8562000993565b9450620005fd565b94509492505050565b60006200065b826200083c565b915062000668836200083c565b9250620006977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200069f565b905092915050565b600082620006b1576001905062000784565b81620006c1576000905062000784565b8160018114620006da5760028114620006e5576200071b565b600191505062000784565b60ff841115620006fa57620006f9620008f5565b5b8360020a915084821115620007145762000713620008f5565b5b5062000784565b5060208310610133831016604e8410600b8410161715620007555782820a9050838111156200074f576200074e620008f5565b5b62000784565b620007648484846001620005f3565b925090508184048111156200077e576200077d620008f5565b5b81810290505b9392505050565b600062000798826200083c565b9150620007a5836200083c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007e157620007e0620008f5565b5b828202905092915050565b6000620007f9826200081c565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200087357808201518184015260208101905062000856565b8381111562000883576000848401525b50505050565b60006002820490506001821680620008a257607f821691505b60208210811415620008b957620008b862000924565b5b50919050565b620008ca8262000982565b810181811067ffffffffffffffff82111715620008ec57620008eb62000953565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b620009ab81620007ec565b8114620009b757600080fd5b50565b620009c58162000800565b8114620009d157600080fd5b50565b620009df816200083c565b8114620009eb57600080fd5b50565b620009f98162000846565b811462000a0557600080fd5b50565b60805160a05160c05160e0516129cd62000a7a60003960008181610c4101528181610e910152611a6c01526000818161113301528181611a1b0152611b0b01526000818161115f01528181611b2c0152611b710152600081816111c2015281816111fa015261126201526129cd6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610158578063983b2d56116100d5578063e54d63f711610099578063e54d63f7146107ec578063e80952951461081c578063eda4e6d61461083a578063f2fde38b14610858578063f83da35d1461088857610265565b8063983b2d561461070e5780639da7d8ba1461073e578063a9059cbb1461076e578063b470aade1461079e578063e3ab207a146107bc57610265565b80638d34855a1161011c5780638d34855a146106665780638da5cb5b146106965780638f1df6bc146106b45780638f770ad0146106d257806395d89b41146106f057610265565b80636a2d094e1461059a5780636ffa8a05146105ca57806370a08231146105fa578063731f237c1461062a57806379ba50971461064857610265565b8063313ce567116101e657806351b4541c116101aa57806351b4541c146104ce578063573cc507146104fe57806358b2833b1461051c5780636721d4ef1461053a5780636787a9be1461056a57610265565b8063313ce567146103f057806340452d911461040e578063449a52f81461043e57806347a505171461046e5780634abfbba21461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063229ba1971461034257806323b872dd146103605780633092afd51461039057806331333487146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612246565b6108b8565b6040516102919190612477565b60405180910390f35b6102a2610a63565b6040516102af91906124ad565b60405180910390f35b6102d260048036038101906102cd91906121e1565b610af1565b6040516102df9190612477565b60405180910390f35b6102f0610c0b565b6040516102fd919061252f565b60405180910390f35b61030e610c2d565b60405161031b9190612565565b60405180910390f35b61032c610c33565b6040516103399190612565565b60405180910390f35b61034a610c3f565b6040516103579190612565565b60405180910390f35b61037a60048036038101906103759190612192565b610c63565b6040516103879190612477565b60405180910390f35b6103aa60048036038101906103a59190612169565b610d83565b6040516103b79190612477565b60405180910390f35b6103da60048036038101906103d591906122c1565b610e76565b6040516103e79190612565565b60405180910390f35b6103f8610f2a565b6040516104059190612565565b60405180910390f35b61042860048036038101906104239190612298565b610f30565b6040516104359190612492565b60405180910390f35b610458600480360381019061045391906121e1565b610f54565b6040516104659190612477565b60405180910390f35b61048860048036038101906104839190612169565b6110e6565b6040516104959190612565565b60405180910390f35b6104b860048036038101906104b39190612298565b61112f565b6040516104c59190612565565b60405180910390f35b6104e860048036038101906104e39190612298565b61118f565b6040516104f59190612565565b60405180910390f35b6105066111b0565b6040516105139190612565565b60405180910390f35b6105246111b6565b6040516105319190612565565b60405180910390f35b610554600480360381019061054f91906122c1565b6111bc565b6040516105619190612565565b60405180910390f35b610584600480360381019061057f9190612298565b61122d565b6040516105919190612565565b60405180910390f35b6105b460048036038101906105af9190612298565b61129d565b6040516105c19190612565565b60405180910390f35b6105e460048036038101906105df919061221d565b6112be565b6040516105f19190612565565b60405180910390f35b610614600480360381019061060f9190612169565b6112fa565b6040516106219190612565565b60405180910390f35b6106326113a2565b60405161063f9190612477565b60405180910390f35b6106506114c1565b60405161065d9190612477565b60405180910390f35b610680600480360381019061067b919061221d565b611668565b60405161068d9190612565565b60405180910390f35b61069e611696565b6040516106ab919061245c565b60405180910390f35b6106bc6116bc565b6040516106c99190612477565b60405180910390f35b6106da611806565b6040516106e79190612565565b60405180910390f35b6106f861180c565b60405161070591906124ad565b60405180910390f35b61072860048036038101906107239190612169565b61189a565b6040516107359190612477565b60405180910390f35b6107586004803603810190610753919061221d565b611957565b6040516107659190612565565b60405180910390f35b610788600480360381019061078391906121e1565b611983565b6040516107959190612477565b60405180910390f35b6107a6611a19565b6040516107b39190612565565b60405180910390f35b6107d660048036038101906107d1919061221d565b611a3d565b6040516107e39190612565565b60405180910390f35b610806600480360381019061080191906122c1565b611a51565b6040516108139190612565565b60405180910390f35b610824611b05565b604051610831919061252f565b60405180910390f35b610842611b6f565b60405161084f9190612565565b60405180910390f35b610872600480360381019061086d9190612169565b611b93565b60405161087f9190612477565b60405180910390f35b6108a2600480360381019061089d91906122fd565b611c35565b6040516108af9190612492565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60068054610a7090612790565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612790565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc6116bc565b50610b068361122d565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b94919061259c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bf89190612565565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610c706116bc565b50610c7a8461122d565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d0557600080fd5b610d10868684611ca4565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610d6f9190612565565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e0c57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e1557600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610eba91906125f2565b905060005b84811015610f035764e8d4a510008284610ed99190612623565b610ee391906125f2565b83610eee919061267d565b92508080610efb906127c2565b915050610ebf565b5064e8d4a510008583610f169190612623565b610f2091906125f2565b9250505092915050565b60085481565b60008181548110610f4057600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda906124ef565b60405180910390fd5b600a5460095484610ff4919061259c565b1115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c906124cf565b60405180910390fd5b61103d6116bc565b506110478361122d565b9050826009600082825461105b919061259c565b9250508190555061106c8482611cc9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110ca9190612565565b60405180910390a36110da611d8e565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261115d9190612623565b7f0000000000000000000000000000000000000000000000000000000000000000611188919061259c565b9050919050565b6000603c824261119f919061267d565b6111a991906125f2565b9050919050565b600b5481565b60035481565b600080827f00000000000000000000000000000000000000000000000000000000000000006111eb919061267d565b846111f69190612623565b90507f00000000000000000000000000000000000000000000000000000000000000008161122491906125f2565b91505092915050565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008361128c9190612623565b61129691906125f2565b9050919050565b6000603c82426112ad919061267d565b6112b791906125f2565b9050919050565b6000606860ff167cffffffffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600080611309856110e6565b925061131660035461118f565b9050611352600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610e76565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113829190612623565b828461138e9190612623565b61139891906125f2565b9350505050919050565b60008060006113b260035461118f565b915060008214156113c8576000925050506114be565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506114058183610e76565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261144a9190612623565b600354611457919061259c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516114af919061254a565b60405180910390a46001925050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061167684611957565b9150611681846112be565b905061168d82826111bc565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060006116d26113a2565b506116db611e7c565b975060006001028814156116fa57600098505050505050505050611803565b61170388611a3d565b9550600186611712919061259c565b905061171d8661112f565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061175b8261129d565b92506000831115611777576117708584611a51565b935061177b565b8493505b61178a60008560095484611c35565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117be87611fac565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117ee9190612565565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461181990612790565b80601f016020809104026020016040519081016040528092919081815260200182805461184590612790565b80156118925780601f1061186757610100808354040283529160200191611892565b820191906000526020600020905b81548152906001019060200180831161187557829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f657600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119906116bc565b5061199a8461122d565b91506119a7338684611ca4565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a069190612565565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611a9591906125f2565b905060005b84811015611ade5764e8d4a510008284611ab49190612623565b611abe91906125f2565b83611ac9919061259c565b92508080611ad6906127c2565b915050611a9a565b5064e8d4a510008583611af19190612623565b611afb91906125f2565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611b56919061267d565b611b6091906125f2565b611b6a919061259c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bef57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807cffffffffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611cb18584611ff8565b50611cbc8484611cc9565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611d265760009350505050611d88565b611d2f866110e6565b92508483611d3d919061259c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611dac919061267d565b81548110611de3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611e2e919061267d565b81548110611e65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555060019250505090565b6000806000806001600080549050611e94919061267d565b81548110611ecb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611f3a57600080fd5b505afa158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f72919061226f565b6fffffffffffffffffffffffffffffffff169050611f8f82611a3d565b8111611fa357600060010292505050611fa9565b81925050505b90565b600080611fb883611668565b9050611fee600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611fe98361122d565b611cc9565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085141561205557600093505050506120fa565b61205e866110e6565b9250848310156120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a9061250f565b60405180910390fd5b84836120af919061267d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008135905061210f81612924565b92915050565b6000813590506121248161293b565b92915050565b60008135905061213981612952565b92915050565b60008151905061214e81612969565b92915050565b60008135905061216381612980565b92915050565b60006020828403121561217b57600080fd5b600061218984828501612100565b91505092915050565b6000806000606084860312156121a757600080fd5b60006121b586828701612100565b93505060206121c686828701612100565b92505060406121d786828701612154565b9150509250925092565b600080604083850312156121f457600080fd5b600061220285828601612100565b925050602061221385828601612154565b9150509250929050565b60006020828403121561222f57600080fd5b600061223d84828501612115565b91505092915050565b60006020828403121561225857600080fd5b60006122668482850161212a565b91505092915050565b60006020828403121561228157600080fd5b600061228f8482850161213f565b91505092915050565b6000602082840312156122aa57600080fd5b60006122b884828501612154565b91505092915050565b600080604083850312156122d457600080fd5b60006122e285828601612154565b92505060206122f385828601612154565b9150509250929050565b6000806000806080858703121561231357600080fd5b600061232187828801612154565b945050602061233287828801612154565b935050604061234387828801612154565b925050606061235487828801612154565b91505092959194509250565b612369816126b1565b82525050565b612378816126c3565b82525050565b612387816126cf565b82525050565b600061239882612580565b6123a2818561258b565b93506123b281856020860161275d565b6123bb81612898565b840191505092915050565b60006123d360078361258b565b91506123de826128a9565b602082019050919050565b60006123f6600a8361258b565b9150612401826128d2565b602082019050919050565b6000612419600d8361258b565b9150612424826128fb565b602082019050919050565b61243881612705565b82525050565b6124478161274b565b82525050565b61245681612741565b82525050565b60006020820190506124716000830184612360565b92915050565b600060208201905061248c600083018461236f565b92915050565b60006020820190506124a7600083018461237e565b92915050565b600060208201905081810360008301526124c7818461238d565b905092915050565b600060208201905081810360008301526124e8816123c6565b9050919050565b60006020820190508181036000830152612508816123e9565b9050919050565b600060208201905081810360008301526125288161240c565b9050919050565b6000602082019050612544600083018461242f565b92915050565b600060208201905061255f600083018461243e565b92915050565b600060208201905061257a600083018461244d565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125a782612741565b91506125b283612741565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125e7576125e661280b565b5b828201905092915050565b60006125fd82612741565b915061260883612741565b9250826126185761261761283a565b5b828204905092915050565b600061262e82612741565b915061263983612741565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126725761267161280b565b5b828202905092915050565b600061268882612741565b915061269383612741565b9250828210156126a6576126a561280b565b5b828203905092915050565b60006126bc82612721565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061275682612705565b9050919050565b60005b8381101561277b578082015181840152602081019050612760565b8381111561278a576000848401525b50505050565b600060028204905060018216806127a857607f821691505b602082108114156127bc576127bb612869565b5b50919050565b60006127cd82612741565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612800576127ff61280b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b61292d816126b1565b811461293857600080fd5b50565b612944816126cf565b811461294f57600080fd5b50565b61295b816126d9565b811461296657600080fd5b50565b61297281612705565b811461297d57600080fd5b50565b61298981612741565b811461299457600080fd5b5056fea2646970667358221220af3c2f3320ef1d316867ea0b957ce11b3e6cae59e749801e1d0ee6baa5a236e064736f6c63430008040033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin
@@ -1 +1 @@
-60e06040523480156200001157600080fd5b506040516200318a3803806200318a833981810160405281019062000037919062000468565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590805190602001906200010a92919062000301565b5084600690805190602001906200012392919062000301565b508360ff166007819055504260808181525050603c8262000145919062000727565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b919062000727565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002889190620005ea565b600981905550505050505050506200096e565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200030f9062000809565b90600052602060002090601f0160209004810192826200033357600085556200037f565b82601f106200034e57805160ff19168380011785556200037f565b828001600101855582156200037f579182015b828111156200037e57825182559160200191906001019062000361565b5b5090506200038e919062000392565b5090565b5b80821115620003ad57600081600090555060010162000393565b5090565b6000620003c8620003c28462000559565b62000530565b905082815260208101848484011115620003e157600080fd5b620003ee848285620007d3565b509392505050565b600081519050620004078162000920565b92915050565b600082601f8301126200041f57600080fd5b815162000431848260208601620003b1565b91505092915050565b6000815190506200044b816200093a565b92915050565b600081519050620004628162000954565b92915050565b60008060008060008060c087890312156200048257600080fd5b600087015167ffffffffffffffff8111156200049d57600080fd5b620004ab89828a016200040d565b965050602087015167ffffffffffffffff811115620004c957600080fd5b620004d789828a016200040d565b9550506040620004ea89828a0162000451565b9450506060620004fd89828a016200043a565b93505060806200051089828a016200043a565b92505060a06200052389828a01620003f6565b9150509295509295509295565b60006200053c6200054f565b90506200054a82826200083f565b919050565b6000604051905090565b600067ffffffffffffffff821115620005775762000576620008d3565b5b620005828262000902565b9050602081019050919050565b6000808291508390505b6001851115620005e157808604811115620005b957620005b862000875565b5b6001851615620005c95780820291505b8081029050620005d98562000913565b945062000599565b94509492505050565b6000620005f782620007bc565b91506200060483620007bc565b9250620006337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200063b565b905092915050565b6000826200064d576001905062000720565b816200065d576000905062000720565b81600181146200067657600281146200068157620006b7565b600191505062000720565b60ff84111562000696576200069562000875565b5b8360020a915084821115620006b057620006af62000875565b5b5062000720565b5060208310610133831016604e8410600b8410161715620006f15782820a905083811115620006eb57620006ea62000875565b5b62000720565b6200070084848460016200058f565b925090508184048111156200071a576200071962000875565b5b81810290505b9392505050565b60006200073482620007bc565b91506200074183620007bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200077d576200077c62000875565b5b828202905092915050565b600062000795826200079c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620007f3578082015181840152602081019050620007d6565b8381111562000803576000848401525b50505050565b600060028204905060018216806200082257607f821691505b60208210811415620008395762000838620008a4565b5b50919050565b6200084a8262000902565b810181811067ffffffffffffffff821117156200086c576200086b620008d3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200092b8162000788565b81146200093757600080fd5b50565b6200094581620007bc565b81146200095157600080fd5b50565b6200095f81620007c6565b81146200096b57600080fd5b50565b60805160a05160c0516127bb620009cf60003960008181610b2c01528181610d7d015281816119080152611e67015260008181610f8b015281816118b601526119a3015260008181610fb7015281816119c40152611a0901526127bb6000f3fe608060405234801561001057600080fd5b506004361061022e576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101425780639da7d8ba116100ca578063e3ab207a11610099578063e3ab207a146106d7578063e54d63f714610707578063e809529514610737578063eda4e6d614610755578063f2fde38b146107735761022e565b80639da7d8ba1461063b578063a2119e2f1461066b578063a9059cbb14610689578063b470aade146106b95761022e565b806379ba50971161011157806379ba5097146105935780638da5cb5b146105b15780638f1df6bc146105cf57806395d89b41146105ed578063983b2d561461060b5761022e565b80636a2d094e146104e55780636ffa8a051461051557806370a0823114610545578063731f237c146105755761022e565b80633092afd5116101c5578063449a52f811610194578063449a52f81461040757806347a50517146104375780634abfbba214610467578063573cc507146104975780636787a9be146104b55761022e565b80633092afd5146103595780633133348714610389578063313ce567146103b957806340452d91146103d75761022e565b806318160ddd1161020157806318160ddd146102cf5780631989c6a8146102ed578063229ba1971461030b57806323b872dd146103295761022e565b806301ffc9a71461023357806306fdde0314610263578063095ea7b31461028157806309f28f3c146102b1575b600080fd5b61024d6004803603810190610248919061213b565b6107a3565b60405161025a91906122c3565b60405180910390f35b61026b61094e565b60405161027891906122f9565b60405180910390f35b61029b600480360381019061029691906120d6565b6109dc565b6040516102a891906122c3565b60405180910390f35b6102b9610af6565b6040516102c6919061233b565b60405180910390f35b6102d7610b18565b6040516102e49190612371565b60405180910390f35b6102f5610b1e565b6040516103029190612371565b60405180910390f35b610313610b2a565b6040516103209190612371565b60405180910390f35b610343600480360381019061033e9190612087565b610b4e565b60405161035091906122c3565b60405180910390f35b610373600480360381019061036e919061205e565b610c6e565b60405161038091906122c3565b60405180910390f35b6103a3600480360381019061039e91906121b6565b610d61565b6040516103b09190612371565b60405180910390f35b6103c1610e12565b6040516103ce9190612371565b60405180910390f35b6103f160048036038101906103ec919061218d565b610e18565b6040516103fe91906122de565b60405180910390f35b610421600480360381019061041c91906120d6565b610e3c565b60405161042e91906122c3565b60405180910390f35b610451600480360381019061044c919061205e565b610f3e565b60405161045e9190612371565b60405180910390f35b610481600480360381019061047c919061218d565b610f87565b60405161048e9190612371565b60405180910390f35b61049f610fe7565b6040516104ac9190612371565b60405180910390f35b6104cf60048036038101906104ca919061218d565b610fed565b6040516104dc9190612371565b60405180910390f35b6104ff60048036038101906104fa919061218d565b611059565b60405161050c9190612371565b60405180910390f35b61052f600480360381019061052a9190612112565b61107a565b60405161053c9190612371565b60405180910390f35b61055f600480360381019061055a919061205e565b6110ad565b60405161056c9190612371565b60405180910390f35b61057d61118e565b60405161058a91906122c3565b60405180910390f35b61059b61133c565b6040516105a891906122c3565b60405180910390f35b6105b96114e3565b6040516105c691906122a8565b60405180910390f35b6105d7611509565b6040516105e491906122c3565b60405180910390f35b6105f5611685565b60405161060291906122f9565b60405180910390f35b6106256004803603810190610620919061205e565b611713565b60405161063291906122c3565b60405180910390f35b61065560048036038101906106509190612112565b6117d0565b6040516106629190612371565b60405180910390f35b6106736117fc565b604051610680919061233b565b60405180910390f35b6106a3600480360381019061069e91906120d6565b61181e565b6040516106b091906122c3565b60405180910390f35b6106c16118b4565b6040516106ce9190612371565b60405180910390f35b6106f160048036038101906106ec9190612112565b6118d8565b6040516106fe9190612371565b60405180910390f35b610721600480360381019061071c91906121b6565b6118ec565b60405161072e9190612371565b60405180910390f35b61073f61199d565b60405161074c919061233b565b60405180910390f35b61075d611a07565b60405161076a9190612371565b60405180910390f35b61078d6004803603810190610788919061205e565b611a2b565b60405161079a91906122c3565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107f85760019050610949565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561084b5760019050610949565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561089e5760019050610949565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108f15760019050610949565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109445760019050610949565b600090505b919050565b6005805461095b906125d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610987906125d0565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b6000806109e7611509565b506109f183610fed565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a7f91906123a8565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ae39190612371565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610b5b611509565b50610b6584610fed565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610bf057600080fd5b610bfb868684611acd565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610c5a9190612371565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cf757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d0057600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610da691906123fe565b905060005b84811015610ded57620f42408284610dc3919061242f565b610dcd91906123fe565b83610dd891906124bd565b92508080610de590612602565b915050610dab565b50620f42408583610dfe919061242f565b610e0891906123fe565b9250505092915050565b60075481565b60008181548110610e2857600080fd5b906000526020600020016000915090505481565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e9557600080fd5b610e9d611509565b508290508260086000828254610eb391906123a8565b92505081905550610ec48482611b0e565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f229190612371565b60405180910390a3610f32611bd3565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610fb5919061242f565b7f0000000000000000000000000000000000000000000000000000000000000000610fe091906123a8565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461103e919061242f565b611048919061242f565b61105291906123fe565b9050919050565b6000603c824261106991906124bd565b61107391906123fe565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806110bc85610f3e565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff166110e561199d565b6110ef9190612489565b6fffffffffffffffffffffffffffffffff16905061113d600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610d61565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061116e919061242f565b828461117a919061242f565b61118491906123fe565b9350505050919050565b600080600080600061119e61199d565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846111ca9190612489565b92506000836fffffffffffffffffffffffffffffffff1614156111f4576000945050505050611339565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061124382846fffffffffffffffffffffffffffffffff16610d61565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516113289190612356565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461139957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600061151f611cbb565b9750600060010288141561153e57600098505050505050505050611682565b611547886118d8565b955060018661155691906123a8565b905061156186610f87565b915061156b61118e565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506115a882611059565b925060008311156115dd576d04ee2d6d415b85acef81000000006115cc86856118ec565b6115d691906123fe565b93506115fa565b6d04ee2d6d415b85acef8100000000856115f791906123fe565b93505b61160960008560085484611deb565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561163d88611e51565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161166d9190612371565b60405180910390a16001985050505050505050505b90565b60068054611692906125d0565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906125d0565b801561170b5780601f106116e05761010080835404028352916020019161170b565b820191906000526020600020905b8154815290600101906020018083116116ee57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176f57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600061182b611509565b5061183584610fed565b9150611842338684611acd565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516118a19190612371565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f000000000000000000000000000000000000000000000000000000000000000061193191906123fe565b905060005b8481101561197857620f4240828461194e919061242f565b61195891906123fe565b8361196391906123a8565b9250808061197090612602565b915050611936565b50620f42408583611989919061242f565b61199391906123fe565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426119ee91906124bd565b6119f891906123fe565b611a0291906123a8565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8757600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611ada8584611eed565b50611ae58484611b0e565b50611aee61199d565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611b6b5760009350505050611bcd565b611b7486610f3e565b92508483611b8291906123a8565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611bea91906124bd565b81548110611c21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611c6e91906124bd565b81548110611ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611cd391906124bd565b81548110611d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611d7957600080fd5b505afa158015611d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190612164565b6fffffffffffffffffffffffffffffffff169050611dce826118d8565b8111611de257600060010292505050611de8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000611e5f846117d0565b9150620f42407f000000000000000000000000000000000000000000000000000000000000000083611e91919061242f565b611e9b91906123fe565b9050611ee2600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef810000000083611edd91906123fe565b611b0e565b508092505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611f4a5760009350505050611fef565b611f5386610f3e565b925084831015611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f9061231b565b60405180910390fd5b8483611fa491906124bd565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008135905061200481612712565b92915050565b60008135905061201981612729565b92915050565b60008135905061202e81612740565b92915050565b60008151905061204381612757565b92915050565b6000813590506120588161276e565b92915050565b60006020828403121561207057600080fd5b600061207e84828501611ff5565b91505092915050565b60008060006060848603121561209c57600080fd5b60006120aa86828701611ff5565b93505060206120bb86828701611ff5565b92505060406120cc86828701612049565b9150509250925092565b600080604083850312156120e957600080fd5b60006120f785828601611ff5565b925050602061210885828601612049565b9150509250929050565b60006020828403121561212457600080fd5b60006121328482850161200a565b91505092915050565b60006020828403121561214d57600080fd5b600061215b8482850161201f565b91505092915050565b60006020828403121561217657600080fd5b600061218484828501612034565b91505092915050565b60006020828403121561219f57600080fd5b60006121ad84828501612049565b91505092915050565b600080604083850312156121c957600080fd5b60006121d785828601612049565b92505060206121e885828601612049565b9150509250929050565b6121fb816124f1565b82525050565b61220a81612503565b82525050565b6122198161250f565b82525050565b600061222a8261238c565b6122348185612397565b935061224481856020860161259d565b61224d816126d8565b840191505092915050565b6000612265600d83612397565b9150612270826126e9565b602082019050919050565b61228481612545565b82525050565b6122938161258b565b82525050565b6122a281612581565b82525050565b60006020820190506122bd60008301846121f2565b92915050565b60006020820190506122d86000830184612201565b92915050565b60006020820190506122f36000830184612210565b92915050565b60006020820190508181036000830152612313818461221f565b905092915050565b6000602082019050818103600083015261233481612258565b9050919050565b6000602082019050612350600083018461227b565b92915050565b600060208201905061236b600083018461228a565b92915050565b60006020820190506123866000830184612299565b92915050565b600081519050919050565b600082825260208201905092915050565b60006123b382612581565b91506123be83612581565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156123f3576123f261264b565b5b828201905092915050565b600061240982612581565b915061241483612581565b9250826124245761242361267a565b5b828204905092915050565b600061243a82612581565b915061244583612581565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561247e5761247d61264b565b5b828202905092915050565b600061249482612545565b915061249f83612545565b9250828210156124b2576124b161264b565b5b828203905092915050565b60006124c882612581565b91506124d383612581565b9250828210156124e6576124e561264b565b5b828203905092915050565b60006124fc82612561565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061259682612545565b9050919050565b60005b838110156125bb5780820151818401526020810190506125a0565b838111156125ca576000848401525b50505050565b600060028204905060018216806125e857607f821691505b602082108114156125fc576125fb6126a9565b5b50919050565b600061260d82612581565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156126405761263f61264b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b61271b816124f1565b811461272657600080fd5b50565b6127328161250f565b811461273d57600080fd5b50565b61274981612519565b811461275457600080fd5b50565b61276081612545565b811461276b57600080fd5b50565b61277781612581565b811461278257600080fd5b5056fea264697066735822122069b6cd97967565dfb2e175d110410f789ea9f11b3ecaaf8389dfe61c7b06ff6264736f6c63430008040033
-\ No newline at end of file
+61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200076c565b6080908152503480156200003657600080fd5b506040516200333b3803806200333b83398181016040528101906200005c9190620004ad565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200032f565b508460079080519060200190620001489291906200032f565b508360ff166008819055504260038190555060035460a08181525050603c826200017391906200076c565b60c081815250506f4b3b4ca85a86c47a098a224000000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200022f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c0640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ad91906200062f565b600a8190555050505050505050620009e9565b6000807cffffffffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033d906200086a565b90600052602060002090601f016020900481019282620003615760008555620003ad565b82601f106200037c57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ac5782518255916020019190600101906200038f565b5b509050620003bc9190620003c0565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b6000620003f6620003f0846200059e565b62000575565b9050828152602081018484840111156200040f57600080fd5b6200041c84828562000834565b509392505050565b600081519050620004358162000981565b92915050565b600082601f8301126200044d57600080fd5b81516200045f848260208601620003df565b91505092915050565b60008151905062000479816200099b565b92915050565b6000815190506200049081620009b5565b92915050565b600081519050620004a781620009cf565b92915050565b60008060008060008060c08789031215620004c757600080fd5b600087015167ffffffffffffffff811115620004e257600080fd5b620004f089828a016200043b565b965050602087015167ffffffffffffffff8111156200050e57600080fd5b6200051c89828a016200043b565b95505060406200052f89828a0162000496565b94505060606200054289828a0162000468565b93505060806200055589828a016200047f565b92505060a06200056889828a0162000424565b9150509295509295509295565b60006200058162000594565b90506200058f8282620008a0565b919050565b6000604051905090565b600067ffffffffffffffff821115620005bc57620005bb62000934565b5b620005c78262000963565b9050602081019050919050565b6000808291508390505b60018511156200062657808604811115620005fe57620005fd620008d6565b5b60018516156200060e5780820291505b80810290506200061e8562000974565b9450620005de565b94509492505050565b60006200063c826200081d565b915062000649836200081d565b9250620006787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000680565b905092915050565b60008262000692576001905062000765565b81620006a2576000905062000765565b8160018114620006bb5760028114620006c657620006fc565b600191505062000765565b60ff841115620006db57620006da620008d6565b5b8360020a915084821115620006f557620006f4620008d6565b5b5062000765565b5060208310610133831016604e8410600b8410161715620007365782820a90508381111562000730576200072f620008d6565b5b62000765565b620007458484846001620005d4565b925090508184048111156200075f576200075e620008d6565b5b81810290505b9392505050565b600062000779826200081d565b915062000786836200081d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007c257620007c1620008d6565b5b828202905092915050565b6000620007da82620007fd565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200085457808201518184015260208101905062000837565b8381111562000864576000848401525b50505050565b600060028204905060018216806200088357607f821691505b602082108114156200089a576200089962000905565b5b50919050565b620008ab8262000963565b810181811067ffffffffffffffff82111715620008cd57620008cc62000934565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200098c81620007cd565b81146200099857600080fd5b50565b620009a681620007e1565b8114620009b257600080fd5b50565b620009c0816200081d565b8114620009cc57600080fd5b50565b620009da8162000827565b8114620009e657600080fd5b50565b60805160a05160c05160e0516128e062000a5b60003960008181610c1801528181610e6801526119eb0152600081816110b80152818161199a0152611a8a0152600081816110e401528181611aab0152611af00152600081816111470152818161117f01526111e701526128e06000f3fe608060405234801561001057600080fd5b506004361061025a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be11610158578063983b2d56116100d5578063e54d63f711610099578063e54d63f7146107c3578063e8095295146107f3578063eda4e6d614610811578063f2fde38b1461082f578063f83da35d1461085f5761025a565b8063983b2d56146106e55780639da7d8ba14610715578063a9059cbb14610745578063b470aade14610775578063e3ab207a146107935761025a565b806379ba50971161011c57806379ba50971461063d5780638d34855a1461065b5780638da5cb5b1461068b5780638f1df6bc146106a957806395d89b41146106c75761025a565b80636787a9be1461055f5780636a2d094e1461058f5780636ffa8a05146105bf57806370a08231146105ef578063731f237c1461061f5761025a565b806331333487116101e65780634abfbba2116101aa5780634abfbba21461049357806351b4541c146104c3578063573cc507146104f357806358b2833b146105115780636721d4ef1461052f5761025a565b806331333487146103b5578063313ce567146103e557806340452d9114610403578063449a52f81461043357806347a50517146104635761025a565b806318160ddd1161022d57806318160ddd146102fb5780631989c6a814610319578063229ba1971461033757806323b872dd146103555780633092afd5146103855761025a565b806301ffc9a71461025f57806306fdde031461028f578063095ea7b3146102ad57806309f28f3c146102dd575b600080fd5b610279600480360381019061027491906121c5565b61088f565b60405161028691906123d3565b60405180910390f35b610297610a3a565b6040516102a49190612409565b60405180910390f35b6102c760048036038101906102c29190612160565b610ac8565b6040516102d491906123d3565b60405180910390f35b6102e5610be2565b6040516102f2919061246b565b60405180910390f35b610303610c04565b60405161031091906124a1565b60405180910390f35b610321610c0a565b60405161032e91906124a1565b60405180910390f35b61033f610c16565b60405161034c91906124a1565b60405180910390f35b61036f600480360381019061036a9190612111565b610c3a565b60405161037c91906123d3565b60405180910390f35b61039f600480360381019061039a91906120e8565b610d5a565b6040516103ac91906123d3565b60405180910390f35b6103cf60048036038101906103ca9190612240565b610e4d565b6040516103dc91906124a1565b60405180910390f35b6103ed610f01565b6040516103fa91906124a1565b60405180910390f35b61041d60048036038101906104189190612217565b610f07565b60405161042a91906123ee565b60405180910390f35b61044d60048036038101906104489190612160565b610f2b565b60405161045a91906123d3565b60405180910390f35b61047d600480360381019061047891906120e8565b61106b565b60405161048a91906124a1565b60405180910390f35b6104ad60048036038101906104a89190612217565b6110b4565b6040516104ba91906124a1565b60405180910390f35b6104dd60048036038101906104d89190612217565b611114565b6040516104ea91906124a1565b60405180910390f35b6104fb611135565b60405161050891906124a1565b60405180910390f35b61051961113b565b60405161052691906124a1565b60405180910390f35b61054960048036038101906105449190612240565b611141565b60405161055691906124a1565b60405180910390f35b61057960048036038101906105749190612217565b6111b2565b60405161058691906124a1565b60405180910390f35b6105a960048036038101906105a49190612217565b611222565b6040516105b691906124a1565b60405180910390f35b6105d960048036038101906105d4919061219c565b611243565b6040516105e691906124a1565b60405180910390f35b610609600480360381019061060491906120e8565b61127f565b60405161061691906124a1565b60405180910390f35b610627611327565b60405161063491906123d3565b60405180910390f35b610645611446565b60405161065291906123d3565b60405180910390f35b6106756004803603810190610670919061219c565b6115ed565b60405161068291906124a1565b60405180910390f35b61069361161b565b6040516106a091906123b8565b60405180910390f35b6106b1611641565b6040516106be91906123d3565b60405180910390f35b6106cf61178b565b6040516106dc9190612409565b60405180910390f35b6106ff60048036038101906106fa91906120e8565b611819565b60405161070c91906123d3565b60405180910390f35b61072f600480360381019061072a919061219c565b6118d6565b60405161073c91906124a1565b60405180910390f35b61075f600480360381019061075a9190612160565b611902565b60405161076c91906123d3565b60405180910390f35b61077d611998565b60405161078a91906124a1565b60405180910390f35b6107ad60048036038101906107a8919061219c565b6119bc565b6040516107ba91906124a1565b60405180910390f35b6107dd60048036038101906107d89190612240565b6119d0565b6040516107ea91906124a1565b60405180910390f35b6107fb611a84565b604051610808919061246b565b60405180910390f35b610819611aee565b60405161082691906124a1565b60405180910390f35b610849600480360381019061084491906120e8565b611b12565b60405161085691906123d3565b60405180910390f35b6108796004803603810190610874919061227c565b611bb4565b60405161088691906123ee565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108e45760019050610a35565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109375760019050610a35565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561098a5760019050610a35565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109dd5760019050610a35565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a305760019050610a35565b600090505b919050565b60068054610a47906126cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a73906126cc565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081565b600080610ad3611641565b50610add836111b2565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b6b91906124d8565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bcf91906124a1565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610c47611641565b50610c51846111b2565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610cdc57600080fd5b610ce7868684611c23565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610d4691906124a1565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610de357503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610dec57600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610e91919061252e565b905060005b84811015610eda5764e8d4a510008284610eb0919061255f565b610eba919061252e565b83610ec591906125b9565b92508080610ed2906126fe565b915050610e96565b5064e8d4a510008583610eed919061255f565b610ef7919061252e565b9250505092915050565b60085481565b60008181548110610f1757600080fd5b906000526020600020016000915090505481565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb19061242b565b60405180910390fd5b610fc2611641565b50610fcc836111b2565b90508260096000828254610fe091906124d8565b92505081905550610ff18482611c48565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161104f91906124a1565b60405180910390a361105f611d0d565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826110e2919061255f565b7f000000000000000000000000000000000000000000000000000000000000000061110d91906124d8565b9050919050565b6000603c824261112491906125b9565b61112e919061252e565b9050919050565b600a5481565b60035481565b600080827f000000000000000000000000000000000000000000000000000000000000000061117091906125b9565b8461117b919061255f565b90507f0000000000000000000000000000000000000000000000000000000000000000816111a9919061252e565b91505092915050565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611211919061255f565b61121b919061252e565b9050919050565b6000603c824261123291906125b9565b61123c919061252e565b9050919050565b6000606860ff167cffffffffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061128e8561106b565b925061129b600354611114565b90506112d7600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610e4d565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e4000000611307919061255f565b8284611313919061255f565b61131d919061252e565b9350505050919050565b6000806000611337600354611114565b9150600082141561134d57600092505050611443565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905061138a8183610e4d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c826113cf919061255f565b6003546113dc91906124d8565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516114349190612486565b60405180910390a46001925050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115fb846118d6565b915061160684611243565b90506116128282611141565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000611657611327565b50611660611dfb565b9750600060010288141561167f57600098505050505050505050611788565b611688886119bc565b955060018661169791906124d8565b90506116a2866110b4565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506116e082611222565b925060008311156116fc576116f585846119d0565b9350611700565b8493505b61170f60008560095484611bb4565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561174387611f2b565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161177391906124a1565b60405180910390a16001985050505050505050505b90565b60078054611798906126cc565b80601f01602080910402602001604051908101604052809291908181526020018280546117c4906126cc565b80156118115780601f106117e657610100808354040283529160200191611811565b820191906000526020600020905b8154815290600101906020018083116117f457829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461187557600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061190f611641565b50611919846111b2565b9150611926338684611c23565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161198591906124a1565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611a14919061252e565b905060005b84811015611a5d5764e8d4a510008284611a33919061255f565b611a3d919061252e565b83611a4891906124d8565b92508080611a55906126fe565b915050611a19565b5064e8d4a510008583611a70919061255f565b611a7a919061252e565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ad591906125b9565b611adf919061252e565b611ae991906124d8565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b6e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807cffffffffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611c308584611f77565b50611c3b8484611c48565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611ca55760009350505050611d07565b611cae8661106b565b92508483611cbc91906124d8565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611d2b91906125b9565b81548110611d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611dad91906125b9565b81548110611de4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555060019250505090565b6000806000806001600080549050611e1391906125b9565b81548110611e4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611eb957600080fd5b505afa158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef191906121ee565b6fffffffffffffffffffffffffffffffff169050611f0e826119bc565b8111611f2257600060010292505050611f28565b81925050505b90565b600080611f37836115ed565b9050611f6d600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f68836111b2565b611c48565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611fd45760009350505050612079565b611fdd8661106b565b925084831015612022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120199061244b565b60405180910390fd5b848361202e91906125b9565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008135905061208e81612837565b92915050565b6000813590506120a38161284e565b92915050565b6000813590506120b881612865565b92915050565b6000815190506120cd8161287c565b92915050565b6000813590506120e281612893565b92915050565b6000602082840312156120fa57600080fd5b60006121088482850161207f565b91505092915050565b60008060006060848603121561212657600080fd5b60006121348682870161207f565b93505060206121458682870161207f565b9250506040612156868287016120d3565b9150509250925092565b6000806040838503121561217357600080fd5b60006121818582860161207f565b9250506020612192858286016120d3565b9150509250929050565b6000602082840312156121ae57600080fd5b60006121bc84828501612094565b91505092915050565b6000602082840312156121d757600080fd5b60006121e5848285016120a9565b91505092915050565b60006020828403121561220057600080fd5b600061220e848285016120be565b91505092915050565b60006020828403121561222957600080fd5b6000612237848285016120d3565b91505092915050565b6000806040838503121561225357600080fd5b6000612261858286016120d3565b9250506020612272858286016120d3565b9150509250929050565b6000806000806080858703121561229257600080fd5b60006122a0878288016120d3565b94505060206122b1878288016120d3565b93505060406122c2878288016120d3565b92505060606122d3878288016120d3565b91505092959194509250565b6122e8816125ed565b82525050565b6122f7816125ff565b82525050565b6123068161260b565b82525050565b6000612317826124bc565b61232181856124c7565b9350612331818560208601612699565b61233a816127d4565b840191505092915050565b6000612352600a836124c7565b915061235d826127e5565b602082019050919050565b6000612375600d836124c7565b91506123808261280e565b602082019050919050565b61239481612641565b82525050565b6123a381612687565b82525050565b6123b28161267d565b82525050565b60006020820190506123cd60008301846122df565b92915050565b60006020820190506123e860008301846122ee565b92915050565b600060208201905061240360008301846122fd565b92915050565b60006020820190508181036000830152612423818461230c565b905092915050565b6000602082019050818103600083015261244481612345565b9050919050565b6000602082019050818103600083015261246481612368565b9050919050565b6000602082019050612480600083018461238b565b92915050565b600060208201905061249b600083018461239a565b92915050565b60006020820190506124b660008301846123a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60006124e38261267d565b91506124ee8361267d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561252357612522612747565b5b828201905092915050565b60006125398261267d565b91506125448361267d565b92508261255457612553612776565b5b828204905092915050565b600061256a8261267d565b91506125758361267d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156125ae576125ad612747565b5b828202905092915050565b60006125c48261267d565b91506125cf8361267d565b9250828210156125e2576125e1612747565b5b828203905092915050565b60006125f88261265d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061269282612641565b9050919050565b60005b838110156126b757808201518184015260208101905061269c565b838111156126c6576000848401525b50505050565b600060028204905060018216806126e457607f821691505b602082108114156126f8576126f76127a5565b5b50919050565b60006127098261267d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561273c5761273b612747565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b612840816125ed565b811461284b57600080fd5b50565b6128578161260b565b811461286257600080fd5b50565b61286e81612615565b811461287957600080fd5b50565b61288581612641565b811461289057600080fd5b50565b61289c8161267d565b81146128a757600080fd5b5056fea26469706673582212205d06e18992135f6fef2320a6a1e02ee11de4a95d9a97ba191c6b77f0365bb50964736f6c63430008040033
+\ 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":"uint256","name":"_taxLevelMinute","type":"uint256"},{"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":"demurragePeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":[{"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":"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":"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":[{"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/test.sh b/python/test.sh
@@ -4,7 +4,8 @@ set -e
export PYTHONPATH=.
-modes=(MultiNocap MultiCap SingleCap SingleNocap)
+#modes=(MultiNocap MultiCap SingleCap SingleNocap)
+modes=(SingleCap SingleNocap) # other contracts need to be updted
for m in ${modes[@]}; do
ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py
ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_basic.py
@@ -22,10 +23,10 @@ for m in ${modes[@]}; do
ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py
done
-modes=(MultiCap MultiNocap)
-for m in ${modes[@]}; do
- ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_remainder.py
- ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py
-done
+#modes=(MultiCap MultiNocap)
+#for m in ${modes[@]}; do
+# ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_remainder.py
+# ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py
+#done
set +e
diff --git a/solidity/DemurrageTokenSingleCap.sol b/solidity/DemurrageTokenSingleCap.sol
@@ -14,10 +14,6 @@ contract DemurrageTokenSingleCap {
uint8 constant shiftRedistributionDemurrage = 104;
uint256 constant maskRedistributionDemurrage = 0x000000ffffffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 20) - 1) << 140
- uint8 constant shiftRedistributionIsUsed = 255;
- uint256 constant maskRedistributionIsUsed = 0x4000000000000000000000000000000000000000000000000000000000000000; // 1 << 255
-
-
// Account balances
mapping (address => uint256) account;
diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -2,17 +2,21 @@ pragma solidity > 0.6.11;
// SPDX-License-Identifier: GPL-3.0-or-later
-contract DemurrageTokenSingleNocap {
+contract DemurrageTokenSingleCap {
// Redistribution bit field, with associated shifts and masks
// (Uses sub-byte boundaries)
- bytes32[] public redistributions; // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
+ bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
uint8 constant shiftRedistributionPeriod = 0;
uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1
uint8 constant shiftRedistributionValue = 32;
uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32
- uint8 constant shiftRedistributionDemurrage = 140;
- uint256 constant maskRedistributionDemurrage = 0x000000000000000000000000fffff00000000000000000000000000000000000; // ((1 << 20) - 1) << 140
+ uint8 constant shiftRedistributionDemurrage = 104;
+ uint256 constant maskRedistributionDemurrage = 0x000000ffffffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 20) - 1) << 140
+
+ uint8 constant shiftRedistributionIsUsed = 255;
+ uint256 constant maskRedistributionIsUsed = 0x4000000000000000000000000000000000000000000000000000000000000000; // 1 << 255
+
// Account balances
mapping (address => uint256) account;
@@ -21,7 +25,9 @@ contract DemurrageTokenSingleNocap {
uint128 public demurrageAmount;
// Cached demurrage period; the period for which demurrageAmount was calculated
- uint128 public demurragePeriod;
+ //uint128 public demurragePeriod;
+ // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated
+ uint256 public demurrageTimestamp;
// Implements EIP172
address public owner;
@@ -45,7 +51,13 @@ contract DemurrageTokenSingleNocap {
// 128 bit resolution of the demurrage divisor
// (this constant x 1000000 is contained within 128 bits)
- uint256 constant ppmDivider = 100000000000000000000000000000000;
+ uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less
+
+ // remaining decimal positions of nanoDivider to reach 38, equals precision in growth and decay
+ uint256 constant growthResolutionFactor = 1000000000000;
+
+ // demurrage decimal width; 38 places
+ uint256 immutable resolutionFactor = nanoDivider * growthResolutionFactor;
// Timestamp of start of periods (time which contract constructor was called)
uint256 public immutable periodStart;
@@ -55,7 +67,7 @@ contract DemurrageTokenSingleNocap {
// Demurrage in ppm per minute
uint256 public immutable taxLevel;
-
+
// Addresses allowed to mint new tokens
mapping (address => bool) minter;
@@ -89,7 +101,7 @@ contract DemurrageTokenSingleNocap {
// EIP173
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173
- constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public {
+ constructor(string memory _name, string memory _symbol, uint8 _decimals, uint128 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public {
// ACL setup
owner = msg.sender;
minter[owner] = true;
@@ -100,12 +112,14 @@ contract DemurrageTokenSingleNocap {
decimals = _decimals;
// Demurrage setup
- periodStart = block.timestamp;
+ demurrageTimestamp = block.timestamp;
+ periodStart = demurrageTimestamp;
periodDuration = _periodMinutes * 60;
- demurrageAmount = uint128(ppmDivider * 1000000); // Represents 38 decimal places
- demurragePeriod = 1;
+ //demurrageAmount = 100000000000000000000000000000000000000 - _taxLevelMinute; // Represents 38 decimal places, same as resolutionFactor
+ demurrageAmount = 100000000000000000000000000000000000000;
+ //demurragePeriod = 1;
taxLevel = _taxLevelMinute; // Represents 38 decimal places
- bytes32 initialRedistribution = toRedistribution(0, 1000000, 0, 1);
+ bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1);
redistributions.push(initialRedistribution);
// Misc settings
@@ -135,11 +149,12 @@ contract DemurrageTokenSingleNocap {
baseBalance = baseBalanceOf(_account);
- periodCount = actualPeriod() - demurragePeriod;
+ //periodCount = actualPeriod() - demurragePeriod;
+ periodCount = getMinutesDelta(demurrageTimestamp);
currentDemurragedAmount = uint128(decayBy(demurrageAmount, periodCount));
- return (baseBalance * currentDemurragedAmount) / (ppmDivider * 1000000);
+ return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000);
}
/// Balance unmodified by demurrage
@@ -187,10 +202,10 @@ contract DemurrageTokenSingleNocap {
function mintTo(address _beneficiary, uint256 _amount) external returns (bool) {
uint256 baseAmount;
- require(minter[msg.sender]);
+ require(minter[msg.sender], 'ERR_ACCESS');
changePeriod();
- baseAmount = _amount;
+ baseAmount = toBaseAmount(_amount);
totalSupply += _amount;
increaseBaseBalance(_beneficiary, baseAmount);
emit Mint(msg.sender, _beneficiary, _amount);
@@ -200,7 +215,7 @@ contract DemurrageTokenSingleNocap {
// Deserializes the redistribution word
// uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
- function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) private pure returns(bytes32) {
+ function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) {
bytes32 redistribution;
redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage);
@@ -232,10 +247,13 @@ contract DemurrageTokenSingleNocap {
// Save the current total supply amount to the current redistribution period
function saveRedistributionSupply() private returns (bool) {
uint256 currentRedistribution;
+ uint256 grownSupply;
+ //grownSupply = growBy(totalSupply, 1);
+ grownSupply = totalSupply;
currentRedistribution = uint256(redistributions[redistributions.length-1]);
currentRedistribution &= (~maskRedistributionValue);
- currentRedistribution |= (totalSupply << shiftRedistributionValue);
+ currentRedistribution |= (grownSupply << shiftRedistributionValue);
redistributions[redistributions.length-1] = bytes32(currentRedistribution);
return true;
@@ -259,35 +277,54 @@ contract DemurrageTokenSingleNocap {
return lastRedistribution;
}
- // Returns the amount sent to the sink address
- function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) {
+ function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) {
+ uint256 difference;
+
+ difference = _supply * (resolutionFactor - _demurrageAmount); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider));
+ return difference / resolutionFactor;
+ }
+
+ function getDistributionFromRedistribution(bytes32 _redistribution) public returns (uint256) {
uint256 redistributionSupply;
- uint256 unit;
+ uint256 redistributionDemurrage;
redistributionSupply = toRedistributionSupply(_redistribution);
+ redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution);
+ return getDistribution(redistributionSupply, redistributionDemurrage);
+ }
- unit = (redistributionSupply * taxLevel) / 1000000;
-
- increaseBaseBalance(sinkAddress, unit / ppmDivider);
+ // Returns the amount sent to the sink address
+ function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) {
+ uint256 unit;
+
+ unit = getDistributionFromRedistribution(_redistribution);
+ increaseBaseBalance(sinkAddress, toBaseAmount(unit));
return unit;
}
+ // Calculate the time delta in whole minutes passed between given timestamp and current timestamp
+ function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) {
+ return (block.timestamp - _lastTimestamp) / 60;
+ }
+
// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
function applyDemurrage() public returns (bool) {
- uint128 epochPeriodCount;
- uint128 periodCount;
+ //uint128 epochPeriodCount;
+ uint256 periodCount;
uint256 lastDemurrageAmount;
- uint256 newDemurrageAmount;
- epochPeriodCount = actualPeriod();
- periodCount = epochPeriodCount - demurragePeriod;
+ //epochPeriodCount = actualPeriod();
+ //periodCount = epochPeriodCount - demurragePeriod;
+
+ periodCount = getMinutesDelta(demurrageTimestamp);
if (periodCount == 0) {
return false;
}
lastDemurrageAmount = demurrageAmount;
demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount));
- demurragePeriod = epochPeriodCount;
- emit Decayed(epochPeriodCount, periodCount, lastDemurrageAmount, demurrageAmount);
+ //demurragePeriod = epochPeriodCount;
+ demurrageTimestamp = demurrageTimestamp + (periodCount * 60);
+ emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount);
return true;
}
@@ -312,6 +349,7 @@ contract DemurrageTokenSingleNocap {
uint256 periodTimestamp;
uint256 nextPeriod;
+ applyDemurrage();
currentRedistribution = checkPeriod();
if (currentRedistribution == bytes32(0x00)) {
return false;
@@ -321,20 +359,19 @@ contract DemurrageTokenSingleNocap {
nextPeriod = currentPeriod + 1;
periodTimestamp = getPeriodTimeDelta(currentPeriod);
- applyDemurrage();
currentDemurrageAmount = demurrageAmount;
demurrageCounts = demurrageCycles(periodTimestamp);
if (demurrageCounts > 0) {
- nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts) / ppmDivider;
+ nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts);
} else {
- nextRedistributionDemurrage = currentDemurrageAmount / ppmDivider;
+ nextRedistributionDemurrage = currentDemurrageAmount;
}
nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod);
redistributions.push(nextRedistribution);
- applyDefaultRedistribution(currentRedistribution);
+ applyDefaultRedistribution(nextRedistribution);
emit Period(nextPeriod);
return true;
}
@@ -344,33 +381,32 @@ contract DemurrageTokenSingleNocap {
uint256 valueFactor;
uint256 truncatedTaxLevel;
- valueFactor = 1000000;
- truncatedTaxLevel = taxLevel / ppmDivider;
+ valueFactor = growthResolutionFactor;
+ truncatedTaxLevel = taxLevel / nanoDivider;
for (uint256 i = 0; i < _period; i++) {
- valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / 1000000);
+ valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor);
}
- return (valueFactor * _value) / 1000000;
+ return (valueFactor * _value) / growthResolutionFactor;
}
// Calculate a value reduced by demurrage by the given period
- // TODO: higher precision if possible
function decayBy(uint256 _value, uint256 _period) public view returns (uint256) {
uint256 valueFactor;
uint256 truncatedTaxLevel;
- valueFactor = 1000000;
- truncatedTaxLevel = taxLevel / ppmDivider;
+ valueFactor = growthResolutionFactor;
+ truncatedTaxLevel = taxLevel / nanoDivider;
for (uint256 i = 0; i < _period; i++) {
- valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / 1000000);
+ valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / growthResolutionFactor);
}
- return (valueFactor * _value) / 1000000;
+ return (valueFactor * _value) / growthResolutionFactor;
}
// Inflates the given amount according to the current demurrage modifier
function toBaseAmount(uint256 _value) public view returns (uint256) {
- return (_value * ppmDivider * 1000000) / demurrageAmount;
+ return (_value * resolutionFactor) / demurrageAmount;
}
// Implements ERC20, triggers tax and/or redistribution
@@ -398,7 +434,6 @@ contract DemurrageTokenSingleNocap {
return result;
}
-
// Implements ERC20, triggers tax and/or redistribution
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
uint256 baseValue;
@@ -421,7 +456,7 @@ contract DemurrageTokenSingleNocap {
decreaseBaseBalance(_from, _value);
increaseBaseBalance(_to, _value);
- period = actualPeriod();
+ //period = actualPeriod();
return true;
}