false
true
0

Contract Address Details

0x25CEbabd085706e99f8320179042fcBEeF1444Ff

Contract Name
ShortsTrackerTimelock
Creator
0x180f4b–a2ab00 at 0x36c250–c0d2c4
Balance
0 tPLS
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
25349044
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
ShortsTrackerTimelock




Optimization enabled
true
Compiler version
v0.6.12+commit.27d51765




Optimization runs
8
EVM Version
default




Verified at
2023-05-15T11:01:07.194436Z

Constructor Arguments

0x000000000000000000000000180f4bd2563b95564c0142e269e70c6a84a2ab000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000014

Arg [0] (address) : 0x180f4bd2563b95564c0142e269e70c6a84a2ab00
Arg [1] (uint256) : 1
Arg [2] (uint256) : 300
Arg [3] (uint256) : 20

              

contracts/peripherals/ShortsTrackerTimelock.sol

// SPDX-License-Identifier: MIT

import "../libraries/math/SafeMath.sol";
import "../access/Governable.sol";
import "../core/interfaces/IShortsTracker.sol";

pragma solidity 0.6.12;

contract ShortsTrackerTimelock {
    using SafeMath for uint256;

    uint256 public constant BASIS_POINTS_DIVISOR = 10000;
    uint256 public constant MAX_BUFFER = 5 days;

    mapping (bytes32 => uint256) public pendingActions;

    address public admin;
    uint256 public buffer;

    mapping (address => bool) public isHandler;
    mapping (address => uint256) public lastUpdated;
    uint256 public averagePriceUpdateDelay;
    uint256 public maxAveragePriceChange;

    event GlobalShortAveragePriceUpdated(address indexed token, uint256 oldAveragePrice, uint256 newAveragePrice);

    event SignalSetGov(address target, address gov);
    event SetGov(address target, address gov);

    event SignalSetAdmin(address admin);
    event SetAdmin(address admin);

    event SetHandler(address indexed handler, bool isHandler);

    event SignalSetMaxAveragePriceChange(uint256 maxAveragePriceChange);
    event SetMaxAveragePriceChange(uint256 maxAveragePriceChange);

    event SignalSetAveragePriceUpdateDelay(uint256 averagePriceUpdateDelay);
    event SetAveragePriceUpdateDelay(uint256 averagePriceUpdateDelay);

    event SignalSetIsGlobalShortDataReady(address target, bool isGlobalShortDataReady);
    event SetIsGlobalShortDataReady(address target, bool isGlobalShortDataReady);

    event SignalPendingAction(bytes32 action);
    event ClearAction(bytes32 action);

    constructor(
        address _admin,
        uint256 _buffer,
        uint256 _averagePriceUpdateDelay,
        uint256 _maxAveragePriceChange
    ) public {
        admin = _admin;
        buffer = _buffer;
        averagePriceUpdateDelay = _averagePriceUpdateDelay;
        maxAveragePriceChange = _maxAveragePriceChange;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "ShortsTrackerTimelock: admin forbidden");
        _;
    }

    modifier onlyHandler() {
        require(isHandler[msg.sender] || msg.sender == admin, "ShortsTrackerTimelock: handler forbidden");
        _;
    }

    function setBuffer(uint256 _buffer) external onlyAdmin {
        require(_buffer <= MAX_BUFFER, "ShortsTrackerTimelock: invalid buffer");
        require(_buffer > buffer, "ShortsTrackerTimelock: buffer cannot be decreased");
        buffer = _buffer;
    }

    function signalSetAdmin(address _admin) external onlyAdmin {
        require(_admin != address(0), "ShortsTrackerTimelock: invalid admin");

        bytes32 action = keccak256(abi.encodePacked("setAdmin", _admin));
        _setPendingAction(action);

        emit SignalSetAdmin(_admin);
    }

    function setAdmin(address _admin) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setAdmin", _admin));
        _validateAction(action);
        _clearAction(action);

        admin = _admin;

        emit SetAdmin(_admin);
    }

    function setHandler(address _handler, bool _isActive) external onlyAdmin {
        isHandler[_handler] = _isActive;

        emit SetHandler(_handler, _isActive);
    }

    function signalSetGov(address _shortsTracker, address _gov) external onlyAdmin {
        require(_gov != address(0), "ShortsTrackerTimelock: invalid gov");

        bytes32 action = keccak256(abi.encodePacked("setGov", _shortsTracker, _gov));
        _setPendingAction(action);

        emit SignalSetGov(_shortsTracker, _gov);
    }

    function setGov(address _shortsTracker, address _gov) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setGov", _shortsTracker, _gov));
        _validateAction(action);
        _clearAction(action);

        Governable(_shortsTracker).setGov(_gov);

        emit SetGov(_shortsTracker, _gov);
    }

    function signalSetAveragePriceUpdateDelay(uint256 _averagePriceUpdateDelay) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setAveragePriceUpdateDelay", _averagePriceUpdateDelay));
        _setPendingAction(action);

        emit SignalSetAveragePriceUpdateDelay(_averagePriceUpdateDelay);
    }

    function setAveragePriceUpdateDelay(uint256 _averagePriceUpdateDelay) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setAveragePriceUpdateDelay", _averagePriceUpdateDelay));
        _validateAction(action);
        _clearAction(action);

        averagePriceUpdateDelay = _averagePriceUpdateDelay;

        emit SetAveragePriceUpdateDelay(_averagePriceUpdateDelay);
    }

    function signalSetMaxAveragePriceChange(uint256 _maxAveragePriceChange) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setMaxAveragePriceChange", _maxAveragePriceChange));
        _setPendingAction(action);

        emit SignalSetMaxAveragePriceChange(_maxAveragePriceChange);
    }

    function setMaxAveragePriceChange(uint256 _maxAveragePriceChange) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setMaxAveragePriceChange", _maxAveragePriceChange));
        _validateAction(action);
        _clearAction(action);

        maxAveragePriceChange = _maxAveragePriceChange;

        emit SetMaxAveragePriceChange(_maxAveragePriceChange);
    }

    function signalSetIsGlobalShortDataReady(IShortsTracker _shortsTracker, bool _value) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setIsGlobalShortDataReady", address(_shortsTracker), _value));
        _setPendingAction(action);

        emit SignalSetIsGlobalShortDataReady(address(_shortsTracker), _value);
    }

    function setIsGlobalShortDataReady(IShortsTracker _shortsTracker, bool _value) external onlyAdmin {
        bytes32 action = keccak256(abi.encodePacked("setIsGlobalShortDataReady", address(_shortsTracker), _value));
        _validateAction(action);
        _clearAction(action);

        _shortsTracker.setIsGlobalShortDataReady(_value);

        emit SetIsGlobalShortDataReady(address(_shortsTracker), _value);
    }

    function disableIsGlobalShortDataReady(IShortsTracker _shortsTracker) external onlyAdmin {
        _shortsTracker.setIsGlobalShortDataReady(false);

        emit SetIsGlobalShortDataReady(address(_shortsTracker), false);
    }

    function setGlobalShortAveragePrices(IShortsTracker _shortsTracker, address[] calldata _tokens, uint256[] calldata _averagePrices) external onlyHandler {
        _shortsTracker.setIsGlobalShortDataReady(false);

        for (uint256 i = 0; i < _tokens.length; i++) {
            address token = _tokens[i];
            uint256 oldAveragePrice = _shortsTracker.globalShortAveragePrices(token);
            uint256 newAveragePrice = _averagePrices[i];
            uint256 diff = newAveragePrice > oldAveragePrice ? newAveragePrice.sub(oldAveragePrice) : oldAveragePrice.sub(newAveragePrice);
            require(diff.mul(BASIS_POINTS_DIVISOR).div(oldAveragePrice) < maxAveragePriceChange, "ShortsTrackerTimelock: too big change");

            require(block.timestamp >= lastUpdated[token].add(averagePriceUpdateDelay), "ShortsTrackerTimelock: too early");
            lastUpdated[token] = block.timestamp;

            emit GlobalShortAveragePriceUpdated(token, oldAveragePrice, newAveragePrice);
        }

        _shortsTracker.setInitData(_tokens, _averagePrices);
    }

    function _setPendingAction(bytes32 _action) private {
        require(pendingActions[_action] == 0, "ShortsTrackerTimelock: action already signalled");
        pendingActions[_action] = block.timestamp.add(buffer);
        emit SignalPendingAction(_action);
    }

    function _validateAction(bytes32 _action) private view {
        require(pendingActions[_action] != 0, "ShortsTrackerTimelock: action not signalled");
        require(pendingActions[_action] <= block.timestamp, "ShortsTrackerTimelock: action time not yet passed");
    }

    function _clearAction(bytes32 _action) private {
        require(pendingActions[_action] != 0, "ShortsTrackerTimelock: invalid _action");
        delete pendingActions[_action];
        emit ClearAction(_action);
    }
}
        

