0x608060405234801561001057600080fd5b506124eb806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638da5cb5b116100ad578063d0a1291f11610071578063d0a1291f14610242578063d32867d014610255578063e30b52871461025f578063e941fa7814610272578063f2fde38b1461027a57600080fd5b80638da5cb5b146101df5780639d153495146101f0578063a001ecdd14610213578063a224dcb71461021c578063b2016bd41461022f57600080fd5b80636a52bd45116100f45780636a52bd451461017d578063715018a614610186578063724e78da1461018e578063741bef1a146101a157806386243394146101cc57600080fd5b80631794bb3c146101265780631df4ccfc1461013b57806328335bbb14610157578063666181a91461016a575b600080fd5b610139610134366004611c1b565b61028d565b005b61014460695481565b6040519081526020015b60405180910390f35b610139610165366004611cf3565b6103dc565b610139610178366004611da5565b61066f565b61014460685481565b610139610699565b61013961019c366004611da5565b6106ad565b6066546101b4906001600160a01b031681565b6040516001600160a01b03909116815260200161014e565b6101396101da366004611dc0565b6106d7565b6033546001600160a01b03166101b4565b6102036101fe366004611e0c565b61083f565b604051901515815260200161014e565b61014460675481565b61020361022a366004611e0c565b610b07565b6065546101b4906001600160a01b031681565b610139610250366004611e25565b610d4f565b610144620f424081565b61013961026d366004611e0c565b611309565b610203611833565b610139610288366004611da5565b611933565b600054610100900460ff16158080156102ad5750600054600160ff909116105b806102c75750303b1580156102c7575060005460ff166001145b61032f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610352576000805461ff0019166101001790555b61035a6119ac565b606680546001600160a01b038087166001600160a01b0319928316179092556065805492861692909116919091179055606782905580156103d6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050565b4284116104205760405162461bcd60e51b81526020600482015260126024820152711cdd185c9d115c1bd8da081a5b881c185cdd60721b6044820152606401610326565b6000606a600060686000815461043590611e8e565b9182905550815260208101919091526040016000209050806104588a8c83611f46565b5060038101859055600481018490556005810180546001600160a81b0319163360ff60a01b191617600160a01b851515021760ff60a81b1916600160a81b8415150217905560005b878110156105b1578888828181106104ba576104ba612007565b90506020028101906104cc919061201d565b6040516104da929190612064565b60405180910390208b8b6040516104f2929190612064565b6040518091039020036105475760405162461bcd60e51b815260206004820152601c60248201527f746f6b656e732063616e206e6f74206265206964656e74697463616c000000006044820152606401610326565b6001826002018a8a8481811061055f5761055f612007565b9050602002810190610571919061201d565b60405161057f929190612064565b908152604051908190036020019020805491151560ff19909216919091179055806105a981611e8e565b9150506104a0565b506068546003820154600483015460058401546040517f7aa0e2508522c6e152ffa3164ff180b4d3a50b99c2d3a682a4a3176d99bcf5f59461061c94909387938f938f9392916001600160a01b0381169160ff600160a01b8304811692600160a81b9004169061211a565b60405180910390a16005810154600160a01b900460ff161561065557336000908152600a820160205260409020805460ff191660011790555b6106636068548b8b89610d4f565b50505050505050505050565b6106776119db565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b6106a16119db565b6106ab6000611a35565b565b6106b56119db565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6000838152606a602052604090206005810154600160a01b900460ff166107345760405162461bcd60e51b81526020600482015260116024820152701b9bdd0818481c1c9a5d985d19481b1bdd607a1b6044820152606401610326565b336000908152600a8201602052604090205460ff166107955760405162461bcd60e51b815260206004820152601760248201527f6e6f74207065726d697474656420746f20696e766974650000000000000000006044820152606401610326565b60005b8281101561080957600182600a0160008686858181106107ba576107ba612007565b90506020020160208101906107cf9190611da5565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061080181611e8e565b915050610798565b507f47e145642f40b14fcfba9a6525311864334f5a1e2675ef92ba4f3fe3b8e46198843385856040516103cd949392919061220c565b6000818152606a602052604081208054819061085a90611ebd565b905060000361087b5760405162461bcd60e51b815260040161032690612270565b80600301544210156108bb5760405162461bcd60e51b8152602060048201526009602482015268746f6f206561726c7960b81b6044820152606401610326565b336000908152600b8201602052604090205460ff16156109105760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481c99599d5b99195960821b6044820152606401610326565b60008061091c83611a87565b9050826008015481108015610941575033600090815260068401602052604090205415155b156109a65760088301546000906109588382612298565b61096590620f42406122ab565b61096f91906122c2565b336000908152600686016020526040902054909150620f4240906109949083906122ab565b61099e91906122c2565b925050610a2a565b8260090154811080156109c9575033600090815260078401602052604090205415155b15610a2a5760098301546000906109e08382612298565b6109ed90620f42406122ab565b6109f791906122c2565b336000908152600786016020526040902054909150620f424090610a1c9083906122ab565b610a2691906122c2565b9250505b336000818152600b8501602052604090819020805460ff19166001179055606554905163a9059cbb60e01b81526004810192909252602482018490526001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc91906122e4565b604080518781523360208201529081018490529094507f6909eb935886ad8c734c29844350c36b0260f7006ff58559a3c286a9e7c8d8789060600160405180910390a1505050919050565b6000818152606a6020526040812080548190610b2290611ebd565b9050600003610b435760405162461bcd60e51b815260040161032690612270565b336000908152600d8201602052604090205460ff1615610b975760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610326565b600c81015460ff16610bac57610bac83611309565b33600090815260068201602052604081205415610c1d576008820154336000908152600684016020526040812054909190610beb90620f4240906122ab565b610bf591906122c2565b9050620f424083600e015482610c0b91906122ab565b610c1591906122c2565b915050610c73565b6009820154336000908152600784016020526040812054909190610c4590620f4240906122ab565b610c4f91906122c2565b9050620f424083600f015482610c6591906122ab565b610c6f91906122c2565b9150505b336000818152600d8401602052604090819020805460ff19166001179055606554905163a9059cbb60e01b81526004810192909252602482018390526001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0591906122e4565b604080518681523360208201529081018390529093507f98131a469190deca66117f3768bba4328c631613211a3cc4054efc6ee16cd4269060600160405180910390a15050919050565b6000848152606a6020526040902080548190610d6a90611ebd565b9050600003610d8b5760405162461bcd60e51b815260040161032690612270565b6005810154600160a01b900460ff161580610db75750336000908152600a8201602052604090205460ff165b610e035760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420696e766974656420746f2070726976617465206c6f740000000000006044820152606401610326565b80600301544210610e415760405162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b6044820152606401610326565b60008211610e895760405162461bcd60e51b815260206004820152601560248201527473697a65206d75737420626520706f73697469766560581b6044820152606401610326565b610e9282611aa1565b610ede5760405162461bcd60e51b815260206004820152601760248201527f696e73756666696369656e7420636f6c6c61746572616c0000000000000000006044820152606401610326565b610fa784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508454859250610f249150611ebd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5090611ebd565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b5050505050611b63565b1561108757336000908152600782016020526040902054156110075760405162461bcd60e51b815260206004820152601960248201527863616e6e6f74206a6f696e206f6e20626f746820736964657360381b6044820152606401610326565b6005810154600160a81b900460ff16158061102457506008810154155b6110405760405162461bcd60e51b815260040161032690612301565b33600090815260068201602052604081208054849290611061908490612348565b925050819055508181600801600082825461107c9190612348565b909155506112c39050565b80600101805461109690611ebd565b9050600003611127578060020184846040516110b3929190612064565b9081526040519081900360200190205460ff166111125760405162461bcd60e51b815260206004820152601860248201527f696e76616c696420746f6b656e20696420666f72206c6f7400000000000000006044820152606401610326565b60018101611121848683611f46565b50611178565b61116f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050600183018054610f2490611ebd565b61117857600080fd5b336000908152600682016020526040902054156111d35760405162461bcd60e51b815260206004820152601960248201527863616e6e6f74206a6f696e206f6e20626f746820736964657360381b6044820152606401610326565b6005810154600160a81b900460ff1615806111f057506009810154155b61120c5760405162461bcd60e51b815260040161032690612301565b6005810154600160a81b900460ff16158061122a5750818160080154145b6112815760405162461bcd60e51b815260206004820152602260248201527f6c6f742073697a65206d7573742062652073616d6520696e206368616c6c656e604482015261676560f01b6064820152608401610326565b336000908152600782016020526040812080548492906112a2908490612348565b92505081905550818160090160008282546112bd9190612348565b90915550505b7f2ef9c5ad696244f79a77d314d32cd61df59551c3eb7e42679ea2f2898784065c85858533866040516112fa95949392919061235b565b60405180910390a15050505050565b6000818152606a602052604090208054819061132490611ebd565b90506000036113455760405162461bcd60e51b815260040161032690612270565b600c81015460ff161561138d5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481c995cdbdb1d995960821b6044820152606401610326565b806004015481600301546113a19190612348565b4210156113dc5760405162461bcd60e51b8152602060048201526009602482015268746f6f206561726c7960b81b6044820152606401610326565b60006113e782611a87565b6066546003840154604051634a7d1f1b60e11b81529293506000926001600160a01b03909216916394fa3e369161142391879190600401612392565b602060405180830381865afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146491906123b4565b6066546003850154604051634a7d1f1b60e11b81529293506000926001600160a01b03909216916394fa3e36916114a391600189019190600401612392565b602060405180830381865afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e491906123b4565b606654600486015460038701549293506000926001600160a01b03909216916394fa3e369188916115159190612348565b6040518363ffffffff1660e01b8152600401611532929190612392565b602060405180830381865afa15801561154f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157391906123b4565b606654600487015460038801549293506000926001600160a01b03909216916394fa3e369160018a01916115a79190612348565b6040518363ffffffff1660e01b81526004016115c4929190612392565b602060405180830381865afa1580156115e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160591906123b4565b9050600061161384846122ab565b9050600061162186846122ab565b90506060600060646067548a61163791906122ab565b61164191906122c2565b905082840361165d57600e8a01899055600f8a018990556117bd565b8284111561171257806116718a60026122ab565b61167b9190612298565b600e8b015589548a9061168d90611ebd565b80601f01602080910402602001604051908101604052809291908181526020018280546116b990611ebd565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b505050505091506117bd565b8061171e8a60026122ab565b6117289190612298565b600f8b015560018a01805461173c90611ebd565b80601f016020809104026020016040519081016040528092919081815260200182805461176890611ebd565b80156117b55780601f1061178a576101008083540402835291602001916117b5565b820191906000526020600020905b81548152906001019060200180831161179857829003601f168201915b505050505091505b7fcb4fe1f5bd157ec52ea58b76dd52ac4ce2d6a5498e3a3fcea3b972c3299647358b8a848b8b8b8b6040516117f897969594939291906123f1565b60405180910390a180606960008282546118129190612348565b909155505050600c909801805460ff19166001179055505050505050505050565b600061183d6119db565b60698054600090915560655460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015611897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bb91906122e4565b9150816118fc5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610326565b6040518181527fb7eeacba6b133788365610e83d3f130d07b6ef6e78877961f25b3f61fcba07529060200160405180910390a15090565b61193b6119db565b6001600160a01b0381166119a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610326565b6119a981611a35565b50565b600054610100900460ff166119d35760405162461bcd60e51b81526004016103269061244e565b6106ab611bbc565b6033546001600160a01b031633146106ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610326565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611a9b82600801548360090154611bec565b92915050565b6065546040516323b872dd60e01b8152336004820152306024820152604481018390526000916001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d91906122e4565b905080611b5e5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610326565b919050565b600081604051602001611b769190612499565b6040516020818303038152906040528051906020012083604051602001611b9d9190612499565b6040516020818303038152906040528051906020012014905092915050565b600054610100900460ff16611be35760405162461bcd60e51b81526004016103269061244e565b6106ab33611a35565b6000818311611bfb5782611bfd565b815b9392505050565b80356001600160a01b0381168114611b5e57600080fd5b600080600060608486031215611c3057600080fd5b611c3984611c04565b9250611c4760208501611c04565b9150604084013590509250925092565b60008083601f840112611c6957600080fd5b50813567ffffffffffffffff811115611c8157600080fd5b602083019150836020828501011115611c9957600080fd5b9250929050565b60008083601f840112611cb257600080fd5b50813567ffffffffffffffff811115611cca57600080fd5b6020830191508360208260051b8501011115611c9957600080fd5b80151581146119a957600080fd5b600080600080600080600080600060e08a8c031215611d1157600080fd5b893567ffffffffffffffff80821115611d2957600080fd5b611d358d838e01611c57565b909b50995060208c0135915080821115611d4e57600080fd5b50611d5b8c828d01611ca0565b90985096505060408a0135945060608a0135935060808a0135925060a08a0135611d8481611ce5565b915060c08a0135611d9481611ce5565b809150509295985092959850929598565b600060208284031215611db757600080fd5b611bfd82611c04565b600080600060408486031215611dd557600080fd5b83359250602084013567ffffffffffffffff811115611df357600080fd5b611dff86828701611ca0565b9497909650939450505050565b600060208284031215611e1e57600080fd5b5035919050565b60008060008060608587031215611e3b57600080fd5b84359350602085013567ffffffffffffffff811115611e5957600080fd5b611e6587828801611c57565b9598909750949560400135949350505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611ea057611ea0611e78565b5060010190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680611ed157607f821691505b602082108103611ef157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611f4157600081815260208120601f850160051c81016020861015611f1e5750805b601f850160051c820191505b81811015611f3d57828155600101611f2a565b5050505b505050565b67ffffffffffffffff831115611f5e57611f5e611ea7565b611f7283611f6c8354611ebd565b83611ef7565b6000601f841160018114611fa65760008515611f8e5750838201355b600019600387901b1c1916600186901b178355612000565b600083815260209020601f19861690835b82811015611fd75786850135825560209485019460019092019101611fb7565b5086821015611ff45760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261203457600080fd5b83018035915067ffffffffffffffff82111561204f57600080fd5b602001915036819003821315611c9957600080fd5b8183823760009101908152919050565b6000815461208181611ebd565b80855260206001838116801561209e57600181146120b8576120e6565b60ff1985168884015283151560051b8801830195506120e6565b866000528260002060005b858110156120de5781548a82018601529083019084016120c3565b890184019650505b505050505092915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8981526101006020820152600061213561010083018b612074565b828103604084015288815260208082019060058b901b8301018b60005b8c8110156121c757848303601f190184528135368f9003601e1901811261217857600080fd5b8e0160208101903567ffffffffffffffff81111561219557600080fd5b8036038213156121a457600080fd5b6121af8582846120f1565b60209687019690955093909301925050600101612152565b50508093505050508660608301528560808301526121f060a08301866001600160a01b03169052565b92151560c082015290151560e090910152979650505050505050565b8481526001600160a01b03848116602080840191909152606060408401819052830184905260009185919060808501845b87811015612262578261224f86611c04565b168252938301939083019060010161223d565b509998505050505050505050565b6020808252600e908201526d1a5b9d985b1a59081b1bdd081a5960921b604082015260600190565b81810381811115611a9b57611a9b611e78565b8082028115828204841417611a9b57611a9b611e78565b6000826122df57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156122f657600080fd5b8151611bfd81611ce5565b60208082526027908201527f6d756c7469706c65207573657273206e6f7420616c6c6f77656420696e206368604082015266616c6c656e676560c81b606082015260800190565b80820180821115611a9b57611a9b611e78565b8581526080602082015260006123756080830186886120f1565b6001600160a01b0394909416604083015250606001529392505050565b6040815260006123a56040830185612074565b90508260208301529392505050565b6000602082840312156123c657600080fd5b5051919050565b60005b838110156123e85781810151838201526020016123d0565b50506000910152565b87815286602082015260e06040820152600086518060e084015261010061241e8282860160208c016123cd565b606084019790975260808301959095525060a081019290925260c0820152601f909101601f191601019392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516124ab8184602087016123cd565b919091019291505056fea2646970667358221220bd72e2f72e8cb8c30b5673b55b1454f8177aa6fb366c163e319d336172cc73b564736f6c63430008110033