Contract Address Details

0x9953475C1bA240757c1b2731586C6d3C774b5167

Contract Name
ICO
Creator
0xc7d98c–7f3521 at 0x25982f–547a1f
Balance
0 CLO ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
15078202
Contract name:
ICO




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
200
EVM Version
default




Verified at
2024-03-12T09:21:24.602730Z

Contract source code

// SPDX-License-Identifier: No License (None)
pragma solidity 0.8.19;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    address internal _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    /*
    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }
    */
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
}

interface IVesting {
    function allocateTokens(
        address to, // beneficiary of tokens
        uint256 amount, // amount of token
        uint256 unlockPercentage,   // percentage (with 2 decimals) of initially unlocked token
        uint256 cliffFinish,       // Timestamp (unix time) when starts vesting. First vesting will be at this time
        uint256 vestingPercentage,  // percentage (with 2 decimals) of tokens will be unlocked every interval (i.e. 10% per 30 days)
        uint256 vestingInterval     // interval (in seconds) of vesting (i.e. 30 days)
    ) external;
}

contract ICO is Ownable {
    address public ICOtoken;    // ICO token and receiving token must have 18 decimals
    address public vestingContract; 
    address public paymentToken; //BUSDT
    address public VUSD; // Virtual USD

    uint256 public unlockPercentage; // 5% - percentage (with 2 decimals) of initially unlocked token
    uint256 public cliffPeriod;    // cliff period (in seconds)
    uint256 public vestingPercentage;        // 5% - percentage (with 2 decimals) of locked tokens will be unlocked every interval (i.e. 5% per 30 days)
    uint256 public vestingInterval;     // interval (in seconds) of vesting (i.e. 30 days)
    uint256 public bonusReserve;  // 16M 
    uint256 public bonusPercentage;  // 25% (with two decimals)
    uint256 public bonusActivator;   // 10% (with two decimals) of round amount

    uint256 public startDate; // 26 February 2024, 10:00:00 UTC

    struct Round {
        uint256 amount;     // amount of tokens to sell in this round
        uint128 price;      // price per token (in payTokens value)
        uint128 roundStarts; // timestamp when round starts
        uint256 totalSold;  // amount of tokens sold 
        uint256 totalReceived;  // total payments received in round
    }

    Round[] public rounds;      // return info about arbitrary round
    uint256 public currentRound;
    bool public isPause;

    event BuyToken(address buyer, uint256 round, uint256 amountToPay, uint256 amountToBuy, uint256 bonus);
    event RoundEnds(uint256 round, uint256 starTime, uint256 endTime, uint256 lastSoldAmount);
    event SetBonusData(
        uint256 _bonusReserve,     // amount of bonus reserve
        uint256 _bonusPercentage,  // bonus rewards % (with two decimals)
        uint256 _bonusActivator    // bonus activator % (with two decimals) of round amount
    );

    function initialize() external {
        require(_owner == address(0), "Already init");
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
        ICOtoken = 0xdf4Da43DD3E9918F0784f8c92b8aa1b304C43243;// LiveDIFF token
        vestingContract = 0xe5A5837b96176d6E47E541F186B2348DED2c0A1d; // Vesting contract
        IERC20(ICOtoken).approve(vestingContract, type(uint256).max);
        paymentToken = 0xbf6c50889d3a620eb42C0F188b65aDe90De958c4; //BUSDT
        VUSD = 0xA032bE9AC4113ef7B8208563b6Cc633A2d0583Ab; // Virtual USD
        unlockPercentage = 500; // 5% - percentage (with 2 decimals) of initially unlocked token
        cliffPeriod = 180 days;    // cliff period (in seconds)
        vestingPercentage = 500;        // 5% - percentage (with 2 decimals) of locked tokens will be unlocked every interval (i.e. 5% per 30 days)
        vestingInterval = 30 days;     // interval (in seconds) of vesting (i.e. 30 days)
        bonusReserve = 16 * 10**6 * 10**18;  // 16M 
        bonusPercentage = 2500;  // 25% (with two decimals)
        bonusActivator = 1000;   // 10% (with two decimals) of round amount
        startDate = 1708941600; // 26 February 2024, 10:00:00 UTC        
    }

    modifier checkRound() {
        require(currentRound < rounds.length, "ICO finished");
        require(block.timestamp >= startDate, "ICO is not started yet");
        require(!isPause, "ICO is paused");
        _;
    }

    // Buy ICO tokens
    function buyToken(
        uint256 amountToBuy,    // amount of token to buy
        address buyer           // buyer address
    ) public checkRound {
        _buyToken(paymentToken, amountToBuy, buyer);
    }

    // Buy ICO tokens using Virtual USD
    function buyTokenVirtual(
        uint256 amountToBuy,    // amount of token to buy
        address buyer           // buyer address
    ) public checkRound {
        _buyToken(VUSD, amountToBuy, buyer);
    }

    function _buyToken(
        address payToken,       // token to pay
        uint256 amountToBuy,    // amount of token to buy
        address buyer           // buyer address
    ) public checkRound {
        require(buyer != address(0), "Incorrect buyer");
        uint256 _currentRound = currentRound;   // use local variable to save gas
        Round storage r = rounds[_currentRound];
        if(r.roundStarts == 0) {
            if(_currentRound == 0) r.roundStarts = uint128(startDate);
            else r.roundStarts = uint128(block.timestamp);
        }

        if(r.totalSold + amountToBuy >= r.amount) {
            amountToBuy = r.amount - r.totalSold;
            currentRound++;
            emit RoundEnds(_currentRound, r.roundStarts, block.timestamp, amountToBuy);
        }

        uint256 amountToPay = amountToBuy * r.price / 1e18;
        r.totalSold += amountToBuy;
        r.totalReceived += amountToPay;
        safeTransferFrom(payToken, msg.sender, owner(), amountToPay);
        uint256 bonus = _getBonus(amountToBuy, r.amount);
        // set vesting
        uint256 finishVesting = block.timestamp + cliffPeriod;
        uint256 unlockedAmount = (amountToBuy + bonus) * unlockPercentage / 10000;
        uint256 lockedAmount = (amountToBuy + bonus) - unlockedAmount;
        if (lockedAmount != 0) {
            //safeTransfer(ICOtoken, vestingContract, lockedAmount);
            IVesting(vestingContract).allocateTokens(buyer, lockedAmount, 0, finishVesting, vestingPercentage, vestingInterval);
        }
        safeTransfer(ICOtoken, buyer, unlockedAmount);
        emit BuyToken(buyer, _currentRound, amountToPay, amountToBuy, bonus);
    }    

    function _getBonus(uint256 amountToBuy, uint256 roundAmount) internal returns(uint256 bonus) {
        if (amountToBuy >= roundAmount * bonusActivator / 10000 && bonusReserve != 0) {
            bonus = amountToBuy * bonusPercentage / 10000;
            if (bonus > bonusReserve) bonus = bonusReserve;
            bonusReserve -= bonus;
        }
    }

    function addRound(
        uint256 amount,     // amount of tokens to sell in this round
        uint128 price       // price per token (in USD with 18 decimals)     
    ) external onlyOwner {
        rounds.push(Round(amount, price, 0, 0, 0));
    }

    function changRound(
        uint256 roundId,    // round to change
        uint256 amount,     // amount of tokens to sell in this round
        uint128 price       // price per token (in USD with 18 decimals) 
    ) external onlyOwner {
        require(roundId < rounds.length, "wrong round id");
        rounds[roundId].amount = amount;
        rounds[roundId].price = price;
    }

    function setRoundSold(uint256 roundId, uint256 soldAmount, uint256 receivedAmount) external onlyOwner {
        require(roundId < rounds.length, "wrong round id");
        rounds[roundId].totalSold = soldAmount;
        rounds[roundId].totalReceived = receivedAmount;
    }

    function getRoundsNumber() external view returns(uint256 roundsNumber) {
        return rounds.length;
    }

    // return info about current round
    function getCurrentRound() external view returns(Round memory r) {
        if(currentRound < rounds.length) r = rounds[currentRound];
    }
    
    function setPause(bool pause) external onlyOwner {
        isPause = pause;
    }

    function setStartDate(uint256 _startDate) external onlyOwner {
        startDate = _startDate;
    }

    function setVesting(
        address _vestingContract,  // address of vesting contract or address(0) to don't change
        uint256 _unlockPercentage, // percentage of initially unlocked token
        uint256 _cliffPeriod,    // vesting period (in seconds)
        uint256 _vestingPercentage,  // percentage of locked tokens will be unlocked every interval (i.e. 10% per 30 days)
        uint256 _vestingInterval     // interval (in seconds) of vesting (i.e. 30 days)
    ) external onlyOwner {
        if(vestingContract != _vestingContract && _vestingContract != address(0)) {
            IERC20(ICOtoken).approve(vestingContract, 0);
            IERC20(ICOtoken).approve(_vestingContract, type(uint256).max);
            vestingContract = _vestingContract;
        }
        unlockPercentage = _unlockPercentage;
        cliffPeriod = _cliffPeriod;
        vestingPercentage = _vestingPercentage;
        vestingInterval = _vestingInterval;
    }

    function setBonusData(
        uint256 _bonusReserve,     // amount of bonus reserve
        uint256 _bonusPercentage,  // bonus rewards % (with two decimals)
        uint256 _bonusActivator    // bonus activator % (with two decimals) of round amount
    ) external onlyOwner {
        bonusPercentage = _bonusPercentage;
        bonusActivator = _bonusActivator;
        if(_bonusReserve > bonusReserve) {
            uint256 addAmount = _bonusReserve - bonusReserve;
            safeTransferFrom(ICOtoken, msg.sender, address(this), addAmount);
        } else if (_bonusReserve < bonusReserve) {
            uint256 subAmount = bonusReserve - _bonusReserve;
            safeTransfer(ICOtoken, msg.sender, subAmount);
        }
        bonusReserve = _bonusReserve;

        emit SetBonusData(_bonusReserve, _bonusPercentage, _bonusActivator);
    }

    // allow to receive ERC223 tokens
    function tokenReceived(address, uint256, bytes memory) external virtual returns(bytes4) {
        return this.tokenReceived.selector;
    }

    event Rescue(address _token, uint256 _amount);
    function rescueTokens(address _token) onlyOwner external {
        uint256 amount;
        if (_token == address(0)) {
            amount = address(this).balance;
            safeTransferCLO(msg.sender, amount);
        } else {
            amount = IERC20(_token).balanceOf(address(this));
            safeTransfer(_token, msg.sender, amount);
        }
        emit Rescue(_token, amount);
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferCLO(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: CLO_TRANSFER_FAILED');
    }
}
        

Contract ABI

[{"type":"event","name":"BuyToken","inputs":[{"type":"address","name":"buyer","internalType":"address","indexed":false},{"type":"uint256","name":"round","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountToPay","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountToBuy","internalType":"uint256","indexed":false},{"type":"uint256","name":"bonus","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Rescue","inputs":[{"type":"address","name":"_token","internalType":"address","indexed":false},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RoundEnds","inputs":[{"type":"uint256","name":"round","internalType":"uint256","indexed":false},{"type":"uint256","name":"starTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"endTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastSoldAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetBonusData","inputs":[{"type":"uint256","name":"_bonusReserve","internalType":"uint256","indexed":false},{"type":"uint256","name":"_bonusPercentage","internalType":"uint256","indexed":false},{"type":"uint256","name":"_bonusActivator","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ICOtoken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"VUSD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_buyToken","inputs":[{"type":"address","name":"payToken","internalType":"address"},{"type":"uint256","name":"amountToBuy","internalType":"uint256"},{"type":"address","name":"buyer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addRound","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint128","name":"price","internalType":"uint128"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bonusActivator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bonusPercentage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bonusReserve","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyToken","inputs":[{"type":"uint256","name":"amountToBuy","internalType":"uint256"},{"type":"address","name":"buyer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyTokenVirtual","inputs":[{"type":"uint256","name":"amountToBuy","internalType":"uint256"},{"type":"address","name":"buyer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changRound","inputs":[{"type":"uint256","name":"roundId","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint128","name":"price","internalType":"uint128"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cliffPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"r","internalType":"struct ICO.Round","components":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint128","name":"price","internalType":"uint128"},{"type":"uint128","name":"roundStarts","internalType":"uint128"},{"type":"uint256","name":"totalSold","internalType":"uint256"},{"type":"uint256","name":"totalReceived","internalType":"uint256"}]}],"name":"getCurrentRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"roundsNumber","internalType":"uint256"}],"name":"getRoundsNumber","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"paymentToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint128","name":"price","internalType":"uint128"},{"type":"uint128","name":"roundStarts","internalType":"uint128"},{"type":"uint256","name":"totalSold","internalType":"uint256"},{"type":"uint256","name":"totalReceived","internalType":"uint256"}],"name":"rounds","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBonusData","inputs":[{"type":"uint256","name":"_bonusReserve","internalType":"uint256"},{"type":"uint256","name":"_bonusPercentage","internalType":"uint256"},{"type":"uint256","name":"_bonusActivator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPause","inputs":[{"type":"bool","name":"pause","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRoundSold","inputs":[{"type":"uint256","name":"roundId","internalType":"uint256"},{"type":"uint256","name":"soldAmount","internalType":"uint256"},{"type":"uint256","name":"receivedAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setStartDate","inputs":[{"type":"uint256","name":"_startDate","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setVesting","inputs":[{"type":"address","name":"_vestingContract","internalType":"address"},{"type":"uint256","name":"_unlockPercentage","internalType":"uint256"},{"type":"uint256","name":"_cliffPeriod","internalType":"uint256"},{"type":"uint256","name":"_vestingPercentage","internalType":"uint256"},{"type":"uint256","name":"_vestingInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startDate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"unlockPercentage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"vestingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingInterval","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPercentage","inputs":[]}]
            

Contract Creation Code

0x608060405234801561001057600080fd5b50611ca3806100206000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063813d6c9a1161010f578063a32bf597116100a2578063d88dc76911610071578063d88dc76914610460578063f2fde38b14610473578063ff0938a714610486578063ff55d6f6146104a357600080fd5b8063a32bf597146103e2578063aad836051461043b578063b8e50cab14610444578063bedb86fb1461044d57600080fd5b80638c65c81f116100de5780638c65c81f146103645780638da5cb5b146103ab5780639134709e146103bc57806396f03a43146103cf57600080fd5b8063813d6c9a1461030957806382d95df5146103125780638943ec02146103255780638a19c8bc1461035b57600080fd5b80634651cf61116101875780636c7979b3116101565780636c7979b3146102d35780636de2fa95146102e6578063801592a2146102ee5780638129fc1c1461030157600080fd5b80634651cf611461029157806346ff80ee1461029a5780635e6f6045146102ad57806368439188146102c057600080fd5b80632f661946116101c35780632f661946146102415780633013ce291461024a578063320ef87d146102755780633b3fba161461028857600080fd5b8062ae3bf8146101f45780630b97bc8614610209578063106f3bbb146102255780632a2eddde1461022e575b600080fd5b61020761020236600461182c565b6104b6565b005b610212600c5481565b6040519081526020015b60405180910390f35b61021260075481565b61020761023c36600461184e565b6105d4565b61021260065481565b60035461025d906001600160a01b031681565b6040516001600160a01b03909116815260200161021c565b610207610283366004611890565b61075c565b61021260055481565b61021260095481565b60015461025d906001600160a01b031681565b60025461025d906001600160a01b031681565b60045461025d906001600160a01b031681565b6102076102e13660046118bc565b61082e565b600d54610212565b6102076102fc366004611890565b610c04565b610207610d03565b610212600a5481565b6102076103203660046118f8565b610ec3565b610342610333366004611927565b6344a1f60160e11b9392505050565b6040516001600160e01b0319909116815260200161021c565b610212600e5481565b6103776103723660046118f8565b610f01565b604080519586526001600160801b03948516602087015292909316918401919091526060830152608082015260a00161021c565b6000546001600160a01b031661025d565b6102076103ca3660046119f2565b610f4f565b6102076103dd366004611a35565b610fd2565b6103ea6110ff565b60405161021c9190600060a0820190508251825260208301516001600160801b0380821660208501528060408601511660408501525050606083015160608301526080830151608083015292915050565b610212600b5481565b61021260085481565b61020761045b366004611a69565b6111c5565b61020761046e3660046119f2565b611211565b61020761048136600461182c565b611290565b600f546104939060ff1681565b604051901515815260200161021c565b6102076104b1366004611a86565b611389565b336104c96000546001600160a01b031690565b6001600160a01b0316146104f85760405162461bcd60e51b81526004016104ef90611ab2565b60405180910390fd5b60006001600160a01b038216610519575047610514338261147b565b61058e565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190611ae7565b905061058e823383611549565b604080516001600160a01b0384168152602081018390527f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af2910160405180910390a15050565b336105e76000546001600160a01b031690565b6001600160a01b03161461060d5760405162461bcd60e51b81526004016104ef90611ab2565b6002546001600160a01b0386811691161480159061063357506001600160a01b03851615155b156107475760015460025460405163095ea7b360e01b81526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af115801561068d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b19190611b00565b5060015460405163095ea7b360e01b81526001600160a01b03878116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af1158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190611b00565b50600280546001600160a01b0319166001600160a01b0387161790555b60059390935560069190915560075560085550565b3361076f6000546001600160a01b031690565b6001600160a01b0316146107955760405162461bcd60e51b81526004016104ef90611ab2565b600d5483106107d75760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81c9bdd5b99081a5960921b60448201526064016104ef565b81600d84815481106107eb576107eb611b1d565b90600052602060002090600402016002018190555080600d848154811061081457610814611b1d565b906000526020600020906004020160030181905550505050565b600d54600e54106108515760405162461bcd60e51b81526004016104ef90611b33565b600c544210156108735760405162461bcd60e51b81526004016104ef90611b59565b600f5460ff16156108965760405162461bcd60e51b81526004016104ef90611b89565b6001600160a01b0381166108de5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10313abcb2b960891b60448201526064016104ef565b6000600e5490506000600d82815481106108fa576108fa611b1d565b600091825260208220600491909102016001810154909250600160801b90046001600160801b03169003610974578160000361095757600c546001820180546001600160801b03928316600160801b029216919091179055610974565b6001810180546001600160801b03428116600160801b0291161790555b80546002820154610986908690611bc6565b10610a0f576002810154815461099c9190611bd9565b600e805491955060006109ae83611bec565b9091555050600181015460408051848152600160801b9092046001600160801b031660208301524290820152606081018590527fd973376a4b0ebcb1d15c59c5c42583e7edb997119e5246d6888e26c5d0229ad99060800160405180910390a15b6001810154600090670de0b6b3a764000090610a34906001600160801b031687611c05565b610a3e9190611c1c565b905084826002016000828254610a549190611bc6565b9250508190555080826003016000828254610a6f9190611bc6565b90915550610a9290508633610a8c6000546001600160a01b031690565b84611664565b6000610aa2868460000154611794565b9050600060065442610ab49190611bc6565b90506000612710600554848a610aca9190611bc6565b610ad49190611c05565b610ade9190611c1c565b9050600081610aed858b611bc6565b610af79190611bd9565b90508015610b89576002546007546008546040516335ebd4bd60e11b81526001600160a01b038c81166004830152602482018690526000604483015260648201889052608482019390935260a4810191909152911690636bd7a97a9060c401600060405180830381600087803b158015610b7057600080fd5b505af1158015610b84573d6000803e3d6000fd5b505050505b600154610ba0906001600160a01b03168984611549565b604080516001600160a01b038a16815260208101899052908101869052606081018a9052608081018590527f88ec88080cc26f1cd03f72bfe52eb411992bd2c91c32bcdf596693ed20e9d85d9060a00160405180910390a150505050505050505050565b33610c176000546001600160a01b031690565b6001600160a01b031614610c3d5760405162461bcd60e51b81526004016104ef90611ab2565b600a829055600b819055600954831115610c8257600060095484610c619190611bd9565b600154909150610c7c906001600160a01b0316333084611664565b50610cb8565b600954831015610cb857600083600954610c9c9190611bd9565b600154909150610cb6906001600160a01b03163383611549565b505b600983905560408051848152602081018490529081018290527f875bc5c339954a81b6883aa7764366b13459cdd51112fd608fcfb0a22217fbe79060600160405180910390a1505050565b6000546001600160a01b031615610d4b5760405162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481a5b9a5d60a21b60448201526064016104ef565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001805473df4da43dd3e9918f0784f8c92b8aa1b304c432436001600160a01b031991821681179092556002805473e5a5837b96176d6e47e541f186b2348ded2c0a1d92168217905560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af1158015610e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3c9190611b00565b50600380546001600160a01b031990811673bf6c50889d3a620eb42c0f188b65ade90de958c4179091556004805490911673a032be9ac4113ef7b8208563b6cc633a2d0583ab1790556101f4600581905562ed4e0060065560075562278d006008556a0d3c21bcecceda100000006009556109c4600a556103e8600b556365dc6120600c55565b33610ed66000546001600160a01b031690565b6001600160a01b031614610efc5760405162461bcd60e51b81526004016104ef90611ab2565b600c55565b600d8181548110610f1157600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193506001600160801b0380821693600160801b909204169185565b600d54600e5410610f725760405162461bcd60e51b81526004016104ef90611b33565b600c54421015610f945760405162461bcd60e51b81526004016104ef90611b59565b600f5460ff1615610fb75760405162461bcd60e51b81526004016104ef90611b89565b600354610fce906001600160a01b0316838361082e565b5050565b33610fe56000546001600160a01b031690565b6001600160a01b03161461100b5760405162461bcd60e51b81526004016104ef90611ab2565b6040805160a0810182529283526001600160801b039182166020840190815260009184018281526060850183815260808601848152600d80546001810182559552955160049094027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810194909455915190518416600160801b029316929092177fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb682015590517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb782015590517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb890910155565b6111436040518060a001604052806000815260200160006001600160801b0316815260200160006001600160801b0316815260200160008152602001600081525090565b600d54600e5410156111c257600d600e548154811061116457611164611b1d565b60009182526020918290206040805160a08101825260049093029091018054835260018101546001600160801b0380821695850195909552600160801b90049093169082015260028201546060820152600390910154608082015290505b90565b336111d86000546001600160a01b031690565b6001600160a01b0316146111fe5760405162461bcd60e51b81526004016104ef90611ab2565b600f805460ff1916911515919091179055565b600d54600e54106112345760405162461bcd60e51b81526004016104ef90611b33565b600c544210156112565760405162461bcd60e51b81526004016104ef90611b59565b600f5460ff16156112795760405162461bcd60e51b81526004016104ef90611b89565b600454610fce906001600160a01b0316838361082e565b336112a36000546001600160a01b031690565b6001600160a01b0316146112c95760405162461bcd60e51b81526004016104ef90611ab2565b6001600160a01b03811661132e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ef565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361139c6000546001600160a01b031690565b6001600160a01b0316146113c25760405162461bcd60e51b81526004016104ef90611ab2565b600d5483106114045760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81c9bdd5b99081a5960921b60448201526064016104ef565b81600d848154811061141857611418611b1d565b90600052602060002090600402016000018190555080600d848154811061144157611441611b1d565b906000526020600020906004020160010160006101000a8154816001600160801b0302191690836001600160801b03160217905550505050565b604080516000808252602082019092526001600160a01b0384169083906040516114a59190611c3e565b60006040518083038185875af1925050503d80600081146114e2576040519150601f19603f3d011682016040523d82523d6000602084013e6114e7565b606091505b50509050806115445760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a20434c4f5f5452414e534645525f46414960448201526213115160ea1b60648201526084016104ef565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916115a59190611c3e565b6000604051808303816000865af19150503d80600081146115e2576040519150601f19603f3d011682016040523d82523d6000602084013e6115e7565b606091505b50915091508180156116115750805115806116115750808060200190518101906116119190611b00565b61165d5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016104ef565b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916116c89190611c3e565b6000604051808303816000865af19150503d8060008114611705576040519150601f19603f3d011682016040523d82523d6000602084013e61170a565b606091505b50915091508180156117345750805115806117345750808060200190518101906117349190611b00565b61178c5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016104ef565b505050505050565b6000612710600b54836117a79190611c05565b6117b19190611c1c565b83101580156117c1575060095415155b1561180a57612710600a54846117d79190611c05565b6117e19190611c1c565b90506009548111156117f257506009545b80600960008282546118049190611bd9565b90915550505b92915050565b80356001600160a01b038116811461182757600080fd5b919050565b60006020828403121561183e57600080fd5b61184782611810565b9392505050565b600080600080600060a0868803121561186657600080fd5b61186f86611810565b97602087013597506040870135966060810135965060800135945092505050565b6000806000606084860312156118a557600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156118d157600080fd5b6118da84611810565b9250602084013591506118ef60408501611810565b90509250925092565b60006020828403121561190a57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561193c57600080fd5b61194584611810565b925060208401359150604084013567ffffffffffffffff8082111561196957600080fd5b818601915086601f83011261197d57600080fd5b81358181111561198f5761198f611911565b604051601f8201601f19908116603f011681019083821181831017156119b7576119b7611911565b816040528281528960208487010111156119d057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60008060408385031215611a0557600080fd5b82359150611a1560208401611810565b90509250929050565b80356001600160801b038116811461182757600080fd5b60008060408385031215611a4857600080fd5b82359150611a1560208401611a1e565b8015158114611a6657600080fd5b50565b600060208284031215611a7b57600080fd5b813561184781611a58565b600080600060608486031215611a9b57600080fd5b83359250602084013591506118ef60408501611a1e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611af957600080fd5b5051919050565b600060208284031215611b1257600080fd5b815161184781611a58565b634e487b7160e01b600052603260045260246000fd5b6020808252600c908201526b1250d3c8199a5b9a5cda195960a21b604082015260600190565b6020808252601690820152751250d3c81a5cc81b9bdd081cdd185c9d1959081e595d60521b604082015260600190565b6020808252600d908201526c1250d3c81a5cc81c185d5cd959609a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561180a5761180a611bb0565b8181038181111561180a5761180a611bb0565b600060018201611bfe57611bfe611bb0565b5060010190565b808202811582820484141761180a5761180a611bb0565b600082611c3957634e487b7160e01b600052601260045260246000fd5b500490565b6000825160005b81811015611c5f5760208186018101518583015201611c45565b50600092019182525091905056fea26469706673582212205066da375aa769725ecb0d0115d2e00899c38c9bd3bb1c6b4672812645c92f7e64736f6c63430008130033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063813d6c9a1161010f578063a32bf597116100a2578063d88dc76911610071578063d88dc76914610460578063f2fde38b14610473578063ff0938a714610486578063ff55d6f6146104a357600080fd5b8063a32bf597146103e2578063aad836051461043b578063b8e50cab14610444578063bedb86fb1461044d57600080fd5b80638c65c81f116100de5780638c65c81f146103645780638da5cb5b146103ab5780639134709e146103bc57806396f03a43146103cf57600080fd5b8063813d6c9a1461030957806382d95df5146103125780638943ec02146103255780638a19c8bc1461035b57600080fd5b80634651cf61116101875780636c7979b3116101565780636c7979b3146102d35780636de2fa95146102e6578063801592a2146102ee5780638129fc1c1461030157600080fd5b80634651cf611461029157806346ff80ee1461029a5780635e6f6045146102ad57806368439188146102c057600080fd5b80632f661946116101c35780632f661946146102415780633013ce291461024a578063320ef87d146102755780633b3fba161461028857600080fd5b8062ae3bf8146101f45780630b97bc8614610209578063106f3bbb146102255780632a2eddde1461022e575b600080fd5b61020761020236600461182c565b6104b6565b005b610212600c5481565b6040519081526020015b60405180910390f35b61021260075481565b61020761023c36600461184e565b6105d4565b61021260065481565b60035461025d906001600160a01b031681565b6040516001600160a01b03909116815260200161021c565b610207610283366004611890565b61075c565b61021260055481565b61021260095481565b60015461025d906001600160a01b031681565b60025461025d906001600160a01b031681565b60045461025d906001600160a01b031681565b6102076102e13660046118bc565b61082e565b600d54610212565b6102076102fc366004611890565b610c04565b610207610d03565b610212600a5481565b6102076103203660046118f8565b610ec3565b610342610333366004611927565b6344a1f60160e11b9392505050565b6040516001600160e01b0319909116815260200161021c565b610212600e5481565b6103776103723660046118f8565b610f01565b604080519586526001600160801b03948516602087015292909316918401919091526060830152608082015260a00161021c565b6000546001600160a01b031661025d565b6102076103ca3660046119f2565b610f4f565b6102076103dd366004611a35565b610fd2565b6103ea6110ff565b60405161021c9190600060a0820190508251825260208301516001600160801b0380821660208501528060408601511660408501525050606083015160608301526080830151608083015292915050565b610212600b5481565b61021260085481565b61020761045b366004611a69565b6111c5565b61020761046e3660046119f2565b611211565b61020761048136600461182c565b611290565b600f546104939060ff1681565b604051901515815260200161021c565b6102076104b1366004611a86565b611389565b336104c96000546001600160a01b031690565b6001600160a01b0316146104f85760405162461bcd60e51b81526004016104ef90611ab2565b60405180910390fd5b60006001600160a01b038216610519575047610514338261147b565b61058e565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190611ae7565b905061058e823383611549565b604080516001600160a01b0384168152602081018390527f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af2910160405180910390a15050565b336105e76000546001600160a01b031690565b6001600160a01b03161461060d5760405162461bcd60e51b81526004016104ef90611ab2565b6002546001600160a01b0386811691161480159061063357506001600160a01b03851615155b156107475760015460025460405163095ea7b360e01b81526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af115801561068d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b19190611b00565b5060015460405163095ea7b360e01b81526001600160a01b03878116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af1158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190611b00565b50600280546001600160a01b0319166001600160a01b0387161790555b60059390935560069190915560075560085550565b3361076f6000546001600160a01b031690565b6001600160a01b0316146107955760405162461bcd60e51b81526004016104ef90611ab2565b600d5483106107d75760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81c9bdd5b99081a5960921b60448201526064016104ef565b81600d84815481106107eb576107eb611b1d565b90600052602060002090600402016002018190555080600d848154811061081457610814611b1d565b906000526020600020906004020160030181905550505050565b600d54600e54106108515760405162461bcd60e51b81526004016104ef90611b33565b600c544210156108735760405162461bcd60e51b81526004016104ef90611b59565b600f5460ff16156108965760405162461bcd60e51b81526004016104ef90611b89565b6001600160a01b0381166108de5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10313abcb2b960891b60448201526064016104ef565b6000600e5490506000600d82815481106108fa576108fa611b1d565b600091825260208220600491909102016001810154909250600160801b90046001600160801b03169003610974578160000361095757600c546001820180546001600160801b03928316600160801b029216919091179055610974565b6001810180546001600160801b03428116600160801b0291161790555b80546002820154610986908690611bc6565b10610a0f576002810154815461099c9190611bd9565b600e805491955060006109ae83611bec565b9091555050600181015460408051848152600160801b9092046001600160801b031660208301524290820152606081018590527fd973376a4b0ebcb1d15c59c5c42583e7edb997119e5246d6888e26c5d0229ad99060800160405180910390a15b6001810154600090670de0b6b3a764000090610a34906001600160801b031687611c05565b610a3e9190611c1c565b905084826002016000828254610a549190611bc6565b9250508190555080826003016000828254610a6f9190611bc6565b90915550610a9290508633610a8c6000546001600160a01b031690565b84611664565b6000610aa2868460000154611794565b9050600060065442610ab49190611bc6565b90506000612710600554848a610aca9190611bc6565b610ad49190611c05565b610ade9190611c1c565b9050600081610aed858b611bc6565b610af79190611bd9565b90508015610b89576002546007546008546040516335ebd4bd60e11b81526001600160a01b038c81166004830152602482018690526000604483015260648201889052608482019390935260a4810191909152911690636bd7a97a9060c401600060405180830381600087803b158015610b7057600080fd5b505af1158015610b84573d6000803e3d6000fd5b505050505b600154610ba0906001600160a01b03168984611549565b604080516001600160a01b038a16815260208101899052908101869052606081018a9052608081018590527f88ec88080cc26f1cd03f72bfe52eb411992bd2c91c32bcdf596693ed20e9d85d9060a00160405180910390a150505050505050505050565b33610c176000546001600160a01b031690565b6001600160a01b031614610c3d5760405162461bcd60e51b81526004016104ef90611ab2565b600a829055600b819055600954831115610c8257600060095484610c619190611bd9565b600154909150610c7c906001600160a01b0316333084611664565b50610cb8565b600954831015610cb857600083600954610c9c9190611bd9565b600154909150610cb6906001600160a01b03163383611549565b505b600983905560408051848152602081018490529081018290527f875bc5c339954a81b6883aa7764366b13459cdd51112fd608fcfb0a22217fbe79060600160405180910390a1505050565b6000546001600160a01b031615610d4b5760405162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481a5b9a5d60a21b60448201526064016104ef565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001805473df4da43dd3e9918f0784f8c92b8aa1b304c432436001600160a01b031991821681179092556002805473e5a5837b96176d6e47e541f186b2348ded2c0a1d92168217905560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af1158015610e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3c9190611b00565b50600380546001600160a01b031990811673bf6c50889d3a620eb42c0f188b65ade90de958c4179091556004805490911673a032be9ac4113ef7b8208563b6cc633a2d0583ab1790556101f4600581905562ed4e0060065560075562278d006008556a0d3c21bcecceda100000006009556109c4600a556103e8600b556365dc6120600c55565b33610ed66000546001600160a01b031690565b6001600160a01b031614610efc5760405162461bcd60e51b81526004016104ef90611ab2565b600c55565b600d8181548110610f1157600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193506001600160801b0380821693600160801b909204169185565b600d54600e5410610f725760405162461bcd60e51b81526004016104ef90611b33565b600c54421015610f945760405162461bcd60e51b81526004016104ef90611b59565b600f5460ff1615610fb75760405162461bcd60e51b81526004016104ef90611b89565b600354610fce906001600160a01b0316838361082e565b5050565b33610fe56000546001600160a01b031690565b6001600160a01b03161461100b5760405162461bcd60e51b81526004016104ef90611ab2565b6040805160a0810182529283526001600160801b039182166020840190815260009184018281526060850183815260808601848152600d80546001810182559552955160049094027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810194909455915190518416600160801b029316929092177fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb682015590517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb782015590517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb890910155565b6111436040518060a001604052806000815260200160006001600160801b0316815260200160006001600160801b0316815260200160008152602001600081525090565b600d54600e5410156111c257600d600e548154811061116457611164611b1d565b60009182526020918290206040805160a08101825260049093029091018054835260018101546001600160801b0380821695850195909552600160801b90049093169082015260028201546060820152600390910154608082015290505b90565b336111d86000546001600160a01b031690565b6001600160a01b0316146111fe5760405162461bcd60e51b81526004016104ef90611ab2565b600f805460ff1916911515919091179055565b600d54600e54106112345760405162461bcd60e51b81526004016104ef90611b33565b600c544210156112565760405162461bcd60e51b81526004016104ef90611b59565b600f5460ff16156112795760405162461bcd60e51b81526004016104ef90611b89565b600454610fce906001600160a01b0316838361082e565b336112a36000546001600160a01b031690565b6001600160a01b0316146112c95760405162461bcd60e51b81526004016104ef90611ab2565b6001600160a01b03811661132e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ef565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361139c6000546001600160a01b031690565b6001600160a01b0316146113c25760405162461bcd60e51b81526004016104ef90611ab2565b600d5483106114045760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81c9bdd5b99081a5960921b60448201526064016104ef565b81600d848154811061141857611418611b1d565b90600052602060002090600402016000018190555080600d848154811061144157611441611b1d565b906000526020600020906004020160010160006101000a8154816001600160801b0302191690836001600160801b03160217905550505050565b604080516000808252602082019092526001600160a01b0384169083906040516114a59190611c3e565b60006040518083038185875af1925050503d80600081146114e2576040519150601f19603f3d011682016040523d82523d6000602084013e6114e7565b606091505b50509050806115445760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a20434c4f5f5452414e534645525f46414960448201526213115160ea1b60648201526084016104ef565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916115a59190611c3e565b6000604051808303816000865af19150503d80600081146115e2576040519150601f19603f3d011682016040523d82523d6000602084013e6115e7565b606091505b50915091508180156116115750805115806116115750808060200190518101906116119190611b00565b61165d5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016104ef565b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916116c89190611c3e565b6000604051808303816000865af19150503d8060008114611705576040519150601f19603f3d011682016040523d82523d6000602084013e61170a565b606091505b50915091508180156117345750805115806117345750808060200190518101906117349190611b00565b61178c5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016104ef565b505050505050565b6000612710600b54836117a79190611c05565b6117b19190611c1c565b83101580156117c1575060095415155b1561180a57612710600a54846117d79190611c05565b6117e19190611c1c565b90506009548111156117f257506009545b80600960008282546118049190611bd9565b90915550505b92915050565b80356001600160a01b038116811461182757600080fd5b919050565b60006020828403121561183e57600080fd5b61184782611810565b9392505050565b600080600080600060a0868803121561186657600080fd5b61186f86611810565b97602087013597506040870135966060810135965060800135945092505050565b6000806000606084860312156118a557600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156118d157600080fd5b6118da84611810565b9250602084013591506118ef60408501611810565b90509250925092565b60006020828403121561190a57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561193c57600080fd5b61194584611810565b925060208401359150604084013567ffffffffffffffff8082111561196957600080fd5b818601915086601f83011261197d57600080fd5b81358181111561198f5761198f611911565b604051601f8201601f19908116603f011681019083821181831017156119b7576119b7611911565b816040528281528960208487010111156119d057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60008060408385031215611a0557600080fd5b82359150611a1560208401611810565b90509250929050565b80356001600160801b038116811461182757600080fd5b60008060408385031215611a4857600080fd5b82359150611a1560208401611a1e565b8015158114611a6657600080fd5b50565b600060208284031215611a7b57600080fd5b813561184781611a58565b600080600060608486031215611a9b57600080fd5b83359250602084013591506118ef60408501611a1e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611af957600080fd5b5051919050565b600060208284031215611b1257600080fd5b815161184781611a58565b634e487b7160e01b600052603260045260246000fd5b6020808252600c908201526b1250d3c8199a5b9a5cda195960a21b604082015260600190565b6020808252601690820152751250d3c81a5cc81b9bdd081cdd185c9d1959081e595d60521b604082015260600190565b6020808252600d908201526c1250d3c81a5cc81c185d5cd959609a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561180a5761180a611bb0565b8181038181111561180a5761180a611bb0565b600060018201611bfe57611bfe611bb0565b5060010190565b808202811582820484141761180a5761180a611bb0565b600082611c3957634e487b7160e01b600052601260045260246000fd5b500490565b6000825160005b81811015611c5f5760208186018101518583015201611c45565b50600092019182525091905056fea26469706673582212205066da375aa769725ecb0d0115d2e00899c38c9bd3bb1c6b4672812645c92f7e64736f6c63430008130033