contracts/access/Governable.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

contract Governable {
    address public gov;

    constructor() public {
        gov = msg.sender;
    }

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
    }
}
          

contracts/core/interfaces/IShortsTracker.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IShortsTracker {
    function isGlobalShortDataReady() external view returns (bool);
    function globalShortAveragePrices(address _token) external view returns (uint256);
    function getNextGlobalShortData(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _nextPrice,
        uint256 _sizeDelta,
        bool _isIncrease
    ) external view returns (uint256, uint256);
    function updateGlobalShortData(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        uint256 _sizeDelta,
        uint256 _markPrice,
        bool _isIncrease
    ) external;
    function setIsGlobalShortDataReady(bool value) external;
    function setInitData(address[] calldata _tokens, uint256[] calldata _averagePrices) external;
}
          

contracts/libraries/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":8,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","inputs":[{"type":"address","name":"_admin","internalType":"address"},{"type":"uint256","name":"_buffer","internalType":"uint256"},{"type":"uint256","name":"_averagePriceUpdateDelay","internalType":"uint256"},{"type":"uint256","name":"_maxAveragePriceChange","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BASIS_POINTS_DIVISOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_BUFFER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"averagePriceUpdateDelay","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buffer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableIsGlobalShortDataReady","inputs":[{"type":"address","name":"_shortsTracker","internalType":"contract IShortsTracker"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isHandler","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastUpdated","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxAveragePriceChange","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingActions","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAveragePriceUpdateDelay","inputs":[{"type":"uint256","name":"_averagePriceUpdateDelay","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuffer","inputs":[{"type":"uint256","name":"_buffer","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGlobalShortAveragePrices","inputs":[{"type":"address","name":"_shortsTracker","internalType":"contract IShortsTracker"},{"type":"address[]","name":"_tokens","internalType":"address[]"},{"type":"uint256[]","name":"_averagePrices","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGov","inputs":[{"type":"address","name":"_shortsTracker","internalType":"address"},{"type":"address","name":"_gov","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHandler","inputs":[{"type":"address","name":"_handler","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsGlobalShortDataReady","inputs":[{"type":"address","name":"_shortsTracker","internalType":"contract IShortsTracker"},{"type":"bool","name":"_value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxAveragePriceChange","inputs":[{"type":"uint256","name":"_maxAveragePriceChange","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetAdmin","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetAveragePriceUpdateDelay","inputs":[{"type":"uint256","name":"_averagePriceUpdateDelay","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetGov","inputs":[{"type":"address","name":"_shortsTracker","internalType":"address"},{"type":"address","name":"_gov","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetIsGlobalShortDataReady","inputs":[{"type":"address","name":"_shortsTracker","internalType":"contract IShortsTracker"},{"type":"bool","name":"_value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetMaxAveragePriceChange","inputs":[{"type":"uint256","name":"_maxAveragePriceChange","internalType":"uint256"}]},{"type":"event","name":"ClearAction","inputs":[{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"GlobalShortAveragePriceUpdated","inputs":[{"type":"address","name":"token","indexed":true},{"type":"uint256","name":"oldAveragePrice","indexed":false},{"type":"uint256","name":"newAveragePrice","indexed":false}],"anonymous":false},{"type":"event","name":"SetAdmin","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false},{"type":"event","name":"SetAveragePriceUpdateDelay","inputs":[{"type":"uint256","name":"averagePriceUpdateDelay","indexed":false}],"anonymous":false},{"type":"event","name":"SetGov","inputs":[{"type":"address","name":"target","indexed":false},{"type":"address","name":"gov","indexed":false}],"anonymous":false},{"type":"event","name":"SetHandler","inputs":[{"type":"address","name":"handler","indexed":true},{"type":"bool","name":"isHandler","indexed":false}],"anonymous":false},{"type":"event","name":"SetIsGlobalShortDataReady","inputs":[{"type":"address","name":"target","indexed":false},{"type":"bool","name":"isGlobalShortDataReady","indexed":false}],"anonymous":false},{"type":"event","name":"SetMaxAveragePriceChange","inputs":[{"type":"uint256","name":"maxAveragePriceChange","indexed":false}],"anonymous":false},{"type":"event","name":"SignalPendingAction","inputs":[{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetAdmin","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetAveragePriceUpdateDelay","inputs":[{"type":"uint256","name":"averagePriceUpdateDelay","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetGov","inputs":[{"type":"address","name":"target","indexed":false},{"type":"address","name":"gov","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetIsGlobalShortDataReady","inputs":[{"type":"address","name":"target","indexed":false},{"type":"bool","name":"isGlobalShortDataReady","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetMaxAveragePriceChange","inputs":[{"type":"uint256","name":"maxAveragePriceChange","indexed":false}],"anonymous":false}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50604051611c14380380611c148339818101604052608081101561003357600080fd5b50805160208201516040830151606090930151600180546001600160a01b0319166001600160a01b0390941693909317909255600255600591909155600655611b93806100816000396000f3fe608060405234801561001057600080fd5b506004361061011d5760003560e01c80630a6f93e614610122578063126082cf1461015a5780631ab8fe04146101625780632591d4831461016a5780632c166c411461019a57806333156639146101b75780633976e566146101d457806342588a67146102a257806342773c2c146102bf57806346ea87af146102c75780634882fa131461030157806351a6de0d1461032f5780635c3bca361461035d57806361d075691461037a578063627395eb14610382578063704b6c02146103a8578063717cf5d6146103ce578063996a7a1e146103f45780639cb7de4b14610422578063adc7ea3714610450578063e30569e51461046d578063edaafe201461048a578063f851a44014610492575b600080fd5b6101486004803603602081101561013857600080fd5b50356001600160a01b03166104b6565b60408051918252519081900360200190f35b6101486104c8565b6101486104ce565b6101986004803603604081101561018057600080fd5b506001600160a01b03813516906020013515156104d4565b005b610198600480360360208110156101b057600080fd5b5035610627565b610198600480360360208110156101cd57600080fd5b5035610706565b610198600480360360608110156101ea57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561021457600080fd5b82018360208201111561022657600080fd5b803590602001918460208302840111600160201b8311171561024757600080fd5b919390929091602081019035600160201b81111561026457600080fd5b82018360208201111561027657600080fd5b803590602001918460208302840111600160201b8311171561029757600080fd5b5090925090506107e7565b610198600480360360208110156102b857600080fd5b5035610b86565b610148610c59565b6102ed600480360360208110156102dd57600080fd5b50356001600160a01b0316610c5f565b604080519115158252519081900360200190f35b6101986004803603604081101561031757600080fd5b506001600160a01b0381351690602001351515610c74565b6101986004803603604081101561034557600080fd5b506001600160a01b0381358116916020013516610d70565b6101986004803603602081101561037357600080fd5b5035610ec8565b610148610f99565b6101986004803603602081101561039857600080fd5b50356001600160a01b0316610fa0565b610198600480360360208110156103be57600080fd5b50356001600160a01b031661107c565b610198600480360360208110156103e457600080fd5b50356001600160a01b0316611170565b6101986004803603604081101561040a57600080fd5b506001600160a01b038135811691602001351661128b565b6101986004803603604081101561043857600080fd5b506001600160a01b03813516906020013515156113b8565b6101986004803603602081101561046657600080fd5b5035611461565b6101486004803603602081101561048357600080fd5b5035611531565b610148611543565b61049a611549565b604080516001600160a01b039092168252519081900360200190f35b60046020526000908152604090205481565b61271081565b60055481565b6001546001600160a01b0316331461051d5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051787365744973476c6f62616c53686f727444617461526561647960381b6020808301919091526001600160601b0319606086901b16603983015283151560f81b604d8301528251602e818403018152604e909201909252805191012061058681611558565b61058f816115f2565b826001600160a01b0316633d30cabf836040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b1580156105d757600080fd5b505af11580156105eb573d6000803e3d6000fd5b5050604080516001600160a01b0387168152851515602082015281516000805160206119d08339815191529450908190039091019150a1505050565b6001546001600160a01b031633146106705760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051777365744d61784176657261676550726963654368616e676560401b602080830191909152603880830185905283518084039091018152605890920190925280519101206106c181611558565b6106ca816115f2565b60068290556040805183815290517fe846c28c10eef345d8d4fea8b403bfac624c32c3e64ce0b666f23404f2edb5149181900360200190a15050565b6001546001600160a01b0316331461074f5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080517973657441766572616765507269636555706461746544656c617960301b602080830191909152603a80830185905283518084039091018152605a90920190925280519101206107a281611558565b6107ab816115f2565b60058290556040805183815290517fa043b6b847902bb85c2a2575e9bce3a077bcaad8ec888ac941f50a6f4acdbb3d9181900360200190a15050565b3360009081526003602052604090205460ff168061080f57506001546001600160a01b031633145b61084a5760405162461bcd60e51b8152600401808060200182810382526028815260200180611a166028913960400191505060405180910390fd5b60408051633d30cabf60e01b815260006004820181905291516001600160a01b03881692633d30cabf926024808201939182900301818387803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b5050505060005b83811015610ac15760008585838181106108c157fe5b905060200201356001600160a01b031690506000876001600160a01b03166362749803836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561092257600080fd5b505afa158015610936573d6000803e3d6000fd5b505050506040513d602081101561094c57600080fd5b50519050600085858581811061095e57fe5b905060200201359050600082821161097f5761097a8383611683565b610989565b6109898284611683565b6006549091506109a58461099f846127106116ce565b90611727565b106109e15760405162461bcd60e51b8152600401808060200182810382526025815260200180611b396025913960400191505060405180910390fd5b6005546001600160a01b038516600090815260046020526040902054610a0691611766565b421015610a5a576040805162461bcd60e51b815260206004820181905260248201527f53686f727473547261636b657254696d656c6f636b3a20746f6f206561726c79604482015290519081900360640190fd5b6001600160a01b038416600081815260046020908152604091829020429055815186815290810185905281517fa6a58ff784b1e07988de90568885d7bbd8e5485c3ec4344195c7306108553256929181900390910190a25050600190920191506108ab9050565b50846001600160a01b031663bbd97187858585856040518563ffffffff1660e01b81526004018080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b505050505050505050565b6001546001600160a01b03163314610bcf5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080517973657441766572616765507269636555706461746544656c617960301b602080830191909152603a80830185905283518084039091018152605a9092019092528051910120610c22816117be565b6040805183815290517fc226c48cee6a025ab009e01969a2e89f1ce4d455cfa2900745b2237cb0bb8d619181900360200190a15050565b60065481565b60036020526000908152604090205460ff1681565b6001546001600160a01b03163314610cbd5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051787365744973476c6f62616c53686f727444617461526561647960381b6020808301919091526001600160601b0319606086901b16603983015283151560f81b604d8301528251602e818403018152604e9092019092528051910120610d26816117be565b604080516001600160a01b0385168152831515602082015281517f362e5bba25647700de1a7562fc07672df837bef17125e07a6f79abea31ee5a48929181900390910190a1505050565b6001546001600160a01b03163314610db95760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e9092019092528051910120610e0e81611558565b610e17816115f2565b826001600160a01b031663cfad57a2836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015281517f53351836099c03ffc3b1727d8abd4b0222afa87d4ed76ae3102d51369ef7f7859450908190039091019150a1505050565b6001546001600160a01b03163314610f115760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051777365744d61784176657261676550726963654368616e676560401b60208083019190915260388083018590528351808403909101815260589092019092528051910120610f62816117be565b6040805183815290517f21f68305d262b9ce144019f5d9f755a2dd1b5c2d35996cd4b649c285d7525cd19181900360200190a15050565b6206978081565b6001546001600160a01b03163314610fe95760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051633d30cabf60e01b815260006004820181905291516001600160a01b03841692633d30cabf926024808201939182900301818387803b15801561102f57600080fd5b505af1158015611043573d6000803e3d6000fd5b5050604080516001600160a01b03851681526000602082015281516000805160206119d08339815191529450908190039091019150a150565b6001546001600160a01b031633146110c55760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080516739b2ba20b236b4b760c11b6020808301919091526001600160601b0319606085901b1660288301528251601c818403018152603c909201909252805191012061111281611558565b61111b816115f2565b600180546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a15050565b6001546001600160a01b031633146111b95760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b6001600160a01b0381166111fe5760405162461bcd60e51b8152600401808060200182810382526024815260200180611abf6024913960400191505060405180910390fd5b604080516739b2ba20b236b4b760c11b6020808301919091526001600160601b0319606085901b1660288301528251601c818403018152603c909201909252805191012061124b816117be565b604080516001600160a01b038416815290517fbccacda50126e9efa231593d2a9d4394d7cda7909ab2e14d2ae878ab2a306b3f9181900360200190a15050565b6001546001600160a01b031633146112d45760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b6001600160a01b0381166113195760405162461bcd60e51b815260040180806020018281038252602281526020018061195d6022913960400191505060405180910390fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e909201909252805191012061136e816117be565b604080516001600160a01b0380861682528416602082015281517f84f5d90471bb5811423318895e49ef4de52f5a6f4dac67af85e4202410bb66a4929181900390910190a1505050565b6001546001600160a01b031633146114015760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b6001600160a01b038216600081815260036020908152604091829020805460ff1916851515908117909155825190815291517fd373464a39404e5f98fdb4b152b8ba9a094561e97e5c4b4ea11eb18cd9e6695e9281900390910190a25050565b6001546001600160a01b031633146114aa5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b620697808111156114ec5760405162461bcd60e51b8152600401808060200182810382526025815260200180611ae36025913960400191505060405180910390fd5b600254811161152c5760405162461bcd60e51b8152600401808060200182810382526031815260200180611b086031913960400191505060405180910390fd5b600255565b60006020819052908152604090205481565b60025481565b6001546001600160a01b031681565b6000818152602081905260409020546115a25760405162461bcd60e51b815260040180806020018281038252602b8152602001806119a5602b913960400191505060405180910390fd5b6000818152602081905260409020544210156115ef5760405162461bcd60e51b8152600401808060200182810382526031815260200180611a8e6031913960400191505060405180910390fd5b50565b60008181526020819052604090205461163c5760405162461bcd60e51b815260040180806020018281038252602681526020018061197f6026913960400191505060405180910390fd5b60008181526020818152604080832092909255815183815291517f194ed6dd5e37e2acc44a19455c3f208c4831ee695fe362d9c4ef2d316bc53aec9281900390910190a150565b60006116c583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611860565b90505b92915050565b6000826116dd575060006116c8565b828202828482816116ea57fe5b04146116c55760405162461bcd60e51b8152600401808060200182810382526021815260200180611a6d6021913960400191505060405180910390fd5b60006116c583836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506118f7565b6000828201838110156116c5576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600081815260208190526040902054156118095760405162461bcd60e51b815260040180806020018281038252602f815260200180611a3e602f913960400191505060405180910390fd5b600254611817904290611766565b6000828152602081815260409182902092909255805183815290517f5fb9c0ecf7b4a28c4c480212e868f9da7f373a2ed4d23498b0be6aadf35242fb929181900390910190a150565b600081848411156118ef5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118b457818101518382015260200161189c565b50505050905090810190601f1680156118e15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836119465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156118b457818101518382015260200161189c565b50600083858161195257fe5b049594505050505056fe53686f727473547261636b657254696d656c6f636b3a20696e76616c696420676f7653686f727473547261636b657254696d656c6f636b3a20696e76616c6964205f616374696f6e53686f727473547261636b657254696d656c6f636b3a20616374696f6e206e6f74207369676e616c6c6564177de4361fc37a0e8defe8ac0c685d3472789b507959897eec32350c9d2c366653686f727473547261636b657254696d656c6f636b3a2061646d696e20666f7262696464656e53686f727473547261636b657254696d656c6f636b3a2068616e646c657220666f7262696464656e53686f727473547261636b657254696d656c6f636b3a20616374696f6e20616c7265616479207369676e616c6c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753686f727473547261636b657254696d656c6f636b3a20616374696f6e2074696d65206e6f74207965742070617373656453686f727473547261636b657254696d656c6f636b3a20696e76616c69642061646d696e53686f727473547261636b657254696d656c6f636b3a20696e76616c69642062756666657253686f727473547261636b657254696d656c6f636b3a206275666665722063616e6e6f742062652064656372656173656453686f727473547261636b657254696d656c6f636b3a20746f6f20626967206368616e6765a2646970667358221220f73c1cb32af60700ae62d547ab484579520788dce5fc8372a49e4d051388335864736f6c634300060c0033000000000000000000000000180f4bd2563b95564c0142e269e70c6a84a2ab000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000014

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061011d5760003560e01c80630a6f93e614610122578063126082cf1461015a5780631ab8fe04146101625780632591d4831461016a5780632c166c411461019a57806333156639146101b75780633976e566146101d457806342588a67146102a257806342773c2c146102bf57806346ea87af146102c75780634882fa131461030157806351a6de0d1461032f5780635c3bca361461035d57806361d075691461037a578063627395eb14610382578063704b6c02146103a8578063717cf5d6146103ce578063996a7a1e146103f45780639cb7de4b14610422578063adc7ea3714610450578063e30569e51461046d578063edaafe201461048a578063f851a44014610492575b600080fd5b6101486004803603602081101561013857600080fd5b50356001600160a01b03166104b6565b60408051918252519081900360200190f35b6101486104c8565b6101486104ce565b6101986004803603604081101561018057600080fd5b506001600160a01b03813516906020013515156104d4565b005b610198600480360360208110156101b057600080fd5b5035610627565b610198600480360360208110156101cd57600080fd5b5035610706565b610198600480360360608110156101ea57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561021457600080fd5b82018360208201111561022657600080fd5b803590602001918460208302840111600160201b8311171561024757600080fd5b919390929091602081019035600160201b81111561026457600080fd5b82018360208201111561027657600080fd5b803590602001918460208302840111600160201b8311171561029757600080fd5b5090925090506107e7565b610198600480360360208110156102b857600080fd5b5035610b86565b610148610c59565b6102ed600480360360208110156102dd57600080fd5b50356001600160a01b0316610c5f565b604080519115158252519081900360200190f35b6101986004803603604081101561031757600080fd5b506001600160a01b0381351690602001351515610c74565b6101986004803603604081101561034557600080fd5b506001600160a01b0381358116916020013516610d70565b6101986004803603602081101561037357600080fd5b5035610ec8565b610148610f99565b6101986004803603602081101561039857600080fd5b50356001600160a01b0316610fa0565b610198600480360360208110156103be57600080fd5b50356001600160a01b031661107c565b610198600480360360208110156103e457600080fd5b50356001600160a01b0316611170565b6101986004803603604081101561040a57600080fd5b506001600160a01b038135811691602001351661128b565b6101986004803603604081101561043857600080fd5b506001600160a01b03813516906020013515156113b8565b6101986004803603602081101561046657600080fd5b5035611461565b6101486004803603602081101561048357600080fd5b5035611531565b610148611543565b61049a611549565b604080516001600160a01b039092168252519081900360200190f35b60046020526000908152604090205481565b61271081565b60055481565b6001546001600160a01b0316331461051d5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051787365744973476c6f62616c53686f727444617461526561647960381b6020808301919091526001600160601b0319606086901b16603983015283151560f81b604d8301528251602e818403018152604e909201909252805191012061058681611558565b61058f816115f2565b826001600160a01b0316633d30cabf836040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b1580156105d757600080fd5b505af11580156105eb573d6000803e3d6000fd5b5050604080516001600160a01b0387168152851515602082015281516000805160206119d08339815191529450908190039091019150a1505050565b6001546001600160a01b031633146106705760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051777365744d61784176657261676550726963654368616e676560401b602080830191909152603880830185905283518084039091018152605890920190925280519101206106c181611558565b6106ca816115f2565b60068290556040805183815290517fe846c28c10eef345d8d4fea8b403bfac624c32c3e64ce0b666f23404f2edb5149181900360200190a15050565b6001546001600160a01b0316331461074f5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080517973657441766572616765507269636555706461746544656c617960301b602080830191909152603a80830185905283518084039091018152605a90920190925280519101206107a281611558565b6107ab816115f2565b60058290556040805183815290517fa043b6b847902bb85c2a2575e9bce3a077bcaad8ec888ac941f50a6f4acdbb3d9181900360200190a15050565b3360009081526003602052604090205460ff168061080f57506001546001600160a01b031633145b61084a5760405162461bcd60e51b8152600401808060200182810382526028815260200180611a166028913960400191505060405180910390fd5b60408051633d30cabf60e01b815260006004820181905291516001600160a01b03881692633d30cabf926024808201939182900301818387803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b5050505060005b83811015610ac15760008585838181106108c157fe5b905060200201356001600160a01b031690506000876001600160a01b03166362749803836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561092257600080fd5b505afa158015610936573d6000803e3d6000fd5b505050506040513d602081101561094c57600080fd5b50519050600085858581811061095e57fe5b905060200201359050600082821161097f5761097a8383611683565b610989565b6109898284611683565b6006549091506109a58461099f846127106116ce565b90611727565b106109e15760405162461bcd60e51b8152600401808060200182810382526025815260200180611b396025913960400191505060405180910390fd5b6005546001600160a01b038516600090815260046020526040902054610a0691611766565b421015610a5a576040805162461bcd60e51b815260206004820181905260248201527f53686f727473547261636b657254696d656c6f636b3a20746f6f206561726c79604482015290519081900360640190fd5b6001600160a01b038416600081815260046020908152604091829020429055815186815290810185905281517fa6a58ff784b1e07988de90568885d7bbd8e5485c3ec4344195c7306108553256929181900390910190a25050600190920191506108ab9050565b50846001600160a01b031663bbd97187858585856040518563ffffffff1660e01b81526004018080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b505050505050505050565b6001546001600160a01b03163314610bcf5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080517973657441766572616765507269636555706461746544656c617960301b602080830191909152603a80830185905283518084039091018152605a9092019092528051910120610c22816117be565b6040805183815290517fc226c48cee6a025ab009e01969a2e89f1ce4d455cfa2900745b2237cb0bb8d619181900360200190a15050565b60065481565b60036020526000908152604090205460ff1681565b6001546001600160a01b03163314610cbd5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051787365744973476c6f62616c53686f727444617461526561647960381b6020808301919091526001600160601b0319606086901b16603983015283151560f81b604d8301528251602e818403018152604e9092019092528051910120610d26816117be565b604080516001600160a01b0385168152831515602082015281517f362e5bba25647700de1a7562fc07672df837bef17125e07a6f79abea31ee5a48929181900390910190a1505050565b6001546001600160a01b03163314610db95760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e9092019092528051910120610e0e81611558565b610e17816115f2565b826001600160a01b031663cfad57a2836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015281517f53351836099c03ffc3b1727d8abd4b0222afa87d4ed76ae3102d51369ef7f7859450908190039091019150a1505050565b6001546001600160a01b03163314610f115760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051777365744d61784176657261676550726963654368616e676560401b60208083019190915260388083018590528351808403909101815260589092019092528051910120610f62816117be565b6040805183815290517f21f68305d262b9ce144019f5d9f755a2dd1b5c2d35996cd4b649c285d7525cd19181900360200190a15050565b6206978081565b6001546001600160a01b03163314610fe95760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b60408051633d30cabf60e01b815260006004820181905291516001600160a01b03841692633d30cabf926024808201939182900301818387803b15801561102f57600080fd5b505af1158015611043573d6000803e3d6000fd5b5050604080516001600160a01b03851681526000602082015281516000805160206119d08339815191529450908190039091019150a150565b6001546001600160a01b031633146110c55760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b604080516739b2ba20b236b4b760c11b6020808301919091526001600160601b0319606085901b1660288301528251601c818403018152603c909201909252805191012061111281611558565b61111b816115f2565b600180546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a15050565b6001546001600160a01b031633146111b95760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b6001600160a01b0381166111fe5760405162461bcd60e51b8152600401808060200182810382526024815260200180611abf6024913960400191505060405180910390fd5b604080516739b2ba20b236b4b760c11b6020808301919091526001600160601b0319606085901b1660288301528251601c818403018152603c909201909252805191012061124b816117be565b604080516001600160a01b038416815290517fbccacda50126e9efa231593d2a9d4394d7cda7909ab2e14d2ae878ab2a306b3f9181900360200190a15050565b6001546001600160a01b031633146112d45760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b6001600160a01b0381166113195760405162461bcd60e51b815260040180806020018281038252602281526020018061195d6022913960400191505060405180910390fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e909201909252805191012061136e816117be565b604080516001600160a01b0380861682528416602082015281517f84f5d90471bb5811423318895e49ef4de52f5a6f4dac67af85e4202410bb66a4929181900390910190a1505050565b6001546001600160a01b031633146114015760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b6001600160a01b038216600081815260036020908152604091829020805460ff1916851515908117909155825190815291517fd373464a39404e5f98fdb4b152b8ba9a094561e97e5c4b4ea11eb18cd9e6695e9281900390910190a25050565b6001546001600160a01b031633146114aa5760405162461bcd60e51b81526004018080602001828103825260268152602001806119f06026913960400191505060405180910390fd5b620697808111156114ec5760405162461bcd60e51b8152600401808060200182810382526025815260200180611ae36025913960400191505060405180910390fd5b600254811161152c5760405162461bcd60e51b8152600401808060200182810382526031815260200180611b086031913960400191505060405180910390fd5b600255565b60006020819052908152604090205481565b60025481565b6001546001600160a01b031681565b6000818152602081905260409020546115a25760405162461bcd60e51b815260040180806020018281038252602b8152602001806119a5602b913960400191505060405180910390fd5b6000818152602081905260409020544210156115ef5760405162461bcd60e51b8152600401808060200182810382526031815260200180611a8e6031913960400191505060405180910390fd5b50565b60008181526020819052604090205461163c5760405162461bcd60e51b815260040180806020018281038252602681526020018061197f6026913960400191505060405180910390fd5b60008181526020818152604080832092909255815183815291517f194ed6dd5e37e2acc44a19455c3f208c4831ee695fe362d9c4ef2d316bc53aec9281900390910190a150565b60006116c583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611860565b90505b92915050565b6000826116dd575060006116c8565b828202828482816116ea57fe5b04146116c55760405162461bcd60e51b8152600401808060200182810382526021815260200180611a6d6021913960400191505060405180910390fd5b60006116c583836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506118f7565b6000828201838110156116c5576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600081815260208190526040902054156118095760405162461bcd60e51b815260040180806020018281038252602f815260200180611a3e602f913960400191505060405180910390fd5b600254611817904290611766565b6000828152602081815260409182902092909255805183815290517f5fb9c0ecf7b4a28c4c480212e868f9da7f373a2ed4d23498b0be6aadf35242fb929181900390910190a150565b600081848411156118ef5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118b457818101518382015260200161189c565b50505050905090810190601f1680156118e15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836119465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156118b457818101518382015260200161189c565b50600083858161195257fe5b049594505050505056fe53686f727473547261636b657254696d656c6f636b3a20696e76616c696420676f7653686f727473547261636b657254696d656c6f636b3a20696e76616c6964205f616374696f6e53686f727473547261636b657254696d656c6f636b3a20616374696f6e206e6f74207369676e616c6c6564177de4361fc37a0e8defe8ac0c685d3472789b507959897eec32350c9d2c366653686f727473547261636b657254696d656c6f636b3a2061646d696e20666f7262696464656e53686f727473547261636b657254696d656c6f636b3a2068616e646c657220666f7262696464656e53686f727473547261636b657254696d656c6f636b3a20616374696f6e20616c7265616479207369676e616c6c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753686f727473547261636b657254696d656c6f636b3a20616374696f6e2074696d65206e6f74207965742070617373656453686f727473547261636b657254696d656c6f636b3a20696e76616c69642061646d696e53686f727473547261636b657254696d656c6f636b3a20696e76616c69642062756666657253686f727473547261636b657254696d656c6f636b3a206275666665722063616e6e6f742062652064656372656173656453686f727473547261636b657254696d656c6f636b3a20746f6f20626967206368616e6765a2646970667358221220f73c1cb32af60700ae62d547ab484579520788dce5fc8372a49e4d051388335864736f6c634300060c0033