0x60a06040523060805234801561001457600080fd5b5060805161193d61003e60003960008181610d4701528181610d700152610e1d015261193d6000f3fe60806040526004361061018b5760003560e01c806369f9d7fc116100d6578063950e61c61161007f578063ad3cb1cc11610059578063ad3cb1cc14610475578063f2fde38b146104cb578063fe07c7ee146104eb57600080fd5b8063950e61c6146103db57806399d25c8f14610415578063a658551d1461045557600080fd5b8063790fcf9f116100b0578063790fcf9f146103575780637fe4b65f146103775780638da5cb5b1461039e57600080fd5b806369f9d7fc146102535780636c2d2f3214610322578063715018a61461034257600080fd5b806337b0dfd7116101385780634f1ef286116101125780634f1ef286146102da57806352d1902d146102ed57806356650a591461030257600080fd5b806337b0dfd71461027a5780633bed82991461029a5780634a506553146102ba57600080fd5b80631d996766116101695780631d9967661461021357806320ff430b14610233578063225ac2f21461025357600080fd5b8063081259111461019057806309ff18f0146101b257806311532e77146101ef575b600080fd5b34801561019c57600080fd5b506101b06101ab3660046114e9565b61051b565b005b3480156101be57600080fd5b506000546101d2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101fb57600080fd5b5061020560015481565b6040519081526020016101e6565b34801561021f57600080fd5b506101b061022e366004611536565b610619565b34801561023f57600080fd5b506101b061024e366004611551565b610676565b34801561025f57600080fd5b50610268600681565b60405160ff90911681526020016101e6565b34801561028657600080fd5b506101b06102953660046114e9565b610697565b3480156102a657600080fd5b506101b06102b536600461159b565b610777565b3480156102c657600080fd5b506101b06102d5366004611619565b6107e3565b6101b06102e8366004611619565b610871565b3480156102f957600080fd5b50610205610965565b34801561030e57600080fd5b506101b061031d36600461159b565b610994565b34801561032e57600080fd5b506101b061033d366004611536565b6109f8565b34801561034e57600080fd5b506101b0610a6f565b34801561036357600080fd5b506101b0610372366004611746565b610a83565b34801561038357600080fd5b506002546101d290600160401b90046001600160a01b031681565b3480156103aa57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101d2565b3480156103e757600080fd5b506002546103fc9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101e6565b34801561042157600080fd5b50610445610430366004611536565b60056020526000908152604090205460ff1681565b60405190151581526020016101e6565b34801561046157600080fd5b506003546101d2906001600160a01b031681565b34801561048157600080fd5b506104be6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e6919061182c565b3480156104d757600080fd5b506101b06104e6366004611536565b610bbe565b3480156104f757600080fd5b50610445610506366004611536565b60046020526000908152604090205460ff1681565b6001600160a01b03851660009081526004602052604090205460ff166105885760405162461bcd60e51b815260206004820152601960248201527f494e56414c49445f544f4b454e5f464f525f4d494e54494e470000000000000060448201526064015b60405180910390fd5b6002546105ac906001600160a01b03878116913391600160401b9091041686610c15565b60025460408051600160401b9092046001600160a01b03908116835260208301869052908201849052606082018390523391868216918816907ec9e2cc407234e92452eb2ed66d21a046da7ef1ae6b0fc6be89fd25e4f1ad28906080015b60405180910390a45050505050565b610621610c97565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f9571cc54cfa80ead8e8e93dd428266203b9a87d40db79a6ec6748d815c135354906020015b60405180910390a150565b61067e610c97565b6106926001600160a01b0384168383610d0b565b505050565b6001600160a01b03851660009081526005602052604090205460ff166106ff5760405162461bcd60e51b815260206004820152601b60248201527f494e56414c49445f544f4b454e5f464f525f52454445454d494e470000000000604482015260640161057f565b60035461071b906001600160a01b038781169133911686610c15565b600354604080516001600160a01b0392831681526020810186905290810184905260608101839052339186811691908816907f53e6e6870c33449d075d7cd0d3865a02ab4cda802e8787d2da8160ba94e2c7fb9060800161060a565b61077f610c97565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527f4e01eaf60160a0ebf7bd5f0c5a210bc16d5028505bbe3f2f31db5fec0ba4d48491015b60405180910390a15050565b6107eb610c97565b600080546001600160a01b0319166001600160a01b0384161790558051602082012060015561a8c061081d904261183f565b6002805467ffffffffffffffff191667ffffffffffffffff929092169190911790556040517fcc54b42f78b332711d2d2b40bd7edb325a1fef0124753b0689728b7209ca1e2e906107d79084908490611875565b610879610d3c565b6000546001600160a01b038381169116146108c0576040517f9ab1811500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001548151602083012014610901576040517fefac8be100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025467ffffffffffffffff168015806109245750428167ffffffffffffffff16115b1561095b576040517f260343ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106928383610df3565b600061096f610e12565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61099c610c97565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527ff1614ee46d8d6e4ff24d957aa18127a86394bb2a6d61927e9ccd5015f1103ad091016107d7565b610a00610c97565b600280547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038416908102919091179091556040519081527f7a42ad327f7dc8771c3fe49beac52d4d1bf2934976245d9d763d40c660852ed39060200161066b565b610a77610c97565b610a816000610e5b565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610ac95750825b905060008267ffffffffffffffff166001148015610ae65750303b155b905081158015610af4575080155b15610b2b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b5a57845468ff00000000000000001916600160401b1785555b610b678a8a8a8a8a610ecc565b8315610bb257845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b610bc6610c97565b6001600160a01b038116610c09576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526000600482015260240161057f565b610c1281610e5b565b50565b6040516001600160a01b038481166024830152838116604483015260648201839052610c919186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610ffa565b50505050565b33610cc97f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a81576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161057f565b6040516001600160a01b0383811660248301526044820183905261069291859182169063a9059cbb90606401610c4a565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610dd557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610dc97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610a815760405163703e46dd60e11b815260040160405180910390fd5b610dfb610d3c565b610e0482611076565b610e0e828261107e565b5050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a815760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b610ed4611166565b610edd856111c8565b600280547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038781169190910291909117909155600380546001600160a01b03191691851691909117905560005b8251811015610f9357600160046000858481518110610f5957610f5961189f565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610f38565b5060005b8151811015610ff257600160056000848481518110610fb857610fb861189f565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610f97565b505050505050565b600061100f6001600160a01b038416836111d0565b9050805160001415801561103457508080602001905181019061103291906118b5565b155b15610692576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161057f565b610c12610c97565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156110d8575060408051601f3d908101601f191682019092526110d5918101906118d2565b60015b61110057604051634c9c8ce360e01b81526001600160a01b038316600482015260240161057f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461115c576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161057f565b61069283836111e5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a81576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc6611166565b60606111de8383600061123b565b9392505050565b6111ee826112f1565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611233576106928282611368565b610e0e6113de565b606081471015611279576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161057f565b600080856001600160a01b0316848660405161129591906118eb565b60006040518083038185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b50915091506112e7868383611416565b9695505050505050565b806001600160a01b03163b60000361132757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161057f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161138591906118eb565b600060405180830381855af49150503d80600081146113c0576040519150601f19603f3d011682016040523d82523d6000602084013e6113c5565b606091505b50915091506113d5858383611416565b95945050505050565b3415610a81576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608261142b576114268261148b565b6111de565b815115801561144257506001600160a01b0384163b155b15611484576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161057f565b50806111de565b80511561149b5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b03811681146114e457600080fd5b919050565b600080600080600060a0868803121561150157600080fd5b61150a866114cd565b9450611518602087016114cd565b94979496505050506040830135926060810135926080909101359150565b60006020828403121561154857600080fd5b6111de826114cd565b60008060006060848603121561156657600080fd5b61156f846114cd565b925061157d602085016114cd565b9150604084013590509250925092565b8015158114610c1257600080fd5b600080604083850312156115ae57600080fd5b6115b7836114cd565b915060208301356115c78161158d565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611611576116116115d2565b604052919050565b6000806040838503121561162c57600080fd5b611635836114cd565b915060208084013567ffffffffffffffff8082111561165357600080fd5b818601915086601f83011261166757600080fd5b813581811115611679576116796115d2565b61168b601f8201601f191685016115e8565b915080825287848285010111156116a157600080fd5b80848401858401376000848284010152508093505050509250929050565b600082601f8301126116d057600080fd5b8135602067ffffffffffffffff8211156116ec576116ec6115d2565b8160051b6116fb8282016115e8565b928352848101820192828101908785111561171557600080fd5b83870192505b8483101561173b5761172c836114cd565b8252918301919083019061171b565b979650505050505050565b600080600080600060a0868803121561175e57600080fd5b611767866114cd565b9450611775602087016114cd565b9350611783604087016114cd565b9250606086013567ffffffffffffffff808211156117a057600080fd5b6117ac89838a016116bf565b935060808801359150808211156117c257600080fd5b506117cf888289016116bf565b9150509295509295909350565b60005b838110156117f75781810151838201526020016117df565b50506000910152565b600081518084526118188160208601602086016117dc565b601f01601f19169290920160200192915050565b6020815260006111de6020830184611800565b67ffffffffffffffff81811683821601908082111561186e57634e487b7160e01b600052601160045260246000fd5b5092915050565b6001600160a01b03831681526040602082015260006118976040830184611800565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156118c757600080fd5b81516111de8161158d565b6000602082840312156118e457600080fd5b5051919050565b600082516118fd8184602087016117dc565b919091019291505056fea2646970667358221220056c3455f4698b9b51955e40208af9b2eb127887e2bcfd925eaf4fe422317e3764736f6c63430008180033