0x6080604052600080546001600160a01b0319166f22d53366457f9d5e68ec105046fc438317905534801561003257600080fd5b50612141806100426000396000f3fe6080604052600436106101295760003560e01c80638cedca71116100a55780639864dcdd11610074578063c579d49011610059578063c579d49014610332578063d3c2e7ed14610352578063f24ccbfe1461036757600080fd5b80639864dcdd146102ed578063bfe2a1f41461030257600080fd5b80638cedca71146102655780638da41b0f1461028d5780638df50f74146102ad5780639093410d146102c057600080fd5b806341c0e1b5116100fc5780637beb02bf116100e15780637beb02bf146101ed57806381650aad1461021b5780638bcb62161461025057600080fd5b806341c0e1b5146101985780637b103999146101ad57600080fd5b80630f2eee421461012e578063247492f81461015a5780632fa13cb81461016e578063389f87ff14610183575b600080fd5b34801561013a57600080fd5b50610143608081565b60405160ff90911681526020015b60405180910390f35b34801561016657600080fd5b506001610143565b34801561017a57600080fd5b50610143600081565b610196610191366004611a77565b61038f565b005b3480156101a457600080fd5b50610196610432565b3480156101b957600080fd5b506101d573287778f121f134c66212fb16c9b53ec991d32f5b81565b6040516001600160a01b039091168152602001610151565b3480156101f957600080fd5b5061020d610208366004611ac4565b6104f5565b604051908152602001610151565b34801561022757600080fd5b5061023b610236366004611ac4565b61062b565b60408051928352602083019190915201610151565b34801561025c57600080fd5b50610143600181565b34801561027157600080fd5b506101d573ccf3d848e08b94478ed8f46ffead3008faf581fd81565b34801561029957600080fd5b5061020d6102a8366004611ac4565b61072f565b61020d6102bb366004611b8c565b61085b565b3480156102cc57600080fd5b506102e06102db366004611a77565b610a02565b6040516101519190611c9c565b3480156102f957600080fd5b50610143607f81565b34801561030e57600080fd5b5061032261031d366004611cf0565b610a46565b6040519015158152602001610151565b34801561033e57600080fd5b5061019661034d366004611d14565b610ae6565b34801561035e57600080fd5b5061014360ff81565b34801561037357600080fd5b506101d573ce7a977cac4a481bc84ac06b2da0df614e621cf381565b600061039a82610a02565b905060006103a782610c20565b6040517ff4b24b5500000000000000000000000000000000000000000000000000000000815290925073ce7a977cac4a481bc84ac06b2da0df614e621cf3915063f4b24b55906103fb908490600401611dcb565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b50505050505050565b336001600160a01b031673ccf3d848e08b94478ed8f46ffead3008faf581fd6001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801561048e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b29190611e12565b6001600160a01b0316146104f2576040517fa6c827a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33ff5b6040517fec74d0a80000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600091829185169063ec74d0a890602401608060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d9190611e2f565b6040808201518251606084015192517f9a497196000000000000000000000000000000000000000000000000000000008152600481019190915260248101929092529192506001600160a01b03861690639a49719690604401602060405180830381865afa1580156105f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106179190611edc565b6106219190611f24565b9150505b92915050565b6000806000846001600160a01b0316632a9439456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106929190611e12565b6040517f544fb5c10000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291925060009183169063544fb5c1906024016040805180830381865afa1580156106f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071a9190611f3b565b80516020909101519097909650945050505050565b6040517fec74d0a80000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600091829185169063ec74d0a890602401608060405180830381865afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190611e2f565b604080820151606083015191517fa7573206000000000000000000000000000000000000000000000000000000008152600481019190915260248101919091529091506001600160a01b0385169063a757320690604401602060405180830381865afa15801561082b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084f9190611edc565b81516106219190611f24565b60008061086786610a02565b905061089381600001518560008151811061088457610884611ead565b60200260200101518786610fd7565b6001600160a01b03168152602081015184516108bd91908690600190811061088457610884611ead565b6001600160a01b03166020820152604081015184516108ea91908690600290811061088457610884611ead565b6001600160a01b031660408201526060810151845161091791908690600390811061088457610884611ead565b6001600160a01b031660608201526080810151845161095391908690600490811061094457610944611ead565b602002602001015187866110db565b8160800181815250506109778160a001518560058151811061094457610944611ead565b60a082015260008061098883610c20565b6040517f43757276655573645061796261636b000000000000000000000000000000000081529193509150600f0160405180910390207f2b6d22f419271bcc89bbac8deec947c664365d6e24d06fef0ca7c325c704dce3826040516109ed9190611f96565b60405180910390a2509150505b949350505050565b6040805160c08101825260008082526020808301829052928201819052606082018190526080820181905260a0820152825190916106259184018101908401611fa9565b6040517f602b62d40000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260009073c9332fdcb1c491dcc683bae86fe3cb70360738bc9063602b62d490602401602060405180830381865afa158015610aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade9190611edc565b151592915050565b336001600160a01b031673ccf3d848e08b94478ed8f46ffead3008faf581fd6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b669190611e12565b6001600160a01b031614610ba6576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161415610c07576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610c01573d6000803e3d6000fd5b50505050565b610c1b6001600160a01b0384168383611123565b505050565b60006060826080015160001415610c63576040517f0648424e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251610c6e90610a46565b610ca4576040517f88d2139d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408301516001600160a01b0316610cbd573060408401525b825160408085015190517f9b6c56ec0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009283921690639b6c56ec90602401602060405180830381865afa158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b9190611edc565b905080856080015110610d645760808501819052600191505b60208501516080860151610d8d9173f939e0a03fb07f59a73314e73794be0e57ac1b4e916111ea565b608086018190528551610db69173f939e0a03fb07f59a73314e73794be0e57ac1b4e9190611297565b600085600001516001600160a01b0316632621db2f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1e9190611e12565b90506000808415610e6a57610e3c6001600160a01b03841630611367565b915083610e5d73f939e0a03fb07f59a73314e73794be0e57ac1b4e30611367565b610e679190611f24565b90505b875160808901516040808b015160a08c015191517f37671f9300000000000000000000000000000000000000000000000000000000815260048101939093526001600160a01b039081166024840152604483019190915260006064830152909116906337671f9390608401600060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506000808615610f9e5783610f246001600160a01b03871630611367565b610f2e9190611f24565b915082610f4f73f939e0a03fb07f59a73314e73794be0e57ac1b4e30611367565b610f599190611f24565b60608b0151909150610f76906001600160a01b0387169084611429565b5060608a0151610f9c9073f939e0a03fb07f59a73314e73794be0e57ac1b4e9083611429565b505b89608001518a8383604051602001610fb893929190612044565b6040516020818303038152906040529850985050505050505050915091565b600060ff8416156110d257610feb84611599565b1561101f5781610ffa856115b8565b60ff168151811061100d5761100d611ead565b602002602001015160601c94506110d2565b8360ff1660fe14156110325750306109fa565b8360ff1660ff14156110a757306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a09190611e12565b90506109fa565b826110b185611604565b60ff16815181106110c4576110c4611ead565b602002602001015160001c94505b50929392505050565b600060ff8416156110d2576110ef84611599565b156110a757816110fe856115b8565b60ff168151811061111157611111611ead565b602002602001015160001c94506110d2565b6040516001600160a01b038316602482015260448101829052610c1b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261164f565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156112215761121e8484611367565b91505b6001600160a01b0383161580159061124257506001600160a01b0383163014155b801561126b57506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b801561127657508115155b15611290576112906001600160a01b03851684308561174e565b5092915050565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156112c157505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015282919085169063dd62ed3e90604401602060405180830381865afa158015611329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134d9190611edc565b1015610c1b57610c1b6001600160a01b038416838361179f565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561139f57506001600160a01b03811631610625565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156113fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114229190611edc565b9050610625565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156114605761145d8430611367565b91505b6001600160a01b0383161580159061148157506001600160a01b0383163014155b801561148c57508115155b15611290576001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146114ce576114c96001600160a01b0385168484611123565b611290565b6000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461151b576040519150601f19603f3d011682016040523d82523d6000602084013e611520565b606091505b5050905080611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4574682073656e64206661696c0000000000000000000000000000000000000060448201526064015b60405180910390fd5b50909392505050565b6000600160ff8316108015906106255750607f60ff8316111592915050565b60006115c382611599565b6115f9576040517fdcc95a3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106256001836120aa565b6000608060ff83161015611644576040517f866f6e8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106256080836120aa565b60006116a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118319092919063ffffffff16565b805190915015610c1b57808060200190518101906116c291906120cd565b610c1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611587565b6040516001600160a01b0380851660248301528316604482015260648101829052610c019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611168565b6040516001600160a01b0383166024820152600060448201526117e89084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611168565b6040516001600160a01b038316602482015260448101829052610c1b9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611168565b60606109fa8484600085606061184685611932565b61187c576040517f304619b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080866001600160a01b0316858760405161189891906120ef565b60006040518083038185875af1925050503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b509150915081156118ee5791506109fa9050565b8051156118fe5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879190611f96565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906109fa575050151592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156119e1576119e161196b565b604052919050565b600082601f8301126119fa57600080fd5b813567ffffffffffffffff811115611a1457611a1461196b565b611a4560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161199a565b818152846020838601011115611a5a57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611a8957600080fd5b813567ffffffffffffffff811115611aa057600080fd5b610621848285016119e9565b6001600160a01b0381168114611ac157600080fd5b50565b60008060408385031215611ad757600080fd5b8235611ae281611aac565b91506020830135611af281611aac565b809150509250929050565b600067ffffffffffffffff821115611b1757611b1761196b565b5060051b60200190565b600082601f830112611b3257600080fd5b81356020611b47611b4283611afd565b61199a565b82815260059290921b84018101918181019086841115611b6657600080fd5b8286015b84811015611b815780358352918301918301611b6a565b509695505050505050565b60008060008060808587031215611ba257600080fd5b843567ffffffffffffffff80821115611bba57600080fd5b611bc6888389016119e9565b9550602091508187013581811115611bdd57600080fd5b611be989828a01611b21565b955050604087013581811115611bfe57600080fd5b8701601f81018913611c0f57600080fd5b8035611c1d611b4282611afd565b81815260059190911b8201840190848101908b831115611c3c57600080fd5b928501925b82841015611c6a57833560ff81168114611c5b5760008081fd5b82529285019290850190611c41565b96505050506060870135915080821115611c8357600080fd5b50611c9087828801611b21565b91505092959194509250565b60c0810161062582846001600160a01b03808251168352806020830151166020840152806040830151166040840152806060830151166060840152506080810151608083015260a081015160a08301525050565b600060208284031215611d0257600080fd5b8135611d0d81611aac565b9392505050565b600080600060608486031215611d2957600080fd5b8335611d3481611aac565b92506020840135611d4481611aac565b929592945050506040919091013590565b60005b83811015611d70578181015183820152602001611d58565b83811115610c015750506000910152565b60008151808452611d99816020860160208601611d55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600f60408201527f43757276655573645061796261636b00000000000000000000000000000000006060820152608060208201526000611d0d6080830184611d81565b600060208284031215611e2457600080fd5b8151611d0d81611aac565b600060808284031215611e4157600080fd5b82601f830112611e5057600080fd5b6040516080810181811067ffffffffffffffff82111715611e7357611e7361196b565b604052806080840185811115611e8857600080fd5b845b81811015611ea2578051835260209283019201611e8a565b509195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611eee57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611f3657611f36611ef5565b500390565b600060408284031215611f4d57600080fd5b82601f830112611f5c57600080fd5b6040516040810181811067ffffffffffffffff82111715611f7f57611f7f61196b565b8060405250806040840185811115611e8857600080fd5b602081526000611d0d6020830184611d81565b600060c08284031215611fbb57600080fd5b60405160c0810181811067ffffffffffffffff82111715611fde57611fde61196b565b6040528251611fec81611aac565b81526020830151611ffc81611aac565b6020820152604083015161200f81611aac565b6040820152606083015161202281611aac565b60608201526080838101519082015260a0928301519281019290925250919050565b610100810161209982866001600160a01b03808251168352806020830151166020840152806040830151166040840152806060830151166060840152506080810151608083015260a081015160a08301525050565b60c082019390935260e00152919050565b600060ff821660ff8416808210156120c4576120c4611ef5565b90039392505050565b6000602082840312156120df57600080fd5b81518015158114611d0d57600080fd5b60008251612101818460208701611d55565b919091019291505056fea2646970667358221220b7c125525dcc341ca08650cbcc15e79c5ecb2a1e255b1a39bc854002eab93b4764736f6c634300080a0033