608060405234801561001057600080fd5b50611415806100206000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80634f977d87116100e3578063bf8568951161008c578063f2b6db5111610066578063f2b6db5114610324578063f536f8e71461033d578063f75d6f311461035057600080fd5b8063bf856895146102e3578063c0c53b8b146102fe578063c2d94aec1461031157600080fd5b806380faa57d116100bd57806380faa57d146102b85780638da5cb5b146102c0578063ad5c4648146102c857600080fd5b80634f977d871461028a5780635ea543251461029257806370ccf024146102a557600080fd5b80632afd9f0b11610145578063450eccf11161011f578063450eccf114610266578063452a9320146102795780634f41e95d1461028157600080fd5b80632afd9f0b1461023557806337e9f64a1461023d5780634367ac7c1461025d57600080fd5b8063137ee36e11610176578063137ee36e146101ef578063175e1a7d14610205578063272b13231461022057600080fd5b806302b9c808146101925780630fb5a6b4146101c2575b600080fd5b6002546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6003546101d69067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101b9565b6101f7610363565b6040519081526020016101b9565b6101a573430000000000000000000000000000000000000281565b61023361022e366004611163565b61037f565b005b6101f761047b565b6003546101d69068010000000000000000900467ffffffffffffffff1681565b6101f760055481565b6102336102743660046111ac565b610633565b6101a5610767565b6101f760045481565b6101f76107df565b6102336102a03660046111df565b61087c565b6102336102b33660046111fa565b6109c4565b6101d6610af3565b6101a5610b1a565b6101a573420000000000000000000000000000000000002381565b6002546101d690600160a01b900467ffffffffffffffff1681565b61023361030c366004611226565b610b6e565b61023361031f366004611163565b610cf8565b6000546101a5906201000090046001600160a01b031681565b6001546101a5906001600160a01b031681565b61023361035e366004611271565b610e82565b60006005546103706107df565b61037a91906112d3565b905090565b610387610b1a565b6001600160a01b0316336001600160a01b0316146103d95760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201527343000000000000000000000000000000000000029063954fa5ee906044015b6020604051808303816000875af1158015610453573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047791906112e6565b5050565b6000610485610fbf565b60035467ffffffffffffffff1660000361049f5750600090565b60035468010000000000000000900467ffffffffffffffff166000036104ff576003546104d69067ffffffffffffffff16426112ff565b600360086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b600254600160a01b900467ffffffffffffffff1660000361056957610522610af3565b6002805467ffffffffffffffff92909216600160a01b027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff90921691909117905550600090565b610571610af3565b60025467ffffffffffffffff918216600160a01b909104909116036105965750600090565b60006105a0610363565b90506005546000146105b25760006005555b6105ba610af3565b6002805467ffffffffffffffff92909216600160a01b027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff9092169190911790556040518181527f35b3fe58deb8d2488e5b7242e20936feb7a76abad93c45634023537edf5695709060200160405180910390a1919050565b61063b610b1a565b6001600160a01b0316336001600160a01b0316146106885760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016103d0565b6000600454116107005760405162461bcd60e51b815260206004820152602760248201527f436f6d6d756e69747949737375616e63653a20696e76616c696420726577617260448201527f645065725365630000000000000000000000000000000000000000000000000060648201526084016103d0565b6107086107df565b6005600082825461071991906112d3565b90915550506fffffffffffffffffffffffffffffffff811660045561073c610af3565b600260146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060029054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037a9190611327565b600254600090600160a01b900467ffffffffffffffff1681036108025750600090565b600254600160a01b900467ffffffffffffffff1661081e610af3565b67ffffffffffffffff16036108335750600090565b600254600090600160a01b900467ffffffffffffffff16610852610af3565b61085c9190611344565b67ffffffffffffffff169050600454816108769190611365565b91505090565b610884610b1a565b6001600160a01b0316336001600160a01b0316146108d15760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016103d0565b600354426801000000000000000090910467ffffffffffffffff161161095f5760405162461bcd60e51b815260206004820152602860248201527f436f6d6d756e69747949737375616e63653a20696e76616c696420726577617260448201527f64456e6454696d6500000000000000000000000000000000000000000000000060648201526084016103d0565b6109676107df565b6005600082825461097891906112d3565b9091555050600380547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff84160217905561073c610af3565b6109cc610fbf565b60008111610a1c5760405162461bcd60e51b815260206004820152601e60248201527f436f6d6d756e69747949737375616e63653a207a65726f20616d6f756e74000060448201526064016103d0565b6001546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac919061137c565b50604080516001600160a01b0384168152602081018390527f4210e70dff76ccbceed5420eb30b8353df84b803770fedb67e7b9624b2c11514910160405180910390a15050565b60035460009061037a90429068010000000000000000900467ffffffffffffffff16611041565b60008060029054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bb573d6000803e3d6000fd5b600054610100900460ff1615808015610b8e5750600054600160ff909116105b80610ba85750303b158015610ba8575060005460ff166001145b610c1a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103d0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c5b576000805461ff0019166101001790555b610c648461105b565b600180546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560028054928516929091169190911790558015610cf2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610d00610b1a565b6001600160a01b0316336001600160a01b031614610d4d5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016103d0565b6040517fe12f3a610000000000000000000000000000000000000000000000000000000081523060048201526000907342000000000000000000000000000000000000239063e12f3a6190602401602060405180830381865afa158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc91906112e6565b6040517faad3ec960000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018290529091507342000000000000000000000000000000000000239063aad3ec96906044016020604051808303816000875af1158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7d91906112e6565b505050565b610e8a610b1a565b6001600160a01b0316336001600160a01b031614610ed75760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016103d0565b600454158015610efd575060035468010000000000000000900467ffffffffffffffff16155b610f6f5760405162461bcd60e51b815260206004820152602260248201527f436f6d6d756e69747949737375616e63653a20416c726561647920737461727460448201527f656400000000000000000000000000000000000000000000000000000000000060648201526084016103d0565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790556fffffffffffffffffffffffffffffffff16600455565b6002546001600160a01b0316331461103f5760405162461bcd60e51b815260206004820152602f60248201527f436f6d6d756e69747949737375616e63653a2043616c6c6572206973206e6f7460448201527f2053746162696c69747920506f6f6c000000000000000000000000000000000060648201526084016103d0565b565b60008183106110505781611052565b825b90505b92915050565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b038416021790557343000000000000000000000000000000000000026001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110e257600080fd5b505af11580156110f6573d6000803e3d6000fd5b50506040517f1a33757d0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000239250631a33757d91506104349060029060040161139e565b6001600160a01b038116811461116057600080fd5b50565b60006020828403121561117557600080fd5b81356111808161114b565b9392505050565b80356fffffffffffffffffffffffffffffffff811681146111a757600080fd5b919050565b6000602082840312156111be57600080fd5b61105282611187565b803567ffffffffffffffff811681146111a757600080fd5b6000602082840312156111f157600080fd5b611052826111c7565b6000806040838503121561120d57600080fd5b82356112188161114b565b946020939093013593505050565b60008060006060848603121561123b57600080fd5b83356112468161114b565b925060208401356112568161114b565b915060408401356112668161114b565b809150509250925092565b6000806040838503121561128457600080fd5b61128d83611187565b915061129b602084016111c7565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611055576110556112a4565b6000602082840312156112f857600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115611320576113206112a4565b5092915050565b60006020828403121561133957600080fd5b81516111808161114b565b67ffffffffffffffff828116828216039080821115611320576113206112a4565b8082028115828204841417611055576110556112a4565b60006020828403121561138e57600080fd5b8151801515811461118057600080fd5b60208101600383106113d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9190529056fea2646970667358221220a4f44026ca90c4e02e8946af19ca6198b8ec17a94a3f0314f062908818d904b164736f6c63430008130033