0 txs
0 calls
constructor
constructor(address _daoFeeRegistry, address _versionRegistry, address _trustedFillerRegistry, address _governanceDeployer)
functions
daoFeeRegistry
viewfunction daoFeeRegistry() view returns (address)
folioImplementation
viewfunction folioImplementation() view returns (address)
governanceDeployer
viewfunction governanceDeployer() view returns (address)
trustedFillerRegistry
viewfunction trustedFillerRegistry() view returns (address)
version
purefunction version() pure returns (string)
versionRegistry
viewfunction versionRegistry() view returns (address)
deployFolio
nonpayablefunction deployFolio(tuple basicDetails, tuple additionalDetails, tuple folioFlags, address owner, address[] basketManagers, address[] auctionLaunchers, address[] brandManagers, bytes32 deploymentNonce) returns (address folio, address proxyAdmin)
deployGovernedFolio
nonpayablefunction deployGovernedFolio(address stToken, tuple basicDetails, tuple additionalDetails, tuple folioFlags, tuple ownerGovParams, tuple tradingGovParams, tuple govRoles, bytes32 deploymentNonce) returns (address folio, address proxyAdmin)
events
FolioDeployed
event FolioDeployed(address indexed folioOwner, address indexed folio, address folioAdmin)
GovernedFolioDeployed
event GovernedFolioDeployed(address indexed stToken, address indexed folio, address ownerGovernor, address ownerTimelock, address tradingGovernor, address tradingTimelock)
errors
FolioDeployer__LengthMismatch
error FolioDeployer__LengthMismatch()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x61012060405234801561001157600080fd5b506040516184fc3803806184fc833981016040819052610030916100b3565b6001600160a01b0380851660a052838116608052821660c0526040516100559061008e565b604051809103906000f080158015610071573d6000803e3d6000fd5b506001600160a01b0390811660e052166101005250610112915050565b615ccc8061283083390190565b6001600160a01b03811681146100b057600080fd5b50565b600080600080608085870312156100c957600080fd5b84516100d48161009b565b60208601519094506100e58161009b565b60408601519093506100f68161009b565b60608601519092506101078161009b565b939692955090935050565b60805160a05160c05160e051610100516126b161017f6000396000818160920152818161024e015261037a0152600081816101b801526107ad01526000818161010901526108d001526000818161019101526108ab015260008181610157015261074501526126b16000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063608935151161005b57806360893515146101525780639338d7fa146101795780639980cb231461018c578063c42f3d1b146101b357600080fd5b806305111eb91461008d5780630e6fb787146100d157806321903d791461010457806354fd4d501461012b575b600080fd5b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e46100df366004610edc565b6101da565b604080516001600160a01b039384168152929091166020830152016100c8565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b60408051808201825260058152640342e302e360dc1b602082015290516100c89190610ff3565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6100e46101873660046110fb565b610695565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b604080513360208201529081018290526000908190819060600160408051808303601f190181528282528051602090910120600280845260608401909252925060009190816020015b60408051808201909152600080825260208201528152602001906001900390816102235790505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a7f52023898e856040518463ffffffff1660e01b815260040161029c93929190611291565b60408051808303816000875af11580156102ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102de9190611344565b826000815181106102f1576102f161137e565b60200260200101516000018360008151811061030f5761030f61137e565b6020908102919091018101516001600160a01b039384169101529116905260006103398780611394565b80806020026020016040519081016040528093929190818152602001838360200280828437600092018290525084519495509390930392506104cf915050577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a7f52023898f86196040518463ffffffff1660e01b81526004016103c993929190611291565b60408051808303816000875af11580156103e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040b9190611344565b8360018151811061041e5761041e61137e565b60200260200101516000018460018151811061043c5761043c61137e565b6020908102919091018101516001600160a01b0393841691015291169052604080516001808252818301909252908160200160208202803683370190505090508160018151811061048f5761048f61137e565b602002602001015160200151816000815181106104ae576104ae61137e565b60200260200101906001600160a01b031690816001600160a01b0316815250505b61058e8c8c8c856000815181106104e8576104e861137e565b602002602001015160200151858c80602001906105059190611394565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d80604001906105559190611394565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d9250610695915050565b8095508196505050846001600160a01b03168d6001600160a01b03167f08af36628654870563f8102f737700df4046cdfaef3ff1a7a48253d07e9e1a6b846000815181106105de576105de61137e565b602002602001015160000151856000815181106105fd576105fd61137e565b6020026020010151602001518660018151811061061c5761061c61137e565b6020026020010151600001518760018151811061063b5761063b61137e565b60200260200101516020015160405161067d94939291906001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a35050509850989650505050505050565b6000806106a560608b018b611394565b90506106b460408c018c611394565b9050146106d457604051632692258760e11b815260040160405180910390fd5b6000338b8b8a8a8a8a6040516020016106f296959493929190611648565b60408051601f1981840301815282825280516020918201206001600160a01b03909416908301528101919091526060810185905260800160405160208183030381529060405280519060200120905080887f000000000000000000000000000000000000000000000000000000000000000060405161077090610e5e565b6001600160a01b039283168152911660208201526040018190604051809103906000f59050801580156107a7573d6000803e3d6000fd5b509150807f0000000000000000000000000000000000000000000000000000000000000000836040516107d990610e6b565b6001600160a01b039283168152911660208201526040018190604051809103906000f5905080158015610810573d6000803e3d6000fd5b50925060005b61082360408d018d611394565b90508110156108975761088f61083c60408e018e611394565b8381811061084c5761084c61137e565b905060200201602081019061086191906116c5565b33868f80606001906108739190611394565b868181106108835761088361137e565b90506020020135610d89565b600101610816565b506040805180820182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301529151632d37b79160e01b815291851691632d37b79191610920918f918f918f9033906004016116f9565b600060405180830381600087803b15801561093a57600080fd5b505af115801561094e573d6000803e3d6000fd5b50505050826001600160a01b0316632f2ff15d846001600160a01b031663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c3919061178b565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b038b166024820152604401600060405180830381600087803b158015610a0b57600080fd5b505af1158015610a1f573d6000803e3d6000fd5b5050505060005b8751811015610ae657836001600160a01b0316632f2ff15d7f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb1308a8481518110610a7157610a7161137e565b60200260200101516040518363ffffffff1660e01b8152600401610aa89291909182526001600160a01b0316602082015260400190565b600060405180830381600087803b158015610ac257600080fd5b505af1158015610ad6573d6000803e3d6000fd5b505060019092019150610a269050565b5060005b8651811015610baa57836001600160a01b0316632f2ff15d7f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df5898481518110610b3557610b3561137e565b60200260200101516040518363ffffffff1660e01b8152600401610b6c9291909182526001600160a01b0316602082015260400190565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b505060019092019150610aea9050565b5060005b8551811015610c6e57836001600160a01b0316632f2ff15d7f2d8e650da9bd8c373ab2450d770f2ed39549bfc28d3630025cecc51511bcd374888481518110610bf957610bf961137e565b60200260200101516040518363ffffffff1660e01b8152600401610c309291909182526001600160a01b0316602082015260400190565b600060405180830381600087803b158015610c4a57600080fd5b505af1158015610c5e573d6000803e3d6000fd5b505060019092019150610bae9050565b50826001600160a01b03166336568abe846001600160a01b031663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce0919061178b565b6040516001600160e01b031960e084901b1681526004810191909152306024820152604401600060405180830381600087803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b50506040516001600160a01b03858116825280871693508b1691507f017464e04c545b4f5c5e32a4c60ce4ff586eef58fdda661784f9905bcd764fda9060200160405180910390a3509850989650505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610de3908590610de9565b50505050565b600080602060008451602086016000885af180610e0c576040513d6000823e3d81fd5b50506000513d91508115610e24578060011415610e31565b6001600160a01b0384163b155b15610de357604051635274afe760e01b81526001600160a01b038516600482015260240160405180910390fd5b6106d4806117a583390190565b61082c80611e7983390190565b6001600160a01b0381168114610e8d57600080fd5b50565b8035610e9b81610e78565b919050565b600060a08284031215610eb257600080fd5b50919050565b600060608284031215610eb257600080fd5b600060c08284031215610eb257600080fd5b600080600080600080600080610140898b031215610ef957600080fd5b610f0289610e90565b975060208901356001600160401b03811115610f1d57600080fd5b610f298b828c01610ea0565b97505060408901356001600160401b03811115610f4557600080fd5b610f518b828c01610ea0565b965050610f618a60608b01610eb8565b945060c08901356001600160401b03811115610f7c57600080fd5b610f888b828c01610eca565b94505060e08901356001600160401b03811115610fa457600080fd5b610fb08b828c01610eca565b9350506101008901356001600160401b03811115610fcd57600080fd5b610fd98b828c01610eb8565b989b979a5095989497939692955092936101200135925050565b602081526000825180602084015260005b818110156110215760208186018101516040868401015201611004565b506000604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261106857600080fd5b81356001600160401b0381111561108157611081611041565b8060051b604051601f19603f83011681018181106001600160401b03821117156110ad576110ad611041565b6040529182526020818501810192908101868411156110cb57600080fd5b6020860192505b838310156110f1576110e383610e90565b8152602092830192016110d2565b5095945050505050565b600080600080600080600080610140898b03121561111857600080fd5b88356001600160401b0381111561112e57600080fd5b61113a8b828c01610ea0565b98505060208901356001600160401b0381111561115657600080fd5b6111628b828c01610ea0565b9750506111728a60408b01610eb8565b955061118060a08a01610e90565b945060c08901356001600160401b0381111561119b57600080fd5b6111a78b828c01611057565b94505060e08901356001600160401b038111156111c357600080fd5b6111cf8b828c01611057565b9350506101008901356001600160401b038111156111ec57600080fd5b610fd98b828c01611057565b6000808335601e1984360301811261120f57600080fd5b83016020810192503590506001600160401b0381111561122e57600080fd5b8060051b360382131561124057600080fd5b9250929050565b81835260208301925060008160005b8481101561128757813561126981610e78565b6001600160a01b031686526020958601959190910190600101611256565b5093949350505050565b606081526000843565ffffffffffff81168082146112ae57600080fd5b606084015250602085013563ffffffff811681146112cb57600080fd5b63ffffffff8116608084015250604085013560a083810191909152606086013560c0840152608086013560e0840152611306908601866111f8565b60c061010085015261131d61012085018284611247565b9250505061133660208301856001600160a01b03169052565b826040830152949350505050565b6000806040838503121561135757600080fd5b825161136281610e78565b602084015190925061137381610e78565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126113ab57600080fd5b8301803591506001600160401b038211156113c557600080fd5b6020019150600581901b360382131561124057600080fd5b6000808335601e198436030181126113f457600080fd5b83016020810192503590506001600160401b0381111561141357600080fd5b80360382131561124057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600061145782836113dd565b60a0855261146960a086018284611422565b91505061147960208401846113dd565b858303602087015261148c838284611422565b9250505061149d60408401846111f8565b85830360408701526114b0838284611247565b925050506114c160608401846111f8565b85830360608701528083526001600160fb1b038111156114e057600080fd5b60051b80826020850137608094850135959094019490945290910160200192915050565b81835260208301925060008160005b8481101561128757813561152681610e78565b6001600160a01b0316865260208201356bffffffffffffffffffffffff811680821461155157600080fd5b6020880152506040958601959190910190600101611513565b803582526000602082013536839003601e1901811261158857600080fd5b82016020810190356001600160401b038111156115a457600080fd5b8060061b36038213156115b657600080fd5b60a060208601526115cb60a086018284611504565b604085810135908701526060808601359087015291506115f0905060808401846113dd565b8583036080870152611603838284611422565b9695505050505050565b600081518084526020840193506020830160005b828110156112875781516001600160a01b0316865260209586019590910190600101611621565b60c08152600061165b60c083018961144b565b828103602084015261166d818961156a565b6001600160a01b038816604085015283810360608501529050611690818761160d565b905082810360808401526116a4818661160d565b905082810360a08401526116b8818561160d565b9998505050505050505050565b6000602082840312156116d757600080fd5b81356116e281610e78565b9392505050565b80358015158114610e9b57600080fd5b6101008152600061170e61010083018861144b565b8281036020840152611720818861156a565b86516001600160a01b0390811660408601526020880151166060850152915061174a9050846116e9565b1515608083015261175d602085016116e9565b151560a0830152611770604085016116e9565b151560c08301526001600160a01b03831660e0830152611603565b60006020828403121561179d57600080fd5b505191905056fe60a060405234801561001057600080fd5b506040516106d43803806106d483398101604081905261002f916100e6565b816001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161007a565b506001600160a01b031660805250610119565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100e157600080fd5b919050565b600080604083850312156100f957600080fd5b610102836100ca565b9150610110602084016100ca565b90509250929050565b60805161059a61013a6000396000818160610152610111015261059a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063608935151461005c578063715018a61461009f57806386e5ab2e146100a95780638da5cb5b146100bc578063f2fde38b146100cd575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100a76100e0565b005b6100a76100b73660046103f8565b6100f4565b6000546001600160a01b0316610083565b6100a76100db3660046104cd565b61030d565b6100e8610350565b6100f2600061037d565b565b6100fc610350565b6040516237935760e61b8152600481018390527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03821690630de4d5c090602401602060405180830381865afa158015610162573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018691906104f1565b156101a45760405163639c421d60e01b815260040160405180910390fd5b604051633740401760e01b8152600481018490526000906001600160a01b03831690633740401790602401602060405180830381865afa1580156101ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102109190610513565b6001600160a01b0316036102375760405163a9146eeb60e01b815260040160405180910390fd5b604051632777202560e11b8152600481018490526000906001600160a01b03831690634eee404a90602401602060405180830381865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610513565b60405163278f794360e11b81529091506001600160a01b03861690634f1ef286906102d49084908790600401610530565b600060405180830381600087803b1580156102ee57600080fd5b505af1158015610302573d6000803e3d6000fd5b505050505050505050565b610315610350565b6001600160a01b03811661034457604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b61034d8161037d565b50565b6000546001600160a01b031633146100f25760405163118cdaa760e01b815233600482015260240161033b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461034d57600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561040d57600080fd5b8335610418816103cd565b925060208401359150604084013567ffffffffffffffff81111561043b57600080fd5b8401601f8101861361044c57600080fd5b803567ffffffffffffffff811115610466576104666103e2565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610495576104956103e2565b6040528181528282016020018810156104ad57600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000602082840312156104df57600080fd5b81356104ea816103cd565b9392505050565b60006020828403121561050357600080fd5b815180151581146104ea57600080fd5b60006020828403121561052557600080fd5b81516104ea816103cd565b60018060a01b0383168152604060208201526000825180604084015260005b8181101561056c576020818601810151606086840101520161054f565b506000606082850101526060601f19601f830116840101915050939250505056fea164736f6c634300081c000a608060405234801561001057600080fd5b5060405161082c38038061082c83398101604081905261002f91610324565b604080516020810190915260008152829061004a828261005d565b506100569050816100bc565b5050610386565b6100668261012a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100b0576100ab82826101a9565b505050565b6100b8610220565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100fc60008051602061080c833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012781610241565b50565b806001600160a01b03163b60000361016557604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c69190610357565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b509092509050610217858383610280565b95945050505050565b341561023f5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026b57604051633173bdd160e11b81526000600482015260240161015c565b8060008051602061080c833981519152610188565b60608261029557610290826102df565b6102d8565b81511580156102ac57506001600160a01b0384163b155b156102d557604051639996b31560e01b81526001600160a01b038516600482015260240161015c565b50805b9392505050565b8051156102ef5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461031f57600080fd5b919050565b6000806040838503121561033757600080fd5b61034083610308565b915061034e60208401610308565b90509250929050565b6000825160005b81811015610378576020818601810151858301520161035e565b506000920191825250919050565b610477806103956000396000f3fe608060405261000c61000e565b005b610016610091565b6001600160a01b03163303610087576000356001600160e01b03191663278f794360e11b14610058576040516334ad5dbb60e21b815260040160405180910390fd5b6000806100683660048184610323565b8101906100759190610363565b9150915061008382826100c4565b5050565b61008f61011f565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6100cd8261012f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101175761011282826101ab565b505050565b610083610221565b61008f61012a610240565b61024f565b806001600160a01b03163b60000361016a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101c8919061043b565b600060405180830381855af49150503d8060008114610203576040519150601f19603f3d011682016040523d82523d6000602084013e610208565b606091505b5091509150610218858383610273565b95945050505050565b341561008f5760405163b398979f60e01b815260040160405180910390fd5b600061024a6102d2565b905090565b3660008037600080366000845af43d6000803e80801561026e573d6000f35b3d6000fd5b60608261028857610283826102fa565b6102cb565b815115801561029f57506001600160a01b0384163b155b156102c857604051639996b31560e01b81526001600160a01b0385166004820152602401610161565b50805b9392505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6100b5565b80511561030a5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561033357600080fd5b8386111561034057600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561037657600080fd5b82356001600160a01b038116811461038d57600080fd5b9150602083013567ffffffffffffffff8111156103a957600080fd5b8301601f810185136103ba57600080fd5b803567ffffffffffffffff8111156103d4576103d461034d565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104035761040361034d565b60405281815282820160200187101561041b57600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000825160005b8181101561045c5760208186018101518583015201610442565b50600092019182525091905056fea164736f6c634300081c000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a164736f6c634300081c000a6080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615bf3806100d96000396000f3fe608060405234801561001057600080fd5b50600436106103c45760003560e01c80637abf7e25116101ff578063b0384a0b1161011a578063ce923605116100ad578063dd62ed3e1161007c578063dd62ed3e1461088b578063e1e7bd591461089e578063eddd0d9c146108b1578063fc528482146108c457600080fd5b8063ce9236051461083c578063d17618bf1461084f578063d3ebe4ce14610862578063d547741f1461087857600080fd5b8063bd7379c7116100e9578063bd7379c7146107ff578063c4ec22ad14610813578063c71782301461081c578063ca15c8731461082957600080fd5b8063b0384a0b146107bb578063b200deda146107db578063b579605b146107e4578063bb57ad20146107f757600080fd5b8063979d509411610192578063a217fddf11610161578063a217fddf14610762578063a3246ad31461076a578063a9059cbb1461078a578063aa3b55681461079d57600080fd5b8063979d5094146107205780639980cb23146107295780639f200bba1461073c5780639fa0bba41461074f57600080fd5b80638cdf1288116101ce5780638cdf1288146106df5780639010d07c146106f257806391d148541461070557806395d89b411461071857600080fd5b80637abf7e25146106a95780637aeaafb3146106bc578063834e630f146106c4578063836a1040146106cc57600080fd5b80632753dc80116102ef57806339b1b96d1161028257806354fd4d501161025157806354fd4d501461061a578063571a26a01461063b57806370a082311461066a578063783e93f0146106a057600080fd5b806339b1b96d146105a65780633c46570f146105ae5780634b61ffeb146105c157806351fe9eff146105e057600080fd5b8063320736bf116102be578063320736bf14610564578063325c25a21461057757806336568abe14610580578063374cbb2c1461059357600080fd5b80632753dc80146105015780632d37b7911461052f5780632f2ff15d14610542578063313ce5671461055557600080fd5b806318160ddd11610367578063235d714211610336578063235d7142146104b5578063236ed8f3146104c857806323b872dd146104db578063248a9ca3146104ee57600080fd5b806318160ddd14610467578063181783581461046f5780631fffacd81461047757806321903d791461048a57600080fd5b806306fdde03116103a357806306fdde0314610415578063072c2f171461042a578063095ea7b31461044b57806313966db51461045e57600080fd5b806240718e146103c957806301e1d114146103d357806301ffc9a7146103f2575b600080fd5b6103d16108cd565b005b6103db6109a1565b6040516103e9929190614894565b60405180910390f35b6104056104003660046148b9565b6109b4565b60405190151581526020016103e9565b61041d6109df565b6040516103e991906148e3565b61043d610438366004614931565b610aa2565b6040519081526020016103e9565b61040561045936600461495f565b610d08565b61043d60065481565b61043d610d20565b6103d1610d77565b6103d1610485366004614999565b610d8f565b60125461049d906001600160a01b031681565b6040516001600160a01b0390911681526020016103e9565b6103d16104c3366004614ab6565b610da9565b6103d16104d6366004614931565b610f71565b6104056104e9366004614b81565b611054565b61043d6104fc366004614931565b61107a565b61051461050f366004614bc2565b61109c565b604080519384526020840192909252908201526060016103e9565b6103d161053d366004614c38565b6110e8565b6103d1610550366004614cd8565b6115c7565b604051601281526020016103e9565b61049d610572366004614cfd565b6115e9565b61043d600f5481565b6103d161058e366004614cd8565b611816565b6103d16105a1366004614d58565b611849565b61041d61188b565b61043d6105bc366004614d75565b611919565b6105c9611b50565b6040805192151583529015156020830152016103e9565b6105f36105ee366004614931565b611c13565b604080516001600160a01b0390931683526001600160601b039091166020830152016103e9565b6040805180820190915260058152640342e302e360dc1b602082015261041d565b610514610649366004614931565b601e6020526000908152604090208054600282015460039092015490919083565b61043d610678366004614d58565b6001600160a01b03166000908152600080516020615ba7833981519152602052604090205490565b61043d60095481565b6103d16106b7366004614e33565b611c4e565b6103d1611c6f565b61043d611cc1565b6103db6106da366004614e4f565b611cde565b6103d16106ed366004614d58565b611f89565b61049d610700366004614e76565b612083565b610405610713366004614cd8565b6120b2565b61041d6120ea565b61043d60085481565b60005461049d906001600160a01b031681565b6103d161074a366004614ed9565b612129565b6103d161075d366004614931565b612173565b61043d600081565b61077d610778366004614931565b61218f565b6040516103e99190614f1a565b61040561079836600461495f565b6121ba565b6107a56121c8565b6040516103e99a99989796959493929190614f9f565b6107ce6107c936600461508f565b61247d565b6040516103e9919061511e565b61043d60055481565b6103d16107f2366004614931565b612648565b6103d1612664565b60125461040590600160a01b900460ff1681565b61043d60075481565b600a546104059060ff1681565b61043d610837366004614931565b612875565b61043d61084a366004615131565b61289b565b6103db61085d3660046151c8565b6129a6565b6014546105c99060ff8082169161010090041682565b6103d1610886366004614cd8565b6129bf565b61043d6108993660046151f1565b6129db565b6103d16108ac3660046152db565b612a25565b6103d16108bf366004614931565b612a41565b61043d601f5481565b6108d5612a5d565b6108e06000336120b2565b8061091057506109107f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb130336120b2565b8061094057506109407f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df5336120b2565b61095d57604051637bdeee5360e11b815260040160405180910390fd5b6015546040519081527f4413e35d9a55c68763294e889871b8e17c9650f0db8fcfaf50690b4b02c943709060200160405180910390a142601c5561099f612aa7565b565b6060806109ac612acd565b915091509091565b60006001600160e01b03198216635a05180f60e01b14806109d957506109d982612b7b565b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace038054606091600080516020615ba783398151915291610a1e9061538a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a9061538a565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505091505090565b6000610aac612a5d565b600a5460ff1615610ad05760405163539409e360e11b815260040160405180910390fd5b610ad8612bb0565b601b54421015610afb576040516346f80f1f60e01b815260040160405180910390fd5b6000610b076002612be3565b80519091506000816001600160401b03811115610b2657610b2661521f565b604051908082528060200260200182016040528015610b7b57816020015b610b6860405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610b445790505b5090506000826001600160401b03811115610b9857610b9861521f565b604051908082528060200260200182016040528015610bdd57816020015b6040805180820190915260008082526020820152815260200190600190039081610bb65790505b50905060005b83811015610cc657600060156001016000878481518110610c0657610c066153be565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209050604051806060016040528082600101600101548152602001826001016001015481526020018260010160010154815250848381518110610c7257610c726153be565b60200260200101819052508060040160405180604001604052908160008201548152602001600182015481525050838381518110610cb257610cb26153be565b602090810291909101015250600101610be3565b50604080516060810182526018548082526020820181905291810191909152610cf487868585856078612bf0565b95505050505050610d03612aa7565b919050565b600033610d16818585612d9d565b5060019392505050565b6000806000610d2d612daa565b50915091508082610d5c7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b610d6691906153ea565b610d7091906153ea565b9250505090565b610d7f612a5d565b610d87612bb0565b61099f612aa7565b6000610d9a8161315e565b610da48383613168565b505050565b7f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb130610dd38161315e565b610ddb612a5d565b600a5460ff1615610dff5760405163539409e360e11b815260040160405180910390fd5b610e07612bb0565b6000610e136002612be3565b805190915060005b81811015610e955760156001016000848381518110610e3c57610e3c6153be565b6020908102919091018101516001600160a01b031682528101919091526040016000908120805460ff19168155600180820183905560028201839055600382018390556004820183905560059091019190915501610e1b565b5073cdf52b29de3f69431de99faf2dd5a0aec643d57663f22836d6601460158f8f8f8f8f8f8f8f8f6040518c63ffffffff1660e01b8152600401610ee39b9a99989796959493929190615475565b60006040518083038186803b158015610efb57600080fd5b505af4158015610f0f573d6000803e3d6000fd5b508d93506000925050505b81811015610f5a57610f518d8d83818110610f3757610f376153be565b9050602002016020810190610f4c9190614d58565b613247565b50600101610f1a565b505050610f65612aa7565b50505050505050505050565b610f79612a5d565b610f846000336120b2565b80610fb45750610fb47f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb130336120b2565b80610fe45750610fe47f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df5336120b2565b61100157604051637bdeee5360e11b815260040160405180910390fd5b61100c600142615531565b6000828152601e602052604080822060030192909255905182917fac4a907ec29adcc56774b757ecb1e1b4d597374fc9386107d05e2670259df7d391a2611051612aa7565b50565b6000336110628582856132c6565b61106d858585613326565b60019150505b9392505050565b6000908152600080516020615bc7833981519152602052604090206001015490565b6000858152601e60205260408120819081906110d79088886110bc610d20565b896000036110ca57426110cc565b895b60008a600019613385565b925092509250955095509592505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561112d5750825b90506000826001600160401b031660011480156111495750303b155b905081158015611157575080155b156111755760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561119f57845460ff60401b1916600160401b1785555b6112286111ac8b80615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111ee9250505060208d018d615544565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506134df92505050565b6112306134f1565b6112386134f1565b6112406134f9565b6112a661125060208b018b61558a565b808060200260200160405190810160405280939291908181526020016000905b8282101561129c5761128d604083028601368190038101906155d3565b81526020019060010190611270565b5050505050613509565b6112b38960400135613733565b6112c08960600135613873565b6112ca89356138d0565b6113146112da60808b018b615544565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061393692505050565b61132e61132936899003890160208a016155ef565b613972565b61135361134160408a0160208b01614d58565b61134e60208a018a615632565b613168565b61136861136360208a018a614d58565b6139db565b896080013560000361138d57604051631f6d979160e11b815260040160405180910390fd5b600061139c60408c018c61564f565b90509050806000036113c15760405163e9eaf68960e01b815260040160405180910390fd5b60005b818110156115565760006113db60408e018e61564f565b838181106113eb576113eb6153be565b90506020020160208101906114009190614d58565b6001600160a01b0316036114275760405163445e1f2b60e11b815260040160405180910390fd5b600061143660408e018e61564f565b83818110611446576114466153be565b905060200201602081019061145b9190614d58565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156114a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c59190615698565b90508015156114d760408f018f61564f565b848181106114e7576114e76153be565b90506020020160208101906114fc9190614d58565b9061152b57604051631b58637360e21b81526001600160a01b0390911660048201526024015b60405180910390fd5b5061154c61153c60408f018f61564f565b84818110610f3757610f376153be565b50506001016113c4565b50426007556115698760808d0135613a24565b611574600033613a5a565b50508315610f6557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050505050565b6115d08261107a565b6115d98161315e565b6115e38383613a5a565b50505050565b60006115f3612a5d565b600a5460ff16156116175760405163539409e360e11b815260040160405180910390fd5b61161f612bb0565b6012546001600160a01b0316158015906116425750601254600160a01b900460ff165b61165f576040516387db439760e01b815260040160405180910390fd5b6000868152601e60205260408120819061168990888861167d610d20565b42600060001980613385565b5091509150806000036116af57604051630ad5378760e01b815260040160405180910390fd5b6012546040516333f363a360e01b81523360048201526001600160a01b03878116602483015260448201879052909116906333f363a3906064016020604051808303816000875af1158015611708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172c91906156b1565b9250611739878484613a9f565b6040516314d6c7d760e31b81523060048201526001600160a01b0388811660248301528781166044830152606482018490526084820183905284169063a6b63eb89060a401600060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b5050601380546001600160a01b0319166001600160a01b0387169081179091556040519081528a92507f7e8e2491200fd9e2cf2541c7229d5bf89f4da14659c18fc31054176c339e310b915060200160405180910390a2505061180d612aa7565b95945050505050565b6001600160a01b038116331461183f5760405163334bd91960e11b815260040160405180910390fd5b610da48282613b5d565b611851612a5d565b600061185c8161315e565b61186582613247565b6118825760405163420aca6760e01b815260040160405180910390fd5b50611051612aa7565b600180546118989061538a565b80601f01602080910402602001604051908101604052809291908181526020018280546118c49061538a565b80156119115780601f106118e657610100808354040283529160200191611911565b820191906000526020600020905b8154815290600101906020018083116118f457829003601f168201915b505050505081565b60007f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df56119458161315e565b61194d612a5d565b600a5460ff16156119715760405163539409e360e11b815260040160405180910390fd5b611979612bb0565b8760005b818110156119f257601660008c8c8481811061199b5761199b6153be565b90506020020160208101906119b09190614d58565b6001600160a01b0316815260208101919091526040016000205460ff166119ea5760405163445e1f2b60e11b815260040160405180910390fd5b60010161197d565b50611af68b8b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508a8a808060200260200160405190810160405280939291908181526020016000905b82821015611a8757611a7860608302860136819003810190615726565b81526020019060010190611a5b565b50505050508989808060200260200160405190810160405280939291908181526020016000905b82821015611ada57611acb60408302860136819003810190615742565b81526020019060010190611aae565b50611aef9350505050368a90038a018a615726565b6000612bf0565b9250611b376015600601546078601e600f5442611b1391906153ea565b611b1d91906153ea565b611b2791906153ea565b611b329060016153ea565b613b99565b601b5550611b43612aa7565b5098975050505050505050565b600080611b7e7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460021490565b6013549092506001600160a01b031615801590611c0d5750601360009054906101000a90046001600160a01b03166001600160a01b031663d6dacb446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0d9190615775565b90509091565b60048181548110611c2357600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b6000611c598161315e565b611c6b611329368490038401846155ef565b5050565b611c77612a5d565b6000611c828161315e565b600a805460ff191660011790556040517f0896631e72e873e636ab9ad7599a61ddc2f96c7961fa8e19e00a926e6512312390600090a15061099f612aa7565b6000806000611cce612daa565b509092509050610d7081836153ea565b606080611ce9612a5d565b600a5460ff1615611d0d5760405163539409e360e11b815260040160405180910390fd5b611d15612bb0565b600080546040516311a04fa160e11b8152306004820152829182916001600160a01b03909116906323409f4290602401608060405180830381865afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190615792565b93509350935050611d9e81660110d9316ec000613b99565b90506000670de0b6b3a76400006001670de0b6b3a76400006006548c611dc491906157d1565b611dce91906153ea565b611dd89190615531565b611de291906157fe565b9050600083600181611df488866157d1565b611dfe91906153ea565b611e089190615531565b611e1291906157fe565b90506000670de0b6b3a7640000600181611e2c878f6157d1565b611e3691906153ea565b611e409190615531565b611e4a91906157fe565b9050808210611e595781611e5b565b805b9150818310611e6a5782611e6c565b815b92506000611e7a848d615531565b90508015801590611e8b5750898110155b611ea857604051632cf5f58f60e21b815260040160405180910390fd5b611eb38c6001613ba9565b8151919a50985060005b81811015611f2c57898181518110611ed757611ed76153be565b6020026020010151600014611f2457611f248b8281518110611efb57611efb6153be565b602002602001015133308d8581518110611f1757611f176153be565b6020026020010151613c26565b600101611ebd565b50611f378c83613a24565b8360086000828254611f4991906153ea565b90915550611f5990508486615531565b60096000828254611f6a91906153ea565b925050819055505050505050505050611f81612aa7565b935093915050565b611f91612a5d565b611f99613c5f565b611fa46000336120b2565b8061203857506001600160a01b03811660009081526016602052604090206002015415801561203857506040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015612012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120369190615698565b155b6120555760405163019b497f60e51b815260040160405180910390fd5b61205e81613cea565b61207b5760405163420aca6760e01b815260040160405180910390fd5b611051612aa7565b6000828152600080516020615b878339815191526020819052604082206120aa9084613d70565b949350505050565b6000918252600080516020615bc7833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020615ba783398151915291610a1e9061538a565b60006121348161315e565b610da483838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061393692505050565b600061217e8161315e565b612186612664565b611c6b82613733565b6000818152600080516020615b87833981519152602081905260409091206060919061107390612be3565b600033610d16818585613326565b60006060806060806121f460405180606001604052806000815260200160008152602001600081525090565b6000806000806122046002612be3565b8051909950806001600160401b038111156122215761222161521f565b60405190808252806020026020018201604052801561227657816020015b61226360405180606001604052806000815260200160008152602001600081525090565b81526020019060019003908161223f5790505b509850806001600160401b038111156122915761229161521f565b6040519080825280602002602001820160405280156122d657816020015b60408051808201909152600080825260208201528152602001906001900390816122af5790505b509750806001600160401b038111156122f1576122f161521f565b60405190808252806020026020018201604052801561231a578160200160208202803683370190505b50965060005b8181101561242c576000601560010160008d8481518110612343576123436153be565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090508060010160405180606001604052908160008201548152602001600182015481526020016002820154815250508b83815181106123ac576123ac6153be565b602002602001018190525080600401604051806040016040529081600082015481526020016001820154815250508a83815181106123ec576123ec6153be565b60209081029190910101528054895160ff909116908a9084908110612413576124136153be565b9115156020928302919091019091015250600101612320565b5050601554604080516060810182526017548152601854602082015260195491810191909152601a54601b54601c54601d54949f9d9e509b9c9a9b999a92999198509650945060ff90911692509050565b6060612487612a5d565b61248f612bb0565b606061249c886000613ba9565b925090506124aa3389613d7c565b805185811480156124ba57508084145b6124d757604051635feae2b760e01b815260040160405180910390fd5b60005b81811015612633578787828181106124f4576124f46153be565b90506020020160208101906125099190614d58565b6001600160a01b0316838281518110612524576125246153be565b60200260200101516001600160a01b0316146125535760405163445e1f2b60e11b815260040160405180910390fd5b858582818110612565576125656153be565b9050602002013584828151811061257e5761257e6153be565b6020026020010151101583828151811061259a5761259a6153be565b6020026020010151906125cc57604051631b58637360e21b81526001600160a01b039091166004820152602401611522565b508381815181106125df576125df6153be565b602002602001015160001461262b5761262b838281518110612603576126036153be565b60200260200101518a86848151811061261e5761261e6153be565b6020026020010151613db2565b6001016124da565b50505061263e612aa7565b9695505050505050565b612650612a5d565b600061265b8161315e565b611882826138d0565b61266c612a5d565b612674612bb0565b60098054600091829055600454909190815b81811015612781576000670de0b6b3a7640000600483815481106126ac576126ac6153be565b6000918252602090912001546126d290600160a01b90046001600160601b0316876157d1565b6126dc91906157fe565b90506126e881856153ea565b935061271b60048381548110612700576127006153be565b6000918252602090912001546001600160a01b031682613a24565b6004828154811061272e5761272e6153be565b600091825260209182902001546040518381526001600160a01b03909116917f168a65529db3a11aa555b702a0e4594e364bfeebed05918eeb405d36e744fa51910160405180910390a250600101612686565b506000828460085461279391906153ea565b61279d9190615531565b600080546040516311a04fa160e11b815230600482015292935090916001600160a01b03909116906323409f4290602401608060405180830381865afa1580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190615792565b505050905061281e8183613a24565b806001600160a01b03167fb87e607f6030a23ed9b7dac1a717610f3a3b07325269f18808ba763bdcefe7ae8360405161285991815260200190565b60405180910390a2505060006008555061099f9150612aa79050565b6000818152600080516020615b8783398151915260208190526040822061107390613de3565b60006128a5612a5d565b600a5460ff16156128c95760405163539409e360e11b815260040160405180910390fd5b6128d1612bb0565b6000898152601e602052604090206128f6818a8a6128ed610d20565b428c8d8d613385565b50604051630a99082360e11b815290935073cdf52b29de3f69431de99faf2dd5a0aec643d5769150631532104690612940908d908d908d908d9089908d908d908d90600401615812565b602060405180830381865af415801561295d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129819190615775565b156129915761298f89613cea565b505b5061299a612aa7565b98975050505050505050565b6060806129b38484613ba9565b915091505b9250929050565b6129c88261107a565b6129d18161315e565b6115e38383613b5d565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6000612a308161315e565b612a38612664565b611c6b82613509565b6000612a4c8161315e565b612a54612664565b611c6b82613873565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901612aa157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b606080612ada6002612be3565b8051909250806001600160401b03811115612af757612af761521f565b604051908082528060200260200182016040528015612b20578160200160208202803683370190505b50915060005b81811015612b7557612b50848281518110612b4357612b436153be565b6020026020010151613ded565b838281518110612b6257612b626153be565b6020908102919091010152600101612b26565b50509091565b60006001600160e01b03198216637965db0b60e01b14806109d957506301ffc9a760e01b6001600160e01b03198316146109d9565b612bb8613c5f565b6000806000612bc5612daa565b925092509250600754811115610da457600892909255600955600755565b6060600061107383613fe6565b60155460009087148015612c115750601a54612c0d9083906153ea565b4210155b8015612c1e5750601c5442105b612c3b5760405163089b3fa160e31b815260040160405180910390fd5b601f54600003612c4d57600b54612c51565b601f545b601f80549192506000612c638361587d565b90915550508015612d1b576000601e81612c7e600185615531565b81526020019081526020016000209050878160000154148015612cb0575042838260030154612cad91906153ea565b10155b15612d19578215612cd4576040516346f80f1f60e01b815260040160405180910390fd5b612cdf600142615531565b6003820155612cef600183615531565b6040517fac4a907ec29adcc56774b757ecb1e1b4d597374fc9386107d05e2670259df7d390600090a25b505b600f5460405163fba540c760e01b815273cdf52b29de3f69431de99faf2dd5a0aec643d5769163fba540c791612d6391601591601e9187918d918d918d918d916004016158e7565b60006040518083038186803b158015612d7b57600080fd5b505af4158015612d8f573d6000803e3d6000fd5b505050509695505050505050565b610da48383836001614042565b6000808062015180612dbc81426157fe565b612dc691906157d1565b905060006007548211612dda576000612de7565b600754612de79083615531565b905080600003612e065760085460095460075493509350935050909192565b6008549350600954925060008385612e3c7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b612e4691906153ea565b612e5091906153ea565b600080546040516311a04fa160e11b81523060048201529293509091829182916001600160a01b03909116906323409f4290602401608060405180830381865afa158015612ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec69190615792565b935093509350506000731d84718cf856c82e71499ec02c8b52a392b8fce3632e4c697f83670de0b6b3a7640000612efd9190615531565b6040516001600160e01b031960e084901b16815260048101919091526407620d06ef6024820152604401602060405180830381865af4158015612f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f689190615698565b612f7a90670de0b6b3a7640000615531565b905060006005548211612f8f57600554612f91565b815b9050600086731d84718cf856c82e71499ec02c8b52a392b8fce36399a04f2f612fc285670de0b6b3a7640000615531565b8b6040518363ffffffff1660e01b8152600401612fe9929190918252602082015260400190565b602060405180830381865af4158015613006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302a9190615698565b61303c670de0b6b3a76400008a6157d1565b61304691906157fe565b6130509190615531565b905060008260018161306a670de0b6b3a7640000886157d1565b61307491906153ea565b61307e9190615531565b61308891906157fe565b90506000866001816130a2670de0b6b3a76400008c6157d1565b6130ac91906153ea565b6130b69190615531565b6130c091906157fe565b82116130f757866001816130d48b876157d1565b6130de91906153ea565b6130e89190615531565b6130f291906157fe565b61312b565b670de0b6b3a764000060018161310d85876157d1565b61311791906153ea565b6131219190615531565b61312b91906157fe565b9050613137818e6153ea565b9c506131438184615531565b61314d908d6153ea565b9b5050505050505050505050909192565b611051813361412a565b6012546001600160a01b038381169116146131c3576012546001600160a01b0316156131a7576040516312794cc760e21b815260040160405180910390fd5b601280546001600160a01b0319166001600160a01b0384161790555b60125460ff600160a01b909104161515811515146131f3576012805460ff60a01b1916600160a01b831515021790555b601254604080516001600160a01b0383168152600160a01b90920460ff16151560208301527f5806f7ef7f8d6bafce97caf329ff62db253b61c867a1b2c4da9e79dbc4ec2f22910160405180910390a15050565b60006001600160a01b0382161580159061326a57506001600160a01b0382163014155b6132875760405163445e1f2b60e11b815260040160405180910390fd5b6040516001600160a01b038316907f59b7c8b22741836fc393dc21baa2e8157e039b28c3ee59310f38b2847a2dd29c90600090a26109d9600283614163565b60006132d284846129db565b905060001981146115e3578181101561331757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611522565b6115e384848484036000614042565b6001600160a01b03831661335057604051634b637e8f60e11b815260006004820152602401611522565b6001600160a01b03821661337a5760405163ec442f0560e01b815260006004820152602401611522565b610da4838383614178565b6000806000806040518060e001604052808a81526020018981526020016133ab8d613ded565b81526020016133b98c613ded565b815260200188815260200187815260200186815250905073cdf52b29de3f69431de99faf2dd5a0aec643d57663ef27b38b60158e8e8e866040518663ffffffff1660e01b815260040161348995949392919060006101608201905086825285602083015260018060a01b038516604083015260018060a01b038416606083015282516080830152602083015160a0830152604083015160c0830152606083015160e0830152608083015161010083015260a083015161012083015260c08301516101408301529695505050505050565b606060405180830381865af41580156134a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ca91906159a4565b919e909d50909b509950505050505050505050565b6134e76141ac565b611c6b82826141f5565b61099f6141ac565b6135016141ac565b61099f614246565b7fb8dde4be9101cab9d9d994925b7817605b5ce5834e63618484b8b4e5bef6a5488160405161353891906159d2565b60405180910390a160045460005b8181101561357f57600480548061355f5761355f615a33565b600082815260208120820160001990810191909155019055600101613546565b508151905080600003613590575050565b60408111156135b257604051636516935760e11b815260040160405180910390fd5b60008060005b8381101561370a57826001600160a01b03168582815181106135dc576135dc6153be565b6020026020010151600001516001600160a01b03161161360f576040516341dc215f60e11b815260040160405180910390fd5b848181518110613621576136216153be565b6020026020010151602001516001600160601b03166000036136565760405163011becf960e01b815260040160405180910390fd5b848181518110613668576136686153be565b6020026020010151602001516001600160601b03168261368891906153ea565b915084818151811061369c5761369c6153be565b602002602001015160000151925060048582815181106136be576136be6153be565b602090810291909101810151825460018181018555600094855293839020825192909301516001600160601b0316600160a01b026001600160a01b0390921691909117910155016135b8565b50670de0b6b3a764000081146115e35760405163f79b6e4960e01b815260040160405180910390fd5b67016345785d8a000081111561375c576040516302aec4d160e11b815260040160405180910390fd5b731d84718cf856c82e71499ec02c8b52a392b8fce3632e4c697f61378883670de0b6b3a7640000615531565b6040516001600160e01b031960e084901b16815260048101919091526407620d06ef6024820152604401602060405180830381865af41580156137cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f39190615698565b61380590670de0b6b3a7640000615531565b600555801580613816575060055415155b61383357604051637c379aa760e11b815260040160405180910390fd5b60055460408051918252602082018390527f504285076b3e8a5b35bb309459af128be9f7cf48f7aab9e599332a1e79cb541e91015b60405180910390a150565b66b1a2bc2ec5000081111561389b5760405163330e445d60e01b815260040160405180910390fd5b60068190556040518181527f97aee230ba41961438e908e115df76fa8113f85a0586d85b19ba5be50e6a227490602001613868565b603c81101580156138e4575062093a808111155b6139015760405163bb80f28f60e01b815260040160405180910390fd5b600f8190556040518181527f99578d7fe3e20e279feceaa076eb8032d475ca1a49391ec0a740445152a5971390602001613868565b60016139428282615a90565b507f7332b59e42a46838955f2abeac0a553dd3870441c46bbfb13728d9b2cc5fb6d48160405161386891906148e3565b8051601480546020808501805115156101000261ff001995151595861661ffff1990941693909317929092179092556040805193845290511515918301919091527f0c3825f1c390b37d01efdd6f2a3ac910ae514627326e019748f6d5a6746726dd9101613868565b6001600160a01b038116613a0257604051635908381f60e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216613a4e5760405163ec442f0560e01b815260006004820152602401611522565b611c6b60008383614178565b6000600080516020615b8783398151915281613a76858561424e565b905080156120aa576000858152602083905260409020613a969085614163565b50949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613af084826142f3565b6115e3576040516001600160a01b03848116602483015260006044830152613b5391869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061433d565b6115e3848261433d565b6000600080516020615b8783398151915281613b7985856143ae565b905080156120aa576000858152602083905260409020613a96908561442a565b6000828218828411028218611073565b6060806000613bb6610d20565b9050613bc0612acd565b8151919450925060005b81811015613c1c57613bf787858381518110613be857613be86153be565b6020026020010151858961443f565b848281518110613c0957613c096153be565b6020908102919091010152600101613bca565b5050509250929050565b6040516001600160a01b0384811660248301528381166044830152606482018390526115e39186918216906323b872dd90608401613b21565b6013546001600160a01b03161561099f57601360009054906101000a90046001600160a01b03166001600160a01b031663c8b58aab6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613cc057600080fd5b505af1158015613cd4573d6000803e3d6000fd5b5050601380546001600160a01b03191690555050565b6040516000906001600160a01b038316907f4e3a022fa7a66b1e055fe6b819a1afe69dc1d44c43de4af7b32f095e603884ae908390a26001600160a01b0382166000908152601660205260408120805460ff1916815560018101829055600280820183905560038201839055600482018390556005909101919091556109d9908361442a565b60006110738383614483565b6001600160a01b038216613da657604051634b637e8f60e11b815260006004820152602401611522565b611c6b82600083614178565b6040516001600160a01b03838116602483015260448201839052610da491859182169063a9059cbb90606401613b21565b60006109d9825490565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015613e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e589190615698565b6013549091506001600160a01b031615801590613f695750601354604080516309769f0b60e41b815290516001600160a01b03808616931691639769f0b09160048083019260209291908290030181865afa158015613ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edf91906156b1565b6001600160a01b03161480613f6957506013546040805163a482171960e01b815290516001600160a01b0380861693169163a48217199160048083019260209291908290030181865afa158015613f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f5e91906156b1565b6001600160a01b0316145b15610d03576013546040516370a0823160e01b81526001600160a01b039182166004820152908316906370a0823190602401602060405180830381865afa158015613fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdc9190615698565b6109d990826153ea565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403657602002820191906000526020600020905b815481526020019060010190808311614022575b50505050509050919050565b600080516020615ba78339815191526001600160a01b03851661407b5760405163e602df0560e01b815260006004820152602401611522565b6001600160a01b0384166140a557604051634a1406b160e11b815260006004820152602401611522565b6001600160a01b0380861660009081526001830160209081526040808320938816835292905220839055811561412357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161411a91815260200190565b60405180910390a35b5050505050565b61413482826120b2565b611c6b5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611522565b6000611073836001600160a01b0384166144ad565b306001600160a01b038316036141a157604051631df47fd760e11b815260040160405180910390fd5b610da48383836144fc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661099f57604051631afcd79f60e31b815260040160405180910390fd5b6141fd6141ac565b600080516020615ba78339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036142378482615a90565b50600481016115e38382615a90565b612aa76141ac565b6000600080516020615bc783398151915261426984846120b2565b6142e9576000848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561429f3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506109d9565b60009150506109d9565b6000806000806020600086516020880160008a5af192503d9150600051905082801561263e57508115614329578060011461263e565b50505050506001600160a01b03163b151590565b600080602060008451602086016000885af180614360576040513d6000823e3d81fd5b50506000513d91508115614378578060011415614385565b6001600160a01b0384163b155b156115e357604051635274afe760e01b81526001600160a01b0385166004820152602401611522565b6000600080516020615bc78339815191526143c984846120b2565b156142e9576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506109d9565b6000611073836001600160a01b03841661463a565b600061446e61444d83614723565b8015614469575060008480614464576144646157e8565b868809115b151590565b614479868686614750565b61180d91906153ea565b600082600001828154811061449a5761449a6153be565b9060005260206000200154905092915050565b60008181526001830160205260408120546144f4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109d9565b5060006109d9565b600080516020615ba78339815191526001600160a01b038416614538578181600201600082825461452d91906153ea565b909155506145aa9050565b6001600160a01b0384166000908152602082905260409020548281101561458b5760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401611522565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b0383166145c85760028101805483900390556145e7565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161462c91815260200190565b60405180910390a350505050565b600081815260018301602052604081205480156142e957600061465e600183615531565b855490915060009061467290600190615531565b90508082146146d7576000866000018281548110614692576146926153be565b90600052602060002001549050808760000184815481106146b5576146b56153be565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806146e8576146e8615a33565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109d9565b6000600282600381111561473957614739615b4e565b6147439190615b64565b60ff166001149050919050565b60008383028160001985870982811083820303915050806000036147875783828161477d5761477d6157e8565b0492505050611073565b80841161479e5761479e600385150260111861480b565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b634e487b71600052806020526024601cfd5b600081518084526020840193506020830160005b828110156148585781516001600160a01b0316865260209586019590910190600101614831565b5093949350505050565b600081518084526020840193506020830160005b82811015614858578151865260209586019590910190600101614876565b6040815260006148a7604083018561481d565b828103602084015261180d8185614862565b6000602082840312156148cb57600080fd5b81356001600160e01b03198116811461107357600080fd5b602081526000825180602084015260005b8181101561491157602081860181015160408684010152016148f4565b506000604082850101526040601f19601f83011684010191505092915050565b60006020828403121561494357600080fd5b5035919050565b6001600160a01b038116811461105157600080fd5b6000806040838503121561497257600080fd5b823561497d8161494a565b946020939093013593505050565b801515811461105157600080fd5b600080604083850312156149ac57600080fd5b82356149b78161494a565b915060208301356149c78161498b565b809150509250929050565b60008083601f8401126149e457600080fd5b5081356001600160401b038111156149fb57600080fd5b6020830191508360208260051b85010111156129b857600080fd5b60008083601f840112614a2857600080fd5b5081356001600160401b03811115614a3f57600080fd5b6020830191508360206060830285010111156129b857600080fd5b60008083601f840112614a6c57600080fd5b5081356001600160401b03811115614a8357600080fd5b6020830191508360208260061b85010111156129b857600080fd5b600060608284031215614ab057600080fd5b50919050565b60008060008060008060008060006101008a8c031215614ad557600080fd5b89356001600160401b03811115614aeb57600080fd5b614af78c828d016149d2565b909a5098505060208a01356001600160401b03811115614b1657600080fd5b614b228c828d01614a16565b90985096505060408a01356001600160401b03811115614b4157600080fd5b614b4d8c828d01614a5a565b9096509450614b6190508b60608c01614a9e565b989b979a50959894979396929550929360c0810135935060e00135919050565b600080600060608486031215614b9657600080fd5b8335614ba18161494a565b92506020840135614bb18161494a565b929592945050506040919091013590565b600080600080600060a08688031215614bda57600080fd5b853594506020860135614bec8161494a565b93506040860135614bfc8161494a565b94979396509394606081013594506080013592915050565b600060a08284031215614ab057600080fd5b600060408284031215614ab057600080fd5b60008060008060006101008688031215614c5157600080fd5b85356001600160401b03811115614c6757600080fd5b614c7388828901614c14565b95505060208601356001600160401b03811115614c8f57600080fd5b614c9b88828901614c14565b945050614cab8760408801614c26565b9250614cba8760808801614a9e565b915060e0860135614cca8161494a565b809150509295509295909350565b60008060408385031215614ceb57600080fd5b8235915060208301356149c78161494a565b600080600080600060a08688031215614d1557600080fd5b853594506020860135614d278161494a565b93506040860135614d378161494a565b92506060860135614d478161494a565b949793965091946080013592915050565b600060208284031215614d6a57600080fd5b81356110738161494a565b60008060008060008060008060e0898b031215614d9157600080fd5b8835975060208901356001600160401b03811115614dae57600080fd5b614dba8b828c016149d2565b90985096505060408901356001600160401b03811115614dd957600080fd5b614de58b828c01614a16565b90965094505060608901356001600160401b03811115614e0457600080fd5b614e108b828c01614a5a565b9094509250614e2490508a60808b01614a9e565b90509295985092959890939650565b600060408284031215614e4557600080fd5b6110738383614c26565b600080600060608486031215614e6457600080fd5b833592506020840135614bb18161494a565b60008060408385031215614e8957600080fd5b50508035926020909101359150565b60008083601f840112614eaa57600080fd5b5081356001600160401b03811115614ec157600080fd5b6020830191508360208285010111156129b857600080fd5b60008060208385031215614eec57600080fd5b82356001600160401b03811115614f0257600080fd5b614f0e85828601614e98565b90969095509350505050565b602081526000611073602083018461481d565b600081518084526020840193506020830160005b82811015614858578151805187526020908101518188015260409096019590910190600101614f41565b600081518084526020840193506020830160005b828110156148585781511515865260209586019590910190600101614f7f565b8a815261018060208201526000614fba61018083018c61481d565b82810360408401528a518082526020808d0192019060005b8181101561500f57614ff98385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101614fd2565b50508381036060850152615023818c614f2d565b9150508281036080840152615038818a614f6b565b885160a0850152602089015160c0850152604089015160e0850152915061505c9050565b85610100830152846101208301528361014083015261508061016083018415159052565b9b9a5050505050505050505050565b600080600080600080608087890312156150a857600080fd5b8635955060208701356150ba8161494a565b945060408701356001600160401b038111156150d557600080fd5b6150e189828a016149d2565b90955093505060608701356001600160401b0381111561510057600080fd5b61510c89828a016149d2565b979a9699509497509295939492505050565b6020815260006110736020830184614862565b60008060008060008060008060e0898b03121561514d57600080fd5b88359750602089013561515f8161494a565b9650604089013561516f8161494a565b9550606089013594506080890135935060a089013561518d8161498b565b925060c08901356001600160401b038111156151a857600080fd5b6151b48b828c01614e98565b999c989b5096995094979396929594505050565b600080604083850312156151db57600080fd5b823591506020830135600481106149c757600080fd5b6000806040838503121561520457600080fd5b823561520f8161494a565b915060208301356149c78161494a565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156152575761525761521f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156152855761528561521f565b604052919050565b60006040828403121561529f57600080fd5b6152a7615235565b905081356152b48161494a565b815260208201356001600160601b03811681146152d057600080fd5b602082015292915050565b6000602082840312156152ed57600080fd5b81356001600160401b0381111561530357600080fd5b8201601f8101841361531457600080fd5b80356001600160401b0381111561532d5761532d61521f565b61533c60208260051b0161525d565b8082825260208201915060208360061b85010192508683111561535e57600080fd5b6020840193505b8284101561263e57615377878561528d565b8252602082019150604084019350615365565b600181811c9082168061539e57607f821691505b602082108103614ab057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156109d9576109d96153d4565b81835260208301925060008160005b84811015614858578135865260208083013590870152604080830135908701526060958601959091019060010161540c565b81835260208301925060008160005b848110156148585781358652602080830135908701526040958601959091019060010161544d565b8b8152602081018b905261014060408201819052810189905260008a6101608301825b8c8110156154c85782356154ab8161494a565b6001600160a01b0316825260209283019290910190600101615498565b5083810360608501526154dc818b8d6153fd565b91505082810360808401526154f281888a61543e565b863560a0850152602087013560c0850152604087013560e085015291506155169050565b61010082019390935261012001529998505050505050505050565b818103818111156109d9576109d96153d4565b6000808335601e1984360301811261555b57600080fd5b8301803591506001600160401b0382111561557557600080fd5b6020019150368190038213156129b857600080fd5b6000808335601e198436030181126155a157600080fd5b8301803591506001600160401b038211156155bb57600080fd5b6020019150600681901b36038213156129b857600080fd5b6000604082840312156155e557600080fd5b611073838361528d565b6000604082840312801561560257600080fd5b5061560b615235565b82356156168161498b565b815260208301356156268161498b565b60208201529392505050565b60006020828403121561564457600080fd5b81356110738161498b565b6000808335601e1984360301811261566657600080fd5b8301803591506001600160401b0382111561568057600080fd5b6020019150600581901b36038213156129b857600080fd5b6000602082840312156156aa57600080fd5b5051919050565b6000602082840312156156c357600080fd5b81516110738161494a565b6000606082840312156156e057600080fd5b604051606081016001600160401b03811182821017156157025761570261521f565b60409081528335825260208085013590830152928301359281019290925250919050565b60006060828403121561573857600080fd5b61107383836156ce565b6000604082840312801561575557600080fd5b5061575e615235565b823581526020928301359281019290925250919050565b60006020828403121561578757600080fd5b81516110738161498b565b600080600080608085870312156157a857600080fd5b84516157b38161494a565b60208601516040870151606090970151919890975090945092505050565b80820281158282048414176109d9576109d96153d4565b634e487b7160e01b600052601260045260246000fd5b60008261580d5761580d6157e8565b500490565b8881526001600160a01b03888116602083015287166040820152606081018690526080810185905283151560a082015260e060c0820181905281018290528183610100830137600081830161010090810191909152601f909201601f19160101979650505050505050565b60006001820161588f5761588f6153d4565b5060010190565b600081518084526020840193506020830160005b82811015614858576158d18683518051825260208082015190830152604090810151910152565b60609590950194602091909101906001016158aa565b600061014082018a835289602084015288604084015261014060608401528088518083526101608501915060208a01925060005b818110156159425783516001600160a01b031683526020938401939092019160010161591b565b505083810360808501526159568189615896565b91505082810360a084015261596b8187614f2d565b855160c0850152602086015160e0850152604086015161010085015291506159909050565b826101208301529998505050505050505050565b6000806000606084860312156159b957600080fd5b5050815160208301516040909301519094929350919050565b602080825282518282018190526000918401906040840190835b81811015615a2857835180516001600160a01b031684526020908101516001600160601b031681850152909301926040909201916001016159ec565b509095945050505050565b634e487b7160e01b600052603160045260246000fd5b601f821115610da457806000526020600020601f840160051c81016020851015615a705750805b601f840160051c820191505b818110156141235760008155600101615a7c565b81516001600160401b03811115615aa957615aa961521f565b615abd81615ab7845461538a565b84615a49565b6020601f821160018114615af15760008315615ad95750848201515b600019600385901b1c1916600184901b178455614123565b600084815260208120601f198516915b82811015615b215787850151825560209485019460019092019101615b01565b5084821015615b3f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b600060ff831680615b7757615b776157e8565b8060ff8416069150509291505056fec1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a164736f6c634300081c000a0000000000000000000000000262e3e15ccfd2221b35d05909222f1f5fcdcd80000000000000000000000000a665b273997f70b647b66fa7ed021287544849db000000000000000000000000b14502af75c79efc89f9eb2af5fa2e8ff0fb210500000000000000000000000019e3d9fbd121a13bb55bcb6b50f9cb44f9306ce0