0x608060405234801561001057600080fd5b50612354806100206000396000f3fe6080604052600436106100f75760003560e01c80638e1478971161008a578063ce18acd411610059578063ce18acd414610298578063d5804bd4146102ab578063f2fde38b146102cb578063ffa1ad74146102eb57600080fd5b80638e14789714610218578063ac7cffa614610238578063ae8f4f3a14610258578063b0c8bd041461027857600080fd5b80635c975abb116100c65780635c975abb146101a2578063715018a6146101c55780637cb2b79c146101da5780638da5cb5b146101fa57600080fd5b8063271f7b99146101035780632a709b1414610125578063383fe46714610162578063485cc9551461018257600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004611d71565b610312565b005b34801561013157600080fd5b5060cc54610145906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012361017d366004611d39565b6103b3565b34801561018e57600080fd5b5061012361019d366004611eea565b61043c565b3480156101ae57600080fd5b5060975460ff166040519015158152602001610159565b3480156101d157600080fd5b50610123610509565b3480156101e657600080fd5b506101236101f5366004611d1d565b61053f565b34801561020657600080fd5b506033546001600160a01b0316610145565b34801561022457600080fd5b50610123610233366004611d1d565b6105b1565b34801561024457600080fd5b5060cb54610145906001600160a01b031681565b34801561026457600080fd5b50610123610273366004611e56565b61068a565b34801561028457600080fd5b50610123610293366004611d1d565b610bd2565b6101236102a6366004611f84565b610c44565b3480156102b757600080fd5b506101236102c6366004611e08565b610d79565b3480156102d757600080fd5b506101236102e6366004611d1d565b610eb8565b3480156102f757600080fd5b50610300600081565b60405160ff9091168152602001610159565b6033546001600160a01b031633146103455760405162461bcd60e51b815260040161033c906121c5565b60405180910390fd5b604051632ef18fbd60e11b81526001600160a01b03871690635de31f7a9061037990889088908890889088906004016120b3565b600060405180830381600087803b15801561039357600080fd5b505af11580156103a7573d6000803e3d6000fd5b50505050505050505050565b6033546001600160a01b031633146103dd5760405162461bcd60e51b815260040161033c906121c5565b60405163f2fde38b60e01b81526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b15801561042057600080fd5b505af1158015610434573d6000803e3d6000fd5b505050505050565b600054610100900460ff1680610455575060005460ff16155b6104715760405162461bcd60e51b815260040161033c9061214d565b600054610100900460ff16158015610493576000805461ffff19166101011790555b331561049e57600080fd5b60cb80546001600160a01b038086166001600160a01b03199283161790925560cc8054928516929091169190911790554660cd556104da610f50565b6104e2610fbb565b6104ea61101b565b6104f2611090565b8015610504576000805461ff00191690555b505050565b6033546001600160a01b031633146105335760405162461bcd60e51b815260040161033c906121c5565b61053d6000611100565b565b6033546001600160a01b031633146105695760405162461bcd60e51b815260040161033c906121c5565b6001600160a01b03811661058f5760405162461bcd60e51b815260040161033c9061219b565b60cc80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146105db5760405162461bcd60e51b815260040161033c906121c5565b6040516370a0823160e01b815230600482015261067f90829073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b15801561062b57600080fd5b505afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190611f9c565b73dac17f958d2ee523a2206206994597c13d831ec79190611152565b6106876111b5565b50565b600260655414156106ad5760405162461bcd60e51b815260040161033c90612223565b600260655560975460ff16156106d55760405162461bcd60e51b815260040161033c90612123565b600061071e61071986868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061122a92505050565b611257565b905060006107538260018151811061074657634e487b7160e01b600052603260045260246000fd5b6020026020010151611257565b90507f553685c68db2f1e0adf08d56c06ec87ff411232298a59276dbdb1b032c38151e6107a78260008151811061079a57634e487b7160e01b600052603260045260246000fd5b6020026020010151611389565b146107e65760405162461bcd60e51b815260206004820152600f60248201526e10948e881253959053125117d15595608a1b604482015260640161033c565b60006108198260018151811061080c57634e487b7160e01b600052603260045260246000fd5b60200260200101516113d7565b905060006108418360028151811061080c57634e487b7160e01b600052603260045260246000fd5b90506001600160a01b038116331461088b5760405162461bcd60e51b815260206004820152600d60248201526c21291d102727aa2fa7a72ba2a960991b604482015260640161033c565b60006108b18560028151811061079a57634e487b7160e01b600052603260045260246000fd5b9050806108d05760405162461bcd60e51b815260040161033c906121fa565b60006108f68660058151811061079a57634e487b7160e01b600052603260045260246000fd5b905060cd5481146109425760405162461bcd60e51b815260206004820152601660248201527521291d102ba927a723afaa20a923a2aa2fa1a420a4a760511b604482015260640161033c565b60006109688760048151811061079a57634e487b7160e01b600052603260045260246000fd5b905060cd548114156109b55760405162461bcd60e51b815260206004820152601660248201527521291d102ba927a723afa9a7aaa921a2afa1a420a4a760511b604482015260640161033c565b60008b8b6040516109c7929190611fdd565b6040805191829003909120600081815260ca602052919091205490915060ff1615610a2b5760405162461bcd60e51b815260206004820152601460248201527321291d1021a7a6a6a4aa26a2a72a2fa5a727aba760611b604482015260640161033c565b600081815260ca602052604090819020805460ff1916600117905560cb5490516307cdd1ed60e31b81526001600160a01b0390911690633e6e8f6890610a7b90849086908f908f90600401612009565b60206040518083038186803b158015610a9357600080fd5b505afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190611e3c565b610b105760405162461bcd60e51b815260206004820152601660248201527542523a20494e56414c49445f5349474e41545552455360501b604482015260640161033c565b60cc5460cd5460405163707af71960e11b81526001600160a01b0389811660048301526024820192909252600092610bab9230928a928a92169063e0f5ee329060440160806040518083038186803b158015610b6b57600080fd5b505afa158015610b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba39190611efc565b9291906113f7565b9050610bbe816000015187848887611574565b505060016065555050505050505050505050565b6033546001600160a01b03163314610bfc5760405162461bcd60e51b815260040161033c906121c5565b6001600160a01b038116610c225760405162461bcd60e51b815260040161033c9061219b565b60cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065541415610c675760405162461bcd60e51b815260040161033c90612223565b600260655560975460ff1615610c8f5760405162461bcd60e51b815260040161033c90612123565b34610cac5760405162461bcd60e51b815260040161033c906121fa565b60cc54604051637a38f9eb60e01b8152600481018390526001600160a01b0390911690637a38f9eb9060240160206040518083038186803b158015610cf057600080fd5b505afa158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d289190611e3c565b610d645760405162461bcd60e51b815260206004820152600d60248201526c10948e881393d517d193d55391609a1b604482015260640161033c565b610d7160003334846115e4565b506001606555565b60026065541415610d9c5760405162461bcd60e51b815260040161033c90612223565b600260655560975460ff1615610dc45760405162461bcd60e51b815260040161033c90612123565b6001600160a01b038316610dea5760405162461bcd60e51b815260040161033c9061219b565b81610e075760405162461bcd60e51b815260040161033c906121fa565b6000610e9c3360cc5460405163707af71960e11b81526001600160a01b038881166004830152602482018790523092889291169063e0f5ee329060440160806040518083038186803b158015610e5c57600080fd5b505afa158015610e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e949190611efc565b92919061167c565b8051909150610ead903385856115e4565b505060016065555050565b6033546001600160a01b03163314610ee25760405162461bcd60e51b815260040161033c906121c5565b6001600160a01b038116610f475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161033c565b61068781611100565b600054610100900460ff1680610f69575060005460ff16155b610f855760405162461bcd60e51b815260040161033c9061214d565b600054610100900460ff16158015610fa7576000805461ffff19166101011790555b8015610687576000805461ff001916905550565b600054610100900460ff1680610fd4575060005460ff16155b610ff05760405162461bcd60e51b815260040161033c9061214d565b600054610100900460ff16158015611012576000805461ffff19166101011790555b610fa733611100565b600054610100900460ff1680611034575060005460ff16155b6110505760405162461bcd60e51b815260040161033c9061214d565b600054610100900460ff16158015611072576000805461ffff19166101011790555b6097805460ff191690558015610687576000805461ff001916905550565b600054610100900460ff16806110a9575060005460ff16155b6110c55760405162461bcd60e51b815260040161033c9061214d565b600054610100900460ff161580156110e7576000805461ffff19166101011790555b60016065558015610687576000805461ff001916905550565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160a01b03831660248201526044810182905261050490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611789565b60975460ff16156111d85760405162461bcd60e51b815260040161033c90612123565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861120d3390565b6040516001600160a01b03909116815260200160405180910390a1565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60606112628261185b565b61126b57600080fd5b600061127683611894565b905060008167ffffffffffffffff8111156112a157634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156112e657816020015b60408051808201909152600080825260208201528152602001906001900390816112bf5790505b50905060006112f88560200151611917565b8560200151611307919061225a565b90506000805b8481101561137e5761131e83611999565b915060405180604001604052808381526020018481525084828151811061135557634e487b7160e01b600052603260045260246000fd5b602090810291909101015261136a828461225a565b925080611376816122d8565b91505061130d565b509195945050505050565b80516000901580159061139e57508151602110155b6113a757600080fd5b6000806113b384611a42565b8151919350915060208210156113cf5760208290036101000a90045b949350505050565b80516000906015146113e857600080fd5b6113f182611389565b92915050565b604080516080810182526000808252602082018190529181018290526060810191909152846060015161145d5760405162461bcd60e51b815260206004820152600e60248201526d14950e881393d517d31254d5115160921b604482015260640161033c565b84516001600160a01b031661147c57611477848484611a89565b61156b565b6001856040015160018111156114a257634e487b7160e01b600052602160045260246000fd5b14156115135784516040516340c10f1960e01b81526001600160a01b03858116600483015260248201859052909116906340c10f19906044015b600060405180830381600087803b1580156114f657600080fd5b505af115801561150a573d6000803e3d6000fd5b5050505061156b565b60008560400151600181111561153957634e487b7160e01b600052602160045260246000fd5b1415611555578451611477906001600160a01b03168484611152565b634e487b7160e01b600052600160045260246000fd5b50929392505050565b836001600160a01b0316856001600160a01b03167f812815d6ddc266545cbe93cd74cdaec6517a81842a230a1773c976e78389ad2e848660cd54866040516115d5949392919093845260208401929092526040830152606082015260800190565b60405180910390a35050505050565b6001600160a01b03838116600081815260c960209081526040918290205460cd548351888152928301919091528183015260608101859052905191928716917f553685c68db2f1e0adf08d56c06ec87ff411232298a59276dbdb1b032c38151e9181900360800190a36001600160a01b038316600090815260c960205260408120805491611671836122d8565b919050555050505050565b60408051608081018252600080825260208201819052918101829052606081019190915284606001516116e25760405162461bcd60e51b815260206004820152600e60248201526d14950e881393d517d31254d5115160921b604482015260640161033c565b60018560400151600181111561170857634e487b7160e01b600052602160045260246000fd5b1415611746578451604051632770a7eb60e21b81526001600160a01b0386811660048301526024820185905290911690639dc29fac906044016114dc565b60008560400151600181111561176c57634e487b7160e01b600052602160045260246000fd5b1415611555578451611477906001600160a01b0316858585611b7e565b60006117de826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611bb69092919063ffffffff16565b80519091501561050457808060200190518101906117fc9190611e3c565b6105045760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161033c565b805160009061186c57506000919050565b6020820151805160001a9060c082101561188a575060009392505050565b5060019392505050565b80516000906118a557506000919050565b6000806118b58460200151611917565b84602001516118c4919061225a565b90506000846000015185602001516118dc919061225a565b90505b8082101561190e576118f082611999565b6118fa908361225a565b915082611906816122d8565b9350506118df565b50909392505050565b8051600090811a60808110156119305750600092915050565b60b881108061194b575060c0811080159061194b575060f881105b156119595750600192915050565b60c081101561198d5761196e600160b8612289565b61197b9060ff1682612272565b61198690600161225a565b9392505050565b61196e600160f8612289565b80516000908190811a60808110156119b45760019150611a3b565b60b88110156119da576119c8608082612272565b6119d390600161225a565b9150611a3b565b60c0811015611a075760b78103600185019450806020036101000a85510460018201810193505050611a3b565b60f8811015611a1b576119c860c082612272565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b6000806000611a548460200151611917565b90506000818560200151611a68919061225a565b90506000828660000151611a7c9190612272565b9196919550909350505050565b80836001600160a01b0316311015611ae35760405162461bcd60e51b815260206004820152601860248201527f52543a20494e53554646494349454e545f42414c414e43450000000000000000604482015260640161033c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b30576040519150601f19603f3d011682016040523d82523d6000602084013e611b35565b606091505b5050905080611b785760405162461bcd60e51b815260206004820152600f60248201526e14950e8814d1539117d49155915495608a1b604482015260640161033c565b50505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611b789085906323b872dd60e01b9060840161117e565b60606113cf848460008585843b611c0f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161033c565b600080866001600160a01b03168587604051611c2b9190611fed565b60006040518083038185875af1925050503d8060008114611c68576040519150601f19603f3d011682016040523d82523d6000602084013e611c6d565b606091505b5091509150611c7d828286611c88565b979650505050505050565b60608315611c97575081611986565b825115611ca75782518084602001fd5b8160405162461bcd60e51b815260040161033c91906120f0565b80518015158114611cd157600080fd5b919050565b60008083601f840112611ce7578182fd5b50813567ffffffffffffffff811115611cfe578182fd5b602083019150836020828501011115611d1657600080fd5b9250929050565b600060208284031215611d2e578081fd5b813561198681612309565b60008060408385031215611d4b578081fd5b8235611d5681612309565b91506020830135611d6681612309565b809150509250929050565b60008060008060008060808789031215611d89578182fd5b8635611d9481612309565b9550602087013567ffffffffffffffff80821115611db0578384fd5b611dbc8a838b01611cd6565b90975095506040890135915080821115611dd4578384fd5b50611de189828a01611cd6565b909450925050606087013560ff81168114611dfa578182fd5b809150509295509295509295565b600080600060608486031215611e1c578283fd5b8335611e2781612309565b95602085013595506040909401359392505050565b600060208284031215611e4d578081fd5b61198682611cc1565b60008060008060408587031215611e6b578384fd5b843567ffffffffffffffff80821115611e82578586fd5b611e8e88838901611cd6565b90965094506020870135915080821115611ea6578384fd5b818701915087601f830112611eb9578384fd5b813581811115611ec7578485fd5b8860208260051b8501011115611edb578485fd5b95989497505060200194505050565b60008060408385031215611d4b578182fd5b600060808284031215611f0d578081fd5b6040516080810181811067ffffffffffffffff82111715611f3c57634e487b7160e01b83526041600452602483fd5b6040528251611f4a81612309565b815260208381015190820152604083015160028110611f67578283fd5b6040820152611f7860608401611cc1565b60608201529392505050565b600060208284031215611f95578081fd5b5035919050565b600060208284031215611fad578081fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8183823760009101908152919050565b60008251611fff8184602087016122ac565b9190910192915050565b60006060820186835260208681850152606060408501528185835260808501905060808660051b860101925086845b878110156120a457868503607f190183528135368a9003601e1901811261205d578687fd5b8901803567ffffffffffffffff811115612075578788fd5b8036038b1315612083578788fd5b6120908782888501611fb4565b965050509183019190830190600101612038565b50929998505050505050505050565b6060815260006120c7606083018789611fb4565b82810360208401526120da818688611fb4565b91505060ff831660408301529695505050505050565b602081526000825180602084015261210f8160408501602087016122ac565b601f01601f19169190910160400192915050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526010908201526f42523a205a45524f5f4144445245535360801b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201526e10948e8816915493d7d05353d55395608a1b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561226d5761226d6122f3565b500190565b600082821015612284576122846122f3565b500390565b600060ff821660ff8416808210156122a3576122a36122f3565b90039392505050565b60005b838110156122c75781810151838201526020016122af565b83811115611b785750506000910152565b60006000198214156122ec576122ec6122f3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461068757600080fdfea264697066735822122075b8689d8a3cf5bd1c69430cf0d0820ad4bb0281358cd74167e1025f1d0e0a1b64736f6c63430008040033