Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 2 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
9054291 | 1610 days ago | Contract Creation | 0 ETH | |||
8967800 | 1625 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
UniversalRegistry
Compiler Version
v0.5.11+commit.c082d0b4
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-11-20 */ /** Author: Loopring Foundation (Loopring Project Ltd) */ pragma solidity ^0.5.11; contract ERC20 { function totalSupply() public view returns (uint); function balanceOf( address who ) public view returns (uint); function allowance( address owner, address spender ) public view returns (uint); function transfer( address to, uint value ) public returns (bool); function transferFrom( address from, address to, uint value ) public returns (bool); function approve( address spender, uint value ) public returns (bool); } contract BurnableERC20 is ERC20 { function burn( uint value ) public returns (bool); function burnFrom( address from, uint value ) public returns (bool); } contract Proxy { function implementation() public view returns (address); function () payable external { address _impl = implementation(); require(_impl != address(0)); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } } contract SimpleProxy is Proxy { bytes32 private constant implementationPosition = keccak256( "org.loopring.protocol.simple.proxy" ); constructor(address _implementation) public { bytes32 position = implementationPosition; assembly {sstore(position, _implementation) } } function implementation() public view returns (address impl) { bytes32 position = implementationPosition; assembly { impl := sload(position) } } } library Cloneable { function clone(address a) external returns (address) { address retval; assembly{ mstore(0x0, or (0x5880730000000000000000000000000000000000000000803b80938091923cF3 ,mul(a,0x1000000000000000000))) retval := create(0,0, 32) } return retval; } } contract Ownable { address public owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() public { owner = msg.sender; } modifier onlyOwner() { require(msg.sender == owner, "UNAUTHORIZED"); _; } function transferOwnership( address newOwner ) public onlyOwner { require(newOwner != address(0), "ZERO_ADDRESS"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); } } contract Claimable is Ownable { address public pendingOwner; modifier onlyPendingOwner() { require(msg.sender == pendingOwner, "UNAUTHORIZED"); _; } function transferOwnership( address newOwner ) public onlyOwner { require(newOwner != address(0) && newOwner != owner, "INVALID_ADDRESS"); pendingOwner = newOwner; } function claimOwnership() public onlyPendingOwner { emit OwnershipTransferred(owner, pendingOwner); owner = pendingOwner; pendingOwner = address(0); } } contract ReentrancyGuard { uint private _guardValue; modifier nonReentrant() { require(_guardValue == 0, "REENTRANCY"); _guardValue = 1; _; _guardValue = 0; } } contract IExchange is Claimable, ReentrancyGuard { string constant public version = ""; event Cloned (address indexed clone); function clone() external nonReentrant returns (address cloneAddress) { address origin = address(this); cloneAddress = Cloneable.clone(origin); assert(cloneAddress != origin); assert(cloneAddress != address(0)); emit Cloned(cloneAddress); } } contract ILoopring is Claimable, ReentrancyGuard { string constant public version = ""; uint public exchangeCreationCostLRC; address public universalRegistry; address public lrcAddress; event ExchangeInitialized( uint indexed exchangeId, address indexed exchangeAddress, address indexed owner, address operator, bool onchainDataAvailability ); function initializeExchange( address exchangeAddress, uint exchangeId, address owner, address payable operator, bool onchainDataAvailability ) external; } contract IUniversalRegistry is Claimable, ReentrancyGuard { enum ForgeMode { AUTO_UPGRADABLE, MANUAL_UPGRADABLE, PROXIED, NATIVE } event ProtocolRegistered ( address indexed protocol, address indexed implementationManager, string version ); event ProtocolEnabled ( address indexed protocol ); event ProtocolDisabled ( address indexed protocol ); event DefaultProtocolChanged ( address indexed oldDefault, address indexed newDefault ); event ExchangeForged ( address indexed protocol, address indexed implementation, address indexed exchangeAddress, address owner, ForgeMode forgeMode, bool onchainDataAvailability, uint exchangeId, uint amountLRCBurned ); address public lrcAddress; address[] public exchanges; address[] public protocols; mapping (string => address) public versionMap; function registerProtocol( address protocol, address implementation ) external returns (address implManager); function setDefaultProtocol( address protocol ) external; function enableProtocol( address protocol ) external; function disableProtocol( address protocol ) external; function forgeExchange( ForgeMode forgeMode, bool onchainDataAvailability, address protocol, address implementation ) external returns ( address exchangeAddress, uint exchangeId ); function defaultProtocol() public view returns ( address protocol, address versionmanager, address defaultImpl, string memory protocolVersion, string memory defaultImplVersion ); function isProtocolRegistered( address protocol ) public view returns (bool registered); function isProtocolEnabled( address protocol ) public view returns (bool enabled); function isExchangeRegistered( address exchange ) public view returns (bool registered); function isProtocolAndImplementationEnabled( address protocol, address implementation ) public view returns (bool enabled); function getExchangeProtocol( address exchangeAddress ) public view returns ( address protocol, address implementation ); } contract IImplementationManager is Claimable, ReentrancyGuard { event DefaultChanged ( address indexed oldDefault, address indexed newDefault ); event Registered ( address indexed implementation, string version ); event Enabled ( address indexed implementation ); event Disabled ( address indexed implementation ); address public protocol; address public defaultImpl; address[] public implementations; mapping (string => address) public versionMap; function register( address implementation ) external; function setDefault( address implementation ) external; function enable( address implementation ) external; function disable( address implementation ) external; function version() public view returns ( string memory protocolVersion, string memory defaultImplVersion ); function latest() public view returns (address implementation); function isRegistered( address implementation ) public view returns (bool registered); function isEnabled( address implementation ) public view returns (bool enabled); } contract IExchangeProxy is Proxy { bytes32 private constant registryPosition = keccak256( "org.loopring.protocol.v3.registry" ); constructor(address _registry) public { setRegistry(_registry); } function registry() public view returns (address registryAddress) { bytes32 position = registryPosition; assembly { registryAddress := sload(position) } } function protocol() public view returns (address protocolAddress) { IUniversalRegistry r = IUniversalRegistry(registry()); (protocolAddress, ) = r.getExchangeProtocol(address(this)); } function setRegistry(address _registry) private { require(_registry != address(0), "ZERO_ADDRESS"); bytes32 position = registryPosition; assembly { sstore(position, _registry) } } } contract AutoUpgradabilityProxy is IExchangeProxy { constructor(address _registry) public IExchangeProxy(_registry) {} function implementation() public view returns (address) { IUniversalRegistry r = IUniversalRegistry(registry()); (, address managerAddr) = r.getExchangeProtocol(address(this)); return IImplementationManager(managerAddr).defaultImpl(); } } contract ManualUpgradabilityProxy is IExchangeProxy { event Upgraded(address indexed implementation); bytes32 private constant implementationPosition = keccak256( "org.loopring.protocol.v3.implementation" ); modifier onlyUnderlyingOwner() { address underlyingOwner = Ownable(address(this)).owner(); require(underlyingOwner != address(0), "NO_OWNER"); require(underlyingOwner == msg.sender, "UNAUTHORIZED"); _; } constructor( address _registry, address _implementation ) public IExchangeProxy(_registry) { setImplementation(_implementation); } function implementation() public view returns (address impl) { bytes32 position = implementationPosition; assembly { impl := sload(position) } } function upgradeTo( address newImplementation ) external onlyUnderlyingOwner { require(implementation() != newImplementation, "SAME_IMPLEMENTATION"); IUniversalRegistry r = IUniversalRegistry(registry()); require( r.isProtocolAndImplementationEnabled(protocol(), newImplementation), "INVALID_PROTOCOL_OR_IMPLEMENTATION" ); setImplementation(newImplementation); emit Upgraded(newImplementation); } function setImplementation( address newImplementation ) private { bytes32 position = implementationPosition; assembly {sstore(position, newImplementation) } } } contract ImplementationManager is IImplementationManager { struct Status { bool registered; bool enabled; } mapping (address => Status) private statusMap; constructor( address _owner, address _protocol, address _implementation ) public { require(_owner != address(0), "ZERO_ADDRESS"); require(_protocol != address(0), "ZERO_PROTOCOL"); owner = _owner; protocol = _protocol; defaultImpl = _implementation; registerInternal(_implementation); } function register( address implementation ) external nonReentrant onlyOwner { registerInternal(implementation); } function setDefault( address implementation ) external nonReentrant onlyOwner { require(implementation != defaultImpl, "SAME_IMPLEMENTATION"); require(isEnabled(implementation), "INVALID_IMPLEMENTATION"); address oldDefault = defaultImpl; defaultImpl = implementation; emit DefaultChanged( oldDefault, implementation ); } function enable( address implementation ) external nonReentrant onlyOwner { Status storage status = statusMap[implementation]; require(status.registered && !status.enabled, "INVALID_IMPLEMENTATION"); status.enabled = true; emit Enabled(implementation); } function disable( address implementation ) external nonReentrant onlyOwner { require(implementation != defaultImpl, "FORBIDDEN"); require(isEnabled(implementation), "INVALID_IMPLEMENTATION"); statusMap[implementation].enabled = false; emit Disabled(implementation); } function version() public view returns ( string memory protocolVersion, string memory defaultImplVersion ) { protocolVersion = ILoopring(protocol).version(); defaultImplVersion = IExchange(defaultImpl).version(); } function latest() public view returns (address) { return implementations[implementations.length - 1]; } function isRegistered( address implementation ) public view returns (bool) { return statusMap[implementation].registered; } function isEnabled( address implementation ) public view returns (bool) { return statusMap[implementation].enabled; } function registerInternal( address implementation ) internal { require(implementation != address(0), "INVALID_IMPLEMENTATION"); string memory _version = IExchange(implementation).version(); require(bytes(_version).length >= 3, "INVALID_VERSION"); require(versionMap[_version] == address(0), "VERSION_USED"); require(!statusMap[implementation].registered, "ALREADY_REGISTERED"); implementations.push(implementation); statusMap[implementation] = Status(true, true); versionMap[_version] = implementation; emit Registered(implementation, _version); } } contract UniversalRegistry is IUniversalRegistry { struct Protocol { address protocol; bool registered; bool enabled; address manager; string version; } mapping (address => address) private exchangeMap; mapping (address => Protocol) private protocolMap; address private defaultProtocolAddress; constructor( address _lrcAddress ) Claimable() public { require(_lrcAddress != address(0), "ZERO_ADDRESS"); lrcAddress = _lrcAddress; } function registerProtocol( address protocol, address implementation ) external nonReentrant onlyOwner returns (address manager) { require(!protocolMap[protocol].registered, "PROTOCOL_REGISTERED"); ILoopring loopring = ILoopring(protocol); require(loopring.universalRegistry() == address(this), "REGISTRY_MISMATCH"); require(loopring.owner() == owner, "OWNER_MISMATCH"); require(loopring.lrcAddress() == lrcAddress, "LRC_ADDRESS_MISMATCH"); IImplementationManager m = new ImplementationManager(owner, protocol, implementation); manager = address(m); string memory version = loopring.version(); require(versionMap[version] == address(0), "VERSION_REGISTERED"); require(!protocolMap[protocol].registered, "PROTOCOL_REGISTERED"); protocols.push(protocol); versionMap[version] = protocol; protocolMap[protocol] = Protocol(protocol, true, true, manager, version); if (defaultProtocolAddress == address(0)) { defaultProtocolAddress = protocol; } emit ProtocolRegistered(protocol, manager, version); } function setDefaultProtocol( address protocol ) external nonReentrant onlyOwner { require(protocol != defaultProtocolAddress, "SAME_PROTOCOL"); require(protocolMap[protocol].registered, "NOT_REGISTERED"); require(protocolMap[protocol].enabled, "PROTOCOL_DISABLED"); address oldDefault = defaultProtocolAddress; defaultProtocolAddress = protocol; emit DefaultProtocolChanged(oldDefault, defaultProtocolAddress); } function enableProtocol( address protocol ) external nonReentrant onlyOwner { require(protocolMap[protocol].registered, "NOT_REGISTERED"); require(!protocolMap[protocol].enabled, "ALREADY_ENABLED"); protocolMap[protocol].enabled = true; emit ProtocolEnabled(protocol); } function disableProtocol( address protocol ) external nonReentrant onlyOwner { require(protocolMap[protocol].enabled, "ALREADY_DISABLED"); protocolMap[protocol].enabled = false; emit ProtocolDisabled(protocol); } function forgeExchange( ForgeMode forgeMode, bool onchainDataAvailability, address protocol, address implementation ) external nonReentrant returns ( address exchangeAddress, uint exchangeId ) { (address _protocol, address _implementation) = getProtocolAndImplementationToUse( protocol, implementation ); ILoopring loopring = ILoopring(_protocol); uint exchangeCreationCostLRC = loopring.exchangeCreationCostLRC(); if (exchangeCreationCostLRC > 0) { require( BurnableERC20(lrcAddress).burnFrom(msg.sender, exchangeCreationCostLRC), "BURN_FAILURE" ); } exchangeAddress = forgeInternal(forgeMode, _implementation); assert(exchangeMap[exchangeAddress] == address(0)); exchangeMap[exchangeAddress] = _protocol; exchanges.push(exchangeAddress); exchangeId = exchanges.length; loopring.initializeExchange( exchangeAddress, exchangeId, msg.sender, msg.sender, onchainDataAvailability ); emit ExchangeForged( _protocol, _implementation, exchangeAddress, msg.sender, forgeMode, onchainDataAvailability, exchangeId, exchangeCreationCostLRC ); } function defaultProtocol() public view returns ( address protocol, address manager, address defaultImpl, string memory protocolVersion, string memory defaultImplVersion ) { protocol = defaultProtocolAddress; Protocol storage p = protocolMap[protocol]; manager = p.manager; IImplementationManager m = IImplementationManager(manager); defaultImpl = m.defaultImpl(); (protocolVersion, defaultImplVersion) = m.version(); } function isProtocolRegistered( address protocol ) public view returns (bool) { return protocolMap[protocol].registered; } function isProtocolEnabled( address protocol ) public view returns (bool) { return protocolMap[protocol].enabled; } function isExchangeRegistered( address exchange ) public view returns (bool) { return exchangeMap[exchange] != address(0); } function isProtocolAndImplementationEnabled( address protocol, address implementation ) public view returns (bool enabled) { if (!isProtocolEnabled(protocol)) { return false; } address managerAddr = protocolMap[protocol].manager; IImplementationManager m = IImplementationManager(managerAddr); return m.isEnabled(implementation); } function getExchangeProtocol( address exchangeAddress ) public view returns ( address protocol, address manager ) { require(exchangeAddress != address(0), "ZERO_ADDRESS"); protocol = exchangeMap[exchangeAddress]; require(protocol != address(0), "INVALID_EXCHANGE"); manager = protocolMap[protocol].manager; } function getProtocolAndImplementationToUse( address protocol, address implementation ) private view returns ( address protocolToUse, address implementationToUse ) { protocolToUse = protocol; if (protocolToUse == address(0)) { protocolToUse = defaultProtocolAddress; } else { require(isProtocolEnabled(protocolToUse), "INVALID_PROTOCOL"); } implementationToUse = implementation; IImplementationManager m = IImplementationManager(protocolMap[protocolToUse].manager); if (implementationToUse == address(0)) { implementationToUse = m.defaultImpl(); } else { require(m.isEnabled(implementationToUse), "INVALID_IMPLEMENTATION"); } } function forgeInternal( ForgeMode forgeMode, address implementation ) private returns (address) { if (forgeMode == ForgeMode.AUTO_UPGRADABLE) { return address(new AutoUpgradabilityProxy(address(this))); } else if (forgeMode == ForgeMode.MANUAL_UPGRADABLE) { return address(new ManualUpgradabilityProxy(address(this), implementation)); } else if (forgeMode == ForgeMode.PROXIED) { return address(new SimpleProxy(implementation)); } else if (forgeMode == ForgeMode.NATIVE) { return IExchange(implementation).clone(); } else { revert("INVALID_FORGE_MODE"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"exchanges","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"registerProtocol","outputs":[{"internalType":"address","name":"manager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"exchange","type":"address"}],"name":"isExchangeRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lrcAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"isProtocolEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"setDefaultProtocol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"defaultProtocol","outputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"defaultImpl","type":"address"},{"internalType":"string","name":"protocolVersion","type":"string"},{"internalType":"string","name":"defaultImplVersion","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"exchangeAddress","type":"address"}],"name":"getExchangeProtocol","outputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"manager","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"enableProtocol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protocols","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"enum IUniversalRegistry.ForgeMode","name":"forgeMode","type":"uint8"},{"internalType":"bool","name":"onchainDataAvailability","type":"bool"},{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"forgeExchange","outputs":[{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"uint256","name":"exchangeId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"disableProtocol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"isProtocolAndImplementationEnabled","outputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"isProtocolRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"versionMap","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lrcAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"},{"indexed":true,"internalType":"address","name":"implementationManager","type":"address"},{"indexed":false,"internalType":"string","name":"version","type":"string"}],"name":"ProtocolRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"}],"name":"ProtocolEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"}],"name":"ProtocolDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldDefault","type":"address"},{"indexed":true,"internalType":"address","name":"newDefault","type":"address"}],"name":"DefaultProtocolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":true,"internalType":"address","name":"exchangeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"enum IUniversalRegistry.ForgeMode","name":"forgeMode","type":"uint8"},{"indexed":false,"internalType":"bool","name":"onchainDataAvailability","type":"bool"},{"indexed":false,"internalType":"uint256","name":"exchangeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLRCBurned","type":"uint256"}],"name":"ExchangeForged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051614a2b380380614a2b8339818101604052602081101561003357600080fd5b5051600080546001600160a01b031916331790556001600160a01b0381166100bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055614940806100eb6000396000f3fe60806040523480156200001157600080fd5b5060043610620001485760003560e01c8063821f6c0f11620000bd578063c4897cd5116200007b578063c4897cd514620004d2578063e30c39781462000503578063e9407b2b146200050d578063f2bdeea61462000536578063f2fde38b14620005e05762000148565b8063821f6c0f14620003f15780638c396220146200041a5780638da5cb5b146200043a578063942fef131462000444578063bf60411814620004a95762000148565b80634e6b6376116200010b5780634e6b6376146200022a5780634e71e0c81462000255578063529a579a146200025f578063715018a6146200039857806374e6365e14620003a25762000148565b80632839fc29146200014d57806328a09ba014620001895780633bbcf73e14620001ba5780633d6cf72214620001f75780634df1e5cd1462000201575b600080fd5b6200016d600480360360208110156200016557600080fd5b503562000609565b604080516001600160a01b039092168252519081900360200190f35b6200016d60048036036040811015620001a157600080fd5b506001600160a01b038135811691602001351662000631565b620001e360048036036020811015620001d257600080fd5b50356001600160a01b031662000eb5565b604080519115158252519081900360200190f35b6200016d62000ed5565b620001e3600480360360208110156200021957600080fd5b50356001600160a01b031662000ee4565b62000253600480360360208110156200024257600080fd5b50356001600160a01b031662000f09565b005b620002536200111c565b62000269620011cf565b60405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015620002f4578181015183820152602001620002da565b50505050905090810190601f168015620003225780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015620003575781810151838201526020016200033d565b50505050905090810190601f168015620003855780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6200025362001456565b620003cb60048036036020811015620003ba57600080fd5b50356001600160a01b0316620014ef565b604080516001600160a01b03938416815291909216602082015281519081900390910190f35b62000253600480360360208110156200040957600080fd5b50356001600160a01b0316620015c6565b6200016d600480360360208110156200043257600080fd5b503562001782565b6200016d62001790565b62000486600480360360808110156200045c57600080fd5b5060ff8135169060208101351515906001600160a01b03604082013581169160600135166200179f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6200025360048036036020811015620004c157600080fd5b50356001600160a01b031662001af5565b620001e360048036036040811015620004ea57600080fd5b506001600160a01b038135811691602001351662001c45565b6200016d62001cf8565b620001e3600480360360208110156200052557600080fd5b50356001600160a01b031662001d07565b6200016d600480360360208110156200054e57600080fd5b810190602081018135600160201b8111156200056957600080fd5b8201836020820111156200057c57600080fd5b803590602001918460018302840111600160201b831117156200059e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062001d2c945050505050565b6200025360048036036020811015620005f857600080fd5b50356001600160a01b031662001d52565b600481815481106200061757fe5b6000918252602090912001546001600160a01b0316905081565b600060025460001462000678576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314620006cc576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038316600090815260086020526040902054600160a01b900460ff161562000738576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b6000839050306001600160a01b0316816001600160a01b03166325ebe7eb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200078157600080fd5b505afa15801562000796573d6000803e3d6000fd5b505050506040513d6020811015620007ad57600080fd5b50516001600160a01b031614620007ff576040805162461bcd60e51b81526020600482015260116024820152700a48a8e92a6a8a4b2be9a92a69a82a8869607b1b604482015290519081900360640190fd5b60005460408051638da5cb5b60e01b815290516001600160a01b0392831692841691638da5cb5b916004808301926020929190829003018186803b1580156200084757600080fd5b505afa1580156200085c573d6000803e3d6000fd5b505050506040513d60208110156200087357600080fd5b50516001600160a01b031614620008c2576040805162461bcd60e51b815260206004820152600e60248201526d09eae9c8aa4be9a92a69a82a886960931b604482015290519081900360640190fd5b60035460408051631eb67b9160e11b815290516001600160a01b0392831692841691633d6cf722916004808301926020929190829003018186803b1580156200090a57600080fd5b505afa1580156200091f573d6000803e3d6000fd5b505050506040513d60208110156200093657600080fd5b50516001600160a01b0316146200098b576040805162461bcd60e51b8152602060048201526014602482015273098a486be828888a48aa6a6be9a92a69a82a886960631b604482015290519081900360640190fd5b600080546040516001600160a01b039091169086908690620009ad90620021bd565b6001600160a01b03938416815291831660208301529091166040808301919091525190819003606001906000f080158015620009ed573d6000803e3d6000fd5b5090508092506060826001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801562000a2f57600080fd5b505afa15801562000a44573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101562000a6e57600080fd5b8101908080516040519392919084600160201b82111562000a8e57600080fd5b90830190602082018581111562000aa457600080fd5b8251600160201b81118282018810171562000abe57600080fd5b82525081516020918201929091019080838360005b8381101562000aed57818101518382015260200162000ad3565b50505050905090810190601f16801562000b1b5780820380516001836020036101000a031916815260200191505b50604052505050905060006001600160a01b03166006826040518082805190602001908083835b6020831062000b635780518252601f19909201916020918201910162000b42565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b031692909214915062000be79050576040805162461bcd60e51b815260206004820152601260248201527115915494d253d397d49151d254d51154915160721b604482015290519081900360640190fd5b6001600160a01b038616600090815260086020526040902054600160a01b900460ff161562000c53576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03881617905560405181518791600691849190819060208401908083835b6020831062000cd75780518252601f19909201916020918201910162000cb6565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b03199081166001600160a01b039889161790915560a0860182528c871680875260018785018181528885018281528e8b1660608b0190815260808b018d8152600095865260088952969094208a51815493519251938716908d161760ff60a01b1916600160a01b921515929092029190911760ff60a81b1916600160a81b9215159290920291909117815591519082018054909316981697909717905551805194959462000dc49450600286019350910190620021cb565b50506009546001600160a01b03161515905062000df757600980546001600160a01b0319166001600160a01b0388161790555b836001600160a01b0316866001600160a01b03167f1b4568a587d9e2e57686ed25c91d408b5a35e919686f643f081ee017f4ea542c836040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000e6c57818101518382015260200162000e52565b50505050905090810190601f16801562000e9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3505060006002555092915050565b6001600160a01b0390811660009081526007602052604090205416151590565b6003546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a81b900460ff1690565b6002541562000f4c576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462000fa0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6009546001600160a01b038281169116141562000ff4576040805162461bcd60e51b815260206004820152600d60248201526c14d0535157d41493d513d0d3d3609a1b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff166200105a576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16620010c3576040805162461bcd60e51b8152602060048201526011602482015270141493d513d0d3d317d11254d050931151607a1b604482015290519081900360640190fd5b600980546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f43159b3d893e5120a3c82b7c4701c08e2f426b046c3f420dcee43d5ae18b5b5690600090a350506000600255565b6001546001600160a01b031633146200116b576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6009546001600160a01b0390811660008181526008602090815260408083206001810154825163631ffbf360e01b815292519596169460609384938792839263631ffbf39260048082019391829003018186803b1580156200123057600080fd5b505afa15801562001245573d6000803e3d6000fd5b505050506040513d60208110156200125c57600080fd5b50516040805163054fd4d560e41b815290519196506001600160a01b038316916354fd4d5091600480820192600092909190829003018186803b158015620012a357600080fd5b505afa158015620012b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015620012e257600080fd5b8101908080516040519392919084600160201b8211156200130257600080fd5b9083019060208201858111156200131857600080fd5b8251600160201b8111828201881017156200133257600080fd5b82525081516020918201929091019080838360005b838110156200136157818101518382015260200162001347565b50505050905090810190601f1680156200138f5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084600160201b821115620013b257600080fd5b908301906020820185811115620013c857600080fd5b8251600160201b811182820188101715620013e257600080fd5b82525081516020918201929091019080838360005b8381101562001411578181015183820152602001620013f7565b50505050905090810190601f1680156200143f5780820380516001836020036101000a031916815260200191505b5060405250999a9899509697919650945092505050565b6000546001600160a01b03163314620014a5576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806001600160a01b0383166200153d576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b6001600160a01b0380841660009081526007602052604090205416915081620015a0576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f45584348414e474560801b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154919391169150565b6002541562001609576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146200165d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff16620016c3576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16156200172b576040805162461bcd60e51b815260206004820152600f60248201526e1053149150511657d1539050931151608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b1916600160a81b179055517fc6dddbd701f38521605face97e4a42c12d0458040f3e33b7c3c3e14c6bc55d959190a2506000600255565b600581815481106200061757fe5b6000546001600160a01b031681565b600080600254600014620017e7576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b6001600255600080620017fb868662001e2e565b9150915060008290506000816001600160a01b0316637207d1886040518163ffffffff1660e01b815260040160206040518083038186803b1580156200184057600080fd5b505afa15801562001855573d6000803e3d6000fd5b505050506040513d60208110156200186c57600080fd5b5051905080156200193b576003546040805163079cc67960e41b81523360048201526024810184905290516001600160a01b03909216916379cc6790916044808201926020929091908290030181600087803b158015620018cc57600080fd5b505af1158015620018e1573d6000803e3d6000fd5b505050506040513d6020811015620018f857600080fd5b50516200193b576040805162461bcd60e51b815260206004820152600c60248201526b4255524e5f4641494c55524560a01b604482015290519081900360640190fd5b620019478a8462002017565b6001600160a01b0380821660009081526007602052604090205491975016156200196d57fe5b6001600160a01b038087166000818152600760205260408082208054858a166001600160a01b031991821617909155600480546001810182558185527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805490921685179091558054825163f2fc7d6760e01b81529182019490945260248101849052336044820181905260648201528d1515608482015290519298509285169263f2fc7d679260a4808301939282900301818387803b15801562001a3257600080fd5b505af115801562001a47573d6000803e3d6000fd5b50505050856001600160a01b0316836001600160a01b0316856001600160a01b03167fef332a01dc11ee04eab2405c2f60c65d8e33b933136b7b085aae6e7a77e8eb99338e8e8b8860405180866001600160a01b03166001600160a01b0316815260200185600381111562001ab857fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a4505060006002555091969095509350505050565b6002541562001b38576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462001b8c576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff1662001bf4576040805162461bcd60e51b815260206004820152601060248201526f1053149150511657d11254d05093115160821b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b19169055517f4eefa26623f720c6c56f2a3ecbe4e895171df2f804bb6a917d30d394743256239190a2506000600255565b600062001c528362000ee4565b62001c605750600062001cf2565b6001600160a01b03808416600090815260086020908152604091829020600101548251639015d37160e01b81528685166004820152925193169283928392639015d37192602480840193829003018186803b15801562001cbf57600080fd5b505afa15801562001cd4573d6000803e3d6000fd5b505050506040513d602081101562001ceb57600080fd5b5051925050505b92915050565b6001546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a01b900460ff1690565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b0316331462001da1576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381161580159062001dc857506000546001600160a01b03828116911614155b62001e0c576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8160006001600160a01b03821662001e54576009546001600160a01b0316915062001ea4565b62001e5f8262000ee4565b62001ea4576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d41493d513d0d3d360821b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154839190811690821662001f3f57806001600160a01b031663631ffbf36040518163ffffffff1660e01b815260040160206040518083038186803b15801562001f0957600080fd5b505afa15801562001f1e573d6000803e3d6000fd5b505050506040513d602081101562001f3557600080fd5b505191506200200f565b806001600160a01b0316639015d371836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801562001f9657600080fd5b505afa15801562001fab573d6000803e3d6000fd5b505050506040513d602081101562001fc257600080fd5b50516200200f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b509250929050565b6000808360038111156200202757fe5b14156200207457306040516200203d9062002250565b6001600160a01b03909116815260405190819003602001906000f0801580156200206b573d6000803e3d6000fd5b50905062001cf2565b60018360038111156200208357fe5b1415620020ce5730826040516200209a906200225e565b6001600160a01b03928316815291166020820152604080519182900301906000f0801580156200206b573d6000803e3d6000fd5b6002836003811115620020dd57fe5b1415620020f357816040516200203d906200226c565b60038360038111156200210257fe5b14156200217b57816001600160a01b03166309ed46076040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200214557600080fd5b505af11580156200215a573d6000803e3d6000fd5b505050506040513d60208110156200217157600080fd5b5051905062001cf2565b6040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f464f5247455f4d4f444560701b604482015290519081900360640190fd5b611a7d806200229b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200220e57805160ff19168380011785556200223e565b828001600101855582156200223e579182015b828111156200223e57825182559160200191906001019062002221565b506200224c9291506200227a565b5090565b6103db8062003d1883390190565b61068f80620040f383390190565b61018a806200478283390190565b6200229791905b808211156200224c576000815560010162002281565b9056fe60806040523480156200001157600080fd5b5060405162001a7d38038062001a7d833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091906001600160a01b038316620000d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166200014657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5a45524f5f50524f544f434f4c00000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b038086166001600160a01b03199283161790925560038054858416908316179055600480549284169290911691909117905562000197816001600160e01b03620001a016565b505050620006d9565b6001600160a01b0381166200021657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e56414c49445f494d504c454d454e544154494f4e00000000000000000000604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200029157600080fd5b8101908080516040519392919084640100000000821115620002b257600080fd5b908301906020820185811115620002c857600080fd5b8251640100000000811182820188101715620002e357600080fd5b82525081516020918201929091019080838360005b8381101562000312578181015183820152602001620002f8565b50505050905090810190601f168015620003405780820380516001836020036101000a031916815260200191505b506040525050509050600381511015620003bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f56455253494f4e0000000000000000000000000000000000604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b60208310620003fa5780518252601f199092019160209182019101620003d9565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b0316929092149150620004a3905057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f56455253494f4e5f555345440000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156200052c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f414c52454144595f524547495354455245440000000000000000000000000000604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b60208310620005f55780518252601f199092019160209182019101620005d4565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b838110156200069a57818101518382015260200162000680565b50505050905090810190601f168015620006c85780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b61139480620006e96000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638ce74426116100a2578063e30c397811610071578063e30c39781461030d578063e6c09edf14610315578063e823d5cf1461033b578063f2bdeea614610361578063f2fde38b146104055761010b565b80638ce744261461029d5780638da5cb5b146102a55780639015d371146102ad578063c3c5a547146102e75761010b565b80635bfa1b68116100de5780635bfa1b681461024a578063631ffbf314610270578063715018a614610278578063845affc8146102805761010b565b80634420e486146101105780634e71e0c81461013857806352bfe7891461014057806354fd4d5014610164575b600080fd5b6101366004803603602081101561012657600080fd5b50356001600160a01b031661042b565b005b6101366104d1565b610148610583565b604080516001600160a01b039092168252519081900360200190f35b61016c6105b3565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156101ad578181015183820152602001610195565b50505050905090810190601f1680156101da5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561020d5781810151838201526020016101f5565b50505050905090810190601f16801561023a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6101366004803603602081101561026057600080fd5b50356001600160a01b0316610823565b61014861097c565b61013661098b565b6101486004803603602081101561029657600080fd5b5035610a23565b610148610a4a565b610148610a59565b6102d3600480360360208110156102c357600080fd5b50356001600160a01b0316610a68565b604080519115158252519081900360200190f35b6102d3600480360360208110156102fd57600080fd5b50356001600160a01b0316610a8b565b610148610aa9565b6101366004803603602081101561032b57600080fd5b50356001600160a01b0316610ab8565b6101366004803603602081101561035157600080fd5b50356001600160a01b0316610c3e565b6101486004803603602081101561037757600080fd5b810190602081018135600160201b81111561039157600080fd5b8201836020820111156103a357600080fd5b803590602001918460018302840111600160201b831117156103c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dd6945050505050565b6101366004803603602081101561041b57600080fd5b50356001600160a01b0316610dfc565b6002541561046d576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146104c0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6104c981610ed5565b506000600255565b6001546001600160a01b0316331461051f576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6005805460009190600019810190811061059957fe5b6000918252602090912001546001600160a01b0316905090565b606080600360009054906101000a90046001600160a01b03166001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801561060457600080fd5b505afa158015610618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561064157600080fd5b8101908080516040519392919084600160201b82111561066057600080fd5b90830190602082018581111561067557600080fd5b8251600160201b81118282018810171561068e57600080fd5b82525081516020918201929091019080838360005b838110156106bb5781810151838201526020016106a3565b50505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b5060408181526004805463054fd4d560e41b845291519698506001600160a01b03909116956354fd4d50955081830194506000935091829003018186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561076f57600080fd5b8101908080516040519392919084600160201b82111561078e57600080fd5b9083019060208201858111156107a357600080fd5b8251600160201b8111828201881017156107bc57600080fd5b82525081516020918201929091019080838360005b838110156107e95781810151838201526020016107d1565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b5060405250505090509091565b60025415610865576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146108b8576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381166000908152600760205260409020805460ff1680156108e857508054610100900460ff16155b610932576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b805461ff0019166101001781556040516001600160a01b038316907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1290600090a250506000600255565b6004546001600160a01b031681565b6000546001600160a01b031633146109d9576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60058181548110610a3057fe5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031681565b6000546001600160a01b031681565b6001600160a01b0316600090815260076020526040902054610100900460ff1690565b6001600160a01b031660009081526007602052604090205460ff1690565b6001546001600160a01b031681565b60025415610afa576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610b4d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610b9c576040805162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b604482015290519081900360640190fd5b610ba581610a68565b610bef576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805461ff0019169055517ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe9190a2506000600255565b60025415610c80576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610cd3576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610d2c576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b610d3581610a68565b610d7f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0dce6c7e4b7c18563c67d50415c83afaa4c165d8452c6b51659c1bfa2435f3cb90600090a350506000600255565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b03163314610e4a576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b03811615801590610e7057506000546001600160a01b03828116911614155b610eb3576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116610f29576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b158015610f6457600080fd5b505afa158015610f78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fa157600080fd5b8101908080516040519392919084600160201b821115610fc057600080fd5b908301906020820185811115610fd557600080fd5b8251600160201b811182820188101715610fee57600080fd5b82525081516020918201929091019080838360005b8381101561101b578181015183820152602001611003565b50505050905090810190601f1680156110485780820380516001836020036101000a031916815260200191505b50604052505050905060038151101561109a576040805162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a22fab22a929a4a7a760891b604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b602083106110d75780518252601f1990920191602091820191016110b8565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b03169290921491506111549050576040805162461bcd60e51b815260206004820152600c60248201526b15915494d253d397d554d15160a21b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156111b7576040805162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b6020831061127e5780518252601f19909201916020918201910161125f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b83811015611321578181015183820152602001611309565b50505050905090810190601f16801561134e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505056fea265627a7a72315820ebe8f498a2a9a6d5143737847f60a44a37e4e4722213694801d5a3021cf87aec64736f6c634300050b0032608060405234801561001057600080fd5b506040516103db3803806103db8339818101604052602081101561003357600080fd5b505180610048816001600160e01b0361004f16565b50506100e6565b6001600160a01b0381166100c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b600060405180806103ba60219139604051908190036021019020929092555050565b6102c5806100f56000396000f3fe6080604052600436106100345760003560e01c80635c60da1b146100785780637b103999146100a95780638ce74426146100be575b600061003e6100d3565b90506001600160a01b03811661005357600080fd5b60405136600082376000803683855af43d806000843e818015610074578184f35b8184fd5b34801561008457600080fd5b5061008d6100d3565b604080516001600160a01b039092168252519081900360200190f35b3480156100b557600080fd5b5061008d6101c8565b3480156100ca57600080fd5b5061008d6101eb565b6000806100de6101c8565b60408051633a731b2f60e11b815230600482015281519293506000926001600160a01b038516926374e6365e9260248082019391829003018186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d604081101561015057600080fd5b506020908101516040805163631ffbf360e01b815290519193506001600160a01b0384169263631ffbf392600480840193829003018186803b15801561019557600080fd5b505afa1580156101a9573d6000803e3d6000fd5b505050506040513d60208110156101bf57600080fd5b50519250505090565b600080604051808061027060219139604051908190036021019020549392505050565b6000806101f66101c8565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561023d57600080fd5b505afa158015610251573d6000803e3d6000fd5b505050506040513d604081101561026757600080fd5b50519291505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a72315820e42b816ccaf235c960e6fa24f5a0031ab5057b5dcfeec5fb5811fc465f2a9e3b64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161068f38038061068f8339818101604052604081101561003357600080fd5b5080516020909101518161004f816001600160e01b0361006916565b50610062816001600160e01b0361010016565b5050610122565b6001600160a01b0381166100de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6000604051808061066e60219139604051908190036021019020929092555050565b6000604051808061064760279139604051908190036027019020929092555050565b610516806101316000396000f3fe60806040526004361061003f5760003560e01c80633659cfe6146100835780635c60da1b146100b85780637b103999146100e95780638ce74426146100fe575b6000610049610113565b90506001600160a01b03811661005e57600080fd5b60405136600082376000803683855af43d806000843e81801561007f578184f35b8184fd5b34801561008f57600080fd5b506100b6600480360360208110156100a657600080fd5b50356001600160a01b0316610136565b005b3480156100c457600080fd5b506100cd610113565b604080516001600160a01b039092168252519081900360200190f35b3480156100f557600080fd5b506100cd6103ae565b34801561010a57600080fd5b506100cd6103d1565b600080604051808061049a60279139604051908190036027019020549392505050565b6000306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561017157600080fd5b505afa158015610185573d6000803e3d6000fd5b505050506040513d602081101561019b57600080fd5b505190506001600160a01b0381166101e5576040805162461bcd60e51b81526020600482015260086024820152672727afa7aba722a960c11b604482015290519081900360640190fd5b6001600160a01b0381163314610231576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b816001600160a01b0316610243610113565b6001600160a01b03161415610295576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b600061029f6103ae565b9050806001600160a01b031663c4897cd56102b86103d1565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152516044808301926020929190829003018186803b15801561030557600080fd5b505afa158015610319573d6000803e3d6000fd5b505050506040513d602081101561032f57600080fd5b505161036c5760405162461bcd60e51b81526004018080602001828103825260228152602001806104786022913960400191505060405180910390fd5b61037583610455565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2505050565b60008060405180806104c160219139604051908190036021019020549392505050565b6000806103dc6103ae565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561042357600080fd5b505afa158015610437573d6000803e3d6000fd5b505050506040513d604081101561044d57600080fd5b505192915050565b6000604051808061049a6027913960405190819003602701902092909255505056fe494e56414c49445f50524f544f434f4c5f4f525f494d504c454d454e544154494f4e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a723158206acaacfc4d1703159e6ea7ffa104958090c83e81bc8b4d1c1887a5b9b1f3f4fd64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161018a38038061018a8339818101604052602081101561003357600080fd5b50516040516000908060226101688239604051908190036022019020929092555050610104806100646000396000f3fe608060405260043610601c5760003560e01c80635c60da1b14605c575b60006024608a565b90506001600160a01b038116603857600080fd5b60405136600082376000803683855af43d806000843e8180156058578184f35b8184fd5b348015606757600080fd5b50606e608a565b604080516001600160a01b039092168252519081900360200190f35b60008060405180806100ae6022913960405190819003602201902054939250505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a72315820e4b97c71f12dd7e59216bd5fe82f370a4ede95bdb3a8f0b59f0836a47582a0eb64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a7231582058a14c5d8bb77be76c1db74e3193864be695c251ab387d10d480cfe4bd0801d064736f6c634300050b0032000000000000000000000000bbbbca6a901c926f240b89eacb641d8aec7aeafd
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620001485760003560e01c8063821f6c0f11620000bd578063c4897cd5116200007b578063c4897cd514620004d2578063e30c39781462000503578063e9407b2b146200050d578063f2bdeea61462000536578063f2fde38b14620005e05762000148565b8063821f6c0f14620003f15780638c396220146200041a5780638da5cb5b146200043a578063942fef131462000444578063bf60411814620004a95762000148565b80634e6b6376116200010b5780634e6b6376146200022a5780634e71e0c81462000255578063529a579a146200025f578063715018a6146200039857806374e6365e14620003a25762000148565b80632839fc29146200014d57806328a09ba014620001895780633bbcf73e14620001ba5780633d6cf72214620001f75780634df1e5cd1462000201575b600080fd5b6200016d600480360360208110156200016557600080fd5b503562000609565b604080516001600160a01b039092168252519081900360200190f35b6200016d60048036036040811015620001a157600080fd5b506001600160a01b038135811691602001351662000631565b620001e360048036036020811015620001d257600080fd5b50356001600160a01b031662000eb5565b604080519115158252519081900360200190f35b6200016d62000ed5565b620001e3600480360360208110156200021957600080fd5b50356001600160a01b031662000ee4565b62000253600480360360208110156200024257600080fd5b50356001600160a01b031662000f09565b005b620002536200111c565b62000269620011cf565b60405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015620002f4578181015183820152602001620002da565b50505050905090810190601f168015620003225780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015620003575781810151838201526020016200033d565b50505050905090810190601f168015620003855780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6200025362001456565b620003cb60048036036020811015620003ba57600080fd5b50356001600160a01b0316620014ef565b604080516001600160a01b03938416815291909216602082015281519081900390910190f35b62000253600480360360208110156200040957600080fd5b50356001600160a01b0316620015c6565b6200016d600480360360208110156200043257600080fd5b503562001782565b6200016d62001790565b62000486600480360360808110156200045c57600080fd5b5060ff8135169060208101351515906001600160a01b03604082013581169160600135166200179f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6200025360048036036020811015620004c157600080fd5b50356001600160a01b031662001af5565b620001e360048036036040811015620004ea57600080fd5b506001600160a01b038135811691602001351662001c45565b6200016d62001cf8565b620001e3600480360360208110156200052557600080fd5b50356001600160a01b031662001d07565b6200016d600480360360208110156200054e57600080fd5b810190602081018135600160201b8111156200056957600080fd5b8201836020820111156200057c57600080fd5b803590602001918460018302840111600160201b831117156200059e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062001d2c945050505050565b6200025360048036036020811015620005f857600080fd5b50356001600160a01b031662001d52565b600481815481106200061757fe5b6000918252602090912001546001600160a01b0316905081565b600060025460001462000678576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314620006cc576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038316600090815260086020526040902054600160a01b900460ff161562000738576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b6000839050306001600160a01b0316816001600160a01b03166325ebe7eb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200078157600080fd5b505afa15801562000796573d6000803e3d6000fd5b505050506040513d6020811015620007ad57600080fd5b50516001600160a01b031614620007ff576040805162461bcd60e51b81526020600482015260116024820152700a48a8e92a6a8a4b2be9a92a69a82a8869607b1b604482015290519081900360640190fd5b60005460408051638da5cb5b60e01b815290516001600160a01b0392831692841691638da5cb5b916004808301926020929190829003018186803b1580156200084757600080fd5b505afa1580156200085c573d6000803e3d6000fd5b505050506040513d60208110156200087357600080fd5b50516001600160a01b031614620008c2576040805162461bcd60e51b815260206004820152600e60248201526d09eae9c8aa4be9a92a69a82a886960931b604482015290519081900360640190fd5b60035460408051631eb67b9160e11b815290516001600160a01b0392831692841691633d6cf722916004808301926020929190829003018186803b1580156200090a57600080fd5b505afa1580156200091f573d6000803e3d6000fd5b505050506040513d60208110156200093657600080fd5b50516001600160a01b0316146200098b576040805162461bcd60e51b8152602060048201526014602482015273098a486be828888a48aa6a6be9a92a69a82a886960631b604482015290519081900360640190fd5b600080546040516001600160a01b039091169086908690620009ad90620021bd565b6001600160a01b03938416815291831660208301529091166040808301919091525190819003606001906000f080158015620009ed573d6000803e3d6000fd5b5090508092506060826001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801562000a2f57600080fd5b505afa15801562000a44573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101562000a6e57600080fd5b8101908080516040519392919084600160201b82111562000a8e57600080fd5b90830190602082018581111562000aa457600080fd5b8251600160201b81118282018810171562000abe57600080fd5b82525081516020918201929091019080838360005b8381101562000aed57818101518382015260200162000ad3565b50505050905090810190601f16801562000b1b5780820380516001836020036101000a031916815260200191505b50604052505050905060006001600160a01b03166006826040518082805190602001908083835b6020831062000b635780518252601f19909201916020918201910162000b42565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b031692909214915062000be79050576040805162461bcd60e51b815260206004820152601260248201527115915494d253d397d49151d254d51154915160721b604482015290519081900360640190fd5b6001600160a01b038616600090815260086020526040902054600160a01b900460ff161562000c53576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03881617905560405181518791600691849190819060208401908083835b6020831062000cd75780518252601f19909201916020918201910162000cb6565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b03199081166001600160a01b039889161790915560a0860182528c871680875260018785018181528885018281528e8b1660608b0190815260808b018d8152600095865260088952969094208a51815493519251938716908d161760ff60a01b1916600160a01b921515929092029190911760ff60a81b1916600160a81b9215159290920291909117815591519082018054909316981697909717905551805194959462000dc49450600286019350910190620021cb565b50506009546001600160a01b03161515905062000df757600980546001600160a01b0319166001600160a01b0388161790555b836001600160a01b0316866001600160a01b03167f1b4568a587d9e2e57686ed25c91d408b5a35e919686f643f081ee017f4ea542c836040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000e6c57818101518382015260200162000e52565b50505050905090810190601f16801562000e9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3505060006002555092915050565b6001600160a01b0390811660009081526007602052604090205416151590565b6003546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a81b900460ff1690565b6002541562000f4c576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462000fa0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6009546001600160a01b038281169116141562000ff4576040805162461bcd60e51b815260206004820152600d60248201526c14d0535157d41493d513d0d3d3609a1b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff166200105a576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16620010c3576040805162461bcd60e51b8152602060048201526011602482015270141493d513d0d3d317d11254d050931151607a1b604482015290519081900360640190fd5b600980546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f43159b3d893e5120a3c82b7c4701c08e2f426b046c3f420dcee43d5ae18b5b5690600090a350506000600255565b6001546001600160a01b031633146200116b576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6009546001600160a01b0390811660008181526008602090815260408083206001810154825163631ffbf360e01b815292519596169460609384938792839263631ffbf39260048082019391829003018186803b1580156200123057600080fd5b505afa15801562001245573d6000803e3d6000fd5b505050506040513d60208110156200125c57600080fd5b50516040805163054fd4d560e41b815290519196506001600160a01b038316916354fd4d5091600480820192600092909190829003018186803b158015620012a357600080fd5b505afa158015620012b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015620012e257600080fd5b8101908080516040519392919084600160201b8211156200130257600080fd5b9083019060208201858111156200131857600080fd5b8251600160201b8111828201881017156200133257600080fd5b82525081516020918201929091019080838360005b838110156200136157818101518382015260200162001347565b50505050905090810190601f1680156200138f5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084600160201b821115620013b257600080fd5b908301906020820185811115620013c857600080fd5b8251600160201b811182820188101715620013e257600080fd5b82525081516020918201929091019080838360005b8381101562001411578181015183820152602001620013f7565b50505050905090810190601f1680156200143f5780820380516001836020036101000a031916815260200191505b5060405250999a9899509697919650945092505050565b6000546001600160a01b03163314620014a5576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806001600160a01b0383166200153d576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b6001600160a01b0380841660009081526007602052604090205416915081620015a0576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f45584348414e474560801b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154919391169150565b6002541562001609576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146200165d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff16620016c3576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16156200172b576040805162461bcd60e51b815260206004820152600f60248201526e1053149150511657d1539050931151608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b1916600160a81b179055517fc6dddbd701f38521605face97e4a42c12d0458040f3e33b7c3c3e14c6bc55d959190a2506000600255565b600581815481106200061757fe5b6000546001600160a01b031681565b600080600254600014620017e7576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b6001600255600080620017fb868662001e2e565b9150915060008290506000816001600160a01b0316637207d1886040518163ffffffff1660e01b815260040160206040518083038186803b1580156200184057600080fd5b505afa15801562001855573d6000803e3d6000fd5b505050506040513d60208110156200186c57600080fd5b5051905080156200193b576003546040805163079cc67960e41b81523360048201526024810184905290516001600160a01b03909216916379cc6790916044808201926020929091908290030181600087803b158015620018cc57600080fd5b505af1158015620018e1573d6000803e3d6000fd5b505050506040513d6020811015620018f857600080fd5b50516200193b576040805162461bcd60e51b815260206004820152600c60248201526b4255524e5f4641494c55524560a01b604482015290519081900360640190fd5b620019478a8462002017565b6001600160a01b0380821660009081526007602052604090205491975016156200196d57fe5b6001600160a01b038087166000818152600760205260408082208054858a166001600160a01b031991821617909155600480546001810182558185527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805490921685179091558054825163f2fc7d6760e01b81529182019490945260248101849052336044820181905260648201528d1515608482015290519298509285169263f2fc7d679260a4808301939282900301818387803b15801562001a3257600080fd5b505af115801562001a47573d6000803e3d6000fd5b50505050856001600160a01b0316836001600160a01b0316856001600160a01b03167fef332a01dc11ee04eab2405c2f60c65d8e33b933136b7b085aae6e7a77e8eb99338e8e8b8860405180866001600160a01b03166001600160a01b0316815260200185600381111562001ab857fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a4505060006002555091969095509350505050565b6002541562001b38576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462001b8c576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff1662001bf4576040805162461bcd60e51b815260206004820152601060248201526f1053149150511657d11254d05093115160821b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b19169055517f4eefa26623f720c6c56f2a3ecbe4e895171df2f804bb6a917d30d394743256239190a2506000600255565b600062001c528362000ee4565b62001c605750600062001cf2565b6001600160a01b03808416600090815260086020908152604091829020600101548251639015d37160e01b81528685166004820152925193169283928392639015d37192602480840193829003018186803b15801562001cbf57600080fd5b505afa15801562001cd4573d6000803e3d6000fd5b505050506040513d602081101562001ceb57600080fd5b5051925050505b92915050565b6001546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a01b900460ff1690565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b0316331462001da1576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381161580159062001dc857506000546001600160a01b03828116911614155b62001e0c576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8160006001600160a01b03821662001e54576009546001600160a01b0316915062001ea4565b62001e5f8262000ee4565b62001ea4576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d41493d513d0d3d360821b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154839190811690821662001f3f57806001600160a01b031663631ffbf36040518163ffffffff1660e01b815260040160206040518083038186803b15801562001f0957600080fd5b505afa15801562001f1e573d6000803e3d6000fd5b505050506040513d602081101562001f3557600080fd5b505191506200200f565b806001600160a01b0316639015d371836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801562001f9657600080fd5b505afa15801562001fab573d6000803e3d6000fd5b505050506040513d602081101562001fc257600080fd5b50516200200f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b509250929050565b6000808360038111156200202757fe5b14156200207457306040516200203d9062002250565b6001600160a01b03909116815260405190819003602001906000f0801580156200206b573d6000803e3d6000fd5b50905062001cf2565b60018360038111156200208357fe5b1415620020ce5730826040516200209a906200225e565b6001600160a01b03928316815291166020820152604080519182900301906000f0801580156200206b573d6000803e3d6000fd5b6002836003811115620020dd57fe5b1415620020f357816040516200203d906200226c565b60038360038111156200210257fe5b14156200217b57816001600160a01b03166309ed46076040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200214557600080fd5b505af11580156200215a573d6000803e3d6000fd5b505050506040513d60208110156200217157600080fd5b5051905062001cf2565b6040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f464f5247455f4d4f444560701b604482015290519081900360640190fd5b611a7d806200229b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200220e57805160ff19168380011785556200223e565b828001600101855582156200223e579182015b828111156200223e57825182559160200191906001019062002221565b506200224c9291506200227a565b5090565b6103db8062003d1883390190565b61068f80620040f383390190565b61018a806200478283390190565b6200229791905b808211156200224c576000815560010162002281565b9056fe60806040523480156200001157600080fd5b5060405162001a7d38038062001a7d833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091906001600160a01b038316620000d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166200014657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5a45524f5f50524f544f434f4c00000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b038086166001600160a01b03199283161790925560038054858416908316179055600480549284169290911691909117905562000197816001600160e01b03620001a016565b505050620006d9565b6001600160a01b0381166200021657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e56414c49445f494d504c454d454e544154494f4e00000000000000000000604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200029157600080fd5b8101908080516040519392919084640100000000821115620002b257600080fd5b908301906020820185811115620002c857600080fd5b8251640100000000811182820188101715620002e357600080fd5b82525081516020918201929091019080838360005b8381101562000312578181015183820152602001620002f8565b50505050905090810190601f168015620003405780820380516001836020036101000a031916815260200191505b506040525050509050600381511015620003bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f56455253494f4e0000000000000000000000000000000000604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b60208310620003fa5780518252601f199092019160209182019101620003d9565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b0316929092149150620004a3905057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f56455253494f4e5f555345440000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156200052c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f414c52454144595f524547495354455245440000000000000000000000000000604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b60208310620005f55780518252601f199092019160209182019101620005d4565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b838110156200069a57818101518382015260200162000680565b50505050905090810190601f168015620006c85780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b61139480620006e96000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638ce74426116100a2578063e30c397811610071578063e30c39781461030d578063e6c09edf14610315578063e823d5cf1461033b578063f2bdeea614610361578063f2fde38b146104055761010b565b80638ce744261461029d5780638da5cb5b146102a55780639015d371146102ad578063c3c5a547146102e75761010b565b80635bfa1b68116100de5780635bfa1b681461024a578063631ffbf314610270578063715018a614610278578063845affc8146102805761010b565b80634420e486146101105780634e71e0c81461013857806352bfe7891461014057806354fd4d5014610164575b600080fd5b6101366004803603602081101561012657600080fd5b50356001600160a01b031661042b565b005b6101366104d1565b610148610583565b604080516001600160a01b039092168252519081900360200190f35b61016c6105b3565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156101ad578181015183820152602001610195565b50505050905090810190601f1680156101da5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561020d5781810151838201526020016101f5565b50505050905090810190601f16801561023a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6101366004803603602081101561026057600080fd5b50356001600160a01b0316610823565b61014861097c565b61013661098b565b6101486004803603602081101561029657600080fd5b5035610a23565b610148610a4a565b610148610a59565b6102d3600480360360208110156102c357600080fd5b50356001600160a01b0316610a68565b604080519115158252519081900360200190f35b6102d3600480360360208110156102fd57600080fd5b50356001600160a01b0316610a8b565b610148610aa9565b6101366004803603602081101561032b57600080fd5b50356001600160a01b0316610ab8565b6101366004803603602081101561035157600080fd5b50356001600160a01b0316610c3e565b6101486004803603602081101561037757600080fd5b810190602081018135600160201b81111561039157600080fd5b8201836020820111156103a357600080fd5b803590602001918460018302840111600160201b831117156103c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dd6945050505050565b6101366004803603602081101561041b57600080fd5b50356001600160a01b0316610dfc565b6002541561046d576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146104c0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6104c981610ed5565b506000600255565b6001546001600160a01b0316331461051f576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6005805460009190600019810190811061059957fe5b6000918252602090912001546001600160a01b0316905090565b606080600360009054906101000a90046001600160a01b03166001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801561060457600080fd5b505afa158015610618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561064157600080fd5b8101908080516040519392919084600160201b82111561066057600080fd5b90830190602082018581111561067557600080fd5b8251600160201b81118282018810171561068e57600080fd5b82525081516020918201929091019080838360005b838110156106bb5781810151838201526020016106a3565b50505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b5060408181526004805463054fd4d560e41b845291519698506001600160a01b03909116956354fd4d50955081830194506000935091829003018186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561076f57600080fd5b8101908080516040519392919084600160201b82111561078e57600080fd5b9083019060208201858111156107a357600080fd5b8251600160201b8111828201881017156107bc57600080fd5b82525081516020918201929091019080838360005b838110156107e95781810151838201526020016107d1565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b5060405250505090509091565b60025415610865576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146108b8576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381166000908152600760205260409020805460ff1680156108e857508054610100900460ff16155b610932576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b805461ff0019166101001781556040516001600160a01b038316907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1290600090a250506000600255565b6004546001600160a01b031681565b6000546001600160a01b031633146109d9576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60058181548110610a3057fe5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031681565b6000546001600160a01b031681565b6001600160a01b0316600090815260076020526040902054610100900460ff1690565b6001600160a01b031660009081526007602052604090205460ff1690565b6001546001600160a01b031681565b60025415610afa576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610b4d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610b9c576040805162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b604482015290519081900360640190fd5b610ba581610a68565b610bef576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805461ff0019169055517ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe9190a2506000600255565b60025415610c80576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610cd3576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610d2c576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b610d3581610a68565b610d7f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0dce6c7e4b7c18563c67d50415c83afaa4c165d8452c6b51659c1bfa2435f3cb90600090a350506000600255565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b03163314610e4a576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b03811615801590610e7057506000546001600160a01b03828116911614155b610eb3576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116610f29576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b158015610f6457600080fd5b505afa158015610f78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fa157600080fd5b8101908080516040519392919084600160201b821115610fc057600080fd5b908301906020820185811115610fd557600080fd5b8251600160201b811182820188101715610fee57600080fd5b82525081516020918201929091019080838360005b8381101561101b578181015183820152602001611003565b50505050905090810190601f1680156110485780820380516001836020036101000a031916815260200191505b50604052505050905060038151101561109a576040805162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a22fab22a929a4a7a760891b604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b602083106110d75780518252601f1990920191602091820191016110b8565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b03169290921491506111549050576040805162461bcd60e51b815260206004820152600c60248201526b15915494d253d397d554d15160a21b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156111b7576040805162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b6020831061127e5780518252601f19909201916020918201910161125f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b83811015611321578181015183820152602001611309565b50505050905090810190601f16801561134e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505056fea265627a7a72315820ebe8f498a2a9a6d5143737847f60a44a37e4e4722213694801d5a3021cf87aec64736f6c634300050b0032608060405234801561001057600080fd5b506040516103db3803806103db8339818101604052602081101561003357600080fd5b505180610048816001600160e01b0361004f16565b50506100e6565b6001600160a01b0381166100c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b600060405180806103ba60219139604051908190036021019020929092555050565b6102c5806100f56000396000f3fe6080604052600436106100345760003560e01c80635c60da1b146100785780637b103999146100a95780638ce74426146100be575b600061003e6100d3565b90506001600160a01b03811661005357600080fd5b60405136600082376000803683855af43d806000843e818015610074578184f35b8184fd5b34801561008457600080fd5b5061008d6100d3565b604080516001600160a01b039092168252519081900360200190f35b3480156100b557600080fd5b5061008d6101c8565b3480156100ca57600080fd5b5061008d6101eb565b6000806100de6101c8565b60408051633a731b2f60e11b815230600482015281519293506000926001600160a01b038516926374e6365e9260248082019391829003018186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d604081101561015057600080fd5b506020908101516040805163631ffbf360e01b815290519193506001600160a01b0384169263631ffbf392600480840193829003018186803b15801561019557600080fd5b505afa1580156101a9573d6000803e3d6000fd5b505050506040513d60208110156101bf57600080fd5b50519250505090565b600080604051808061027060219139604051908190036021019020549392505050565b6000806101f66101c8565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561023d57600080fd5b505afa158015610251573d6000803e3d6000fd5b505050506040513d604081101561026757600080fd5b50519291505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a72315820e42b816ccaf235c960e6fa24f5a0031ab5057b5dcfeec5fb5811fc465f2a9e3b64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161068f38038061068f8339818101604052604081101561003357600080fd5b5080516020909101518161004f816001600160e01b0361006916565b50610062816001600160e01b0361010016565b5050610122565b6001600160a01b0381166100de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6000604051808061066e60219139604051908190036021019020929092555050565b6000604051808061064760279139604051908190036027019020929092555050565b610516806101316000396000f3fe60806040526004361061003f5760003560e01c80633659cfe6146100835780635c60da1b146100b85780637b103999146100e95780638ce74426146100fe575b6000610049610113565b90506001600160a01b03811661005e57600080fd5b60405136600082376000803683855af43d806000843e81801561007f578184f35b8184fd5b34801561008f57600080fd5b506100b6600480360360208110156100a657600080fd5b50356001600160a01b0316610136565b005b3480156100c457600080fd5b506100cd610113565b604080516001600160a01b039092168252519081900360200190f35b3480156100f557600080fd5b506100cd6103ae565b34801561010a57600080fd5b506100cd6103d1565b600080604051808061049a60279139604051908190036027019020549392505050565b6000306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561017157600080fd5b505afa158015610185573d6000803e3d6000fd5b505050506040513d602081101561019b57600080fd5b505190506001600160a01b0381166101e5576040805162461bcd60e51b81526020600482015260086024820152672727afa7aba722a960c11b604482015290519081900360640190fd5b6001600160a01b0381163314610231576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b816001600160a01b0316610243610113565b6001600160a01b03161415610295576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b600061029f6103ae565b9050806001600160a01b031663c4897cd56102b86103d1565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152516044808301926020929190829003018186803b15801561030557600080fd5b505afa158015610319573d6000803e3d6000fd5b505050506040513d602081101561032f57600080fd5b505161036c5760405162461bcd60e51b81526004018080602001828103825260228152602001806104786022913960400191505060405180910390fd5b61037583610455565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2505050565b60008060405180806104c160219139604051908190036021019020549392505050565b6000806103dc6103ae565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561042357600080fd5b505afa158015610437573d6000803e3d6000fd5b505050506040513d604081101561044d57600080fd5b505192915050565b6000604051808061049a6027913960405190819003602701902092909255505056fe494e56414c49445f50524f544f434f4c5f4f525f494d504c454d454e544154494f4e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a723158206acaacfc4d1703159e6ea7ffa104958090c83e81bc8b4d1c1887a5b9b1f3f4fd64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161018a38038061018a8339818101604052602081101561003357600080fd5b50516040516000908060226101688239604051908190036022019020929092555050610104806100646000396000f3fe608060405260043610601c5760003560e01c80635c60da1b14605c575b60006024608a565b90506001600160a01b038116603857600080fd5b60405136600082376000803683855af43d806000843e8180156058578184f35b8184fd5b348015606757600080fd5b50606e608a565b604080516001600160a01b039092168252519081900360200190f35b60008060405180806100ae6022913960405190819003602201902054939250505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a72315820e4b97c71f12dd7e59216bd5fe82f370a4ede95bdb3a8f0b59f0836a47582a0eb64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a7231582058a14c5d8bb77be76c1db74e3193864be695c251ab387d10d480cfe4bd0801d064736f6c634300050b0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bbbbca6a901c926f240b89eacb641d8aec7aeafd
-----Decoded View---------------
Arg [0] : _lrcAddress (address): 0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000bbbbca6a901c926f240b89eacb641d8aec7aeafd
Swarm Source
bzzr://58a14c5d8bb77be76c1db74e3193864be695c251ab387d10d480cfe4bd0801d0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.