diff --git a/.gitignore b/.gitignore index 971bc59..8250e11 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ /node_modules/ /artifacts/**/*.json !/artifacts/contracts/RenPool.sol/RenPool.json +!/artifacts/contracts/RenPoolFactory.sol/RenPoolFactory.json !/artifacts/@renproject/gateway-sol/contracts/Gateway/interfaces/IERC20Standard.sol/IERC20Standard.json !/artifacts/interfaces/IDarknodeRegistry.sol/IDarknodeRegistry.json /cache/ diff --git a/artifacts/contracts/RenPool.sol/RenPool.json b/artifacts/contracts/RenPool.sol/RenPool.json index 31873fe..22bd8a5 100644 --- a/artifacts/contracts/RenPool.sol/RenPool.json +++ b/artifacts/contracts/RenPool.sol/RenPool.json @@ -118,6 +118,63 @@ "name": "RenDeposited", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "RenWithdrawalRequestCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "RenWithdrawalRequestFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "RenWithdrawalRequested", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -252,6 +309,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "cancelWithdrawalRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "claimRewards", @@ -361,7 +425,7 @@ "type": "address" } ], - "name": "fulfillWithdrawRequest", + "name": "fulfillWithdrawalRequest", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -411,6 +475,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "isRegistered", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -574,7 +651,7 @@ "type": "uint256" } ], - "name": "requestWithdraw", + "name": "requestWithdrawal", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -592,6 +669,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "totalWithdrawalRequested", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "unlockPool", @@ -627,7 +717,7 @@ "type": "address" } ], - "name": "withdrawRequests", + "name": "withdrawalRequests", "outputs": [ { "internalType": "uint256", @@ -643,8 +733,8 @@ "type": "receive" } ], - "bytecode": "0x60806040523480156200001157600080fd5b5060405162003b2e38038062003b2e833981810160405281019062000037919062000273565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806004819055506000600860006101000a81548160ff0219169083151502179055506000600581905550600560068190555060056007819055505050505050505050620003b3565b60008151905062000256816200037f565b92915050565b6000815190506200026d8162000399565b92915050565b600080600080600080600080610100898b0312156200029757620002966200037a565b5b6000620002a78b828c0162000245565b9850506020620002ba8b828c0162000245565b9750506040620002cd8b828c0162000245565b9650506060620002e08b828c0162000245565b9550506080620002f38b828c0162000245565b94505060a0620003068b828c0162000245565b93505060c0620003198b828c0162000245565b92505060e06200032c8b828c016200025c565b9150509295985092959890939650565b6000620003498262000350565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b6200038a816200033c565b81146200039657600080fd5b50565b620003a48162000370565b8114620003b057600080fd5b50565b61376b80620003c36000396000f3fe6080604052600436106101e75760003560e01c80637ecebe0011610102578063b6b34c6711610095578063d693452e11610064578063d693452e14610707578063e39f610114610732578063e438a77d1461075d578063e7585aea146107745761023c565b8063b6b34c6714610671578063b6b55f251461069c578063b7eb85c4146106c5578063d5b2a01a146106dc5761023c565b80639e45e0d0116100d15780639e45e0d0146105b5578063a4e2d634146105e0578063ac3479871461060b578063b46ff3c3146106485761023c565b80637ecebe001461050b57806389026538146105485780638da5cb5b1461055f578063901a64981461058a5761023c565b806352df49ec1161017a5780636ec21cc8116101495780636ec21cc81461043d57806370a082311461046857806371bbef36146104a5578063745400c9146104e25761023c565b806352df49ec1461038157806363ffab31146103be57806364c9ec6f146103e95780636664e42e146104145761023c565b80632e0f2625116101b65780632e0f2625146102d75780632e1a7d4d1461030257806334246f9b1461032b578063372500ab146103565761023c565b8063023c5b08146102415780631261795d1461026c57806313a0ae2b1461028357806327e235e31461029a5761023c565b3661023c573373ffffffffffffffffffffffffffffffffffffffff167f66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c346040516102329190612ff7565b60405180910390a2005b600080fd5b34801561024d57600080fd5b5061025661079d565b6040516102639190612bba565b60405180910390f35b34801561027857600080fd5b506102816107c3565b005b34801561028f57600080fd5b50610298610934565b005b3480156102a657600080fd5b506102c160048036038101906102bc91906125c2565b6109e5565b6040516102ce9190612ff7565b60405180910390f35b3480156102e357600080fd5b506102ec6109fd565b6040516102f99190613072565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612841565b610a02565b005b34801561033757600080fd5b50610340610c9a565b60405161034d9190612d41565b60405180910390f35b34801561036257600080fd5b5061036b610cc0565b6040516103789190612cf0565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906125c2565b610ce6565b6040516103b59190612ff7565b60405180910390f35b3480156103ca57600080fd5b506103d3610cfe565b6040516103e09190612cce565b60405180910390f35b3480156103f557600080fd5b506103fe610d8c565b60405161040b9190612ff7565b60405180910390f35b34801561042057600080fd5b5061043b6004803603810190610436919061278e565b610d92565b005b34801561044957600080fd5b50610452610fc4565b60405161045f9190612ff7565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a91906125c2565b610fca565b60405161049c9190612ff7565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c7919061271f565b611013565b6040516104d99190612ff7565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612841565b611176565b005b34801561051757600080fd5b50610532600480360381019061052d91906125c2565b6112a6565b60405161053f9190612ff7565b60405180910390f35b34801561055457600080fd5b5061055d6112be565b005b34801561056b57600080fd5b506105746114da565b6040516105819190612bba565b60405180910390f35b34801561059657600080fd5b5061059f6114fe565b6040516105ac9190612bba565b60405180910390f35b3480156105c157600080fd5b506105ca611524565b6040516105d79190612d26565b60405180910390f35b3480156105ec57600080fd5b506105f561154a565b6040516106029190612c67565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d91906126d6565b61155d565b60405161063f9190612ff7565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a91906125c2565b611699565b005b34801561067d57600080fd5b50610686611a03565b6040516106939190612d0b565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190612841565b611a29565b005b3480156106d157600080fd5b506106da611cd9565b005b3480156106e857600080fd5b506106f1611ecc565b6040516106fe9190612ff7565b60405180910390f35b34801561071357600080fd5b5061071c611ed2565b6040516107299190612d5c565b60405180910390f35b34801561073e57600080fd5b50610747611ef8565b6040516107549190612ff7565b60405180910390f35b34801561076957600080fd5b50610772611efe565b005b34801561078057600080fd5b5061079b600480360381019061079691906125ef565b612095565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a90612f77565b60405180910390fd5b6000479050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156108c0573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109299190612ff7565b60405180910390a250565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa89401a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016109b19190612bba565b600060405180830381600087803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b50505050565b60096020528060005260406000206000915090505481565b601281565b60003390506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081118015610a5b5750828110155b610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190612ef7565b60405180910390fd5b600860009054906101000a900460ff1615610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190612e37565b60405180910390fd5b8260056000828254610afc91906131a2565b9250508190555082600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b5291906131a2565b92505081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b8152600401610bb6929190612c3e565b602060405180830381600087803b158015610bd057600080fd5b505af1158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c08919061264f565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90612e77565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f315d4ef2c32c6e9b2d2364f5d35c06ffb3427d08357493b104b90799c99c1e3c84604051610c8d9190612ff7565b60405180910390a2505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915090505481565b60038054610d0b90613319565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3790613319565b8015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b505050505081565b60045481565b60008585604051602001610da7929190612d99565b6040516020818303038152906040528051906020012090506000838583604051602001610dd69392919061303b565b6040516020818303038152906040528051906020012090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364936b1e896040518263ffffffff1660e01b8152600401610e4b9190612d77565b60206040518083038186803b158015610e6357600080fd5b505afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b91906126a9565b73ffffffffffffffffffffffffffffffffffffffff1663159ab14d848885886040518563ffffffff1660e01b8152600401610ed99493929190612c82565b602060405180830381600087803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b919061286e565b9050610f6c6040518060400160405280600a81526020017f6d696e74416d6f756e74000000000000000000000000000000000000000000008152508261225d565b3373ffffffffffffffffffffffffffffffffffffffff167f5387ab2b2012a616dcfbc6c0f6c6f7a6ef5b3fc7c7740476f7b20b65f50d597282604051610fb29190612ff7565b60405180910390a25050505050505050565b60055481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080339050600061271090506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a430147f8888856040518463ffffffff1660e01b815260040161108193929190612dc9565b602060405180830381600087803b15801561109b57600080fd5b505af11580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d3919061286e565b905080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e3258683604051611161929190613012565b60405180910390a28093505050509392505050565b60003390506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811180156111cf5750828110155b61120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590612ef7565b60405180910390fd5b600860009054906101000a900460ff1661125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490612fd7565b60405180910390fd5b82600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600b6020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113655750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90612eb7565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114019190612bba565b60206040518083038186803b15801561141957600080fd5b505afa15801561142d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611451919061286e565b11611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890612e97565b60405180910390fd5b6000600860006101000a81548160ff0219169083151502179055507fde17ec5ba6f9b5379a238e2a199366faccaedccf87879284014517333da74e2660405160405180910390a1565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900460ff1681565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa74f1f836040518263ffffffff1660e01b81526004016115ba9190612d77565b60206040518083038186803b1580156115d257600080fd5b505afa1580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a919061267c565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116429190612bba565b60206040518083038186803b15801561165a57600080fd5b505afa15801561166e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611692919061286e565b9050919050565b60003390506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600860009054906101000a900460ff16611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890612fd7565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611780919061314c565b9250508190555080600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117d691906131a2565b92505081905550600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b815260040161187f93929190612bd5565b602060405180830381600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d1919061264f565b611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790612e57565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161196d929190612c3e565b602060405180830381600087803b15801561198757600080fd5b505af115801561199b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bf919061264f565b6119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590612f37565b60405180910390fd5b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000339050600860009054906101000a900460ff1615611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590612f57565b60405180910390fd5b60008211611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890612fb7565b60405180910390fd5b60045460055483611ad2919061314c565b1115611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90612f17565b60405180910390fd5b81600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b62919061314c565b925050819055508160056000828254611b7b919061314c565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9c4f7a1cc1751ba83a1ddccc2da94b1fcfc4efaa2c546f277e551b2dd9c0500583604051611bc89190612ff7565b60405180910390a26004546005541415611be557611be46122f9565b5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230856040518463ffffffff1660e01b8152600401611c4493929190612bd5565b602060405180830381600087803b158015611c5e57600080fd5b505af1158015611c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c96919061264f565b611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90612ed7565b60405180910390fd5b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090612f77565b60405180910390fd5b600860009054906101000a900460ff16611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90612fd7565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b8152600401611e39929190612c3e565b602060405180830381600087803b158015611e5357600080fd5b505af1158015611e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8b919061264f565b611eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec190612f97565b60405180910390fd5b565b60065481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611fa55750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90612eb7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384ac33ec600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120619190612bba565b600060405180830381600087803b15801561207b57600080fd5b505af115801561208f573d6000803e3d6000fd5b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c90612f77565b60405180910390fd5b600860009054906101000a900460ff16612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90612fd7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324b8fbf68484846040518463ffffffff1660e01b81526004016121d393929190612c0c565b600060405180830381600087803b1580156121ed57600080fd5b505af1158015612201573d6000803e3d6000fd5b5050505082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081816003919061225792919061236b565b50505050565b6122f58282604051602401612273929190612e07565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612342565b5050565b6001600860006101000a81548160ff0219169083151502179055507f2e136745550967f28b779ce8c395ca060a2f844edfb5b06631fe677f66f9e30560405160405180910390a1565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461237790613319565b90600052602060002090601f01602090048101928261239957600085556123e0565b82601f106123b257803560ff19168380011785556123e0565b828001600101855582156123e0579182015b828111156123df5782358255916020019190600101906123c4565b5b5090506123ed91906123f1565b5090565b5b8082111561240a5760008160009055506001016123f2565b5090565b600061242161241c846130b2565b61308d565b90508281526020810184848401111561243d5761243c613418565b5b6124488482856132d7565b509392505050565b600061246361245e846130e3565b61308d565b90508281526020810184848401111561247f5761247e613418565b5b61248a8482856132d7565b509392505050565b6000813590506124a1816136c2565b92915050565b6000815190506124b6816136d9565b92915050565b60008083601f8401126124d2576124d161340e565b5b8235905067ffffffffffffffff8111156124ef576124ee613409565b5b60208301915083600182028301111561250b5761250a613413565b5b9250929050565b600082601f8301126125275761252661340e565b5b813561253784826020860161240e565b91505092915050565b60008151905061254f816136f0565b92915050565b60008151905061256481613707565b92915050565b600082601f83011261257f5761257e61340e565b5b813561258f848260208601612450565b91505092915050565b6000813590506125a78161371e565b92915050565b6000815190506125bc8161371e565b92915050565b6000602082840312156125d8576125d7613422565b5b60006125e684828501612492565b91505092915050565b60008060006040848603121561260857612607613422565b5b600061261686828701612492565b935050602084013567ffffffffffffffff8111156126375761263661341d565b5b612643868287016124bc565b92509250509250925092565b60006020828403121561266557612664613422565b5b6000612673848285016124a7565b91505092915050565b60006020828403121561269257612691613422565b5b60006126a084828501612540565b91505092915050565b6000602082840312156126bf576126be613422565b5b60006126cd84828501612555565b91505092915050565b6000602082840312156126ec576126eb613422565b5b600082013567ffffffffffffffff81111561270a5761270961341d565b5b6127168482850161256a565b91505092915050565b60008060006060848603121561273857612737613422565b5b600084013567ffffffffffffffff8111156127565761275561341d565b5b6127628682870161256a565b935050602061277386828701612492565b925050604061278486828701612598565b9150509250925092565b600080600080600060a086880312156127aa576127a9613422565b5b600086013567ffffffffffffffff8111156127c8576127c761341d565b5b6127d48882890161256a565b95505060206127e588828901612492565b94505060406127f688828901612598565b935050606061280788828901612598565b925050608086013567ffffffffffffffff8111156128285761282761341d565b5b61283488828901612512565b9150509295509295909350565b60006020828403121561285757612856613422565b5b600061286584828501612598565b91505092915050565b60006020828403121561288457612883613422565b5b6000612892848285016125ad565b91505092915050565b6128a4816131d6565b82525050565b6128b3816131e8565b82525050565b6128c2816131f4565b82525050565b60006128d4838561312a565b93506128e18385846132d7565b6128ea83613427565b840190509392505050565b600061290082613114565b61290a818561312a565b935061291a8185602086016132e6565b61292381613427565b840191505092915050565b61293781613259565b82525050565b6129468161326b565b82525050565b6129558161327d565b82525050565b6129648161328f565b82525050565b612973816132a1565b82525050565b60006129848261311f565b61298e818561313b565b935061299e8185602086016132e6565b6129a781613427565b840191505092915050565b60006129bf600e8361313b565b91506129ca82613438565b602082019050919050565b60006129e2600e8361313b565b91506129ed82613461565b602082019050919050565b6000612a05600f8361313b565b9150612a108261348a565b602082019050919050565b6000612a2860148361313b565b9150612a33826134b3565b602082019050919050565b6000612a4b602e8361313b565b9150612a56826134dc565b604082019050919050565b6000612a6e60178361313b565b9150612a798261352b565b602082019050919050565b6000612a9160128361313b565b9150612a9c82613554565b602082019050919050565b6000612ab4601e8361313b565b9150612abf8261357d565b602082019050919050565b6000612ad7600d8361313b565b9150612ae2826135a6565b602082019050919050565b6000612afa60178361313b565b9150612b05826135cf565b602082019050919050565b6000612b1d60248361313b565b9150612b28826135f8565b604082019050919050565b6000612b4060148361313b565b9150612b4b82613647565b602082019050919050565b6000612b6360178361313b565b9150612b6e82613670565b602082019050919050565b6000612b8660128361313b565b9150612b9182613699565b602082019050919050565b612ba581613242565b82525050565b612bb48161324c565b82525050565b6000602082019050612bcf600083018461289b565b92915050565b6000606082019050612bea600083018661289b565b612bf7602083018561289b565b612c046040830184612b9c565b949350505050565b6000604082019050612c21600083018661289b565b8181036020830152612c348184866128c8565b9050949350505050565b6000604082019050612c53600083018561289b565b612c606020830184612b9c565b9392505050565b6000602082019050612c7c60008301846128aa565b92915050565b6000608082019050612c9760008301876128b9565b612ca46020830186612b9c565b612cb160408301856128b9565b8181036060830152612cc381846128f5565b905095945050505050565b60006020820190508181036000830152612ce881846128f5565b905092915050565b6000602082019050612d05600083018461292e565b92915050565b6000602082019050612d20600083018461293d565b92915050565b6000602082019050612d3b600083018461294c565b92915050565b6000602082019050612d56600083018461295b565b92915050565b6000602082019050612d71600083018461296a565b92915050565b60006020820190508181036000830152612d918184612979565b905092915050565b60006040820190508181036000830152612db38185612979565b9050612dc2602083018461289b565b9392505050565b60006060820190508181036000830152612de38186612979565b9050612df2602083018561289b565b612dff6040830184612b9c565b949350505050565b60006040820190508181036000830152612e218185612979565b9050612e306020830184612b9c565b9392505050565b60006020820190508181036000830152612e50816129b2565b9050919050565b60006020820190508181036000830152612e70816129d5565b9050919050565b60006020820190508181036000830152612e90816129f8565b9050919050565b60006020820190508181036000830152612eb081612a1b565b9050919050565b60006020820190508181036000830152612ed081612a3e565b9050919050565b60006020820190508181036000830152612ef081612a61565b9050919050565b60006020820190508181036000830152612f1081612a84565b9050919050565b60006020820190508181036000830152612f3081612aa7565b9050919050565b60006020820190508181036000830152612f5081612aca565b9050919050565b60006020820190508181036000830152612f7081612aed565b9050919050565b60006020820190508181036000830152612f9081612b10565b9050919050565b60006020820190508181036000830152612fb081612b33565b9050919050565b60006020820190508181036000830152612fd081612b56565b9050919050565b60006020820190508181036000830152612ff081612b79565b9050919050565b600060208201905061300c6000830184612b9c565b92915050565b60006040820190506130276000830185612b9c565b6130346020830184612b9c565b9392505050565b60006060820190506130506000830186612b9c565b61305d6020830185612b9c565b61306a60408301846128b9565b949350505050565b60006020820190506130876000830184612bab565b92915050565b60006130976130a8565b90506130a3828261334b565b919050565b6000604051905090565b600067ffffffffffffffff8211156130cd576130cc6133da565b5b6130d682613427565b9050602081019050919050565b600067ffffffffffffffff8211156130fe576130fd6133da565b5b61310782613427565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061315782613242565b915061316283613242565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131975761319661337c565b5b828201905092915050565b60006131ad82613242565b91506131b883613242565b9250828210156131cb576131ca61337c565b5b828203905092915050565b60006131e182613222565b9050919050565b60008115159050919050565b6000819050919050565b6000613209826131d6565b9050919050565b600061321b826131d6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613264826132b3565b9050919050565b6000613276826132b3565b9050919050565b6000613288826132b3565b9050919050565b600061329a826132b3565b9050919050565b60006132ac826132b3565b9050919050565b60006132be826132c5565b9050919050565b60006132d082613222565b9050919050565b82818337600083830152505050565b60005b838110156133045780820151818401526020810190506132e9565b83811115613313576000848401525b50505050565b6000600282049050600182168061333157607f821691505b60208210811415613345576133446133ab565b5b50919050565b61335482613427565b810181811067ffffffffffffffff82111715613373576133726133da565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f506f6f6c206973206c6f636b6564000000000000000000000000000000000000600082015250565b7f4465706f736974206661696c6564000000000000000000000000000000000000600082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f506f6f6c2062616c616e6365206973207a65726f000000000000000000000000600082015250565b7f52656e506f6f6c3a2043616c6c6572206973206e6f74206f776e6572206e6f7260008201527f206e6f6465206f70657261746f72000000000000000000000000000000000000602082015250565b7f52656e506f6f6c3a204465706f736974206661696c6564000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f52656e506f6f6c3a20416d6f756e742073757270617373657320626f6e640000600082015250565b7f526566756e64206661696c656400000000000000000000000000000000000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206c6f636b6564000000000000000000600082015250565b7f52656e506f6f6c3a2043616c6c6572206973206e6f74206e6f6465206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f426f6e64207472616e73666572206661696c6564000000000000000000000000600082015250565b7f52656e506f6f6c3a20496e76616c696420616d6f756e74000000000000000000600082015250565b7f506f6f6c206973206e6f74206c6f636b65640000000000000000000000000000600082015250565b6136cb816131d6565b81146136d657600080fd5b50565b6136e2816131e8565b81146136ed57600080fd5b50565b6136f9816131fe565b811461370457600080fd5b50565b61371081613210565b811461371b57600080fd5b50565b61372781613242565b811461373257600080fd5b5056fea2646970667358221220b0d239bd9fe04d0230d54cf2c6df16857e519ea8e0f4b0c4eb56909278c44d2764736f6c63430008070033", - "deployedBytecode": "0x6080604052600436106101e75760003560e01c80637ecebe0011610102578063b6b34c6711610095578063d693452e11610064578063d693452e14610707578063e39f610114610732578063e438a77d1461075d578063e7585aea146107745761023c565b8063b6b34c6714610671578063b6b55f251461069c578063b7eb85c4146106c5578063d5b2a01a146106dc5761023c565b80639e45e0d0116100d15780639e45e0d0146105b5578063a4e2d634146105e0578063ac3479871461060b578063b46ff3c3146106485761023c565b80637ecebe001461050b57806389026538146105485780638da5cb5b1461055f578063901a64981461058a5761023c565b806352df49ec1161017a5780636ec21cc8116101495780636ec21cc81461043d57806370a082311461046857806371bbef36146104a5578063745400c9146104e25761023c565b806352df49ec1461038157806363ffab31146103be57806364c9ec6f146103e95780636664e42e146104145761023c565b80632e0f2625116101b65780632e0f2625146102d75780632e1a7d4d1461030257806334246f9b1461032b578063372500ab146103565761023c565b8063023c5b08146102415780631261795d1461026c57806313a0ae2b1461028357806327e235e31461029a5761023c565b3661023c573373ffffffffffffffffffffffffffffffffffffffff167f66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c346040516102329190612ff7565b60405180910390a2005b600080fd5b34801561024d57600080fd5b5061025661079d565b6040516102639190612bba565b60405180910390f35b34801561027857600080fd5b506102816107c3565b005b34801561028f57600080fd5b50610298610934565b005b3480156102a657600080fd5b506102c160048036038101906102bc91906125c2565b6109e5565b6040516102ce9190612ff7565b60405180910390f35b3480156102e357600080fd5b506102ec6109fd565b6040516102f99190613072565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612841565b610a02565b005b34801561033757600080fd5b50610340610c9a565b60405161034d9190612d41565b60405180910390f35b34801561036257600080fd5b5061036b610cc0565b6040516103789190612cf0565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906125c2565b610ce6565b6040516103b59190612ff7565b60405180910390f35b3480156103ca57600080fd5b506103d3610cfe565b6040516103e09190612cce565b60405180910390f35b3480156103f557600080fd5b506103fe610d8c565b60405161040b9190612ff7565b60405180910390f35b34801561042057600080fd5b5061043b6004803603810190610436919061278e565b610d92565b005b34801561044957600080fd5b50610452610fc4565b60405161045f9190612ff7565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a91906125c2565b610fca565b60405161049c9190612ff7565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c7919061271f565b611013565b6040516104d99190612ff7565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612841565b611176565b005b34801561051757600080fd5b50610532600480360381019061052d91906125c2565b6112a6565b60405161053f9190612ff7565b60405180910390f35b34801561055457600080fd5b5061055d6112be565b005b34801561056b57600080fd5b506105746114da565b6040516105819190612bba565b60405180910390f35b34801561059657600080fd5b5061059f6114fe565b6040516105ac9190612bba565b60405180910390f35b3480156105c157600080fd5b506105ca611524565b6040516105d79190612d26565b60405180910390f35b3480156105ec57600080fd5b506105f561154a565b6040516106029190612c67565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d91906126d6565b61155d565b60405161063f9190612ff7565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a91906125c2565b611699565b005b34801561067d57600080fd5b50610686611a03565b6040516106939190612d0b565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190612841565b611a29565b005b3480156106d157600080fd5b506106da611cd9565b005b3480156106e857600080fd5b506106f1611ecc565b6040516106fe9190612ff7565b60405180910390f35b34801561071357600080fd5b5061071c611ed2565b6040516107299190612d5c565b60405180910390f35b34801561073e57600080fd5b50610747611ef8565b6040516107549190612ff7565b60405180910390f35b34801561076957600080fd5b50610772611efe565b005b34801561078057600080fd5b5061079b600480360381019061079691906125ef565b612095565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a90612f77565b60405180910390fd5b6000479050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156108c0573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109299190612ff7565b60405180910390a250565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa89401a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016109b19190612bba565b600060405180830381600087803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b50505050565b60096020528060005260406000206000915090505481565b601281565b60003390506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081118015610a5b5750828110155b610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190612ef7565b60405180910390fd5b600860009054906101000a900460ff1615610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190612e37565b60405180910390fd5b8260056000828254610afc91906131a2565b9250508190555082600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b5291906131a2565b92505081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b8152600401610bb6929190612c3e565b602060405180830381600087803b158015610bd057600080fd5b505af1158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c08919061264f565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90612e77565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f315d4ef2c32c6e9b2d2364f5d35c06ffb3427d08357493b104b90799c99c1e3c84604051610c8d9190612ff7565b60405180910390a2505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915090505481565b60038054610d0b90613319565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3790613319565b8015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b505050505081565b60045481565b60008585604051602001610da7929190612d99565b6040516020818303038152906040528051906020012090506000838583604051602001610dd69392919061303b565b6040516020818303038152906040528051906020012090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364936b1e896040518263ffffffff1660e01b8152600401610e4b9190612d77565b60206040518083038186803b158015610e6357600080fd5b505afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b91906126a9565b73ffffffffffffffffffffffffffffffffffffffff1663159ab14d848885886040518563ffffffff1660e01b8152600401610ed99493929190612c82565b602060405180830381600087803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b919061286e565b9050610f6c6040518060400160405280600a81526020017f6d696e74416d6f756e74000000000000000000000000000000000000000000008152508261225d565b3373ffffffffffffffffffffffffffffffffffffffff167f5387ab2b2012a616dcfbc6c0f6c6f7a6ef5b3fc7c7740476f7b20b65f50d597282604051610fb29190612ff7565b60405180910390a25050505050505050565b60055481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080339050600061271090506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a430147f8888856040518463ffffffff1660e01b815260040161108193929190612dc9565b602060405180830381600087803b15801561109b57600080fd5b505af11580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d3919061286e565b905080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e3258683604051611161929190613012565b60405180910390a28093505050509392505050565b60003390506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811180156111cf5750828110155b61120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590612ef7565b60405180910390fd5b600860009054906101000a900460ff1661125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490612fd7565b60405180910390fd5b82600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600b6020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113655750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90612eb7565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114019190612bba565b60206040518083038186803b15801561141957600080fd5b505afa15801561142d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611451919061286e565b11611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890612e97565b60405180910390fd5b6000600860006101000a81548160ff0219169083151502179055507fde17ec5ba6f9b5379a238e2a199366faccaedccf87879284014517333da74e2660405160405180910390a1565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900460ff1681565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa74f1f836040518263ffffffff1660e01b81526004016115ba9190612d77565b60206040518083038186803b1580156115d257600080fd5b505afa1580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a919061267c565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116429190612bba565b60206040518083038186803b15801561165a57600080fd5b505afa15801561166e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611692919061286e565b9050919050565b60003390506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600860009054906101000a900460ff16611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890612fd7565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611780919061314c565b9250508190555080600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117d691906131a2565b92505081905550600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b815260040161187f93929190612bd5565b602060405180830381600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d1919061264f565b611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790612e57565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161196d929190612c3e565b602060405180830381600087803b15801561198757600080fd5b505af115801561199b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bf919061264f565b6119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590612f37565b60405180910390fd5b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000339050600860009054906101000a900460ff1615611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590612f57565b60405180910390fd5b60008211611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890612fb7565b60405180910390fd5b60045460055483611ad2919061314c565b1115611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90612f17565b60405180910390fd5b81600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b62919061314c565b925050819055508160056000828254611b7b919061314c565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9c4f7a1cc1751ba83a1ddccc2da94b1fcfc4efaa2c546f277e551b2dd9c0500583604051611bc89190612ff7565b60405180910390a26004546005541415611be557611be46122f9565b5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230856040518463ffffffff1660e01b8152600401611c4493929190612bd5565b602060405180830381600087803b158015611c5e57600080fd5b505af1158015611c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c96919061264f565b611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90612ed7565b60405180910390fd5b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090612f77565b60405180910390fd5b600860009054906101000a900460ff16611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90612fd7565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b8152600401611e39929190612c3e565b602060405180830381600087803b158015611e5357600080fd5b505af1158015611e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8b919061264f565b611eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec190612f97565b60405180910390fd5b565b60065481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611fa55750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90612eb7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384ac33ec600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120619190612bba565b600060405180830381600087803b15801561207b57600080fd5b505af115801561208f573d6000803e3d6000fd5b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c90612f77565b60405180910390fd5b600860009054906101000a900460ff16612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90612fd7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324b8fbf68484846040518463ffffffff1660e01b81526004016121d393929190612c0c565b600060405180830381600087803b1580156121ed57600080fd5b505af1158015612201573d6000803e3d6000fd5b5050505082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081816003919061225792919061236b565b50505050565b6122f58282604051602401612273929190612e07565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612342565b5050565b6001600860006101000a81548160ff0219169083151502179055507f2e136745550967f28b779ce8c395ca060a2f844edfb5b06631fe677f66f9e30560405160405180910390a1565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461237790613319565b90600052602060002090601f01602090048101928261239957600085556123e0565b82601f106123b257803560ff19168380011785556123e0565b828001600101855582156123e0579182015b828111156123df5782358255916020019190600101906123c4565b5b5090506123ed91906123f1565b5090565b5b8082111561240a5760008160009055506001016123f2565b5090565b600061242161241c846130b2565b61308d565b90508281526020810184848401111561243d5761243c613418565b5b6124488482856132d7565b509392505050565b600061246361245e846130e3565b61308d565b90508281526020810184848401111561247f5761247e613418565b5b61248a8482856132d7565b509392505050565b6000813590506124a1816136c2565b92915050565b6000815190506124b6816136d9565b92915050565b60008083601f8401126124d2576124d161340e565b5b8235905067ffffffffffffffff8111156124ef576124ee613409565b5b60208301915083600182028301111561250b5761250a613413565b5b9250929050565b600082601f8301126125275761252661340e565b5b813561253784826020860161240e565b91505092915050565b60008151905061254f816136f0565b92915050565b60008151905061256481613707565b92915050565b600082601f83011261257f5761257e61340e565b5b813561258f848260208601612450565b91505092915050565b6000813590506125a78161371e565b92915050565b6000815190506125bc8161371e565b92915050565b6000602082840312156125d8576125d7613422565b5b60006125e684828501612492565b91505092915050565b60008060006040848603121561260857612607613422565b5b600061261686828701612492565b935050602084013567ffffffffffffffff8111156126375761263661341d565b5b612643868287016124bc565b92509250509250925092565b60006020828403121561266557612664613422565b5b6000612673848285016124a7565b91505092915050565b60006020828403121561269257612691613422565b5b60006126a084828501612540565b91505092915050565b6000602082840312156126bf576126be613422565b5b60006126cd84828501612555565b91505092915050565b6000602082840312156126ec576126eb613422565b5b600082013567ffffffffffffffff81111561270a5761270961341d565b5b6127168482850161256a565b91505092915050565b60008060006060848603121561273857612737613422565b5b600084013567ffffffffffffffff8111156127565761275561341d565b5b6127628682870161256a565b935050602061277386828701612492565b925050604061278486828701612598565b9150509250925092565b600080600080600060a086880312156127aa576127a9613422565b5b600086013567ffffffffffffffff8111156127c8576127c761341d565b5b6127d48882890161256a565b95505060206127e588828901612492565b94505060406127f688828901612598565b935050606061280788828901612598565b925050608086013567ffffffffffffffff8111156128285761282761341d565b5b61283488828901612512565b9150509295509295909350565b60006020828403121561285757612856613422565b5b600061286584828501612598565b91505092915050565b60006020828403121561288457612883613422565b5b6000612892848285016125ad565b91505092915050565b6128a4816131d6565b82525050565b6128b3816131e8565b82525050565b6128c2816131f4565b82525050565b60006128d4838561312a565b93506128e18385846132d7565b6128ea83613427565b840190509392505050565b600061290082613114565b61290a818561312a565b935061291a8185602086016132e6565b61292381613427565b840191505092915050565b61293781613259565b82525050565b6129468161326b565b82525050565b6129558161327d565b82525050565b6129648161328f565b82525050565b612973816132a1565b82525050565b60006129848261311f565b61298e818561313b565b935061299e8185602086016132e6565b6129a781613427565b840191505092915050565b60006129bf600e8361313b565b91506129ca82613438565b602082019050919050565b60006129e2600e8361313b565b91506129ed82613461565b602082019050919050565b6000612a05600f8361313b565b9150612a108261348a565b602082019050919050565b6000612a2860148361313b565b9150612a33826134b3565b602082019050919050565b6000612a4b602e8361313b565b9150612a56826134dc565b604082019050919050565b6000612a6e60178361313b565b9150612a798261352b565b602082019050919050565b6000612a9160128361313b565b9150612a9c82613554565b602082019050919050565b6000612ab4601e8361313b565b9150612abf8261357d565b602082019050919050565b6000612ad7600d8361313b565b9150612ae2826135a6565b602082019050919050565b6000612afa60178361313b565b9150612b05826135cf565b602082019050919050565b6000612b1d60248361313b565b9150612b28826135f8565b604082019050919050565b6000612b4060148361313b565b9150612b4b82613647565b602082019050919050565b6000612b6360178361313b565b9150612b6e82613670565b602082019050919050565b6000612b8660128361313b565b9150612b9182613699565b602082019050919050565b612ba581613242565b82525050565b612bb48161324c565b82525050565b6000602082019050612bcf600083018461289b565b92915050565b6000606082019050612bea600083018661289b565b612bf7602083018561289b565b612c046040830184612b9c565b949350505050565b6000604082019050612c21600083018661289b565b8181036020830152612c348184866128c8565b9050949350505050565b6000604082019050612c53600083018561289b565b612c606020830184612b9c565b9392505050565b6000602082019050612c7c60008301846128aa565b92915050565b6000608082019050612c9760008301876128b9565b612ca46020830186612b9c565b612cb160408301856128b9565b8181036060830152612cc381846128f5565b905095945050505050565b60006020820190508181036000830152612ce881846128f5565b905092915050565b6000602082019050612d05600083018461292e565b92915050565b6000602082019050612d20600083018461293d565b92915050565b6000602082019050612d3b600083018461294c565b92915050565b6000602082019050612d56600083018461295b565b92915050565b6000602082019050612d71600083018461296a565b92915050565b60006020820190508181036000830152612d918184612979565b905092915050565b60006040820190508181036000830152612db38185612979565b9050612dc2602083018461289b565b9392505050565b60006060820190508181036000830152612de38186612979565b9050612df2602083018561289b565b612dff6040830184612b9c565b949350505050565b60006040820190508181036000830152612e218185612979565b9050612e306020830184612b9c565b9392505050565b60006020820190508181036000830152612e50816129b2565b9050919050565b60006020820190508181036000830152612e70816129d5565b9050919050565b60006020820190508181036000830152612e90816129f8565b9050919050565b60006020820190508181036000830152612eb081612a1b565b9050919050565b60006020820190508181036000830152612ed081612a3e565b9050919050565b60006020820190508181036000830152612ef081612a61565b9050919050565b60006020820190508181036000830152612f1081612a84565b9050919050565b60006020820190508181036000830152612f3081612aa7565b9050919050565b60006020820190508181036000830152612f5081612aca565b9050919050565b60006020820190508181036000830152612f7081612aed565b9050919050565b60006020820190508181036000830152612f9081612b10565b9050919050565b60006020820190508181036000830152612fb081612b33565b9050919050565b60006020820190508181036000830152612fd081612b56565b9050919050565b60006020820190508181036000830152612ff081612b79565b9050919050565b600060208201905061300c6000830184612b9c565b92915050565b60006040820190506130276000830185612b9c565b6130346020830184612b9c565b9392505050565b60006060820190506130506000830186612b9c565b61305d6020830185612b9c565b61306a60408301846128b9565b949350505050565b60006020820190506130876000830184612bab565b92915050565b60006130976130a8565b90506130a3828261334b565b919050565b6000604051905090565b600067ffffffffffffffff8211156130cd576130cc6133da565b5b6130d682613427565b9050602081019050919050565b600067ffffffffffffffff8211156130fe576130fd6133da565b5b61310782613427565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061315782613242565b915061316283613242565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131975761319661337c565b5b828201905092915050565b60006131ad82613242565b91506131b883613242565b9250828210156131cb576131ca61337c565b5b828203905092915050565b60006131e182613222565b9050919050565b60008115159050919050565b6000819050919050565b6000613209826131d6565b9050919050565b600061321b826131d6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613264826132b3565b9050919050565b6000613276826132b3565b9050919050565b6000613288826132b3565b9050919050565b600061329a826132b3565b9050919050565b60006132ac826132b3565b9050919050565b60006132be826132c5565b9050919050565b60006132d082613222565b9050919050565b82818337600083830152505050565b60005b838110156133045780820151818401526020810190506132e9565b83811115613313576000848401525b50505050565b6000600282049050600182168061333157607f821691505b60208210811415613345576133446133ab565b5b50919050565b61335482613427565b810181811067ffffffffffffffff82111715613373576133726133da565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f506f6f6c206973206c6f636b6564000000000000000000000000000000000000600082015250565b7f4465706f736974206661696c6564000000000000000000000000000000000000600082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f506f6f6c2062616c616e6365206973207a65726f000000000000000000000000600082015250565b7f52656e506f6f6c3a2043616c6c6572206973206e6f74206f776e6572206e6f7260008201527f206e6f6465206f70657261746f72000000000000000000000000000000000000602082015250565b7f52656e506f6f6c3a204465706f736974206661696c6564000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f52656e506f6f6c3a20416d6f756e742073757270617373657320626f6e640000600082015250565b7f526566756e64206661696c656400000000000000000000000000000000000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206c6f636b6564000000000000000000600082015250565b7f52656e506f6f6c3a2043616c6c6572206973206e6f74206e6f6465206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f426f6e64207472616e73666572206661696c6564000000000000000000000000600082015250565b7f52656e506f6f6c3a20496e76616c696420616d6f756e74000000000000000000600082015250565b7f506f6f6c206973206e6f74206c6f636b65640000000000000000000000000000600082015250565b6136cb816131d6565b81146136d657600080fd5b50565b6136e2816131e8565b81146136ed57600080fd5b50565b6136f9816131fe565b811461370457600080fd5b50565b61371081613210565b811461371b57600080fd5b50565b61372781613242565b811461373257600080fd5b5056fea2646970667358221220b0d239bd9fe04d0230d54cf2c6df16857e519ea8e0f4b0c4eb56909278c44d2764736f6c63430008070033", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162003e6638038062003e66833981810160405281019062000037919062000296565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806004819055506000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff02191690831515021790555060006005819055506000600681905550600560078190555060056008819055505050505050505050620003d6565b6000815190506200027981620003a2565b92915050565b6000815190506200029081620003bc565b92915050565b600080600080600080600080610100898b031215620002ba57620002b96200039d565b5b6000620002ca8b828c0162000268565b9850506020620002dd8b828c0162000268565b9750506040620002f08b828c0162000268565b9650506060620003038b828c0162000268565b9550506080620003168b828c0162000268565b94505060a0620003298b828c0162000268565b93505060c06200033c8b828c0162000268565b92505060e06200034f8b828c016200027f565b9150509295985092959890939650565b60006200036c8262000373565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b620003ad816200035f565b8114620003b957600080fd5b50565b620003c78162000393565b8114620003d357600080fd5b50565b613a8080620003e66000396000f3fe6080604052600436106102085760003560e01c80637ecebe0011610118578063b6b34c67116100a0578063d693452e1161006f578063d693452e1461077e578063e39f6101146107a9578063e438a77d146107d4578063e714a028146107eb578063e7585aea146108025761025d565b8063b6b34c67146106e8578063b6b55f2514610713578063b7eb85c41461073c578063d5b2a01a146107535761025d565b80639e45e0d0116100e75780639e45e0d0146106015780639ee679e81461062c578063a4e2d63414610655578063aaaa0c4b14610680578063ac347987146106ab5761025d565b80637ecebe001461055757806389026538146105945780638da5cb5b146105ab578063901a6498146105d65761025d565b80632e1a7d4d1161019b57806364c9ec6f1161016a57806364c9ec6f1461045e5780636664e42e146104895780636ec21cc8146104b257806370a08231146104dd57806371bbef361461051a5761025d565b80632e1a7d4d146103b457806334246f9b146103dd578063372500ab1461040857806363ffab31146104335761025d565b8063270016fb116101d7578063270016fb146102e657806327b380f31461030f57806327e235e31461034c5780632e0f2625146103895761025d565b8063023c5b08146102625780631261795d1461028d57806313a0ae2b146102a457806322366844146102bb5761025d565b3661025d573373ffffffffffffffffffffffffffffffffffffffff167f66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c34604051610253919061334a565b60405180910390a2005b600080fd5b34801561026e57600080fd5b5061027761082b565b6040516102849190612f4d565b60405180910390f35b34801561029957600080fd5b506102a2610851565b005b3480156102b057600080fd5b506102b96109c2565b005b3480156102c757600080fd5b506102d0610a73565b6040516102dd9190612ffa565b60405180910390f35b3480156102f257600080fd5b5061030d6004803603810190610308919061299b565b610a86565b005b34801561031b57600080fd5b506103366004803603810190610331919061299b565b610e9a565b604051610343919061334a565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061299b565b610eb2565b604051610380919061334a565b60405180910390f35b34801561039557600080fd5b5061039e610eca565b6040516103ab91906133c5565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190612c1a565b610ecf565b005b3480156103e957600080fd5b506103f261119e565b6040516103ff91906130d4565b60405180910390f35b34801561041457600080fd5b5061041d6111c4565b60405161042a9190613083565b60405180910390f35b34801561043f57600080fd5b506104486111ea565b6040516104559190613061565b60405180910390f35b34801561046a57600080fd5b50610473611278565b604051610480919061334a565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612b67565b61127e565b005b3480156104be57600080fd5b506104c76114b0565b6040516104d4919061334a565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff919061299b565b6114b6565b604051610511919061334a565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190612af8565b6114ff565b60405161054e919061334a565b60405180910390f35b34801561056357600080fd5b5061057e6004803603810190610579919061299b565b611662565b60405161058b919061334a565b60405180910390f35b3480156105a057600080fd5b506105a961167a565b005b3480156105b757600080fd5b506105c0611896565b6040516105cd9190612f4d565b60405180910390f35b3480156105e257600080fd5b506105eb6118ba565b6040516105f89190612f4d565b60405180910390f35b34801561060d57600080fd5b506106166118e0565b60405161062391906130b9565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612c1a565b611906565b005b34801561066157600080fd5b5061066a611b0d565b6040516106779190612ffa565b60405180910390f35b34801561068c57600080fd5b50610695611b20565b6040516106a2919061334a565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612aaf565b611b26565b6040516106df919061334a565b60405180910390f35b3480156106f457600080fd5b506106fd611c62565b60405161070a919061309e565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190612c1a565b611c88565b005b34801561074857600080fd5b50610751611f38565b005b34801561075f57600080fd5b5061076861212b565b604051610775919061334a565b60405180910390f35b34801561078a57600080fd5b50610793612131565b6040516107a091906130ef565b60405180910390f35b3480156107b557600080fd5b506107be612157565b6040516107cb919061334a565b60405180910390f35b3480156107e057600080fd5b506107e961215d565b005b3480156107f757600080fd5b5061080061224d565b005b34801561080e57600080fd5b50610829600480360381019061082491906129c8565b612387565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906132ea565b60405180910390fd5b6000479050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561094e573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109b7919061334a565b60405180910390a250565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa89401a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a3f9190612f4d565b600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b50505050565b600960019054906101000a900460ff1681565b60003390506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b099061322a565b60405180910390fd5b600960009054906101000a900460ff16610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b589061328a565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb0919061349f565b9250508190555080600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c069190613526565b925050819055508060066000828254610c1f9190613526565b92505081905550600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b8152600401610cc893929190612f68565b602060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190612a28565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50906131ea565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401610db6929190612fd1565b602060405180830381600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190612a28565b610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e906132ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167fc0c6ac36718cda96fac02ecd8ae8aad366fb1ce2b294e1c2de0bee39ddd328af82604051610e8d919061334a565b60405180910390a2505050565b600b6020528060005260406000206000915090505481565b600a6020528060005260406000206000915090505481565b601281565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f529061332a565b60405180910390fd5b82811015610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061324a565b60405180910390fd5b600960009054906101000a900460ff1615610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe5906132aa565b60405180910390fd5b82600560008282546110009190613526565b9250508190555082600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110569190613526565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b81526004016110ba929190612fd1565b602060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c9190612a28565b61114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906131ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f315d4ef2c32c6e9b2d2364f5d35c06ffb3427d08357493b104b90799c99c1e3c84604051611191919061334a565b60405180910390a2505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600380546111f79061369d565b80601f01602080910402602001604051908101604052809291908181526020018280546112239061369d565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b505050505081565b60045481565b6000858560405160200161129392919061312c565b60405160208183030381529060405280519060200120905060008385836040516020016112c29392919061338e565b6040516020818303038152906040528051906020012090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364936b1e896040518263ffffffff1660e01b8152600401611337919061310a565b60206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190612a82565b73ffffffffffffffffffffffffffffffffffffffff1663159ab14d848885886040518563ffffffff1660e01b81526004016113c59493929190613015565b602060405180830381600087803b1580156113df57600080fd5b505af11580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190612c47565b90506114586040518060400160405280600a81526020017f6d696e74416d6f756e74000000000000000000000000000000000000000000008152508261256a565b3373ffffffffffffffffffffffffffffffffffffffff167f5387ab2b2012a616dcfbc6c0f6c6f7a6ef5b3fc7c7740476f7b20b65f50d59728260405161149e919061334a565b60405180910390a25050505050505050565b60055481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080339050600061271090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a430147f8888856040518463ffffffff1660e01b815260040161156d9392919061315c565b602060405180830381600087803b15801561158757600080fd5b505af115801561159b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bf9190612c47565b905080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325868360405161164d929190613365565b60405180910390a28093505050509392505050565b600c6020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117215750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906132ea565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117bd9190612f4d565b60206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612c47565b1161184d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118449061330a565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507fde17ec5ba6f9b5379a238e2a199366faccaedccf87879284014517333da74e2660405160405180910390a1565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311611992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119899061332a565b60405180910390fd5b828110156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc9061324a565b60405180910390fd5b600960009054906101000a900460ff16611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b9061328a565b60405180910390fd5b82600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260066000828254611a7a919061349f565b92505081905550600960019054906101000a900460ff168015611aac57506002600454611aa791906134f5565b600654115b15611aba57611ab9612606565b5b8173ffffffffffffffffffffffffffffffffffffffff167fd68fb6899f484313a5048f6f882da08bad2e51f156053cb0888c3a0a0c08259084604051611b00919061334a565b60405180910390a2505050565b600960009054906101000a900460ff1681565b60065481565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa74f1f836040518263ffffffff1660e01b8152600401611b83919061310a565b60206040518083038186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190612a55565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c0b9190612f4d565b60206040518083038186803b158015611c2357600080fd5b505afa158015611c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5b9190612c47565b9050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000339050600960009054906101000a900460ff1615611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd4906132aa565b60405180910390fd5b60008211611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d179061332a565b60405180910390fd5b60045460055483611d31919061349f565b1115611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061320a565b60405180910390fd5b81600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc1919061349f565b925050819055508160056000828254611dda919061349f565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9c4f7a1cc1751ba83a1ddccc2da94b1fcfc4efaa2c546f277e551b2dd9c0500583604051611e27919061334a565b60405180910390a26004546005541415611e4457611e436126d2565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230856040518463ffffffff1660e01b8152600401611ea393929190612f68565b602060405180830381600087803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef59190612a28565b611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906131ea565b60405180910390fd5b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf906132ea565b60405180910390fd5b600960009054906101000a900460ff16612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061328a565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b8152600401612098929190612fd1565b602060405180830381600087803b1580156120b257600080fd5b505af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190612a28565b612129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121209061326a565b60405180910390fd5b565b60075481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906132ea565b60405180910390fd5b61224b612606565b565b60003390506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061322a565b60405180910390fd5b80600660008282546122eb9190613526565b92505081905550600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558173ffffffffffffffffffffffffffffffffffffffff167f97470f6911e16b5918a53053f8d1a686e0acaf6a4bfc7b79d064aa24b9f057138260405161237b919061334a565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e906132ea565b60405180910390fd5b600960009054906101000a900460ff16612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d9061328a565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324b8fbf68484846040518463ffffffff1660e01b81526004016124c593929190612f9f565b600060405180830381600087803b1580156124df57600080fd5b505af11580156124f3573d6000803e3d6000fd5b505050506001600960016101000a81548160ff02191690831515021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160039190612564929190612744565b50505050565b612602828260405160240161258092919061319a565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061271b565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384ac33ec600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016126839190612f4d565b600060405180830381600087803b15801561269d57600080fd5b505af11580156126b1573d6000803e3d6000fd5b505050506000600960016101000a81548160ff021916908315150217905550565b6001600960006101000a81548160ff0219169083151502179055507f2e136745550967f28b779ce8c395ca060a2f844edfb5b06631fe677f66f9e30560405160405180910390a1565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b8280546127509061369d565b90600052602060002090601f01602090048101928261277257600085556127b9565b82601f1061278b57803560ff19168380011785556127b9565b828001600101855582156127b9579182015b828111156127b857823582559160200191906001019061279d565b5b5090506127c691906127ca565b5090565b5b808211156127e35760008160009055506001016127cb565b5090565b60006127fa6127f584613405565b6133e0565b905082815260208101848484011115612816576128156137cb565b5b61282184828561365b565b509392505050565b600061283c61283784613436565b6133e0565b905082815260208101848484011115612858576128576137cb565b5b61286384828561365b565b509392505050565b60008135905061287a816139d7565b92915050565b60008151905061288f816139ee565b92915050565b60008083601f8401126128ab576128aa6137c1565b5b8235905067ffffffffffffffff8111156128c8576128c76137bc565b5b6020830191508360018202830111156128e4576128e36137c6565b5b9250929050565b600082601f830112612900576128ff6137c1565b5b81356129108482602086016127e7565b91505092915050565b60008151905061292881613a05565b92915050565b60008151905061293d81613a1c565b92915050565b600082601f830112612958576129576137c1565b5b8135612968848260208601612829565b91505092915050565b60008135905061298081613a33565b92915050565b60008151905061299581613a33565b92915050565b6000602082840312156129b1576129b06137d5565b5b60006129bf8482850161286b565b91505092915050565b6000806000604084860312156129e1576129e06137d5565b5b60006129ef8682870161286b565b935050602084013567ffffffffffffffff811115612a1057612a0f6137d0565b5b612a1c86828701612895565b92509250509250925092565b600060208284031215612a3e57612a3d6137d5565b5b6000612a4c84828501612880565b91505092915050565b600060208284031215612a6b57612a6a6137d5565b5b6000612a7984828501612919565b91505092915050565b600060208284031215612a9857612a976137d5565b5b6000612aa68482850161292e565b91505092915050565b600060208284031215612ac557612ac46137d5565b5b600082013567ffffffffffffffff811115612ae357612ae26137d0565b5b612aef84828501612943565b91505092915050565b600080600060608486031215612b1157612b106137d5565b5b600084013567ffffffffffffffff811115612b2f57612b2e6137d0565b5b612b3b86828701612943565b9350506020612b4c8682870161286b565b9250506040612b5d86828701612971565b9150509250925092565b600080600080600060a08688031215612b8357612b826137d5565b5b600086013567ffffffffffffffff811115612ba157612ba06137d0565b5b612bad88828901612943565b9550506020612bbe8882890161286b565b9450506040612bcf88828901612971565b9350506060612be088828901612971565b925050608086013567ffffffffffffffff811115612c0157612c006137d0565b5b612c0d888289016128eb565b9150509295509295909350565b600060208284031215612c3057612c2f6137d5565b5b6000612c3e84828501612971565b91505092915050565b600060208284031215612c5d57612c5c6137d5565b5b6000612c6b84828501612986565b91505092915050565b612c7d8161355a565b82525050565b612c8c8161356c565b82525050565b612c9b81613578565b82525050565b6000612cad838561347d565b9350612cba83858461365b565b612cc3836137da565b840190509392505050565b6000612cd982613467565b612ce3818561347d565b9350612cf381856020860161366a565b612cfc816137da565b840191505092915050565b612d10816135dd565b82525050565b612d1f816135ef565b82525050565b612d2e81613601565b82525050565b612d3d81613613565b82525050565b612d4c81613625565b82525050565b6000612d5d82613472565b612d67818561348e565b9350612d7781856020860161366a565b612d80816137da565b840191505092915050565b6000612d9860188361348e565b9150612da3826137eb565b602082019050919050565b6000612dbb60178361348e565b9150612dc682613814565b602082019050919050565b6000612dde601e8361348e565b9150612de98261383d565b602082019050919050565b6000612e0160178361348e565b9150612e0c82613866565b602082019050919050565b6000612e24601b8361348e565b9150612e2f8261388f565b602082019050919050565b6000612e47601d8361348e565b9150612e52826138b8565b602082019050919050565b6000612e6a601b8361348e565b9150612e75826138e1565b602082019050919050565b6000612e8d60178361348e565b9150612e988261390a565b602082019050919050565b6000612eb060168361348e565b9150612ebb82613933565b602082019050919050565b6000612ed360158361348e565b9150612ede8261395c565b602082019050919050565b6000612ef6601d8361348e565b9150612f0182613985565b602082019050919050565b6000612f1960178361348e565b9150612f24826139ae565b602082019050919050565b612f38816135c6565b82525050565b612f47816135d0565b82525050565b6000602082019050612f626000830184612c74565b92915050565b6000606082019050612f7d6000830186612c74565b612f8a6020830185612c74565b612f976040830184612f2f565b949350505050565b6000604082019050612fb46000830186612c74565b8181036020830152612fc7818486612ca1565b9050949350505050565b6000604082019050612fe66000830185612c74565b612ff36020830184612f2f565b9392505050565b600060208201905061300f6000830184612c83565b92915050565b600060808201905061302a6000830187612c92565b6130376020830186612f2f565b6130446040830185612c92565b81810360608301526130568184612cce565b905095945050505050565b6000602082019050818103600083015261307b8184612cce565b905092915050565b60006020820190506130986000830184612d07565b92915050565b60006020820190506130b36000830184612d16565b92915050565b60006020820190506130ce6000830184612d25565b92915050565b60006020820190506130e96000830184612d34565b92915050565b60006020820190506131046000830184612d43565b92915050565b600060208201905081810360008301526131248184612d52565b905092915050565b600060408201905081810360008301526131468185612d52565b90506131556020830184612c74565b9392505050565b600060608201905081810360008301526131768186612d52565b90506131856020830185612c74565b6131926040830184612f2f565b949350505050565b600060408201905081810360008301526131b48185612d52565b90506131c36020830184612f2f565b9392505050565b600060208201905081810360008301526131e381612d8b565b9050919050565b6000602082019050818103600083015261320381612dae565b9050919050565b6000602082019050818103600083015261322381612dd1565b9050919050565b6000602082019050818103600083015261324381612df4565b9050919050565b6000602082019050818103600083015261326381612e17565b9050919050565b6000602082019050818103600083015261328381612e3a565b9050919050565b600060208201905081810360008301526132a381612e5d565b9050919050565b600060208201905081810360008301526132c381612e80565b9050919050565b600060208201905081810360008301526132e381612ea3565b9050919050565b6000602082019050818103600083015261330381612ec6565b9050919050565b6000602082019050818103600083015261332381612ee9565b9050919050565b6000602082019050818103600083015261334381612f0c565b9050919050565b600060208201905061335f6000830184612f2f565b92915050565b600060408201905061337a6000830185612f2f565b6133876020830184612f2f565b9392505050565b60006060820190506133a36000830186612f2f565b6133b06020830185612f2f565b6133bd6040830184612c92565b949350505050565b60006020820190506133da6000830184612f3e565b92915050565b60006133ea6133fb565b90506133f682826136cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156134205761341f61378d565b5b613429826137da565b9050602081019050919050565b600067ffffffffffffffff8211156134515761345061378d565b5b61345a826137da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006134aa826135c6565b91506134b5836135c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134ea576134e9613700565b5b828201905092915050565b6000613500826135c6565b915061350b836135c6565b92508261351b5761351a61372f565b5b828204905092915050565b6000613531826135c6565b915061353c836135c6565b92508282101561354f5761354e613700565b5b828203905092915050565b6000613565826135a6565b9050919050565b60008115159050919050565b6000819050919050565b600061358d8261355a565b9050919050565b600061359f8261355a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006135e882613637565b9050919050565b60006135fa82613637565b9050919050565b600061360c82613637565b9050919050565b600061361e82613637565b9050919050565b600061363082613637565b9050919050565b600061364282613649565b9050919050565b6000613654826135a6565b9050919050565b82818337600083830152505050565b60005b8381101561368857808201518184015260208101905061366d565b83811115613697576000848401525b50505050565b600060028204905060018216806136b557607f821691505b602082108114156136c9576136c861375e565b5b50919050565b6136d8826137da565b810181811067ffffffffffffffff821117156136f7576136f661378d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f52656e506f6f6c3a205769746864726177206661696c65640000000000000000600082015250565b7f52656e506f6f6c3a204465706f736974206661696c6564000000000000000000600082015250565b7f52656e506f6f6c3a20416d6f756e742073757270617373657320626f6e640000600082015250565b7f52656e506f6f6c3a20696e76616c696420616d6f756e74000000000000000000600082015250565b7f52656e506f6f6c3a20496e73756666696369656e742066756e64730000000000600082015250565b7f52656e506f6f6c3a20426f6e64207472616e73666572206661696c6564000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206e6f74206c6f636b65640000000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206c6f636b6564000000000000000000600082015250565b7f52656e506f6f6c3a20526566756e64206661696c656400000000000000000000600082015250565b7f52656e506f6f6c3a20556e617574686f72697a65640000000000000000000000600082015250565b7f52656e506f6f6c3a20506f6f6c2062616c616e6365206973207a65726f000000600082015250565b7f52656e506f6f6c3a20496e76616c696420616d6f756e74000000000000000000600082015250565b6139e08161355a565b81146139eb57600080fd5b50565b6139f78161356c565b8114613a0257600080fd5b50565b613a0e81613582565b8114613a1957600080fd5b50565b613a2581613594565b8114613a3057600080fd5b50565b613a3c816135c6565b8114613a4757600080fd5b5056fea26469706673582212200d75bb3d56461e8449387630b7f2039001d77c46cf625fab3f151f5223547a2464736f6c63430008070033", + "deployedBytecode": "0x6080604052600436106102085760003560e01c80637ecebe0011610118578063b6b34c67116100a0578063d693452e1161006f578063d693452e1461077e578063e39f6101146107a9578063e438a77d146107d4578063e714a028146107eb578063e7585aea146108025761025d565b8063b6b34c67146106e8578063b6b55f2514610713578063b7eb85c41461073c578063d5b2a01a146107535761025d565b80639e45e0d0116100e75780639e45e0d0146106015780639ee679e81461062c578063a4e2d63414610655578063aaaa0c4b14610680578063ac347987146106ab5761025d565b80637ecebe001461055757806389026538146105945780638da5cb5b146105ab578063901a6498146105d65761025d565b80632e1a7d4d1161019b57806364c9ec6f1161016a57806364c9ec6f1461045e5780636664e42e146104895780636ec21cc8146104b257806370a08231146104dd57806371bbef361461051a5761025d565b80632e1a7d4d146103b457806334246f9b146103dd578063372500ab1461040857806363ffab31146104335761025d565b8063270016fb116101d7578063270016fb146102e657806327b380f31461030f57806327e235e31461034c5780632e0f2625146103895761025d565b8063023c5b08146102625780631261795d1461028d57806313a0ae2b146102a457806322366844146102bb5761025d565b3661025d573373ffffffffffffffffffffffffffffffffffffffff167f66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c34604051610253919061334a565b60405180910390a2005b600080fd5b34801561026e57600080fd5b5061027761082b565b6040516102849190612f4d565b60405180910390f35b34801561029957600080fd5b506102a2610851565b005b3480156102b057600080fd5b506102b96109c2565b005b3480156102c757600080fd5b506102d0610a73565b6040516102dd9190612ffa565b60405180910390f35b3480156102f257600080fd5b5061030d6004803603810190610308919061299b565b610a86565b005b34801561031b57600080fd5b506103366004803603810190610331919061299b565b610e9a565b604051610343919061334a565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061299b565b610eb2565b604051610380919061334a565b60405180910390f35b34801561039557600080fd5b5061039e610eca565b6040516103ab91906133c5565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190612c1a565b610ecf565b005b3480156103e957600080fd5b506103f261119e565b6040516103ff91906130d4565b60405180910390f35b34801561041457600080fd5b5061041d6111c4565b60405161042a9190613083565b60405180910390f35b34801561043f57600080fd5b506104486111ea565b6040516104559190613061565b60405180910390f35b34801561046a57600080fd5b50610473611278565b604051610480919061334a565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612b67565b61127e565b005b3480156104be57600080fd5b506104c76114b0565b6040516104d4919061334a565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff919061299b565b6114b6565b604051610511919061334a565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190612af8565b6114ff565b60405161054e919061334a565b60405180910390f35b34801561056357600080fd5b5061057e6004803603810190610579919061299b565b611662565b60405161058b919061334a565b60405180910390f35b3480156105a057600080fd5b506105a961167a565b005b3480156105b757600080fd5b506105c0611896565b6040516105cd9190612f4d565b60405180910390f35b3480156105e257600080fd5b506105eb6118ba565b6040516105f89190612f4d565b60405180910390f35b34801561060d57600080fd5b506106166118e0565b60405161062391906130b9565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612c1a565b611906565b005b34801561066157600080fd5b5061066a611b0d565b6040516106779190612ffa565b60405180910390f35b34801561068c57600080fd5b50610695611b20565b6040516106a2919061334a565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612aaf565b611b26565b6040516106df919061334a565b60405180910390f35b3480156106f457600080fd5b506106fd611c62565b60405161070a919061309e565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190612c1a565b611c88565b005b34801561074857600080fd5b50610751611f38565b005b34801561075f57600080fd5b5061076861212b565b604051610775919061334a565b60405180910390f35b34801561078a57600080fd5b50610793612131565b6040516107a091906130ef565b60405180910390f35b3480156107b557600080fd5b506107be612157565b6040516107cb919061334a565b60405180910390f35b3480156107e057600080fd5b506107e961215d565b005b3480156107f757600080fd5b5061080061224d565b005b34801561080e57600080fd5b50610829600480360381019061082491906129c8565b612387565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906132ea565b60405180910390fd5b6000479050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561094e573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109b7919061334a565b60405180910390a250565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa89401a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a3f9190612f4d565b600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b50505050565b600960019054906101000a900460ff1681565b60003390506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b099061322a565b60405180910390fd5b600960009054906101000a900460ff16610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b589061328a565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb0919061349f565b9250508190555080600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c069190613526565b925050819055508060066000828254610c1f9190613526565b92505081905550600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b8152600401610cc893929190612f68565b602060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190612a28565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50906131ea565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401610db6929190612fd1565b602060405180830381600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190612a28565b610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e906132ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167fc0c6ac36718cda96fac02ecd8ae8aad366fb1ce2b294e1c2de0bee39ddd328af82604051610e8d919061334a565b60405180910390a2505050565b600b6020528060005260406000206000915090505481565b600a6020528060005260406000206000915090505481565b601281565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f529061332a565b60405180910390fd5b82811015610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061324a565b60405180910390fd5b600960009054906101000a900460ff1615610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe5906132aa565b60405180910390fd5b82600560008282546110009190613526565b9250508190555082600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110569190613526565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b81526004016110ba929190612fd1565b602060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c9190612a28565b61114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906131ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f315d4ef2c32c6e9b2d2364f5d35c06ffb3427d08357493b104b90799c99c1e3c84604051611191919061334a565b60405180910390a2505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600380546111f79061369d565b80601f01602080910402602001604051908101604052809291908181526020018280546112239061369d565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b505050505081565b60045481565b6000858560405160200161129392919061312c565b60405160208183030381529060405280519060200120905060008385836040516020016112c29392919061338e565b6040516020818303038152906040528051906020012090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364936b1e896040518263ffffffff1660e01b8152600401611337919061310a565b60206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190612a82565b73ffffffffffffffffffffffffffffffffffffffff1663159ab14d848885886040518563ffffffff1660e01b81526004016113c59493929190613015565b602060405180830381600087803b1580156113df57600080fd5b505af11580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190612c47565b90506114586040518060400160405280600a81526020017f6d696e74416d6f756e74000000000000000000000000000000000000000000008152508261256a565b3373ffffffffffffffffffffffffffffffffffffffff167f5387ab2b2012a616dcfbc6c0f6c6f7a6ef5b3fc7c7740476f7b20b65f50d59728260405161149e919061334a565b60405180910390a25050505050505050565b60055481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080339050600061271090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a430147f8888856040518463ffffffff1660e01b815260040161156d9392919061315c565b602060405180830381600087803b15801561158757600080fd5b505af115801561159b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bf9190612c47565b905080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325868360405161164d929190613365565b60405180910390a28093505050509392505050565b600c6020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117215750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906132ea565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117bd9190612f4d565b60206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612c47565b1161184d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118449061330a565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507fde17ec5ba6f9b5379a238e2a199366faccaedccf87879284014517333da74e2660405160405180910390a1565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311611992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119899061332a565b60405180910390fd5b828110156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc9061324a565b60405180910390fd5b600960009054906101000a900460ff16611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b9061328a565b60405180910390fd5b82600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260066000828254611a7a919061349f565b92505081905550600960019054906101000a900460ff168015611aac57506002600454611aa791906134f5565b600654115b15611aba57611ab9612606565b5b8173ffffffffffffffffffffffffffffffffffffffff167fd68fb6899f484313a5048f6f882da08bad2e51f156053cb0888c3a0a0c08259084604051611b00919061334a565b60405180910390a2505050565b600960009054906101000a900460ff1681565b60065481565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa74f1f836040518263ffffffff1660e01b8152600401611b83919061310a565b60206040518083038186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190612a55565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c0b9190612f4d565b60206040518083038186803b158015611c2357600080fd5b505afa158015611c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5b9190612c47565b9050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000339050600960009054906101000a900460ff1615611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd4906132aa565b60405180910390fd5b60008211611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d179061332a565b60405180910390fd5b60045460055483611d31919061349f565b1115611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061320a565b60405180910390fd5b81600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc1919061349f565b925050819055508160056000828254611dda919061349f565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9c4f7a1cc1751ba83a1ddccc2da94b1fcfc4efaa2c546f277e551b2dd9c0500583604051611e27919061334a565b60405180910390a26004546005541415611e4457611e436126d2565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230856040518463ffffffff1660e01b8152600401611ea393929190612f68565b602060405180830381600087803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef59190612a28565b611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906131ea565b60405180910390fd5b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf906132ea565b60405180910390fd5b600960009054906101000a900460ff16612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061328a565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b8152600401612098929190612fd1565b602060405180830381600087803b1580156120b257600080fd5b505af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190612a28565b612129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121209061326a565b60405180910390fd5b565b60075481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906132ea565b60405180910390fd5b61224b612606565b565b60003390506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061322a565b60405180910390fd5b80600660008282546122eb9190613526565b92505081905550600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558173ffffffffffffffffffffffffffffffffffffffff167f97470f6911e16b5918a53053f8d1a686e0acaf6a4bfc7b79d064aa24b9f057138260405161237b919061334a565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e906132ea565b60405180910390fd5b600960009054906101000a900460ff16612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d9061328a565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324b8fbf68484846040518463ffffffff1660e01b81526004016124c593929190612f9f565b600060405180830381600087803b1580156124df57600080fd5b505af11580156124f3573d6000803e3d6000fd5b505050506001600960016101000a81548160ff02191690831515021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160039190612564929190612744565b50505050565b612602828260405160240161258092919061319a565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061271b565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384ac33ec600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016126839190612f4d565b600060405180830381600087803b15801561269d57600080fd5b505af11580156126b1573d6000803e3d6000fd5b505050506000600960016101000a81548160ff021916908315150217905550565b6001600960006101000a81548160ff0219169083151502179055507f2e136745550967f28b779ce8c395ca060a2f844edfb5b06631fe677f66f9e30560405160405180910390a1565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b8280546127509061369d565b90600052602060002090601f01602090048101928261277257600085556127b9565b82601f1061278b57803560ff19168380011785556127b9565b828001600101855582156127b9579182015b828111156127b857823582559160200191906001019061279d565b5b5090506127c691906127ca565b5090565b5b808211156127e35760008160009055506001016127cb565b5090565b60006127fa6127f584613405565b6133e0565b905082815260208101848484011115612816576128156137cb565b5b61282184828561365b565b509392505050565b600061283c61283784613436565b6133e0565b905082815260208101848484011115612858576128576137cb565b5b61286384828561365b565b509392505050565b60008135905061287a816139d7565b92915050565b60008151905061288f816139ee565b92915050565b60008083601f8401126128ab576128aa6137c1565b5b8235905067ffffffffffffffff8111156128c8576128c76137bc565b5b6020830191508360018202830111156128e4576128e36137c6565b5b9250929050565b600082601f830112612900576128ff6137c1565b5b81356129108482602086016127e7565b91505092915050565b60008151905061292881613a05565b92915050565b60008151905061293d81613a1c565b92915050565b600082601f830112612958576129576137c1565b5b8135612968848260208601612829565b91505092915050565b60008135905061298081613a33565b92915050565b60008151905061299581613a33565b92915050565b6000602082840312156129b1576129b06137d5565b5b60006129bf8482850161286b565b91505092915050565b6000806000604084860312156129e1576129e06137d5565b5b60006129ef8682870161286b565b935050602084013567ffffffffffffffff811115612a1057612a0f6137d0565b5b612a1c86828701612895565b92509250509250925092565b600060208284031215612a3e57612a3d6137d5565b5b6000612a4c84828501612880565b91505092915050565b600060208284031215612a6b57612a6a6137d5565b5b6000612a7984828501612919565b91505092915050565b600060208284031215612a9857612a976137d5565b5b6000612aa68482850161292e565b91505092915050565b600060208284031215612ac557612ac46137d5565b5b600082013567ffffffffffffffff811115612ae357612ae26137d0565b5b612aef84828501612943565b91505092915050565b600080600060608486031215612b1157612b106137d5565b5b600084013567ffffffffffffffff811115612b2f57612b2e6137d0565b5b612b3b86828701612943565b9350506020612b4c8682870161286b565b9250506040612b5d86828701612971565b9150509250925092565b600080600080600060a08688031215612b8357612b826137d5565b5b600086013567ffffffffffffffff811115612ba157612ba06137d0565b5b612bad88828901612943565b9550506020612bbe8882890161286b565b9450506040612bcf88828901612971565b9350506060612be088828901612971565b925050608086013567ffffffffffffffff811115612c0157612c006137d0565b5b612c0d888289016128eb565b9150509295509295909350565b600060208284031215612c3057612c2f6137d5565b5b6000612c3e84828501612971565b91505092915050565b600060208284031215612c5d57612c5c6137d5565b5b6000612c6b84828501612986565b91505092915050565b612c7d8161355a565b82525050565b612c8c8161356c565b82525050565b612c9b81613578565b82525050565b6000612cad838561347d565b9350612cba83858461365b565b612cc3836137da565b840190509392505050565b6000612cd982613467565b612ce3818561347d565b9350612cf381856020860161366a565b612cfc816137da565b840191505092915050565b612d10816135dd565b82525050565b612d1f816135ef565b82525050565b612d2e81613601565b82525050565b612d3d81613613565b82525050565b612d4c81613625565b82525050565b6000612d5d82613472565b612d67818561348e565b9350612d7781856020860161366a565b612d80816137da565b840191505092915050565b6000612d9860188361348e565b9150612da3826137eb565b602082019050919050565b6000612dbb60178361348e565b9150612dc682613814565b602082019050919050565b6000612dde601e8361348e565b9150612de98261383d565b602082019050919050565b6000612e0160178361348e565b9150612e0c82613866565b602082019050919050565b6000612e24601b8361348e565b9150612e2f8261388f565b602082019050919050565b6000612e47601d8361348e565b9150612e52826138b8565b602082019050919050565b6000612e6a601b8361348e565b9150612e75826138e1565b602082019050919050565b6000612e8d60178361348e565b9150612e988261390a565b602082019050919050565b6000612eb060168361348e565b9150612ebb82613933565b602082019050919050565b6000612ed360158361348e565b9150612ede8261395c565b602082019050919050565b6000612ef6601d8361348e565b9150612f0182613985565b602082019050919050565b6000612f1960178361348e565b9150612f24826139ae565b602082019050919050565b612f38816135c6565b82525050565b612f47816135d0565b82525050565b6000602082019050612f626000830184612c74565b92915050565b6000606082019050612f7d6000830186612c74565b612f8a6020830185612c74565b612f976040830184612f2f565b949350505050565b6000604082019050612fb46000830186612c74565b8181036020830152612fc7818486612ca1565b9050949350505050565b6000604082019050612fe66000830185612c74565b612ff36020830184612f2f565b9392505050565b600060208201905061300f6000830184612c83565b92915050565b600060808201905061302a6000830187612c92565b6130376020830186612f2f565b6130446040830185612c92565b81810360608301526130568184612cce565b905095945050505050565b6000602082019050818103600083015261307b8184612cce565b905092915050565b60006020820190506130986000830184612d07565b92915050565b60006020820190506130b36000830184612d16565b92915050565b60006020820190506130ce6000830184612d25565b92915050565b60006020820190506130e96000830184612d34565b92915050565b60006020820190506131046000830184612d43565b92915050565b600060208201905081810360008301526131248184612d52565b905092915050565b600060408201905081810360008301526131468185612d52565b90506131556020830184612c74565b9392505050565b600060608201905081810360008301526131768186612d52565b90506131856020830185612c74565b6131926040830184612f2f565b949350505050565b600060408201905081810360008301526131b48185612d52565b90506131c36020830184612f2f565b9392505050565b600060208201905081810360008301526131e381612d8b565b9050919050565b6000602082019050818103600083015261320381612dae565b9050919050565b6000602082019050818103600083015261322381612dd1565b9050919050565b6000602082019050818103600083015261324381612df4565b9050919050565b6000602082019050818103600083015261326381612e17565b9050919050565b6000602082019050818103600083015261328381612e3a565b9050919050565b600060208201905081810360008301526132a381612e5d565b9050919050565b600060208201905081810360008301526132c381612e80565b9050919050565b600060208201905081810360008301526132e381612ea3565b9050919050565b6000602082019050818103600083015261330381612ec6565b9050919050565b6000602082019050818103600083015261332381612ee9565b9050919050565b6000602082019050818103600083015261334381612f0c565b9050919050565b600060208201905061335f6000830184612f2f565b92915050565b600060408201905061337a6000830185612f2f565b6133876020830184612f2f565b9392505050565b60006060820190506133a36000830186612f2f565b6133b06020830185612f2f565b6133bd6040830184612c92565b949350505050565b60006020820190506133da6000830184612f3e565b92915050565b60006133ea6133fb565b90506133f682826136cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156134205761341f61378d565b5b613429826137da565b9050602081019050919050565b600067ffffffffffffffff8211156134515761345061378d565b5b61345a826137da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006134aa826135c6565b91506134b5836135c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134ea576134e9613700565b5b828201905092915050565b6000613500826135c6565b915061350b836135c6565b92508261351b5761351a61372f565b5b828204905092915050565b6000613531826135c6565b915061353c836135c6565b92508282101561354f5761354e613700565b5b828203905092915050565b6000613565826135a6565b9050919050565b60008115159050919050565b6000819050919050565b600061358d8261355a565b9050919050565b600061359f8261355a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006135e882613637565b9050919050565b60006135fa82613637565b9050919050565b600061360c82613637565b9050919050565b600061361e82613637565b9050919050565b600061363082613637565b9050919050565b600061364282613649565b9050919050565b6000613654826135a6565b9050919050565b82818337600083830152505050565b60005b8381101561368857808201518184015260208101905061366d565b83811115613697576000848401525b50505050565b600060028204905060018216806136b557607f821691505b602082108114156136c9576136c861375e565b5b50919050565b6136d8826137da565b810181811067ffffffffffffffff821117156136f7576136f661378d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f52656e506f6f6c3a205769746864726177206661696c65640000000000000000600082015250565b7f52656e506f6f6c3a204465706f736974206661696c6564000000000000000000600082015250565b7f52656e506f6f6c3a20416d6f756e742073757270617373657320626f6e640000600082015250565b7f52656e506f6f6c3a20696e76616c696420616d6f756e74000000000000000000600082015250565b7f52656e506f6f6c3a20496e73756666696369656e742066756e64730000000000600082015250565b7f52656e506f6f6c3a20426f6e64207472616e73666572206661696c6564000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206e6f74206c6f636b65640000000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206c6f636b6564000000000000000000600082015250565b7f52656e506f6f6c3a20526566756e64206661696c656400000000000000000000600082015250565b7f52656e506f6f6c3a20556e617574686f72697a65640000000000000000000000600082015250565b7f52656e506f6f6c3a20506f6f6c2062616c616e6365206973207a65726f000000600082015250565b7f52656e506f6f6c3a20496e76616c696420616d6f756e74000000000000000000600082015250565b6139e08161355a565b81146139eb57600080fd5b50565b6139f78161356c565b8114613a0257600080fd5b50565b613a0e81613582565b8114613a1957600080fd5b50565b613a2581613594565b8114613a3057600080fd5b50565b613a3c816135c6565b8114613a4757600080fd5b5056fea26469706673582212200d75bb3d56461e8449387630b7f2039001d77c46cf625fab3f151f5223547a2464736f6c63430008070033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/RenPoolFactory.sol/RenPoolFactory.json b/artifacts/contracts/RenPoolFactory.sol/RenPoolFactory.json new file mode 100644 index 0000000..b68af2b --- /dev/null +++ b/artifacts/contracts/RenPoolFactory.sol/RenPoolFactory.json @@ -0,0 +1,124 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RenPoolFactory", + "sourceName": "contracts/RenPoolFactory.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_pool", + "type": "address" + } + ], + "name": "PoolDeployed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_renTokenAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "_darknodeRegistryAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "_darknodePaymentAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "_claimRewardsAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "_gatewayRegistryAddr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_bond", + "type": "uint256" + } + ], + "name": "deployNewPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getPools", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pools", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614528806100606000396000f3fe60806040523480156200001157600080fd5b5060043610620000525760003560e01c80632d0d18911462000057578063673a2a1f146200008d5780638da5cb5b14620000af578063ac4afa3814620000d1575b600080fd5b6200007560048036038101906200006f91906200035b565b62000107565b604051620000849190620004e0565b60405180910390f35b620000976200022b565b604051620000a69190620005b8565b60405180910390f35b620000b9620002bb565b604051620000c89190620004e0565b60405180910390f35b620000ef6004803603810190620000e99190620003f7565b620002df565b604051620000fe9190620004e0565b60405180910390f35b6000803390506000888888888860008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878a60405162000145906200031f565b620001589897969594939291906200052a565b604051809103906000f08015801562000175573d6000803e3d6000fd5b50905060008190506001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8dc1358b8a9cf262058f5f7944b19b8d0884556e191652c63859d2bd85724f33838260405162000213929190620004fd565b60405180910390a18093505050509695505050505050565b60606001805480602002602001604051908101604052809291908181526020018280548015620002b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000266575b5050505050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018181548110620002f057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613e66806200068d83390190565b6000813590506200033e8162000658565b92915050565b600081359050620003558162000672565b92915050565b60008060008060008060c087890312156200037b576200037a62000653565b5b60006200038b89828a016200032d565b96505060206200039e89828a016200032d565b9550506040620003b189828a016200032d565b9450506060620003c489828a016200032d565b9350506080620003d789828a016200032d565b92505060a0620003ea89828a0162000344565b9150509295509295509295565b60006020828403121562000410576200040f62000653565b5b6000620004208482850162000344565b91505092915050565b600062000437838362000443565b60208301905092915050565b6200044e8162000615565b82525050565b6200045f8162000615565b82525050565b60006200047282620005ec565b6200047e818562000604565b93506200048b83620005dc565b8060005b83811015620004c2578151620004a6888262000429565b9750620004b383620005f7565b9250506001810190506200048f565b5085935050505092915050565b620004da8162000649565b82525050565b6000602082019050620004f7600083018462000454565b92915050565b600060408201905062000514600083018562000454565b62000523602083018462000454565b9392505050565b60006101008201905062000542600083018b62000454565b62000551602083018a62000454565b62000560604083018962000454565b6200056f606083018862000454565b6200057e608083018762000454565b6200058d60a083018662000454565b6200059c60c083018562000454565b620005ab60e0830184620004cf565b9998505050505050505050565b60006020820190508181036000830152620005d4818462000465565b905092915050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b6000620006228262000629565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b620006638162000615565b81146200066f57600080fd5b50565b6200067d8162000649565b81146200068957600080fd5b5056fe60806040523480156200001157600080fd5b5060405162003e6638038062003e66833981810160405281019062000037919062000296565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806004819055506000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff02191690831515021790555060006005819055506000600681905550600560078190555060056008819055505050505050505050620003d6565b6000815190506200027981620003a2565b92915050565b6000815190506200029081620003bc565b92915050565b600080600080600080600080610100898b031215620002ba57620002b96200039d565b5b6000620002ca8b828c0162000268565b9850506020620002dd8b828c0162000268565b9750506040620002f08b828c0162000268565b9650506060620003038b828c0162000268565b9550506080620003168b828c0162000268565b94505060a0620003298b828c0162000268565b93505060c06200033c8b828c0162000268565b92505060e06200034f8b828c016200027f565b9150509295985092959890939650565b60006200036c8262000373565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b620003ad816200035f565b8114620003b957600080fd5b50565b620003c78162000393565b8114620003d357600080fd5b50565b613a8080620003e66000396000f3fe6080604052600436106102085760003560e01c80637ecebe0011610118578063b6b34c67116100a0578063d693452e1161006f578063d693452e1461077e578063e39f6101146107a9578063e438a77d146107d4578063e714a028146107eb578063e7585aea146108025761025d565b8063b6b34c67146106e8578063b6b55f2514610713578063b7eb85c41461073c578063d5b2a01a146107535761025d565b80639e45e0d0116100e75780639e45e0d0146106015780639ee679e81461062c578063a4e2d63414610655578063aaaa0c4b14610680578063ac347987146106ab5761025d565b80637ecebe001461055757806389026538146105945780638da5cb5b146105ab578063901a6498146105d65761025d565b80632e1a7d4d1161019b57806364c9ec6f1161016a57806364c9ec6f1461045e5780636664e42e146104895780636ec21cc8146104b257806370a08231146104dd57806371bbef361461051a5761025d565b80632e1a7d4d146103b457806334246f9b146103dd578063372500ab1461040857806363ffab31146104335761025d565b8063270016fb116101d7578063270016fb146102e657806327b380f31461030f57806327e235e31461034c5780632e0f2625146103895761025d565b8063023c5b08146102625780631261795d1461028d57806313a0ae2b146102a457806322366844146102bb5761025d565b3661025d573373ffffffffffffffffffffffffffffffffffffffff167f66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c34604051610253919061334a565b60405180910390a2005b600080fd5b34801561026e57600080fd5b5061027761082b565b6040516102849190612f4d565b60405180910390f35b34801561029957600080fd5b506102a2610851565b005b3480156102b057600080fd5b506102b96109c2565b005b3480156102c757600080fd5b506102d0610a73565b6040516102dd9190612ffa565b60405180910390f35b3480156102f257600080fd5b5061030d6004803603810190610308919061299b565b610a86565b005b34801561031b57600080fd5b506103366004803603810190610331919061299b565b610e9a565b604051610343919061334a565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061299b565b610eb2565b604051610380919061334a565b60405180910390f35b34801561039557600080fd5b5061039e610eca565b6040516103ab91906133c5565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190612c1a565b610ecf565b005b3480156103e957600080fd5b506103f261119e565b6040516103ff91906130d4565b60405180910390f35b34801561041457600080fd5b5061041d6111c4565b60405161042a9190613083565b60405180910390f35b34801561043f57600080fd5b506104486111ea565b6040516104559190613061565b60405180910390f35b34801561046a57600080fd5b50610473611278565b604051610480919061334a565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612b67565b61127e565b005b3480156104be57600080fd5b506104c76114b0565b6040516104d4919061334a565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff919061299b565b6114b6565b604051610511919061334a565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190612af8565b6114ff565b60405161054e919061334a565b60405180910390f35b34801561056357600080fd5b5061057e6004803603810190610579919061299b565b611662565b60405161058b919061334a565b60405180910390f35b3480156105a057600080fd5b506105a961167a565b005b3480156105b757600080fd5b506105c0611896565b6040516105cd9190612f4d565b60405180910390f35b3480156105e257600080fd5b506105eb6118ba565b6040516105f89190612f4d565b60405180910390f35b34801561060d57600080fd5b506106166118e0565b60405161062391906130b9565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612c1a565b611906565b005b34801561066157600080fd5b5061066a611b0d565b6040516106779190612ffa565b60405180910390f35b34801561068c57600080fd5b50610695611b20565b6040516106a2919061334a565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612aaf565b611b26565b6040516106df919061334a565b60405180910390f35b3480156106f457600080fd5b506106fd611c62565b60405161070a919061309e565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190612c1a565b611c88565b005b34801561074857600080fd5b50610751611f38565b005b34801561075f57600080fd5b5061076861212b565b604051610775919061334a565b60405180910390f35b34801561078a57600080fd5b50610793612131565b6040516107a091906130ef565b60405180910390f35b3480156107b557600080fd5b506107be612157565b6040516107cb919061334a565b60405180910390f35b3480156107e057600080fd5b506107e961215d565b005b3480156107f757600080fd5b5061080061224d565b005b34801561080e57600080fd5b50610829600480360381019061082491906129c8565b612387565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906132ea565b60405180910390fd5b6000479050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561094e573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109b7919061334a565b60405180910390a250565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa89401a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a3f9190612f4d565b600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b50505050565b600960019054906101000a900460ff1681565b60003390506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b099061322a565b60405180910390fd5b600960009054906101000a900460ff16610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b589061328a565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb0919061349f565b9250508190555080600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c069190613526565b925050819055508060066000828254610c1f9190613526565b92505081905550600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b8152600401610cc893929190612f68565b602060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190612a28565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50906131ea565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401610db6929190612fd1565b602060405180830381600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190612a28565b610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e906132ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167fc0c6ac36718cda96fac02ecd8ae8aad366fb1ce2b294e1c2de0bee39ddd328af82604051610e8d919061334a565b60405180910390a2505050565b600b6020528060005260406000206000915090505481565b600a6020528060005260406000206000915090505481565b601281565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f529061332a565b60405180910390fd5b82811015610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061324a565b60405180910390fd5b600960009054906101000a900460ff1615610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe5906132aa565b60405180910390fd5b82600560008282546110009190613526565b9250508190555082600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110569190613526565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b81526004016110ba929190612fd1565b602060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c9190612a28565b61114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906131ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f315d4ef2c32c6e9b2d2364f5d35c06ffb3427d08357493b104b90799c99c1e3c84604051611191919061334a565b60405180910390a2505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600380546111f79061369d565b80601f01602080910402602001604051908101604052809291908181526020018280546112239061369d565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b505050505081565b60045481565b6000858560405160200161129392919061312c565b60405160208183030381529060405280519060200120905060008385836040516020016112c29392919061338e565b6040516020818303038152906040528051906020012090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364936b1e896040518263ffffffff1660e01b8152600401611337919061310a565b60206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190612a82565b73ffffffffffffffffffffffffffffffffffffffff1663159ab14d848885886040518563ffffffff1660e01b81526004016113c59493929190613015565b602060405180830381600087803b1580156113df57600080fd5b505af11580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190612c47565b90506114586040518060400160405280600a81526020017f6d696e74416d6f756e74000000000000000000000000000000000000000000008152508261256a565b3373ffffffffffffffffffffffffffffffffffffffff167f5387ab2b2012a616dcfbc6c0f6c6f7a6ef5b3fc7c7740476f7b20b65f50d59728260405161149e919061334a565b60405180910390a25050505050505050565b60055481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080339050600061271090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a430147f8888856040518463ffffffff1660e01b815260040161156d9392919061315c565b602060405180830381600087803b15801561158757600080fd5b505af115801561159b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bf9190612c47565b905080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325868360405161164d929190613365565b60405180910390a28093505050509392505050565b600c6020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117215750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906132ea565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117bd9190612f4d565b60206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612c47565b1161184d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118449061330a565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507fde17ec5ba6f9b5379a238e2a199366faccaedccf87879284014517333da74e2660405160405180910390a1565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311611992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119899061332a565b60405180910390fd5b828110156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc9061324a565b60405180910390fd5b600960009054906101000a900460ff16611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b9061328a565b60405180910390fd5b82600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260066000828254611a7a919061349f565b92505081905550600960019054906101000a900460ff168015611aac57506002600454611aa791906134f5565b600654115b15611aba57611ab9612606565b5b8173ffffffffffffffffffffffffffffffffffffffff167fd68fb6899f484313a5048f6f882da08bad2e51f156053cb0888c3a0a0c08259084604051611b00919061334a565b60405180910390a2505050565b600960009054906101000a900460ff1681565b60065481565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa74f1f836040518263ffffffff1660e01b8152600401611b83919061310a565b60206040518083038186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190612a55565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c0b9190612f4d565b60206040518083038186803b158015611c2357600080fd5b505afa158015611c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5b9190612c47565b9050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000339050600960009054906101000a900460ff1615611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd4906132aa565b60405180910390fd5b60008211611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d179061332a565b60405180910390fd5b60045460055483611d31919061349f565b1115611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061320a565b60405180910390fd5b81600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc1919061349f565b925050819055508160056000828254611dda919061349f565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9c4f7a1cc1751ba83a1ddccc2da94b1fcfc4efaa2c546f277e551b2dd9c0500583604051611e27919061334a565b60405180910390a26004546005541415611e4457611e436126d2565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230856040518463ffffffff1660e01b8152600401611ea393929190612f68565b602060405180830381600087803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef59190612a28565b611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906131ea565b60405180910390fd5b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf906132ea565b60405180910390fd5b600960009054906101000a900460ff16612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061328a565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b8152600401612098929190612fd1565b602060405180830381600087803b1580156120b257600080fd5b505af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190612a28565b612129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121209061326a565b60405180910390fd5b565b60075481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906132ea565b60405180910390fd5b61224b612606565b565b60003390506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061322a565b60405180910390fd5b80600660008282546122eb9190613526565b92505081905550600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558173ffffffffffffffffffffffffffffffffffffffff167f97470f6911e16b5918a53053f8d1a686e0acaf6a4bfc7b79d064aa24b9f057138260405161237b919061334a565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e906132ea565b60405180910390fd5b600960009054906101000a900460ff16612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d9061328a565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324b8fbf68484846040518463ffffffff1660e01b81526004016124c593929190612f9f565b600060405180830381600087803b1580156124df57600080fd5b505af11580156124f3573d6000803e3d6000fd5b505050506001600960016101000a81548160ff02191690831515021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160039190612564929190612744565b50505050565b612602828260405160240161258092919061319a565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061271b565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384ac33ec600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016126839190612f4d565b600060405180830381600087803b15801561269d57600080fd5b505af11580156126b1573d6000803e3d6000fd5b505050506000600960016101000a81548160ff021916908315150217905550565b6001600960006101000a81548160ff0219169083151502179055507f2e136745550967f28b779ce8c395ca060a2f844edfb5b06631fe677f66f9e30560405160405180910390a1565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b8280546127509061369d565b90600052602060002090601f01602090048101928261277257600085556127b9565b82601f1061278b57803560ff19168380011785556127b9565b828001600101855582156127b9579182015b828111156127b857823582559160200191906001019061279d565b5b5090506127c691906127ca565b5090565b5b808211156127e35760008160009055506001016127cb565b5090565b60006127fa6127f584613405565b6133e0565b905082815260208101848484011115612816576128156137cb565b5b61282184828561365b565b509392505050565b600061283c61283784613436565b6133e0565b905082815260208101848484011115612858576128576137cb565b5b61286384828561365b565b509392505050565b60008135905061287a816139d7565b92915050565b60008151905061288f816139ee565b92915050565b60008083601f8401126128ab576128aa6137c1565b5b8235905067ffffffffffffffff8111156128c8576128c76137bc565b5b6020830191508360018202830111156128e4576128e36137c6565b5b9250929050565b600082601f830112612900576128ff6137c1565b5b81356129108482602086016127e7565b91505092915050565b60008151905061292881613a05565b92915050565b60008151905061293d81613a1c565b92915050565b600082601f830112612958576129576137c1565b5b8135612968848260208601612829565b91505092915050565b60008135905061298081613a33565b92915050565b60008151905061299581613a33565b92915050565b6000602082840312156129b1576129b06137d5565b5b60006129bf8482850161286b565b91505092915050565b6000806000604084860312156129e1576129e06137d5565b5b60006129ef8682870161286b565b935050602084013567ffffffffffffffff811115612a1057612a0f6137d0565b5b612a1c86828701612895565b92509250509250925092565b600060208284031215612a3e57612a3d6137d5565b5b6000612a4c84828501612880565b91505092915050565b600060208284031215612a6b57612a6a6137d5565b5b6000612a7984828501612919565b91505092915050565b600060208284031215612a9857612a976137d5565b5b6000612aa68482850161292e565b91505092915050565b600060208284031215612ac557612ac46137d5565b5b600082013567ffffffffffffffff811115612ae357612ae26137d0565b5b612aef84828501612943565b91505092915050565b600080600060608486031215612b1157612b106137d5565b5b600084013567ffffffffffffffff811115612b2f57612b2e6137d0565b5b612b3b86828701612943565b9350506020612b4c8682870161286b565b9250506040612b5d86828701612971565b9150509250925092565b600080600080600060a08688031215612b8357612b826137d5565b5b600086013567ffffffffffffffff811115612ba157612ba06137d0565b5b612bad88828901612943565b9550506020612bbe8882890161286b565b9450506040612bcf88828901612971565b9350506060612be088828901612971565b925050608086013567ffffffffffffffff811115612c0157612c006137d0565b5b612c0d888289016128eb565b9150509295509295909350565b600060208284031215612c3057612c2f6137d5565b5b6000612c3e84828501612971565b91505092915050565b600060208284031215612c5d57612c5c6137d5565b5b6000612c6b84828501612986565b91505092915050565b612c7d8161355a565b82525050565b612c8c8161356c565b82525050565b612c9b81613578565b82525050565b6000612cad838561347d565b9350612cba83858461365b565b612cc3836137da565b840190509392505050565b6000612cd982613467565b612ce3818561347d565b9350612cf381856020860161366a565b612cfc816137da565b840191505092915050565b612d10816135dd565b82525050565b612d1f816135ef565b82525050565b612d2e81613601565b82525050565b612d3d81613613565b82525050565b612d4c81613625565b82525050565b6000612d5d82613472565b612d67818561348e565b9350612d7781856020860161366a565b612d80816137da565b840191505092915050565b6000612d9860188361348e565b9150612da3826137eb565b602082019050919050565b6000612dbb60178361348e565b9150612dc682613814565b602082019050919050565b6000612dde601e8361348e565b9150612de98261383d565b602082019050919050565b6000612e0160178361348e565b9150612e0c82613866565b602082019050919050565b6000612e24601b8361348e565b9150612e2f8261388f565b602082019050919050565b6000612e47601d8361348e565b9150612e52826138b8565b602082019050919050565b6000612e6a601b8361348e565b9150612e75826138e1565b602082019050919050565b6000612e8d60178361348e565b9150612e988261390a565b602082019050919050565b6000612eb060168361348e565b9150612ebb82613933565b602082019050919050565b6000612ed360158361348e565b9150612ede8261395c565b602082019050919050565b6000612ef6601d8361348e565b9150612f0182613985565b602082019050919050565b6000612f1960178361348e565b9150612f24826139ae565b602082019050919050565b612f38816135c6565b82525050565b612f47816135d0565b82525050565b6000602082019050612f626000830184612c74565b92915050565b6000606082019050612f7d6000830186612c74565b612f8a6020830185612c74565b612f976040830184612f2f565b949350505050565b6000604082019050612fb46000830186612c74565b8181036020830152612fc7818486612ca1565b9050949350505050565b6000604082019050612fe66000830185612c74565b612ff36020830184612f2f565b9392505050565b600060208201905061300f6000830184612c83565b92915050565b600060808201905061302a6000830187612c92565b6130376020830186612f2f565b6130446040830185612c92565b81810360608301526130568184612cce565b905095945050505050565b6000602082019050818103600083015261307b8184612cce565b905092915050565b60006020820190506130986000830184612d07565b92915050565b60006020820190506130b36000830184612d16565b92915050565b60006020820190506130ce6000830184612d25565b92915050565b60006020820190506130e96000830184612d34565b92915050565b60006020820190506131046000830184612d43565b92915050565b600060208201905081810360008301526131248184612d52565b905092915050565b600060408201905081810360008301526131468185612d52565b90506131556020830184612c74565b9392505050565b600060608201905081810360008301526131768186612d52565b90506131856020830185612c74565b6131926040830184612f2f565b949350505050565b600060408201905081810360008301526131b48185612d52565b90506131c36020830184612f2f565b9392505050565b600060208201905081810360008301526131e381612d8b565b9050919050565b6000602082019050818103600083015261320381612dae565b9050919050565b6000602082019050818103600083015261322381612dd1565b9050919050565b6000602082019050818103600083015261324381612df4565b9050919050565b6000602082019050818103600083015261326381612e17565b9050919050565b6000602082019050818103600083015261328381612e3a565b9050919050565b600060208201905081810360008301526132a381612e5d565b9050919050565b600060208201905081810360008301526132c381612e80565b9050919050565b600060208201905081810360008301526132e381612ea3565b9050919050565b6000602082019050818103600083015261330381612ec6565b9050919050565b6000602082019050818103600083015261332381612ee9565b9050919050565b6000602082019050818103600083015261334381612f0c565b9050919050565b600060208201905061335f6000830184612f2f565b92915050565b600060408201905061337a6000830185612f2f565b6133876020830184612f2f565b9392505050565b60006060820190506133a36000830186612f2f565b6133b06020830185612f2f565b6133bd6040830184612c92565b949350505050565b60006020820190506133da6000830184612f3e565b92915050565b60006133ea6133fb565b90506133f682826136cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156134205761341f61378d565b5b613429826137da565b9050602081019050919050565b600067ffffffffffffffff8211156134515761345061378d565b5b61345a826137da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006134aa826135c6565b91506134b5836135c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134ea576134e9613700565b5b828201905092915050565b6000613500826135c6565b915061350b836135c6565b92508261351b5761351a61372f565b5b828204905092915050565b6000613531826135c6565b915061353c836135c6565b92508282101561354f5761354e613700565b5b828203905092915050565b6000613565826135a6565b9050919050565b60008115159050919050565b6000819050919050565b600061358d8261355a565b9050919050565b600061359f8261355a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006135e882613637565b9050919050565b60006135fa82613637565b9050919050565b600061360c82613637565b9050919050565b600061361e82613637565b9050919050565b600061363082613637565b9050919050565b600061364282613649565b9050919050565b6000613654826135a6565b9050919050565b82818337600083830152505050565b60005b8381101561368857808201518184015260208101905061366d565b83811115613697576000848401525b50505050565b600060028204905060018216806136b557607f821691505b602082108114156136c9576136c861375e565b5b50919050565b6136d8826137da565b810181811067ffffffffffffffff821117156136f7576136f661378d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f52656e506f6f6c3a205769746864726177206661696c65640000000000000000600082015250565b7f52656e506f6f6c3a204465706f736974206661696c6564000000000000000000600082015250565b7f52656e506f6f6c3a20416d6f756e742073757270617373657320626f6e640000600082015250565b7f52656e506f6f6c3a20696e76616c696420616d6f756e74000000000000000000600082015250565b7f52656e506f6f6c3a20496e73756666696369656e742066756e64730000000000600082015250565b7f52656e506f6f6c3a20426f6e64207472616e73666572206661696c6564000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206e6f74206c6f636b65640000000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206c6f636b6564000000000000000000600082015250565b7f52656e506f6f6c3a20526566756e64206661696c656400000000000000000000600082015250565b7f52656e506f6f6c3a20556e617574686f72697a65640000000000000000000000600082015250565b7f52656e506f6f6c3a20506f6f6c2062616c616e6365206973207a65726f000000600082015250565b7f52656e506f6f6c3a20496e76616c696420616d6f756e74000000000000000000600082015250565b6139e08161355a565b81146139eb57600080fd5b50565b6139f78161356c565b8114613a0257600080fd5b50565b613a0e81613582565b8114613a1957600080fd5b50565b613a2581613594565b8114613a3057600080fd5b50565b613a3c816135c6565b8114613a4757600080fd5b5056fea26469706673582212200d75bb3d56461e8449387630b7f2039001d77c46cf625fab3f151f5223547a2464736f6c63430008070033a264697066735822122040d353be8d6af5f0f46e5291a4164d45d1bafde35fdbe8539543281e80e4494964736f6c63430008070033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000525760003560e01c80632d0d18911462000057578063673a2a1f146200008d5780638da5cb5b14620000af578063ac4afa3814620000d1575b600080fd5b6200007560048036038101906200006f91906200035b565b62000107565b604051620000849190620004e0565b60405180910390f35b620000976200022b565b604051620000a69190620005b8565b60405180910390f35b620000b9620002bb565b604051620000c89190620004e0565b60405180910390f35b620000ef6004803603810190620000e99190620003f7565b620002df565b604051620000fe9190620004e0565b60405180910390f35b6000803390506000888888888860008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878a60405162000145906200031f565b620001589897969594939291906200052a565b604051809103906000f08015801562000175573d6000803e3d6000fd5b50905060008190506001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8dc1358b8a9cf262058f5f7944b19b8d0884556e191652c63859d2bd85724f33838260405162000213929190620004fd565b60405180910390a18093505050509695505050505050565b60606001805480602002602001604051908101604052809291908181526020018280548015620002b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000266575b5050505050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018181548110620002f057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613e66806200068d83390190565b6000813590506200033e8162000658565b92915050565b600081359050620003558162000672565b92915050565b60008060008060008060c087890312156200037b576200037a62000653565b5b60006200038b89828a016200032d565b96505060206200039e89828a016200032d565b9550506040620003b189828a016200032d565b9450506060620003c489828a016200032d565b9350506080620003d789828a016200032d565b92505060a0620003ea89828a0162000344565b9150509295509295509295565b60006020828403121562000410576200040f62000653565b5b6000620004208482850162000344565b91505092915050565b600062000437838362000443565b60208301905092915050565b6200044e8162000615565b82525050565b6200045f8162000615565b82525050565b60006200047282620005ec565b6200047e818562000604565b93506200048b83620005dc565b8060005b83811015620004c2578151620004a6888262000429565b9750620004b383620005f7565b9250506001810190506200048f565b5085935050505092915050565b620004da8162000649565b82525050565b6000602082019050620004f7600083018462000454565b92915050565b600060408201905062000514600083018562000454565b62000523602083018462000454565b9392505050565b60006101008201905062000542600083018b62000454565b62000551602083018a62000454565b62000560604083018962000454565b6200056f606083018862000454565b6200057e608083018762000454565b6200058d60a083018662000454565b6200059c60c083018562000454565b620005ab60e0830184620004cf565b9998505050505050505050565b60006020820190508181036000830152620005d4818462000465565b905092915050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b6000620006228262000629565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b620006638162000615565b81146200066f57600080fd5b50565b6200067d8162000649565b81146200068957600080fd5b5056fe60806040523480156200001157600080fd5b5060405162003e6638038062003e66833981810160405281019062000037919062000296565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806004819055506000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff02191690831515021790555060006005819055506000600681905550600560078190555060056008819055505050505050505050620003d6565b6000815190506200027981620003a2565b92915050565b6000815190506200029081620003bc565b92915050565b600080600080600080600080610100898b031215620002ba57620002b96200039d565b5b6000620002ca8b828c0162000268565b9850506020620002dd8b828c0162000268565b9750506040620002f08b828c0162000268565b9650506060620003038b828c0162000268565b9550506080620003168b828c0162000268565b94505060a0620003298b828c0162000268565b93505060c06200033c8b828c0162000268565b92505060e06200034f8b828c016200027f565b9150509295985092959890939650565b60006200036c8262000373565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b620003ad816200035f565b8114620003b957600080fd5b50565b620003c78162000393565b8114620003d357600080fd5b50565b613a8080620003e66000396000f3fe6080604052600436106102085760003560e01c80637ecebe0011610118578063b6b34c67116100a0578063d693452e1161006f578063d693452e1461077e578063e39f6101146107a9578063e438a77d146107d4578063e714a028146107eb578063e7585aea146108025761025d565b8063b6b34c67146106e8578063b6b55f2514610713578063b7eb85c41461073c578063d5b2a01a146107535761025d565b80639e45e0d0116100e75780639e45e0d0146106015780639ee679e81461062c578063a4e2d63414610655578063aaaa0c4b14610680578063ac347987146106ab5761025d565b80637ecebe001461055757806389026538146105945780638da5cb5b146105ab578063901a6498146105d65761025d565b80632e1a7d4d1161019b57806364c9ec6f1161016a57806364c9ec6f1461045e5780636664e42e146104895780636ec21cc8146104b257806370a08231146104dd57806371bbef361461051a5761025d565b80632e1a7d4d146103b457806334246f9b146103dd578063372500ab1461040857806363ffab31146104335761025d565b8063270016fb116101d7578063270016fb146102e657806327b380f31461030f57806327e235e31461034c5780632e0f2625146103895761025d565b8063023c5b08146102625780631261795d1461028d57806313a0ae2b146102a457806322366844146102bb5761025d565b3661025d573373ffffffffffffffffffffffffffffffffffffffff167f66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c34604051610253919061334a565b60405180910390a2005b600080fd5b34801561026e57600080fd5b5061027761082b565b6040516102849190612f4d565b60405180910390f35b34801561029957600080fd5b506102a2610851565b005b3480156102b057600080fd5b506102b96109c2565b005b3480156102c757600080fd5b506102d0610a73565b6040516102dd9190612ffa565b60405180910390f35b3480156102f257600080fd5b5061030d6004803603810190610308919061299b565b610a86565b005b34801561031b57600080fd5b506103366004803603810190610331919061299b565b610e9a565b604051610343919061334a565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061299b565b610eb2565b604051610380919061334a565b60405180910390f35b34801561039557600080fd5b5061039e610eca565b6040516103ab91906133c5565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190612c1a565b610ecf565b005b3480156103e957600080fd5b506103f261119e565b6040516103ff91906130d4565b60405180910390f35b34801561041457600080fd5b5061041d6111c4565b60405161042a9190613083565b60405180910390f35b34801561043f57600080fd5b506104486111ea565b6040516104559190613061565b60405180910390f35b34801561046a57600080fd5b50610473611278565b604051610480919061334a565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612b67565b61127e565b005b3480156104be57600080fd5b506104c76114b0565b6040516104d4919061334a565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff919061299b565b6114b6565b604051610511919061334a565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190612af8565b6114ff565b60405161054e919061334a565b60405180910390f35b34801561056357600080fd5b5061057e6004803603810190610579919061299b565b611662565b60405161058b919061334a565b60405180910390f35b3480156105a057600080fd5b506105a961167a565b005b3480156105b757600080fd5b506105c0611896565b6040516105cd9190612f4d565b60405180910390f35b3480156105e257600080fd5b506105eb6118ba565b6040516105f89190612f4d565b60405180910390f35b34801561060d57600080fd5b506106166118e0565b60405161062391906130b9565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612c1a565b611906565b005b34801561066157600080fd5b5061066a611b0d565b6040516106779190612ffa565b60405180910390f35b34801561068c57600080fd5b50610695611b20565b6040516106a2919061334a565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612aaf565b611b26565b6040516106df919061334a565b60405180910390f35b3480156106f457600080fd5b506106fd611c62565b60405161070a919061309e565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190612c1a565b611c88565b005b34801561074857600080fd5b50610751611f38565b005b34801561075f57600080fd5b5061076861212b565b604051610775919061334a565b60405180910390f35b34801561078a57600080fd5b50610793612131565b6040516107a091906130ef565b60405180910390f35b3480156107b557600080fd5b506107be612157565b6040516107cb919061334a565b60405180910390f35b3480156107e057600080fd5b506107e961215d565b005b3480156107f757600080fd5b5061080061224d565b005b34801561080e57600080fd5b50610829600480360381019061082491906129c8565b612387565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906132ea565b60405180910390fd5b6000479050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561094e573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109b7919061334a565b60405180910390a250565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa89401a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a3f9190612f4d565b600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b50505050565b600960019054906101000a900460ff1681565b60003390506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b099061322a565b60405180910390fd5b600960009054906101000a900460ff16610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b589061328a565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb0919061349f565b9250508190555080600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c069190613526565b925050819055508060066000828254610c1f9190613526565b92505081905550600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b8152600401610cc893929190612f68565b602060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190612a28565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50906131ea565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401610db6929190612fd1565b602060405180830381600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190612a28565b610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e906132ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167fc0c6ac36718cda96fac02ecd8ae8aad366fb1ce2b294e1c2de0bee39ddd328af82604051610e8d919061334a565b60405180910390a2505050565b600b6020528060005260406000206000915090505481565b600a6020528060005260406000206000915090505481565b601281565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f529061332a565b60405180910390fd5b82811015610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061324a565b60405180910390fd5b600960009054906101000a900460ff1615610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe5906132aa565b60405180910390fd5b82600560008282546110009190613526565b9250508190555082600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110569190613526565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b81526004016110ba929190612fd1565b602060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c9190612a28565b61114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906131ca565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f315d4ef2c32c6e9b2d2364f5d35c06ffb3427d08357493b104b90799c99c1e3c84604051611191919061334a565b60405180910390a2505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600380546111f79061369d565b80601f01602080910402602001604051908101604052809291908181526020018280546112239061369d565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b505050505081565b60045481565b6000858560405160200161129392919061312c565b60405160208183030381529060405280519060200120905060008385836040516020016112c29392919061338e565b6040516020818303038152906040528051906020012090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364936b1e896040518263ffffffff1660e01b8152600401611337919061310a565b60206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190612a82565b73ffffffffffffffffffffffffffffffffffffffff1663159ab14d848885886040518563ffffffff1660e01b81526004016113c59493929190613015565b602060405180830381600087803b1580156113df57600080fd5b505af11580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190612c47565b90506114586040518060400160405280600a81526020017f6d696e74416d6f756e74000000000000000000000000000000000000000000008152508261256a565b3373ffffffffffffffffffffffffffffffffffffffff167f5387ab2b2012a616dcfbc6c0f6c6f7a6ef5b3fc7c7740476f7b20b65f50d59728260405161149e919061334a565b60405180910390a25050505050505050565b60055481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080339050600061271090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a430147f8888856040518463ffffffff1660e01b815260040161156d9392919061315c565b602060405180830381600087803b15801561158757600080fd5b505af115801561159b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bf9190612c47565b905080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325868360405161164d929190613365565b60405180910390a28093505050509392505050565b600c6020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117215750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906132ea565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117bd9190612f4d565b60206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612c47565b1161184d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118449061330a565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507fde17ec5ba6f9b5379a238e2a199366faccaedccf87879284014517333da74e2660405160405180910390a1565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003390506000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008311611992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119899061332a565b60405180910390fd5b828110156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc9061324a565b60405180910390fd5b600960009054906101000a900460ff16611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b9061328a565b60405180910390fd5b82600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260066000828254611a7a919061349f565b92505081905550600960019054906101000a900460ff168015611aac57506002600454611aa791906134f5565b600654115b15611aba57611ab9612606565b5b8173ffffffffffffffffffffffffffffffffffffffff167fd68fb6899f484313a5048f6f882da08bad2e51f156053cb0888c3a0a0c08259084604051611b00919061334a565b60405180910390a2505050565b600960009054906101000a900460ff1681565b60065481565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efa74f1f836040518263ffffffff1660e01b8152600401611b83919061310a565b60206040518083038186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190612a55565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c0b9190612f4d565b60206040518083038186803b158015611c2357600080fd5b505afa158015611c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5b9190612c47565b9050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000339050600960009054906101000a900460ff1615611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd4906132aa565b60405180910390fd5b60008211611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d179061332a565b60405180910390fd5b60045460055483611d31919061349f565b1115611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061320a565b60405180910390fd5b81600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc1919061349f565b925050819055508160056000828254611dda919061349f565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9c4f7a1cc1751ba83a1ddccc2da94b1fcfc4efaa2c546f277e551b2dd9c0500583604051611e27919061334a565b60405180910390a26004546005541415611e4457611e436126d2565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230856040518463ffffffff1660e01b8152600401611ea393929190612f68565b602060405180830381600087803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef59190612a28565b611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906131ea565b60405180910390fd5b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf906132ea565b60405180910390fd5b600960009054906101000a900460ff16612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061328a565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b8152600401612098929190612fd1565b602060405180830381600087803b1580156120b257600080fd5b505af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190612a28565b612129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121209061326a565b60405180910390fd5b565b60075481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906132ea565b60405180910390fd5b61224b612606565b565b60003390506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061322a565b60405180910390fd5b80600660008282546122eb9190613526565b92505081905550600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558173ffffffffffffffffffffffffffffffffffffffff167f97470f6911e16b5918a53053f8d1a686e0acaf6a4bfc7b79d064aa24b9f057138260405161237b919061334a565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e906132ea565b60405180910390fd5b600960009054906101000a900460ff16612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d9061328a565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324b8fbf68484846040518463ffffffff1660e01b81526004016124c593929190612f9f565b600060405180830381600087803b1580156124df57600080fd5b505af11580156124f3573d6000803e3d6000fd5b505050506001600960016101000a81548160ff02191690831515021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160039190612564929190612744565b50505050565b612602828260405160240161258092919061319a565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061271b565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384ac33ec600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016126839190612f4d565b600060405180830381600087803b15801561269d57600080fd5b505af11580156126b1573d6000803e3d6000fd5b505050506000600960016101000a81548160ff021916908315150217905550565b6001600960006101000a81548160ff0219169083151502179055507f2e136745550967f28b779ce8c395ca060a2f844edfb5b06631fe677f66f9e30560405160405180910390a1565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b8280546127509061369d565b90600052602060002090601f01602090048101928261277257600085556127b9565b82601f1061278b57803560ff19168380011785556127b9565b828001600101855582156127b9579182015b828111156127b857823582559160200191906001019061279d565b5b5090506127c691906127ca565b5090565b5b808211156127e35760008160009055506001016127cb565b5090565b60006127fa6127f584613405565b6133e0565b905082815260208101848484011115612816576128156137cb565b5b61282184828561365b565b509392505050565b600061283c61283784613436565b6133e0565b905082815260208101848484011115612858576128576137cb565b5b61286384828561365b565b509392505050565b60008135905061287a816139d7565b92915050565b60008151905061288f816139ee565b92915050565b60008083601f8401126128ab576128aa6137c1565b5b8235905067ffffffffffffffff8111156128c8576128c76137bc565b5b6020830191508360018202830111156128e4576128e36137c6565b5b9250929050565b600082601f830112612900576128ff6137c1565b5b81356129108482602086016127e7565b91505092915050565b60008151905061292881613a05565b92915050565b60008151905061293d81613a1c565b92915050565b600082601f830112612958576129576137c1565b5b8135612968848260208601612829565b91505092915050565b60008135905061298081613a33565b92915050565b60008151905061299581613a33565b92915050565b6000602082840312156129b1576129b06137d5565b5b60006129bf8482850161286b565b91505092915050565b6000806000604084860312156129e1576129e06137d5565b5b60006129ef8682870161286b565b935050602084013567ffffffffffffffff811115612a1057612a0f6137d0565b5b612a1c86828701612895565b92509250509250925092565b600060208284031215612a3e57612a3d6137d5565b5b6000612a4c84828501612880565b91505092915050565b600060208284031215612a6b57612a6a6137d5565b5b6000612a7984828501612919565b91505092915050565b600060208284031215612a9857612a976137d5565b5b6000612aa68482850161292e565b91505092915050565b600060208284031215612ac557612ac46137d5565b5b600082013567ffffffffffffffff811115612ae357612ae26137d0565b5b612aef84828501612943565b91505092915050565b600080600060608486031215612b1157612b106137d5565b5b600084013567ffffffffffffffff811115612b2f57612b2e6137d0565b5b612b3b86828701612943565b9350506020612b4c8682870161286b565b9250506040612b5d86828701612971565b9150509250925092565b600080600080600060a08688031215612b8357612b826137d5565b5b600086013567ffffffffffffffff811115612ba157612ba06137d0565b5b612bad88828901612943565b9550506020612bbe8882890161286b565b9450506040612bcf88828901612971565b9350506060612be088828901612971565b925050608086013567ffffffffffffffff811115612c0157612c006137d0565b5b612c0d888289016128eb565b9150509295509295909350565b600060208284031215612c3057612c2f6137d5565b5b6000612c3e84828501612971565b91505092915050565b600060208284031215612c5d57612c5c6137d5565b5b6000612c6b84828501612986565b91505092915050565b612c7d8161355a565b82525050565b612c8c8161356c565b82525050565b612c9b81613578565b82525050565b6000612cad838561347d565b9350612cba83858461365b565b612cc3836137da565b840190509392505050565b6000612cd982613467565b612ce3818561347d565b9350612cf381856020860161366a565b612cfc816137da565b840191505092915050565b612d10816135dd565b82525050565b612d1f816135ef565b82525050565b612d2e81613601565b82525050565b612d3d81613613565b82525050565b612d4c81613625565b82525050565b6000612d5d82613472565b612d67818561348e565b9350612d7781856020860161366a565b612d80816137da565b840191505092915050565b6000612d9860188361348e565b9150612da3826137eb565b602082019050919050565b6000612dbb60178361348e565b9150612dc682613814565b602082019050919050565b6000612dde601e8361348e565b9150612de98261383d565b602082019050919050565b6000612e0160178361348e565b9150612e0c82613866565b602082019050919050565b6000612e24601b8361348e565b9150612e2f8261388f565b602082019050919050565b6000612e47601d8361348e565b9150612e52826138b8565b602082019050919050565b6000612e6a601b8361348e565b9150612e75826138e1565b602082019050919050565b6000612e8d60178361348e565b9150612e988261390a565b602082019050919050565b6000612eb060168361348e565b9150612ebb82613933565b602082019050919050565b6000612ed360158361348e565b9150612ede8261395c565b602082019050919050565b6000612ef6601d8361348e565b9150612f0182613985565b602082019050919050565b6000612f1960178361348e565b9150612f24826139ae565b602082019050919050565b612f38816135c6565b82525050565b612f47816135d0565b82525050565b6000602082019050612f626000830184612c74565b92915050565b6000606082019050612f7d6000830186612c74565b612f8a6020830185612c74565b612f976040830184612f2f565b949350505050565b6000604082019050612fb46000830186612c74565b8181036020830152612fc7818486612ca1565b9050949350505050565b6000604082019050612fe66000830185612c74565b612ff36020830184612f2f565b9392505050565b600060208201905061300f6000830184612c83565b92915050565b600060808201905061302a6000830187612c92565b6130376020830186612f2f565b6130446040830185612c92565b81810360608301526130568184612cce565b905095945050505050565b6000602082019050818103600083015261307b8184612cce565b905092915050565b60006020820190506130986000830184612d07565b92915050565b60006020820190506130b36000830184612d16565b92915050565b60006020820190506130ce6000830184612d25565b92915050565b60006020820190506130e96000830184612d34565b92915050565b60006020820190506131046000830184612d43565b92915050565b600060208201905081810360008301526131248184612d52565b905092915050565b600060408201905081810360008301526131468185612d52565b90506131556020830184612c74565b9392505050565b600060608201905081810360008301526131768186612d52565b90506131856020830185612c74565b6131926040830184612f2f565b949350505050565b600060408201905081810360008301526131b48185612d52565b90506131c36020830184612f2f565b9392505050565b600060208201905081810360008301526131e381612d8b565b9050919050565b6000602082019050818103600083015261320381612dae565b9050919050565b6000602082019050818103600083015261322381612dd1565b9050919050565b6000602082019050818103600083015261324381612df4565b9050919050565b6000602082019050818103600083015261326381612e17565b9050919050565b6000602082019050818103600083015261328381612e3a565b9050919050565b600060208201905081810360008301526132a381612e5d565b9050919050565b600060208201905081810360008301526132c381612e80565b9050919050565b600060208201905081810360008301526132e381612ea3565b9050919050565b6000602082019050818103600083015261330381612ec6565b9050919050565b6000602082019050818103600083015261332381612ee9565b9050919050565b6000602082019050818103600083015261334381612f0c565b9050919050565b600060208201905061335f6000830184612f2f565b92915050565b600060408201905061337a6000830185612f2f565b6133876020830184612f2f565b9392505050565b60006060820190506133a36000830186612f2f565b6133b06020830185612f2f565b6133bd6040830184612c92565b949350505050565b60006020820190506133da6000830184612f3e565b92915050565b60006133ea6133fb565b90506133f682826136cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156134205761341f61378d565b5b613429826137da565b9050602081019050919050565b600067ffffffffffffffff8211156134515761345061378d565b5b61345a826137da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006134aa826135c6565b91506134b5836135c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134ea576134e9613700565b5b828201905092915050565b6000613500826135c6565b915061350b836135c6565b92508261351b5761351a61372f565b5b828204905092915050565b6000613531826135c6565b915061353c836135c6565b92508282101561354f5761354e613700565b5b828203905092915050565b6000613565826135a6565b9050919050565b60008115159050919050565b6000819050919050565b600061358d8261355a565b9050919050565b600061359f8261355a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006135e882613637565b9050919050565b60006135fa82613637565b9050919050565b600061360c82613637565b9050919050565b600061361e82613637565b9050919050565b600061363082613637565b9050919050565b600061364282613649565b9050919050565b6000613654826135a6565b9050919050565b82818337600083830152505050565b60005b8381101561368857808201518184015260208101905061366d565b83811115613697576000848401525b50505050565b600060028204905060018216806136b557607f821691505b602082108114156136c9576136c861375e565b5b50919050565b6136d8826137da565b810181811067ffffffffffffffff821117156136f7576136f661378d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f52656e506f6f6c3a205769746864726177206661696c65640000000000000000600082015250565b7f52656e506f6f6c3a204465706f736974206661696c6564000000000000000000600082015250565b7f52656e506f6f6c3a20416d6f756e742073757270617373657320626f6e640000600082015250565b7f52656e506f6f6c3a20696e76616c696420616d6f756e74000000000000000000600082015250565b7f52656e506f6f6c3a20496e73756666696369656e742066756e64730000000000600082015250565b7f52656e506f6f6c3a20426f6e64207472616e73666572206661696c6564000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206e6f74206c6f636b65640000000000600082015250565b7f52656e506f6f6c3a20506f6f6c206973206c6f636b6564000000000000000000600082015250565b7f52656e506f6f6c3a20526566756e64206661696c656400000000000000000000600082015250565b7f52656e506f6f6c3a20556e617574686f72697a65640000000000000000000000600082015250565b7f52656e506f6f6c3a20506f6f6c2062616c616e6365206973207a65726f000000600082015250565b7f52656e506f6f6c3a20496e76616c696420616d6f756e74000000000000000000600082015250565b6139e08161355a565b81146139eb57600080fd5b50565b6139f78161356c565b8114613a0257600080fd5b50565b613a0e81613582565b8114613a1957600080fd5b50565b613a2581613594565b8114613a3057600080fd5b50565b613a3c816135c6565b8114613a4757600080fd5b5056fea26469706673582212200d75bb3d56461e8449387630b7f2039001d77c46cf625fab3f151f5223547a2464736f6c63430008070033a264697066735822122040d353be8d6af5f0f46e5291a4164d45d1bafde35fdbe8539543281e80e4494964736f6c63430008070033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/RenPool.sol b/contracts/RenPool.sol index 05a0d13..2a04cb3 100644 --- a/contracts/RenPool.sol +++ b/contracts/RenPool.sol @@ -21,14 +21,16 @@ contract RenPool { uint256 public bond; uint256 public totalPooled; + uint256 public totalWithdrawalRequested; uint256 public ownerFee; // Percentage uint256 public nodeOperatorFee; // Percentage bool public isLocked; // ^ we could use enum instead POOL_STATUS = { OPEN /* 0 */, CLOSE /* 1 */ } + bool public isRegistered; mapping(address => uint256) public balances; - mapping(address => uint256) public withdrawRequests; + mapping(address => uint256) public withdrawalRequests; mapping(address => uint256) public nonces; IERC20 public renToken; @@ -39,6 +41,9 @@ contract RenPool { event RenDeposited(address indexed _from, uint256 _amount); event RenWithdrawn(address indexed _from, uint256 _amount); + event RenWithdrawalRequested(address indexed _from, uint256 _amount); + event RenWithdrawalRequestFulfilled(address indexed _from, uint256 _amount); + event RenWithdrawalRequestCancelled(address indexed _from, uint256 _amount); event EthDeposited(address indexed _from, uint256 _amount); event EthWithdrawn(address indexed _from, uint256 _amount); event PoolLocked(); @@ -78,7 +83,9 @@ contract RenPool { gatewayRegistry = IGatewayRegistry(_gatewayRegistryAddr); bond = _bond; isLocked = false; + isRegistered = false; totalPooled = 0; + totalWithdrawalRequested = 0; ownerFee = 5; nodeOperatorFee = 5; } @@ -86,7 +93,7 @@ contract RenPool { modifier onlyNodeOperator() { require ( msg.sender == nodeOperator, - "RenPool: Caller is not node operator" + "RenPool: Unauthorized" ); _; } @@ -94,7 +101,7 @@ contract RenPool { modifier onlyOwnerNodeOperator() { require ( msg.sender == owner || msg.sender == nodeOperator, - "RenPool: Caller is not owner nor node operator" + "RenPool: Unauthorized" ); _; } @@ -102,7 +109,7 @@ contract RenPool { modifier onlyOwner() { require ( msg.sender == owner, - "RenPool: Caller is not owner" + "RenPool: Unauthorized" ); _; } @@ -116,8 +123,13 @@ contract RenPool { emit PoolLocked(); } + function _deregisterDarknode() private { + darknodeRegistry.deregister(darknodeID); + isRegistered = false; + } + function unlockPool() external onlyOwnerNodeOperator { - require(renToken.balanceOf(address(this)) > 0, "Pool balance is zero"); + require(renToken.balanceOf(address(this)) > 0, "RenPool: Pool balance is zero"); isLocked = false; emit PoolUnlocked(); } @@ -159,76 +171,93 @@ contract RenPool { address sender = msg.sender; uint256 senderBalance = balances[sender]; - require(senderBalance > 0 && senderBalance >= _amount, "Insufficient funds"); - require(!isLocked, "Pool is locked"); + require(_amount > 0, "RenPool: Invalid amount"); + require(senderBalance >= _amount, "RenPool: Insufficient funds"); + require(!isLocked, "RenPool: Pool is locked"); totalPooled -= _amount; balances[sender] -= _amount; require( renToken.transfer(sender, _amount), - "Withdraw failed" + "RenPool: Withdraw failed" ); emit RenWithdrawn(sender, _amount); } /** - * @notice Requesting a withdraw in case the pool is locked. The amount - * that needs to be withdrawn will be replaced by another user using the - * fulfillWithdrawRequest method. + * @notice Requesting a withdraw in case the pool is locked. The amount + * that needs to be withdrawn will be replaced by another user using the + * fulfillWithdrawalRequest method. * * @param _amount The amount of REN to be withdrawn. * * @dev Users can have up to a single request active. In case of several * calls to this method, only the last request will be preserved. */ - function requestWithdraw(uint256 _amount) external { + function requestWithdrawal(uint256 _amount) external { address sender = msg.sender; uint256 senderBalance = balances[sender]; - require(senderBalance > 0 && senderBalance >= _amount, "Insufficient funds"); - require(isLocked, "Pool is not locked"); + require(_amount > 0, "RenPool: Invalid amount"); + require(senderBalance >= _amount, "RenPool: Insufficient funds"); + require(isLocked, "RenPool: Pool is not locked"); + + withdrawalRequests[sender] = _amount; + totalWithdrawalRequested += _amount; - withdrawRequests[sender] = _amount; + if(isRegistered && totalWithdrawalRequested > bond / 2) { + _deregisterDarknode(); + } - // TODO emit event + emit RenWithdrawalRequested(sender, _amount); } /** - * @notice User wanting to fullill the withdraw request will pay the amount + * @notice User wanting to fulfill the withdraw request will pay the amount * the user wanting to withdraw his money. * * @param _target The amount of REN to be withdrawn. */ - function fulfillWithdrawRequest(address _target) external { + function fulfillWithdrawalRequest(address _target) external { address sender = msg.sender; - uint256 amount = withdrawRequests[_target]; - // ^ This could not be defined plus make sure amount > 0 - // TODO: make sure user cannot fullfil his own request - // TODO: add test for when _target doesn't have an associated withdrawRequest + uint256 amount = withdrawalRequests[_target]; - require(isLocked, "Pool is not locked"); + require(amount > 0, "RenPool: invalid amount"); + require(isLocked, "RenPool: Pool is not locked"); balances[sender] += amount; balances[_target] -= amount; - delete withdrawRequests[_target]; + totalWithdrawalRequested -= amount; + + delete withdrawalRequests[_target]; // Transfer funds from sender to _target require( renToken.transferFrom(sender, address(this), amount), - "Deposit failed" + "RenPool: Deposit failed" ); require( renToken.transfer(_target, amount), - "Refund failed" + "RenPool: Refund failed" ); - // TODO emit event + emit RenWithdrawalRequestFulfilled(sender, amount); } - // TODO: cancelWithdrawRequest - // TODO: getWithdrawRequests + function cancelWithdrawalRequest() external { + address sender = msg.sender; + uint256 amount = withdrawalRequests[sender]; + + require(amount > 0, "RenPool: invalid amount"); + + totalWithdrawalRequested -= amount; + + delete withdrawalRequests[sender]; + + emit RenWithdrawalRequestCancelled(sender, amount); + } /** * @notice Return REN balance for the given address. @@ -244,11 +273,11 @@ contract RenPool { * registering the darknode. */ function approveBondTransfer() external onlyNodeOperator { - require(isLocked, "Pool is not locked"); + require(isLocked, "RenPool: Pool is not locked"); require( renToken.approve(address(darknodeRegistry), bond), - "Bond transfer failed" + "RenPool: Bond transfer failed" ); } @@ -266,10 +295,11 @@ contract RenPool { * other darknodes and traders to encrypt messages to the trader. */ function registerDarknode(address _darknodeID, bytes calldata _publicKey) external onlyNodeOperator { - require(isLocked, "Pool is not locked"); + require(isLocked, "RenPool: Pool is not locked"); darknodeRegistry.register(_darknodeID, _publicKey); + isRegistered = true; darknodeID = _darknodeID; publicKey = _publicKey; } @@ -283,7 +313,7 @@ contract RenPool { * to being able to call refund. */ function deregisterDarknode() external onlyOwnerNodeOperator { - darknodeRegistry.deregister(darknodeID); + _deregisterDarknode(); } /** diff --git a/index.d.ts b/index.d.ts index 67d0518..e1aa371 100644 --- a/index.d.ts +++ b/index.d.ts @@ -37,6 +37,7 @@ export type Artifact = { }; export const RenPool: Artifact; +export const RenPoolFactory: Artifact; export const IERC20Standard: Artifact; export const IDarknodeRegistry: Artifact; diff --git a/index.js b/index.js index cb3bff8..507636e 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,12 @@ -const RenPool = require('./artifacts/contracts/RenPool.sol/RenPool.json'); +const RenPool= require('./artifacts/contracts/RenPool.sol/RenPool.json'); +const RenPoolFactory = require('./artifacts/contracts/RenPoolFactory.sol/RenPoolFactory.json'); const IERC20Standard = require('./artifacts/@renproject/gateway-sol/contracts/Gateway/interfaces/IERC20Standard.sol/IERC20Standard.json'); const IDarknodeRegistry = require('./artifacts/interfaces/IDarknodeRegistry.sol/IDarknodeRegistry.json'); const deployments = require('./ren-deployments.js'); module.exports = { RenPool, + RenPoolFactory, IERC20Standard, IDarknodeRegistry, deployments, diff --git a/scripts/deploy.js b/scripts/deploy.js index 25f32bb..c502027 100644 --- a/scripts/deploy.js +++ b/scripts/deploy.js @@ -40,32 +40,34 @@ async function faucet(renToken, account) { } async function main() { - print(`${chalk.italic('\u{1F680} RenPool contract deployment')}`); + print(`${chalk.italic('\u{1F680} RenPoolFactory contract deployment')}`); print(`Using network ${chalk.bold(hre.network.name)} (${chalk.bold(hre.network.config.chainId)})`); - print(`Getting signers to deploy RenPool contract`); + print(`Getting signers to deploy RenPoolFactory contract`); const [owner] = await ethers.getSigners(); - const nodeOperator = owner; - - print(`Deploying ${chalk.bold('RenPool')} contract`); - const RenPool = await ethers.getContractFactory('RenPool'); - const renPool = await RenPool.connect(nodeOperator).deploy( - renTokenAddr, - darknodeRegistryAddr, - darknodePaymentAddr, - claimRewardsAddr, - gatewayRegistryAddr, - owner.address, - nodeOperator.address, - POOL_BOND); - await renPool.deployed(); - - print(`Deployed to ${chalk.bold(renPool.address)} TX ${chalk.bold(renPool.deployTransaction.hash)}`); + // const nodeOperator = owner; + + print(`Deploying ${chalk.bold('RenPoolFactory')} contract`); + const RenPoolFactory = await ethers.getContractFactory('RenPoolFactory'); + const renPoolFactory = await RenPoolFactory.connect(owner).deploy(); + await renPoolFactory.deployed(); + // const renPool = await RenPoolFactory.connect(nodeOperator).deploy( + // renTokenAddr, + // darknodeRegistryAddr, + // darknodePaymentAddr, + // claimRewardsAddr, + // gatewayRegistryAddr, + // owner.address, + // nodeOperator.address, + // POOL_BOND); + // await renPool.deployed(); + + print(`Deployed to ${chalk.bold(renPoolFactory.address)} TX ${chalk.bold(renPoolFactory.deployTransaction.hash)}`); const renToken = new ethers.Contract(renTokenAddr, RenToken.abi, owner); if (hre.network.name === 'hardhat') { - print('Skipping RenPool contract Etherscan verification') + print('Skipping RenPoolFactory contract Etherscan verification') await provider.request({ method: 'hardhat_impersonateAccount', params: [topRenTokenHolderAddr] }); @@ -88,26 +90,26 @@ async function main() { } else { print('Waiting before verification'); await sleep(30000); - const balance = await renPool.balanceOf(owner.address); - print(` Owner's balance is ${chalk.yellow(balance)}`); + // const balance = await renPool.balanceOf(owner.address); + // print(` Owner's balance is ${chalk.yellow(balance)}`); - print('Verifying RenPool smart contract in Etherscan') + print('Verifying RenPoolFactory smart contract in Etherscan') await hre.run("verify:verify", { - address: renPool.address, - constructorArguments: [ - renTokenAddr, - darknodeRegistryAddr, - darknodePaymentAddr, - claimRewardsAddr, - gatewayRegistryAddr, - owner.address, - POOL_BOND - ], + address: renPoolFactory.address, + constructorArguments: [] + // renTokenAddr, + // darknodeRegistryAddr, + // darknodePaymentAddr, + // claimRewardsAddr, + // gatewayRegistryAddr, + // owner.address, + // POOL_BOND + // ], }); } - return { renPool, renToken, faucet }; + return { renPoolFactory, renToken, faucet }; } if (require.main === module) { diff --git a/test/RenPool.test.js b/test/RenPool.test.js index bfba502..110de93 100644 --- a/test/RenPool.test.js +++ b/test/RenPool.test.js @@ -178,7 +178,7 @@ describe('RenPool contract test', function () { }); - describe('withdraw/fulfillWithdrawRequest', function () { + describe('withdraw/requestWithdrawal/fulfillWithdrawalRequest', function () { [bn(1), POOL_BOND.sub(1)].forEach(amount => { it('should withdraw properly', async function () { @@ -222,6 +222,39 @@ describe('RenPool contract test', function () { expect(await renPool.totalPooled()).to.equal(0); }); + [bn(1), POOL_BOND].forEach(amount => { + it('should create a withdrawal request', async function () { + // Lock pool + await renToken.connect(bob).approve(renPool.address, POOL_BOND); + await renPool.connect(bob).deposit(POOL_BOND); + expect(await renPool.isLocked()).to.be.true; + + // Request withdrawal + await renPool.connect(bob).requestWithdrawal(amount); + expect(await renPool.withdrawalRequests(bob.address)).to.equal(amount); + expect(await renPool.totalWithdrawalRequested()).to.equal(amount); + }); + }); + + [bn(1), POOL_BOND].forEach(amount => { + it('should cancel a withdrawal request', async function () { + // Lock pool + await renToken.connect(bob).approve(renPool.address, POOL_BOND); + await renPool.connect(bob).deposit(POOL_BOND); + expect(await renPool.isLocked()).to.be.true; + + // Request withdrawal + await renPool.connect(bob).requestWithdrawal(amount); + expect(await renPool.withdrawalRequests(bob.address)).to.equal(amount); + expect(await renPool.totalWithdrawalRequested()).to.equal(amount); + + // Cancel withdrawal request + await renPool.connect(bob).cancelWithdrawalRequest(); + expect(await renPool.withdrawalRequests(bob.address)).to.equal(bn(0)); + expect(await renPool.totalWithdrawalRequested()).to.equal(bn(0)); + }); + }); + [bn(1), POOL_BOND].forEach(amount => { it('should fulfill withdraw properly', async function () { const aliceBalance = await renToken.balanceOf(alice.address); @@ -232,13 +265,13 @@ describe('RenPool contract test', function () { await renPool.connect(bob).deposit(POOL_BOND); expect(await renPool.isLocked()).to.be.true; - // Request withdraw - await renPool.connect(bob).requestWithdraw(amount); - expect(await renPool.withdrawRequests(bob.address)).to.equal(amount); + // Request withdrawal + await renPool.connect(bob).requestWithdrawal(amount); + expect(await renPool.withdrawalRequests(bob.address)).to.equal(amount); - // Fulfill withdraw request + // Fulfill withdrawal request await renToken.connect(alice).approve(renPool.address, POOL_BOND); - await renPool.connect(alice).fulfillWithdrawRequest(bob.address); + await renPool.connect(alice).fulfillWithdrawalRequest(bob.address); // Verify correct balances expect(await renToken.balanceOf(renPool.address)).to.equal(POOL_BOND); @@ -287,6 +320,7 @@ describe('RenPool contract test', function () { // Verify funds are transferred to the DarknodeRegistryStore contract // and the darknode is under 'pending registration' state + expect(await renPool.isRegistered()).to.be.true; expect(await renToken.balanceOf(darknodeRegistryStoreAddr)).to.equal(registryStoreBalance.add(POOL_BOND)); expect(await renToken.balanceOf(renPool.address)).to.equal(0); expect(await darknodeRegistry.isPendingRegistration(NODE_ID)).to.be.true; @@ -306,32 +340,54 @@ describe('RenPool contract test', function () { expect(await darknodeRegistry.getDarknodeOperator(NODE_ID)).to.equal(renPool.address); }); + it('should fail when bond transfer is not approved by node operator', async () => { + expect(alice).to.not.equal(nodeOperator); + + // Lock pool + await renToken.connect(alice).approve(renPool.address, POOL_BOND); + await renPool.connect(alice).deposit(POOL_BOND); + + // Attempt bond transfer approval + await expect( + renPool.connect(alice).approveBondTransfer() + ).to.be.revertedWith('RenPool: Unauthorized'); + }); + it('should fail when darknode registration is not performed by node operator', async () => { expect(alice).to.not.equal(nodeOperator); + // Lock pool await renToken.connect(alice).approve(renPool.address, POOL_BOND); await renPool.connect(alice).deposit(POOL_BOND); - await renPool.connect(nodeOperator).approveBondTransfer(); + // Approve bond transfer and attempt darknode registration + await renPool.connect(nodeOperator).approveBondTransfer(); await expect( renPool.connect(alice).registerDarknode(NODE_ID, PUBLIC_KEY) - ).to.be.revertedWith('RenPool: Caller is not node operator'); + ).to.be.revertedWith('RenPool: Unauthorized'); }); it('should fail when darknode registration is performed twice', async () => { + // Lock pool await renToken.connect(alice).approve(renPool.address, POOL_BOND); await renPool.connect(alice).deposit(POOL_BOND); + + // Register darknode await renPool.connect(nodeOperator).approveBondTransfer(); await renPool.connect(nodeOperator).registerDarknode(NODE_ID, PUBLIC_KEY) + // Attempt a new registration await expect( renPool.connect(nodeOperator).registerDarknode(NODE_ID, PUBLIC_KEY) ).to.be.revertedWith('DarknodeRegistry: must be refunded or never registered'); }); it('should fail when darknode registration is performed twice but preserves first registration data', async () => { + // Lock pool await renToken.connect(alice).approve(renPool.address, POOL_BOND); await renPool.connect(alice).deposit(POOL_BOND); + + // Register darknode await renPool.connect(nodeOperator).approveBondTransfer(); await renPool.connect(nodeOperator).registerDarknode(NODE_ID, PUBLIC_KEY) @@ -376,6 +432,37 @@ describe('RenPool contract test', function () { expect(await renPool.publicKey()).to.equalIgnoreCase(PUBLIC_KEY); }); + [POOL_BOND.div(2).add(1), POOL_BOND].forEach(amount => { + it('should automatically deregister darknode when total withdrawal requested surpasses 0.5 of bond', async function () { + // Lock pool + await renToken.connect(bob).approve(renPool.address, POOL_BOND); + await renPool.connect(bob).deposit(POOL_BOND); + + // Register darknode + await renPool.connect(nodeOperator).approveBondTransfer(); + await renPool.connect(nodeOperator).registerDarknode(NODE_ID, PUBLIC_KEY); + + // Jump one epoch forward for registration to settle + await increaseMonth(); + await darknodeRegistry.epoch(); + + // Request withdraw to trigger deregistration + await renPool.connect(bob).requestWithdrawal(amount); + expect(await renPool.withdrawalRequests(bob.address)).to.equal(amount); + + // Jump one epoch forward for deregitration to settle + await increaseMonth(); + await darknodeRegistry.epoch(); + + // Verify state + expect(await darknodeRegistry.isDeregistered(NODE_ID)).to.be.true; + + // Make sure darknodeID and publicKey are still stored in the RenPool contract + expect(await renPool.darknodeID()).to.equalIgnoreCase(NODE_ID); + expect(await renPool.publicKey()).to.equalIgnoreCase(PUBLIC_KEY); + }); + }) + it('should fail when darknode deregistration is not performed by node operator', async () => { expect(alice).to.not.equal(nodeOperator); @@ -394,7 +481,7 @@ describe('RenPool contract test', function () { // Attemping to deregister the darknode should fail when caller is not node operator await expect( renPool.connect(alice).deregisterDarknode() - ).to.be.revertedWith('RenPool: Caller is not owner nor node operator'); + ).to.be.revertedWith('RenPool: Unauthorized'); // Make sure node is still registered and nodeID and publicKey are still stored // in the RenPool contract