ETH Price: $3,887.84 (+0.03%)

Token

MetaGaming Guild (MGG)
 

Overview

Max Total Supply

1,000,000,000 MGG

Holders

392 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
14,956.552400740494328841 MGG

Value
$0.00
0x117480d66c2132f38cacc393ab5f8c4123d0345a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MGG

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-19
*/

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @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 addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    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 multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b, string memory errorMessage) 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, errorMessage);

        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) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }
}

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0));
        return role.bearer[account];
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// ----------------------------------------------------------------------------
// Contract function to receive approval and execute function in one call
// ----------------------------------------------------------------------------
contract ApproveAndCallFallBack {
    function receiveApproval(address from, uint256 tokens, address token, bytes memory data) public;
}

contract PauserRole {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender));
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is PauserRole {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

contract MGG is Ownable, Pausable {
    /// @notice EIP-20 token name for this token
    string public constant name = "MetaGaming Guild";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "MGG";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 18;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 1_000_000_000e18; // 1 billion MGG

    /// @notice Allowance amounts on behalf of others
    mapping (address => mapping (address => uint96)) internal allowances;

    /// @notice Official record of token balances for each account
    mapping (address => uint96) internal balances;

    /// @notice A record of each accounts delegate
    mapping (address => address) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /// @notice The Admin Token Recovery event
    event AdminTokenRecovery(address tokenRecovered, uint256 amount);

    /// @notice The standard EIP-20 burn event
    event Burn(address indexed from, uint256 value);

    /**
     * @notice Construct a new DGG token
     * @param account The initial account to grant all the tokens
     */
    constructor(address account) public {
        balances[account] = uint96(totalSupply);
        emit Transfer(address(0), account, totalSupply);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint rawAmount) external whenNotPaused returns (bool) {
        uint96 amount;
        if (rawAmount == uint(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(rawAmount, "MGG::approve: amount exceeds 96 bits");
        }

        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint rawAmount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        uint96 amount;
        if (rawAmount == uint(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(rawAmount, "MGG::permit: amount exceeds 96 bits");
        }

        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, rawAmount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "MGG::permit: invalid signature");
        require(signatory == owner, "MGG::permit: unauthorized");
        require(now <= deadline, "MGG::permit: signature expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint rawAmount) external whenNotPaused returns (bool) {
        uint96 amount = safe96(rawAmount, "MGG::transfer: amount exceeds 96 bits");
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint rawAmount) external whenNotPaused returns (bool) {
        address spender = msg.sender;
        uint96 spenderAllowance = allowances[src][spender];
        uint96 amount = safe96(rawAmount, "MGG::transferFrom: amount exceeds 96 bits");

        if (spender != src && spenderAllowance != uint96(-1)) {
            uint96 newAllowance = sub96(spenderAllowance, amount, "MGG::transferFrom: transfer amount exceeds spender allowance");
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "MGG::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "MGG::delegateBySig: invalid nonce");
        require(now <= expiry, "MGG::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) public view returns (uint96) {
        require(blockNumber < block.number, "MGG::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transferTokens(address src, address dst, uint96 amount) internal {
        require(src != address(0), "MGG::_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "MGG::_transferTokens: cannot transfer to the zero address");

        balances[src] = sub96(balances[src], amount, "MGG::_transferTokens: transfer amount exceeds balance");
        balances[dst] = add96(balances[dst], amount, "MGG::_transferTokens: transfer amount overflows");
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, "MGG::_moveDelegates: vote amount underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, "MGG::_moveDelegates: vote amount overflows");
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
      uint32 blockNumber = safe32(block.number, "MGG::_writeCheckpoint: block number exceeds 32 bits");

      if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
      } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }

    /**
     * @notice It allows the admin to retrieve lost tokens sent to the contract
     * @param _tokenAddress: the address of the token to withdraw
     * @param _tokenAmount: the number of tokens to withdraw
     * @dev This function is only callable by admin.
     */
    function retrieveLostTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner {
        require(_tokenAddress != address(0), "MGG::retrieveLostTokens: Invalid _tokenAddress");

        IERC20(_tokenAddress).transfer(address(msg.sender), _tokenAmount);

        emit AdminTokenRecovery(_tokenAddress, _tokenAmount);
    }
    
    function burn(uint rawAmount) public returns (bool success) {
        uint96 amount = safe96(rawAmount, "MGG::burn: amount exceeds 96 bits");
        require(balances[msg.sender] >= amount, "MGG::burn: not enough balance");   // Check if the sender has enough
        balances[msg.sender] = sub96(balances[msg.sender], amount, "MGG::burn: burn amount exceeds balance");  // Subtract from the sender
        totalSupply = SafeMath.sub(totalSupply, rawAmount);  // Updates totalSupply
        emit Burn(msg.sender, rawAmount);
        return true;
    }

    /**
     * @notice Token owner can approve for spender to transferFrom(...) tokens from the token owner's account. The spender contract function receiveApproval(...) is then executed   
     * @param spender address The address which will spend the funds
     * @param rawAmount uint256 The amount of tokens to be spent
     * @param data bytes Additional data with no specified format, sent in call to `spender`
     */
    function approveAndCall(address spender, uint rawAmount, bytes memory data) public returns (bool success) {
        uint96 amount = safe96(rawAmount, "MGG::approveAndCall: amount exceeds 96 bits");
        allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        ApproveAndCallFallBack(spender).receiveApproval(msg.sender, rawAmount, address(this), data);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"retrieveLostTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526b033b2e3c9fd0803ce80000006003553480156200002157600080fd5b5060405162002faa38038062002faa833981016040819052620000449162000236565b6000620000596001600160e01b036200014016565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000b7336001600160e01b036200014416565b6002805460ff19169055600380546001600160a01b03831660008181526005602052604080822080546001600160601b0319166001600160601b0390951694909417909355925491519092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9162000131919062000270565b60405180910390a350620002af565b3390565b6200015f8160016200019660201b62001ae41790919060201c565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b038116620001aa57600080fd5b620001bf82826001600160e01b03620001ef16565b15620001ca57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200020557600080fd5b506001600160a01b03811660009081526020839052604090205460ff165b92915050565b8051620002238162000295565b6000602082840312156200024957600080fd5b600062000257848462000229565b949350505050565b6200026a8162000292565b82525050565b602081016200022382846200025f565b60006001600160a01b03821662000223565b90565b620002a08162000280565b8114620002ac57600080fd5b50565b612ceb80620002bf6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b4b5ea57116100ad578063d660b6511161007c578063d660b651146103f6578063dd62ed3e14610409578063e7a324dc1461041c578063f1127ed814610424578063f2fde38b14610445576101fb565b8063b4b5ea57146103aa578063c3cda520146103bd578063cae9ca51146103d0578063d505accf146103e3576101fb565b80638456cb59116100e95780638456cb591461037f5780638da5cb5b1461038757806395d89b411461038f578063a9059cbb14610397576101fb565b8063715018a614610331578063782d6fe1146103395780637ecebe001461035957806382dc1ec41461036c576101fb565b806342966c68116101925780635c975abb116101615780635c975abb146102ee5780636ef8d66d146102f65780636fcfff45146102fe57806370a082311461031e576101fb565b806342966c681461029557806346fbf68e146102a8578063587cde1e146102bb5780635c19a95c146102db576101fb565b806323b872dd116101ce57806323b872dd1461025b57806330adf81f1461026e578063313ce567146102765780633f4ba83a1461028b576101fb565b806306fdde0314610200578063095ea7b31461021e57806318160ddd1461023e57806320606b7014610253575b600080fd5b610208610458565b60405161021591906127d9565b60405180910390f35b61023161022c366004611ef7565b610484565b60405161021591906126d5565b610246610543565b60405161021591906126e3565b610246610549565b610231610269366004611e0e565b610560565b6102466106a8565b61027e6106b4565b60405161021591906128e3565b6102936106b9565b005b6102316102a3366004612057565b61071e565b6102316102b6366004611dae565b61084c565b6102ce6102c9366004611dae565b61085f565b604051610215919061264c565b6102936102e9366004611dae565b61087a565b610231610887565b610293610890565b61031161030c366004611dae565b61089b565b60405161021591906128ba565b61024661032c366004611dae565b6108b3565b6102936108d7565b61034c610347366004611ef7565b610956565b60405161021591906128ff565b610246610367366004611dae565b610b64565b61029361037a366004611dae565b610b76565b610293610b91565b6102ce610bf0565b610208610bff565b6102316103a5366004611ef7565b610c1e565b61034c6103b8366004611dae565b610c6c565b6102936103cb366004611f82565b610cdc565b6102316103de366004611f27565b610ece565b6102936103f1366004611e5b565b610fc9565b610293610404366004611ef7565b6112ab565b610246610417366004611dd4565b6113c4565b6102466113f8565b610437610432366004612009565b611404565b6040516102159291906128c8565b610293610453366004611dae565b611439565b6040518060400160405280601081526020016f13595d1851d85b5a5b99c811dd5a5b1960821b81525081565b60025460009060ff161561049757600080fd5b60006000198314156104ac57506000196104d1565b6104ce83604051806060016040528060248152602001612b9a60249139611477565b90505b3360008181526004602090815260408083206001600160a01b03891680855292529182902080546001600160601b0319166001600160601b0386161790559051909190600080516020612c418339815191529061052f9085906128f1565b60405180910390a360019150505b92915050565b60035481565b60405161055590612636565b604051809103902081565b60025460009060ff161561057357600080fd5b6001600160a01b03841660009081526004602090815260408083203380855290835281842054825160608101909352602980845291946001600160601b039091169390926105c9928892612b0090830139611477565b9050866001600160a01b0316836001600160a01b0316141580156105f657506001600160601b0382811614155b1561068e57600061062083836040518060600160405280603c8152602001612b29603c91396114a6565b6001600160a01b038981166000818152600460209081526040808320948a16808452949091529081902080546001600160601b0319166001600160601b038616179055519293509091600080516020612c41833981519152906106849085906128f1565b60405180910390a3505b6106998787836114e5565b600193505050505b9392505050565b6040516105559061262b565b601281565b6106c23361084c565b6106cb57600080fd5b60025460ff166106da57600080fd5b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9061071490339061265a565b60405180910390a1565b60008061074383604051806060016040528060218152602001612bbe60219139611477565b336000908152600560205260409020549091506001600160601b038083169116101561078a5760405162461bcd60e51b81526004016107819061284a565b60405180910390fd5b336000908152600560209081526040918290205482516060810190935260268084526107cc936001600160601b039092169285929190612a84908301396114a6565b33600090815260056020526040902080546001600160601b0319166001600160601b03929092169190911790556003546108069084611690565b60035560405133907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061083b9086906126e3565b60405180910390a250600192915050565b600061053d60018363ffffffff6116d216565b6006602052600090815260409020546001600160a01b031681565b6108843382611707565b50565b60025460ff1690565b61089933611791565b565b60086020526000908152604090205463ffffffff1681565b6001600160a01b03166000908152600560205260409020546001600160601b031690565b6108df6117d9565b6000546001600160a01b0390811691161461090c5760405162461bcd60e51b81526004016107819061288a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60004382106109775760405162461bcd60e51b81526004016107819061289a565b6001600160a01b03831660009081526008602052604090205463ffffffff16806109a557600091505061053d565b6001600160a01b038416600090815260076020908152604080832063ffffffff600019860181168552925290912054168310610a21576001600160a01b03841660009081526007602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b0316905061053d565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff16831015610a5c57600091505061053d565b600060001982015b8163ffffffff168163ffffffff161115610b1f57600282820363ffffffff16048103610a8e611d0c565b506001600160a01b038716600090815260076020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610afa5760200151945061053d9350505050565b805163ffffffff16871115610b1157819350610b18565b6001820392505b5050610a64565b506001600160a01b038516600090815260076020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b60096020526000908152604090205481565b610b7f3361084c565b610b8857600080fd5b610884816117dd565b610b9a3361084c565b610ba357600080fd5b60025460ff1615610bb357600080fd5b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589061071490339061265a565b6000546001600160a01b031690565b604051806040016040528060038152602001624d474760e81b81525081565b60025460009060ff1615610c3157600080fd5b6000610c5583604051806060016040528060258152602001612c8460259139611477565b9050610c623385836114e5565b5060019392505050565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610c975760006106a1565b6001600160a01b0383166000908152600760209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03169392505050565b6000604051610cea90612636565b60408051918290038220828201909152601082526f13595d1851d85b5a5b99c811dd5a5b1960821b6020909201919091527f12717300686a489488a90080f7cc7f090152151e495ab76cbbcbd3c2c220e1b8610d44611825565b30604051602001610d589493929190612789565b6040516020818303038152906040528051906020012090506000604051610d7e90612641565b604051908190038120610d99918a908a908a9060200161274b565b60405160208183030381529060405280519060200120905060008282604051602001610dc69291906125fa565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610e0394939291906127be565b6020604051602081039080840390855afa158015610e25573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e585760405162461bcd60e51b81526004016107819061286a565b6001600160a01b03811660009081526009602052604090208054600181019091558914610e975760405162461bcd60e51b81526004016107819061282a565b87421115610eb75760405162461bcd60e51b8152600401610781906127fa565b610ec1818b611707565b505050505b505050505050565b600080610ef3846040518060600160405280602b8152602001612ad5602b9139611477565b3360008181526004602090815260408083206001600160a01b038b1680855292529182902080546001600160601b0319166001600160601b038616179055905192935091600080516020612c4183398151915290610f529085906128f1565b60405180910390a3604051638f4ffcb160e01b81526001600160a01b03861690638f4ffcb190610f8c903390889030908990600401612683565b600060405180830381600087803b158015610fa657600080fd5b505af1158015610fba573d6000803e3d6000fd5b50600198975050505050505050565b6000600019861415610fde5750600019611003565b61100086604051806060016040528060238152602001612c6160239139611477565b90505b600060405161101190612636565b60408051918290038220828201909152601082526f13595d1851d85b5a5b99c811dd5a5b1960821b6020909201919091527f12717300686a489488a90080f7cc7f090152151e495ab76cbbcbd3c2c220e1b861106b611825565b3060405160200161107f9493929190612789565b60405160208183030381529060405280519060200120905060006040516110a59061262b565b604080519182900382206001600160a01b038d166000908152600960209081529290208054600181019091556110e79391928e928e928e9290918e91016126f1565b604051602081830303815290604052805190602001209050600082826040516020016111149291906125fa565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161115194939291906127be565b6020604051602081039080840390855afa158015611173573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111a65760405162461bcd60e51b8152600401610781906127ea565b8b6001600160a01b0316816001600160a01b0316146111d75760405162461bcd60e51b81526004016107819061285a565b884211156111f75760405162461bcd60e51b81526004016107819061283a565b84600460008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160601b0302191690836001600160601b031602179055508a6001600160a01b03168c6001600160a01b0316600080516020612c418339815191528760405161129591906128f1565b60405180910390a3505050505050505050505050565b6112b36117d9565b6000546001600160a01b039081169116146112e05760405162461bcd60e51b81526004016107819061288a565b6001600160a01b0382166113065760405162461bcd60e51b81526004016107819061287a565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906113349033908590600401612668565b602060405180830381600087803b15801561134e57600080fd5b505af1158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113869190810190612039565b507f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812982826040516113b89291906126c7565b60405180910390a15050565b6001600160a01b0391821660009081526004602090815260408083209390941682529190915220546001600160601b031690565b60405161055590612641565b600760209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6114416117d9565b6000546001600160a01b0390811691161461146e5760405162461bcd60e51b81526004016107819061288a565b61088481611829565b600081600160601b841061149e5760405162461bcd60e51b815260040161078191906127d9565b509192915050565b6000836001600160601b0316836001600160601b0316111582906114dd5760405162461bcd60e51b815260040161078191906127d9565b505050900390565b6001600160a01b03831661150b5760405162461bcd60e51b8152600401610781906128aa565b6001600160a01b0382166115315760405162461bcd60e51b81526004016107819061280a565b6001600160a01b03831660009081526005602090815260409182902054825160608101909352603580845261157c936001600160601b039092169285929190612b65908301396114a6565b6001600160a01b03848116600090815260056020908152604080832080546001600160601b0319166001600160601b0396871617905592861682529082902054825160608101909352602f8084526115e49491909116928592909190612c12908301396118aa565b6001600160a01b038381166000818152600560205260409081902080546001600160601b0319166001600160601b0395909516949094179093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116519085906128f1565b60405180910390a36001600160a01b0380841660009081526006602052604080822054858416835291205461168b929182169116836118e6565b505050565b60006106a183836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250611a78565b60006001600160a01b0382166116e757600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03808316600081815260066020818152604080842080546005845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461178b8284836118e6565b50505050565b6117a260018263ffffffff611a9c16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b3390565b6117ee60018263ffffffff611ae416565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b4690565b6001600160a01b03811661184f5760405162461bcd60e51b81526004016107819061281a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000838301826001600160601b0380871690831610156118dd5760405162461bcd60e51b815260040161078191906127d9565b50949350505050565b816001600160a01b0316836001600160a01b03161415801561191157506000816001600160601b0316115b1561168b576001600160a01b038316156119c9576001600160a01b03831660009081526008602052604081205463ffffffff169081611951576000611990565b6001600160a01b0385166000908152600760209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006119b782856040518060600160405280602b8152602001612aaa602b91396114a6565b90506119c586848484611b30565b5050505b6001600160a01b0382161561168b576001600160a01b03821660009081526008602052604081205463ffffffff169081611a04576000611a43565b6001600160a01b0384166000908152600760209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000611a6a82856040518060600160405280602a8152602001612a5a602a91396118aa565b9050610ec685848484611b30565b600081848411156114dd5760405162461bcd60e51b815260040161078191906127d9565b6001600160a01b038116611aaf57600080fd5b611ab982826116d2565b611ac257600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b038116611af757600080fd5b611b0182826116d2565b15611b0b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000611b5443604051806060016040528060338152602001612bdf60339139611ce5565b905060008463ffffffff16118015611b9d57506001600160a01b038516600090815260076020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611bfc576001600160a01b0385166000908152600760209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055611c9b565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152600783528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252600890935292909220805460018801909316929091169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cd692919061290d565b60405180910390a25050505050565b600081600160201b841061149e5760405162461bcd60e51b815260040161078191906127d9565b604080518082019091526000808252602082015290565b803561053d81612a21565b805161053d81612a35565b803561053d81612a3e565b600082601f830112611d5557600080fd5b8135611d68611d638261294f565b612928565b91508082526020830160208301858383011115611d8457600080fd5b611d8f8382846129df565b50505092915050565b803561053d81612a47565b803561053d81612a50565b600060208284031215611dc057600080fd5b6000611dcc8484611d23565b949350505050565b60008060408385031215611de757600080fd5b6000611df38585611d23565b9250506020611e0485828601611d23565b9150509250929050565b600080600060608486031215611e2357600080fd5b6000611e2f8686611d23565b9350506020611e4086828701611d23565b9250506040611e5186828701611d39565b9150509250925092565b600080600080600080600060e0888a031215611e7657600080fd5b6000611e828a8a611d23565b9750506020611e938a828b01611d23565b9650506040611ea48a828b01611d39565b9550506060611eb58a828b01611d39565b9450506080611ec68a828b01611da3565b93505060a0611ed78a828b01611d39565b92505060c0611ee88a828b01611d39565b91505092959891949750929550565b60008060408385031215611f0a57600080fd5b6000611f168585611d23565b9250506020611e0485828601611d39565b600080600060608486031215611f3c57600080fd5b6000611f488686611d23565b9350506020611f5986828701611d39565b925050604084013567ffffffffffffffff811115611f7657600080fd5b611e5186828701611d44565b60008060008060008060c08789031215611f9b57600080fd5b6000611fa78989611d23565b9650506020611fb889828a01611d39565b9550506040611fc989828a01611d39565b9450506060611fda89828a01611da3565b9350506080611feb89828a01611d39565b92505060a0611ffc89828a01611d39565b9150509295509295509295565b6000806040838503121561201c57600080fd5b60006120288585611d23565b9250506020611e0485828601611d98565b60006020828403121561204b57600080fd5b6000611dcc8484611d2e565b60006020828403121561206957600080fd5b6000611dcc8484611d39565b61207e816129c3565b82525050565b61207e81612989565b61207e81612994565b61207e81612999565b61207e6120ab82612999565b612999565b60006120bb82612977565b6120c5818561297b565b93506120d58185602086016129eb565b6120de81612a17565b9093019392505050565b60006120f5601e8361297b565b7f4d47473a3a7065726d69743a20696e76616c6964207369676e61747572650000815260200192915050565b600061212e60258361297b565b7f4d47473a3a64656c656761746542795369673a207369676e61747572652065788152641c1a5c995960da1b602082015260400192915050565b600061217560398361297b565b7f4d47473a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726181527f6e7366657220746f20746865207a65726f206164647265737300000000000000602082015260400192915050565b60006121d460268361297b565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061221c60218361297b565b7f4d47473a3a64656c656761746542795369673a20696e76616c6964206e6f6e638152606560f81b602082015260400192915050565b600061225f600283612984565b61190160f01b815260020192915050565b600061227d601e8361297b565b7f4d47473a3a7065726d69743a207369676e617475726520657870697265640000815260200192915050565b60006122b6601d8361297b565b7f4d47473a3a6275726e3a206e6f7420656e6f7567682062616c616e6365000000815260200192915050565b60006122ef60198361297b565b7f4d47473a3a7065726d69743a20756e617574686f72697a656400000000000000815260200192915050565b6000612328605283612984565b7f5065726d69742861646472657373206f776e65722c616464726573732073706581527f6e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63656020820152712c75696e7432353620646561646c696e652960701b604082015260520192915050565b60006123a260258361297b565b7f4d47473a3a64656c656761746542795369673a20696e76616c6964207369676e815264617475726560d81b602082015260400192915050565b60006123e9602e8361297b565b7f4d47473a3a72657472696576654c6f7374546f6b656e733a20496e76616c696481526d205f746f6b656e4164647265737360901b602082015260400192915050565b6000612439604383612984565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b60006124a460208361297b565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006124dd60268361297b565b7f4d47473a3a6765745072696f72566f7465733a206e6f742079657420646574658152651c9b5a5b995960d21b602082015260400192915050565b6000612525603b8361297b565b7f4d47473a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726181527f6e736665722066726f6d20746865207a65726f20616464726573730000000000602082015260400192915050565b6000612584603a83612984565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b61207e816129a8565b61207e816129b1565b61207e816129d4565b61207e816129b7565b600061260582612252565b9150612611828561209f565b602082019150612621828461209f565b5060200192915050565b600061053d8261231b565b600061053d8261242c565b600061053d82612577565b6020810161053d8284612084565b6020810161053d8284612075565b604081016126768285612075565b6106a16020830184612096565b608081016126918287612075565b61269e6020830186612096565b6126ab6040830185612084565b81810360608301526126bd81846120b0565b9695505050505050565b604081016126768285612084565b6020810161053d828461208d565b6020810161053d8284612096565b60c081016126ff8289612096565b61270c6020830188612084565b6127196040830187612084565b6127266060830186612096565b6127336080830185612096565b61274060a0830184612096565b979650505050505050565b608081016127598287612096565b6127666020830186612084565b6127736040830185612096565b6127806060830184612096565b95945050505050565b608081016127978287612096565b6127a46020830186612096565b6127b16040830185612096565b6127806060830184612084565b608081016127cc8287612096565b61276660208301866125df565b602080825281016106a181846120b0565b6020808252810161053d816120e8565b6020808252810161053d81612121565b6020808252810161053d81612168565b6020808252810161053d816121c7565b6020808252810161053d8161220f565b6020808252810161053d81612270565b6020808252810161053d816122a9565b6020808252810161053d816122e2565b6020808252810161053d81612395565b6020808252810161053d816123dc565b6020808252810161053d81612497565b6020808252810161053d816124d0565b6020808252810161053d81612518565b6020810161053d82846125d6565b604081016128d682856125d6565b6106a160208301846125f1565b6020810161053d82846125df565b6020810161053d82846125e8565b6020810161053d82846125f1565b6040810161291b82856125e8565b6106a160208301846125e8565b60405181810167ffffffffffffffff8111828210171561294757600080fd5b604052919050565b600067ffffffffffffffff82111561296657600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b600061053d8261299c565b151590565b90565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b6001600160601b031690565b600061053d82600061053d82612989565b600061053d826129b7565b82818337506000910152565b60005b83811015612a065781810151838201526020016129ee565b8381111561178b5750506000910152565b601f01601f191690565b612a2a81612989565b811461088457600080fd5b612a2a81612994565b612a2a81612999565b612a2a816129a8565b612a2a816129b156fe4d47473a3a5f6d6f766544656c6567617465733a20766f746520616d6f756e74206f766572666c6f77734d47473a3a6275726e3a206275726e20616d6f756e7420657863656564732062616c616e63654d47473a3a5f6d6f766544656c6567617465733a20766f746520616d6f756e7420756e646572666c6f77734d47473a3a617070726f7665416e6443616c6c3a20616d6f756e74206578636565647320393620626974734d47473a3a7472616e7366657246726f6d3a20616d6f756e74206578636565647320393620626974734d47473a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e63654d47473a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d47473a3a617070726f76653a20616d6f756e74206578636565647320393620626974734d47473a3a6275726e3a20616d6f756e74206578636565647320393620626974734d47473a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974734d47473a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f77738c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9254d47473a3a7065726d69743a20616d6f756e74206578636565647320393620626974734d47473a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473a365627a7a72315820897ca5cf3872e9c93dab470f64e0327621f94ede76e01e18ec9e251b40064fe06c6578706572696d656e74616cf564736f6c634300051000400000000000000000000000003ff9bda6bb59fb87853a25a07764dc241a5ca4eb

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b4b5ea57116100ad578063d660b6511161007c578063d660b651146103f6578063dd62ed3e14610409578063e7a324dc1461041c578063f1127ed814610424578063f2fde38b14610445576101fb565b8063b4b5ea57146103aa578063c3cda520146103bd578063cae9ca51146103d0578063d505accf146103e3576101fb565b80638456cb59116100e95780638456cb591461037f5780638da5cb5b1461038757806395d89b411461038f578063a9059cbb14610397576101fb565b8063715018a614610331578063782d6fe1146103395780637ecebe001461035957806382dc1ec41461036c576101fb565b806342966c68116101925780635c975abb116101615780635c975abb146102ee5780636ef8d66d146102f65780636fcfff45146102fe57806370a082311461031e576101fb565b806342966c681461029557806346fbf68e146102a8578063587cde1e146102bb5780635c19a95c146102db576101fb565b806323b872dd116101ce57806323b872dd1461025b57806330adf81f1461026e578063313ce567146102765780633f4ba83a1461028b576101fb565b806306fdde0314610200578063095ea7b31461021e57806318160ddd1461023e57806320606b7014610253575b600080fd5b610208610458565b60405161021591906127d9565b60405180910390f35b61023161022c366004611ef7565b610484565b60405161021591906126d5565b610246610543565b60405161021591906126e3565b610246610549565b610231610269366004611e0e565b610560565b6102466106a8565b61027e6106b4565b60405161021591906128e3565b6102936106b9565b005b6102316102a3366004612057565b61071e565b6102316102b6366004611dae565b61084c565b6102ce6102c9366004611dae565b61085f565b604051610215919061264c565b6102936102e9366004611dae565b61087a565b610231610887565b610293610890565b61031161030c366004611dae565b61089b565b60405161021591906128ba565b61024661032c366004611dae565b6108b3565b6102936108d7565b61034c610347366004611ef7565b610956565b60405161021591906128ff565b610246610367366004611dae565b610b64565b61029361037a366004611dae565b610b76565b610293610b91565b6102ce610bf0565b610208610bff565b6102316103a5366004611ef7565b610c1e565b61034c6103b8366004611dae565b610c6c565b6102936103cb366004611f82565b610cdc565b6102316103de366004611f27565b610ece565b6102936103f1366004611e5b565b610fc9565b610293610404366004611ef7565b6112ab565b610246610417366004611dd4565b6113c4565b6102466113f8565b610437610432366004612009565b611404565b6040516102159291906128c8565b610293610453366004611dae565b611439565b6040518060400160405280601081526020016f13595d1851d85b5a5b99c811dd5a5b1960821b81525081565b60025460009060ff161561049757600080fd5b60006000198314156104ac57506000196104d1565b6104ce83604051806060016040528060248152602001612b9a60249139611477565b90505b3360008181526004602090815260408083206001600160a01b03891680855292529182902080546001600160601b0319166001600160601b0386161790559051909190600080516020612c418339815191529061052f9085906128f1565b60405180910390a360019150505b92915050565b60035481565b60405161055590612636565b604051809103902081565b60025460009060ff161561057357600080fd5b6001600160a01b03841660009081526004602090815260408083203380855290835281842054825160608101909352602980845291946001600160601b039091169390926105c9928892612b0090830139611477565b9050866001600160a01b0316836001600160a01b0316141580156105f657506001600160601b0382811614155b1561068e57600061062083836040518060600160405280603c8152602001612b29603c91396114a6565b6001600160a01b038981166000818152600460209081526040808320948a16808452949091529081902080546001600160601b0319166001600160601b038616179055519293509091600080516020612c41833981519152906106849085906128f1565b60405180910390a3505b6106998787836114e5565b600193505050505b9392505050565b6040516105559061262b565b601281565b6106c23361084c565b6106cb57600080fd5b60025460ff166106da57600080fd5b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9061071490339061265a565b60405180910390a1565b60008061074383604051806060016040528060218152602001612bbe60219139611477565b336000908152600560205260409020549091506001600160601b038083169116101561078a5760405162461bcd60e51b81526004016107819061284a565b60405180910390fd5b336000908152600560209081526040918290205482516060810190935260268084526107cc936001600160601b039092169285929190612a84908301396114a6565b33600090815260056020526040902080546001600160601b0319166001600160601b03929092169190911790556003546108069084611690565b60035560405133907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061083b9086906126e3565b60405180910390a250600192915050565b600061053d60018363ffffffff6116d216565b6006602052600090815260409020546001600160a01b031681565b6108843382611707565b50565b60025460ff1690565b61089933611791565b565b60086020526000908152604090205463ffffffff1681565b6001600160a01b03166000908152600560205260409020546001600160601b031690565b6108df6117d9565b6000546001600160a01b0390811691161461090c5760405162461bcd60e51b81526004016107819061288a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60004382106109775760405162461bcd60e51b81526004016107819061289a565b6001600160a01b03831660009081526008602052604090205463ffffffff16806109a557600091505061053d565b6001600160a01b038416600090815260076020908152604080832063ffffffff600019860181168552925290912054168310610a21576001600160a01b03841660009081526007602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b0316905061053d565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff16831015610a5c57600091505061053d565b600060001982015b8163ffffffff168163ffffffff161115610b1f57600282820363ffffffff16048103610a8e611d0c565b506001600160a01b038716600090815260076020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610afa5760200151945061053d9350505050565b805163ffffffff16871115610b1157819350610b18565b6001820392505b5050610a64565b506001600160a01b038516600090815260076020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b60096020526000908152604090205481565b610b7f3361084c565b610b8857600080fd5b610884816117dd565b610b9a3361084c565b610ba357600080fd5b60025460ff1615610bb357600080fd5b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589061071490339061265a565b6000546001600160a01b031690565b604051806040016040528060038152602001624d474760e81b81525081565b60025460009060ff1615610c3157600080fd5b6000610c5583604051806060016040528060258152602001612c8460259139611477565b9050610c623385836114e5565b5060019392505050565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610c975760006106a1565b6001600160a01b0383166000908152600760209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03169392505050565b6000604051610cea90612636565b60408051918290038220828201909152601082526f13595d1851d85b5a5b99c811dd5a5b1960821b6020909201919091527f12717300686a489488a90080f7cc7f090152151e495ab76cbbcbd3c2c220e1b8610d44611825565b30604051602001610d589493929190612789565b6040516020818303038152906040528051906020012090506000604051610d7e90612641565b604051908190038120610d99918a908a908a9060200161274b565b60405160208183030381529060405280519060200120905060008282604051602001610dc69291906125fa565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610e0394939291906127be565b6020604051602081039080840390855afa158015610e25573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e585760405162461bcd60e51b81526004016107819061286a565b6001600160a01b03811660009081526009602052604090208054600181019091558914610e975760405162461bcd60e51b81526004016107819061282a565b87421115610eb75760405162461bcd60e51b8152600401610781906127fa565b610ec1818b611707565b505050505b505050505050565b600080610ef3846040518060600160405280602b8152602001612ad5602b9139611477565b3360008181526004602090815260408083206001600160a01b038b1680855292529182902080546001600160601b0319166001600160601b038616179055905192935091600080516020612c4183398151915290610f529085906128f1565b60405180910390a3604051638f4ffcb160e01b81526001600160a01b03861690638f4ffcb190610f8c903390889030908990600401612683565b600060405180830381600087803b158015610fa657600080fd5b505af1158015610fba573d6000803e3d6000fd5b50600198975050505050505050565b6000600019861415610fde5750600019611003565b61100086604051806060016040528060238152602001612c6160239139611477565b90505b600060405161101190612636565b60408051918290038220828201909152601082526f13595d1851d85b5a5b99c811dd5a5b1960821b6020909201919091527f12717300686a489488a90080f7cc7f090152151e495ab76cbbcbd3c2c220e1b861106b611825565b3060405160200161107f9493929190612789565b60405160208183030381529060405280519060200120905060006040516110a59061262b565b604080519182900382206001600160a01b038d166000908152600960209081529290208054600181019091556110e79391928e928e928e9290918e91016126f1565b604051602081830303815290604052805190602001209050600082826040516020016111149291906125fa565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161115194939291906127be565b6020604051602081039080840390855afa158015611173573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111a65760405162461bcd60e51b8152600401610781906127ea565b8b6001600160a01b0316816001600160a01b0316146111d75760405162461bcd60e51b81526004016107819061285a565b884211156111f75760405162461bcd60e51b81526004016107819061283a565b84600460008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160601b0302191690836001600160601b031602179055508a6001600160a01b03168c6001600160a01b0316600080516020612c418339815191528760405161129591906128f1565b60405180910390a3505050505050505050505050565b6112b36117d9565b6000546001600160a01b039081169116146112e05760405162461bcd60e51b81526004016107819061288a565b6001600160a01b0382166113065760405162461bcd60e51b81526004016107819061287a565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906113349033908590600401612668565b602060405180830381600087803b15801561134e57600080fd5b505af1158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113869190810190612039565b507f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812982826040516113b89291906126c7565b60405180910390a15050565b6001600160a01b0391821660009081526004602090815260408083209390941682529190915220546001600160601b031690565b60405161055590612641565b600760209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6114416117d9565b6000546001600160a01b0390811691161461146e5760405162461bcd60e51b81526004016107819061288a565b61088481611829565b600081600160601b841061149e5760405162461bcd60e51b815260040161078191906127d9565b509192915050565b6000836001600160601b0316836001600160601b0316111582906114dd5760405162461bcd60e51b815260040161078191906127d9565b505050900390565b6001600160a01b03831661150b5760405162461bcd60e51b8152600401610781906128aa565b6001600160a01b0382166115315760405162461bcd60e51b81526004016107819061280a565b6001600160a01b03831660009081526005602090815260409182902054825160608101909352603580845261157c936001600160601b039092169285929190612b65908301396114a6565b6001600160a01b03848116600090815260056020908152604080832080546001600160601b0319166001600160601b0396871617905592861682529082902054825160608101909352602f8084526115e49491909116928592909190612c12908301396118aa565b6001600160a01b038381166000818152600560205260409081902080546001600160601b0319166001600160601b0395909516949094179093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116519085906128f1565b60405180910390a36001600160a01b0380841660009081526006602052604080822054858416835291205461168b929182169116836118e6565b505050565b60006106a183836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250611a78565b60006001600160a01b0382166116e757600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03808316600081815260066020818152604080842080546005845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461178b8284836118e6565b50505050565b6117a260018263ffffffff611a9c16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b3390565b6117ee60018263ffffffff611ae416565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b4690565b6001600160a01b03811661184f5760405162461bcd60e51b81526004016107819061281a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000838301826001600160601b0380871690831610156118dd5760405162461bcd60e51b815260040161078191906127d9565b50949350505050565b816001600160a01b0316836001600160a01b03161415801561191157506000816001600160601b0316115b1561168b576001600160a01b038316156119c9576001600160a01b03831660009081526008602052604081205463ffffffff169081611951576000611990565b6001600160a01b0385166000908152600760209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006119b782856040518060600160405280602b8152602001612aaa602b91396114a6565b90506119c586848484611b30565b5050505b6001600160a01b0382161561168b576001600160a01b03821660009081526008602052604081205463ffffffff169081611a04576000611a43565b6001600160a01b0384166000908152600760209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000611a6a82856040518060600160405280602a8152602001612a5a602a91396118aa565b9050610ec685848484611b30565b600081848411156114dd5760405162461bcd60e51b815260040161078191906127d9565b6001600160a01b038116611aaf57600080fd5b611ab982826116d2565b611ac257600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b038116611af757600080fd5b611b0182826116d2565b15611b0b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000611b5443604051806060016040528060338152602001612bdf60339139611ce5565b905060008463ffffffff16118015611b9d57506001600160a01b038516600090815260076020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611bfc576001600160a01b0385166000908152600760209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055611c9b565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152600783528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252600890935292909220805460018801909316929091169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cd692919061290d565b60405180910390a25050505050565b600081600160201b841061149e5760405162461bcd60e51b815260040161078191906127d9565b604080518082019091526000808252602082015290565b803561053d81612a21565b805161053d81612a35565b803561053d81612a3e565b600082601f830112611d5557600080fd5b8135611d68611d638261294f565b612928565b91508082526020830160208301858383011115611d8457600080fd5b611d8f8382846129df565b50505092915050565b803561053d81612a47565b803561053d81612a50565b600060208284031215611dc057600080fd5b6000611dcc8484611d23565b949350505050565b60008060408385031215611de757600080fd5b6000611df38585611d23565b9250506020611e0485828601611d23565b9150509250929050565b600080600060608486031215611e2357600080fd5b6000611e2f8686611d23565b9350506020611e4086828701611d23565b9250506040611e5186828701611d39565b9150509250925092565b600080600080600080600060e0888a031215611e7657600080fd5b6000611e828a8a611d23565b9750506020611e938a828b01611d23565b9650506040611ea48a828b01611d39565b9550506060611eb58a828b01611d39565b9450506080611ec68a828b01611da3565b93505060a0611ed78a828b01611d39565b92505060c0611ee88a828b01611d39565b91505092959891949750929550565b60008060408385031215611f0a57600080fd5b6000611f168585611d23565b9250506020611e0485828601611d39565b600080600060608486031215611f3c57600080fd5b6000611f488686611d23565b9350506020611f5986828701611d39565b925050604084013567ffffffffffffffff811115611f7657600080fd5b611e5186828701611d44565b60008060008060008060c08789031215611f9b57600080fd5b6000611fa78989611d23565b9650506020611fb889828a01611d39565b9550506040611fc989828a01611d39565b9450506060611fda89828a01611da3565b9350506080611feb89828a01611d39565b92505060a0611ffc89828a01611d39565b9150509295509295509295565b6000806040838503121561201c57600080fd5b60006120288585611d23565b9250506020611e0485828601611d98565b60006020828403121561204b57600080fd5b6000611dcc8484611d2e565b60006020828403121561206957600080fd5b6000611dcc8484611d39565b61207e816129c3565b82525050565b61207e81612989565b61207e81612994565b61207e81612999565b61207e6120ab82612999565b612999565b60006120bb82612977565b6120c5818561297b565b93506120d58185602086016129eb565b6120de81612a17565b9093019392505050565b60006120f5601e8361297b565b7f4d47473a3a7065726d69743a20696e76616c6964207369676e61747572650000815260200192915050565b600061212e60258361297b565b7f4d47473a3a64656c656761746542795369673a207369676e61747572652065788152641c1a5c995960da1b602082015260400192915050565b600061217560398361297b565b7f4d47473a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726181527f6e7366657220746f20746865207a65726f206164647265737300000000000000602082015260400192915050565b60006121d460268361297b565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061221c60218361297b565b7f4d47473a3a64656c656761746542795369673a20696e76616c6964206e6f6e638152606560f81b602082015260400192915050565b600061225f600283612984565b61190160f01b815260020192915050565b600061227d601e8361297b565b7f4d47473a3a7065726d69743a207369676e617475726520657870697265640000815260200192915050565b60006122b6601d8361297b565b7f4d47473a3a6275726e3a206e6f7420656e6f7567682062616c616e6365000000815260200192915050565b60006122ef60198361297b565b7f4d47473a3a7065726d69743a20756e617574686f72697a656400000000000000815260200192915050565b6000612328605283612984565b7f5065726d69742861646472657373206f776e65722c616464726573732073706581527f6e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63656020820152712c75696e7432353620646561646c696e652960701b604082015260520192915050565b60006123a260258361297b565b7f4d47473a3a64656c656761746542795369673a20696e76616c6964207369676e815264617475726560d81b602082015260400192915050565b60006123e9602e8361297b565b7f4d47473a3a72657472696576654c6f7374546f6b656e733a20496e76616c696481526d205f746f6b656e4164647265737360901b602082015260400192915050565b6000612439604383612984565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b60006124a460208361297b565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006124dd60268361297b565b7f4d47473a3a6765745072696f72566f7465733a206e6f742079657420646574658152651c9b5a5b995960d21b602082015260400192915050565b6000612525603b8361297b565b7f4d47473a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726181527f6e736665722066726f6d20746865207a65726f20616464726573730000000000602082015260400192915050565b6000612584603a83612984565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b61207e816129a8565b61207e816129b1565b61207e816129d4565b61207e816129b7565b600061260582612252565b9150612611828561209f565b602082019150612621828461209f565b5060200192915050565b600061053d8261231b565b600061053d8261242c565b600061053d82612577565b6020810161053d8284612084565b6020810161053d8284612075565b604081016126768285612075565b6106a16020830184612096565b608081016126918287612075565b61269e6020830186612096565b6126ab6040830185612084565b81810360608301526126bd81846120b0565b9695505050505050565b604081016126768285612084565b6020810161053d828461208d565b6020810161053d8284612096565b60c081016126ff8289612096565b61270c6020830188612084565b6127196040830187612084565b6127266060830186612096565b6127336080830185612096565b61274060a0830184612096565b979650505050505050565b608081016127598287612096565b6127666020830186612084565b6127736040830185612096565b6127806060830184612096565b95945050505050565b608081016127978287612096565b6127a46020830186612096565b6127b16040830185612096565b6127806060830184612084565b608081016127cc8287612096565b61276660208301866125df565b602080825281016106a181846120b0565b6020808252810161053d816120e8565b6020808252810161053d81612121565b6020808252810161053d81612168565b6020808252810161053d816121c7565b6020808252810161053d8161220f565b6020808252810161053d81612270565b6020808252810161053d816122a9565b6020808252810161053d816122e2565b6020808252810161053d81612395565b6020808252810161053d816123dc565b6020808252810161053d81612497565b6020808252810161053d816124d0565b6020808252810161053d81612518565b6020810161053d82846125d6565b604081016128d682856125d6565b6106a160208301846125f1565b6020810161053d82846125df565b6020810161053d82846125e8565b6020810161053d82846125f1565b6040810161291b82856125e8565b6106a160208301846125e8565b60405181810167ffffffffffffffff8111828210171561294757600080fd5b604052919050565b600067ffffffffffffffff82111561296657600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b600061053d8261299c565b151590565b90565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b6001600160601b031690565b600061053d82600061053d82612989565b600061053d826129b7565b82818337506000910152565b60005b83811015612a065781810151838201526020016129ee565b8381111561178b5750506000910152565b601f01601f191690565b612a2a81612989565b811461088457600080fd5b612a2a81612994565b612a2a81612999565b612a2a816129a8565b612a2a816129b156fe4d47473a3a5f6d6f766544656c6567617465733a20766f746520616d6f756e74206f766572666c6f77734d47473a3a6275726e3a206275726e20616d6f756e7420657863656564732062616c616e63654d47473a3a5f6d6f766544656c6567617465733a20766f746520616d6f756e7420756e646572666c6f77734d47473a3a617070726f7665416e6443616c6c3a20616d6f756e74206578636565647320393620626974734d47473a3a7472616e7366657246726f6d3a20616d6f756e74206578636565647320393620626974734d47473a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e63654d47473a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d47473a3a617070726f76653a20616d6f756e74206578636565647320393620626974734d47473a3a6275726e3a20616d6f756e74206578636565647320393620626974734d47473a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974734d47473a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f77738c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9254d47473a3a7065726d69743a20616d6f756e74206578636565647320393620626974734d47473a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473a365627a7a72315820897ca5cf3872e9c93dab470f64e0327621f94ede76e01e18ec9e251b40064fe06c6578706572696d656e74616cf564736f6c63430005100040

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003ff9bda6bb59fb87853a25a07764dc241a5ca4eb

-----Decoded View---------------
Arg [0] : account (address): 0x3Ff9bda6bB59FB87853a25A07764dc241A5ca4eB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ff9bda6bb59fb87853a25a07764dc241a5ca4eb


Deployed Bytecode Sourcemap

16397:16956:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16397:16956:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16488:48;;;:::i;:::-;;;;;;;;;;;;;;;;20482:432;;;;;;;;;:::i;:::-;;;;;;;;16796:42;;;:::i;:::-;;;;;;;;17720:122;;;:::i;23590:689::-;;;;;;;;;:::i;18143:137::-;;;:::i;16697:35::-;;;:::i;:::-;;;;;;;;16272:118;;;:::i;:::-;;31920:558;;;;;;;;;:::i;14546:109::-;;;;;;;;;:::i;17170:45::-;;;;;;;;;:::i;:::-;;;;;;;;24427:102;;;;;;;;;:::i;15525:78::-;;;:::i;14763:77::-;;;:::i;17598:49::-;;;;;;;;;:::i;:::-;;;;;;;;22657:108;;;;;;;;;:::i;13058:140::-;;;:::i;26603:1217::-;;;;;;;;;:::i;:::-;;;;;;;;18361:39;;;;;;;;;:::i;14663:92::-;;;;;;;;;:::i;16061:116::-;;;:::i;12416:79::-;;;:::i;16597:37::-;;;:::i;23029:251::-;;;;;;;;;:::i;25950:222::-;;;;;;;;;:::i;24963:786::-;;;;;;;;;:::i;32917:433::-;;;;;;;;;:::i;21404:1050::-;;;;;;;;;:::i;31568:340::-;;;;;;;;;:::i;19868:136::-;;;;;;;;;:::i;17936:117::-;;;:::i;17459:70::-;;;;;;;;;:::i;:::-;;;;;;;;;13353:109;;;;;;;;;:::i;16488:48::-;;;;;;;;;;;;;;-1:-1:-1;;;16488:48:0;;;;:::o;20482:432::-;15762:7;;20564:4;;15762:7;;15761:8;15753:17;;;;;;20581:13;-1:-1:-1;;20609:9:0;:21;20605:172;;;-1:-1:-1;;;20605:172:0;;;20708:57;20715:9;20708:57;;;;;;;;;;;;;;;;;:6;:57::i;:::-;20699:66;;20605:172;20800:10;20789:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;20789:31:0;;;;;;;;;;;:40;;-1:-1:-1;;;;;;20789:40:0;-1:-1:-1;;;;;20789:40:0;;;;;20847:37;;20789:31;;20800:10;-1:-1:-1;;;;;;;;;;;20847:37:0;;;20789:40;;20847:37;;;;;;;;;;20902:4;20895:11;;;15781:1;20482:432;;;;:::o;16796:42::-;;;;:::o;17720:122::-;17762:80;;;;;;;;;;;;;;17720:122;:::o;23590:689::-;15762:7;;23686:4;;15762:7;;15761:8;15753:17;;;;;;-1:-1:-1;;;;;23768:15:0;;23703;23768;;;:10;:15;;;;;;;;23721:10;23768:24;;;;;;;;;;23819:62;;;;;;;;;;;;23721:10;;-1:-1:-1;;;;;23768:24:0;;;;23703:15;;23819:62;;23826:9;;23819:62;;;;;:6;:62::i;:::-;23803:78;;23909:3;-1:-1:-1;;;;;23898:14:0;:7;-1:-1:-1;;;;;23898:14:0;;;:48;;;;-1:-1:-1;;;;;;23916:30:0;;;;;23898:48;23894:310;;;23963:19;23985:95;23991:16;24009:6;23985:95;;;;;;;;;;;;;;;;;:5;:95::i;:::-;-1:-1:-1;;;;;24095:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;-1:-1:-1;;;;;;24095:39:0;-1:-1:-1;;;;;24095:39:0;;;;;24156:36;24095:39;;-1:-1:-1;24095:24:0;;-1:-1:-1;;;;;;;;;;;24156:36:0;;;24095:39;;24156:36;;;;;;;;;;23894:310;;24216:33;24232:3;24237;24242:6;24216:15;:33::i;:::-;24267:4;24260:11;;;;;15781:1;23590:689;;;;;:::o;18143:137::-;18185:95;;;;;;16697:35;16730:2;16697:35;:::o;16272:118::-;14497:20;14506:10;14497:8;:20::i;:::-;14489:29;;;;;;15941:7;;;;15933:16;;;;;;16331:7;:15;;-1:-1:-1;;16331:15:0;;;16362:20;;;;;;16371:10;;16362:20;;;;;;;;;;16272:118::o;31920:558::-;31966:12;31991:13;32007:54;32014:9;32007:54;;;;;;;;;;;;;;;;;:6;:54::i;:::-;32089:10;32080:20;;;;:8;:20;;;;;;31991:70;;-1:-1:-1;;;;;;32080:30:0;;;:20;;:30;;32072:72;;;;-1:-1:-1;;;32072:72:0;;;;;;;;;;;;;;;;;32229:10;32220:20;;;;:8;:20;;;;;;;;;;32214:77;;;;;;;;;;;;;;-1:-1:-1;;;;;32220:20:0;;;;32242:6;;32214:77;;;;;;;:5;:77::i;:::-;32200:10;32191:20;;;;:8;:20;;;;;:100;;-1:-1:-1;;;;;;32191:100:0;-1:-1:-1;;;;;32191:100:0;;;;;;;;;;32358:11;;32345:36;;32371:9;32345:12;:36::i;:::-;32331:11;:50;32421:27;;32426:10;;32421:27;;;;32438:9;;32421:27;;;;;;;;;;-1:-1:-1;32466:4:0;;31920:558;-1:-1:-1;;31920:558:0:o;14546:109::-;14602:4;14626:21;:8;14639:7;14626:21;:12;:21;:::i;17170:45::-;;;;;;;;;;;;-1:-1:-1;;;;;17170:45:0;;:::o;24427:102::-;24489:32;24499:10;24511:9;24489;:32::i;:::-;24427:102;:::o;15525:78::-;15588:7;;;;15525:78;:::o;14763:77::-;14807:25;14821:10;14807:13;:25::i;:::-;14763:77::o;17598:49::-;;;;;;;;;;;;;;;:::o;22657:108::-;-1:-1:-1;;;;;22740:17:0;22716:4;22740:17;;;:8;:17;;;;;;-1:-1:-1;;;;;22740:17:0;;22657:108::o;13058:140::-;12638:12;:10;:12::i;:::-;12628:6;;-1:-1:-1;;;;;12628:6:0;;;:22;;;12620:67;;;;-1:-1:-1;;;12620:67:0;;;;;;;;;13157:1;13141:6;;13120:40;;-1:-1:-1;;;;;13141:6:0;;;;13120:40;;13157:1;;13120:40;13188:1;13171:19;;-1:-1:-1;;;;;;13171:19:0;;;13058:140::o;26603:1217::-;26682:6;26723:12;26709:11;:26;26701:77;;;;-1:-1:-1;;;26701:77:0;;;;;;;;;-1:-1:-1;;;;;26813:23:0;;26791:19;26813:23;;;:14;:23;;;;;;;;26851:17;26847:58;;26892:1;26885:8;;;;;26847:58;-1:-1:-1;;;;;26965:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;26986:16:0;;26965:38;;;;;;;;;:48;;:63;-1:-1:-1;26961:147:0;;-1:-1:-1;;;;;27052:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;27073:16:0;;;;27052:38;;;;;;;;:44;-1:-1:-1;;;27052:44:0;;-1:-1:-1;;;;;27052:44:0;;-1:-1:-1;27045:51:0;;26961:147;-1:-1:-1;;;;;27169:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;27165:88:0;;;27240:1;27233:8;;;;;27165:88;27265:12;-1:-1:-1;;27307:16:0;;27334:428;27349:5;27341:13;;:5;:13;;;27334:428;;;27413:1;27396:13;;;27395:19;;;27387:27;;27456:20;;:::i;:::-;-1:-1:-1;;;;;;27479:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;27456:51;;;;;;;;;;;;;;;-1:-1:-1;;;27456:51:0;;;-1:-1:-1;;;;;27456:51:0;;;;;;;;;27526:27;;27522:229;;;27581:8;;;;-1:-1:-1;27574:15:0;;-1:-1:-1;;;;27574:15:0;27522:229;27615:12;;:26;;;-1:-1:-1;27611:140:0;;;27670:6;27662:14;;27611:140;;;27734:1;27725:6;:10;27717:18;;27611:140;27334:428;;;;;-1:-1:-1;;;;;;27779:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;-1:-1:-1;;;;;;;;27779:33:0;;;;;-1:-1:-1;;26603:1217:0;;;;:::o;18361:39::-;;;;;;;;;;;;;:::o;14663:92::-;14497:20;14506:10;14497:8;:20::i;:::-;14489:29;;;;;;14728:19;14739:7;14728:10;:19::i;16061:116::-;14497:20;14506:10;14497:8;:20::i;:::-;14489:29;;;;;;15762:7;;;;15761:8;15753:17;;;;;;16121:7;:14;;-1:-1:-1;;16121:14:0;16131:4;16121:14;;;16151:18;;;;;;16158:10;;16151:18;;12416:79;12454:7;12481:6;-1:-1:-1;;;;;12481:6:0;12416:79;:::o;16597:37::-;;;;;;;;;;;;;;-1:-1:-1;;;16597:37:0;;;;:::o;23029:251::-;15762:7;;23108:4;;15762:7;;15761:8;15753:17;;;;;;23125:13;23141:58;23148:9;23141:58;;;;;;;;;;;;;;;;;:6;:58::i;:::-;23125:74;;23210:40;23226:10;23238:3;23243:6;23210:15;:40::i;:::-;-1:-1:-1;23268:4:0;;23029:251;-1:-1:-1;;;23029:251:0:o;25950:222::-;-1:-1:-1;;;;;26056:23:0;;26015:6;26056:23;;;:14;:23;;;;;;;;26097:16;:67;;26163:1;26097:67;;;-1:-1:-1;;;;;26116:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;26137:16:0;;26116:38;;;;;;;;;:44;-1:-1:-1;;;26116:44:0;;-1:-1:-1;;;;;26116:44:0;26090:74;25950:222;-1:-1:-1;;;25950:222:0:o;24963:786::-;25079:23;17762:80;;;;;;;;;;;;;;;;25159:4;;;;;;;;;-1:-1:-1;;;25159:4:0;;;;;;;;25143:22;25167:12;:10;:12::i;:::-;25189:4;25115:80;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;25115:80:0;;;25105:91;;;;;;25079:117;;25207:18;17982:71;;;;;;;;;;;;;;;25238:57;;25270:9;;25281:5;;25288:6;;25238:57;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;25238:57:0;;;25228:68;;;;;;25207:89;;25307:14;25363:15;25380:10;25334:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;25334:57:0;;;25324:68;;;;;;25307:85;;25403:17;25423:26;25433:6;25441:1;25444;25447;25423:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25423:26:0;;-1:-1:-1;;25423:26:0;;;-1:-1:-1;;;;;;;25468:23:0;;25460:73;;;;-1:-1:-1;;;25460:73:0;;;;;;;;;-1:-1:-1;;;;;25561:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;25552:28;;25544:74;;;;-1:-1:-1;;;25544:74:0;;;;;;;;;25644:6;25637:3;:13;;25629:63;;;;-1:-1:-1;;;25629:63:0;;;;;;;;;25710:31;25720:9;25731;25710;:31::i;:::-;25703:38;;;;24963:786;;;;;;;:::o;32917:433::-;33009:12;33034:13;33050:64;33057:9;33050:64;;;;;;;;;;;;;;;;;:6;:64::i;:::-;33136:10;33125:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;33125:31:0;;;;;;;;;;;:40;;-1:-1:-1;;;;;;33125:40:0;-1:-1:-1;;;;;33125:40:0;;;;;33181:37;;33125:40;;-1:-1:-1;33125:31:0;-1:-1:-1;;;;;;;;;;;33181:37:0;;;33125:40;;33181:37;;;;;;;;;;33229:91;;-1:-1:-1;;;33229:91:0;;-1:-1:-1;;;;;33229:47:0;;;;;:91;;33277:10;;33289:9;;33308:4;;33315;;33229:91;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33229:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;33338:4:0;;32917:433;-1:-1:-1;;;;;;;;32917:433:0:o;21404:1050::-;21534:13;-1:-1:-1;;21562:9:0;:21;21558:171;;;-1:-1:-1;;;21558:171:0;;;21661:56;21668:9;21661:56;;;;;;;;;;;;;;;;;:6;:56::i;:::-;21652:65;;21558:171;21741:23;17762:80;;;;;;;;;;;;;;;;21821:4;;;;;;;;;-1:-1:-1;;;21821:4:0;;;;;;;;21805:22;21829:12;:10;:12::i;:::-;21851:4;21777:80;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21777:80:0;;;21767:91;;;;;;21741:117;;21869:18;18185:95;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21955:13:0;;;;;;:6;:13;;;;;;;:15;;;;;;;;21900:81;;18185:95;;21928:5;;21935:7;;21944:9;;21955:15;;21972:8;;21900:81;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21900:81:0;;;21890:92;;;;;;21869:113;;21993:14;22049:15;22066:10;22020:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22020:57:0;;;22010:68;;;;;;21993:85;;22089:17;22109:26;22119:6;22127:1;22130;22133;22109:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;22109:26:0;;-1:-1:-1;;22109:26:0;;;-1:-1:-1;;;;;;;22154:23:0;;22146:66;;;;-1:-1:-1;;;22146:66:0;;;;;;;;;22244:5;-1:-1:-1;;;;;22231:18:0;:9;-1:-1:-1;;;;;22231:18:0;;22223:56;;;;-1:-1:-1;;;22223:56:0;;;;;;;;;22305:8;22298:3;:15;;22290:58;;;;-1:-1:-1;;;22290:58:0;;;;;;;;;22390:6;22361:10;:17;22372:5;-1:-1:-1;;;;;22361:17:0;-1:-1:-1;;;;;22361:17:0;;;;;;;;;;;;:26;22379:7;-1:-1:-1;;;;;22361:26:0;-1:-1:-1;;;;;22361:26:0;;;;;;;;;;;;;:35;;;;;-1:-1:-1;;;;;22361:35:0;;;;;-1:-1:-1;;;;;22361:35:0;;;;;;22430:7;-1:-1:-1;;;;;22414:32:0;22423:5;-1:-1:-1;;;;;22414:32:0;-1:-1:-1;;;;;;;;;;;22439:6:0;22414:32;;;;;;;;;;;;;;;21404:1050;;;;;;;;;;;;:::o;31568:340::-;12638:12;:10;:12::i;:::-;12628:6;;-1:-1:-1;;;;;12628:6:0;;;:22;;;12620:67;;;;-1:-1:-1;;;12620:67:0;;;;;;;;;-1:-1:-1;;;;;31679:27:0;;31671:86;;;;-1:-1:-1;;;31671:86:0;;;;;;;;;31770:65;;-1:-1:-1;;;31770:65:0;;-1:-1:-1;;;;;31770:30:0;;;;;:65;;31809:10;;31822:12;;31770:65;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31770:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31770:65:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31770:65:0;;;;;;;;;;31853:47;31872:13;31887:12;31853:47;;;;;;;;;;;;;;;;31568:340;;:::o;19868:136::-;-1:-1:-1;;;;;19968:19:0;;;19944:4;19968:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;-1:-1:-1;;;;;19968:28:0;;19868:136::o;17936:117::-;17982:71;;;;;;17459:70;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17459:70:0;;-1:-1:-1;;;;;17459:70:0;;:::o;13353:109::-;12638:12;:10;:12::i;:::-;12628:6;;-1:-1:-1;;;;;12628:6:0;;;:22;;;12620:67;;;;-1:-1:-1;;;12620:67:0;;;;;;;;;13426:28;13445:8;13426:18;:28::i;30587:161::-;30662:6;30700:12;-1:-1:-1;;;30689:9:0;;30681:32;;;;-1:-1:-1;;;30681:32:0;;;;;;;;;;-1:-1:-1;30738:1:0;;30587:161;-1:-1:-1;;30587:161:0:o;30952:165::-;31038:6;31070:1;-1:-1:-1;;;;;31065:6:0;:1;-1:-1:-1;;;;;31065:6:0;;;31073:12;31057:29;;;;;-1:-1:-1;;;31057:29:0;;;;;;;;;;-1:-1:-1;;;31104:5:0;;;30952:165::o;28211:610::-;-1:-1:-1;;;;;28305:17:0;;28297:89;;;;-1:-1:-1;;;28297:89:0;;;;;;;;;-1:-1:-1;;;;;28405:17:0;;28397:87;;;;-1:-1:-1;;;28397:87:0;;;;;;;;;-1:-1:-1;;;;;28519:13:0;;;;;;:8;:13;;;;;;;;;;28513:85;;;;;;;;;;;;;;-1:-1:-1;;;;;28519:13:0;;;;28534:6;;28513:85;;;;;;;:5;:85::i;:::-;-1:-1:-1;;;;;28497:13:0;;;;;;;:8;:13;;;;;;;;:101;;-1:-1:-1;;;;;;28497:101:0;-1:-1:-1;;;;;28497:101:0;;;;;;28631:13;;;;;;;;;;28625:79;;;;;;;;;;;;;;28631:13;;;;;28646:6;;28625:79;;;;;;;;:5;:79::i;:::-;-1:-1:-1;;;;;28609:13:0;;;;;;;:8;:13;;;;;;;:95;;-1:-1:-1;;;;;;28609:95:0;-1:-1:-1;;;;;28609:95:0;;;;;;;;;;;28720:26;;;;;;;;;;28739:6;;28720:26;;;;;;;;;;-1:-1:-1;;;;;28774:14:0;;;;;;;:9;:14;;;;;;;28790;;;;;;;;28759:54;;28774:14;;;;28790;28806:6;28759:14;:54::i;:::-;28211:610;;;:::o;1914:137::-;1972:7;1999:44;2003:1;2006;1999:44;;;;;;;;;;;;;;;;;:3;:44::i;7429:165::-;7501:4;-1:-1:-1;;;;;7526:21:0;;7518:30;;;;;;-1:-1:-1;;;;;;7566:20:0;:11;:20;;;;;;;;;;;;;;;7429:165::o;27828:375::-;-1:-1:-1;;;;;27931:20:0;;;27905:23;27931:20;;;:9;:20;;;;;;;;;;27988:8;:19;;;;;;28018:20;;;;:32;;;-1:-1:-1;;;;;;28018:32:0;;;;;;;28068:54;;27931:20;;;;;-1:-1:-1;;;;;27988:19:0;;;;28018:32;;27931:20;;;28068:54;;27905:23;28068:54;28135:60;28150:15;28167:9;28178:16;28135:14;:60::i;:::-;27828:375;;;;:::o;14978:130::-;15038:24;:8;15054:7;15038:24;:15;:24;:::i;:::-;15078:22;;-1:-1:-1;;;;;15078:22:0;;;;;;;;14978:130;:::o;11071:98::-;11151:10;11071:98;:::o;14848:122::-;14905:21;:8;14918:7;14905:21;:12;:21;:::i;:::-;14942:20;;-1:-1:-1;;;;;14942:20:0;;;;;;;;14848:122;:::o;31125:153::-;31235:9;31125:153;:::o;13568:229::-;-1:-1:-1;;;;;13642:22:0;;13634:73;;;;-1:-1:-1;;;13634:73:0;;;;;;;;;13744:6;;;13723:38;;-1:-1:-1;;;;;13723:38:0;;;;13744:6;;;13723:38;;;13772:6;:17;;-1:-1:-1;;;;;;13772:17:0;-1:-1:-1;;;;;13772:17:0;;;;;;;;;;13568:229::o;30756:188::-;30842:6;30872:5;;;30904:12;-1:-1:-1;;;;;30896:6:0;;;;;;;;30888:29;;;;-1:-1:-1;;;30888:29:0;;;;;;;;;;-1:-1:-1;30935:1:0;30756:188;-1:-1:-1;;;;30756:188:0:o;28829:945::-;28934:6;-1:-1:-1;;;;;28924:16:0;:6;-1:-1:-1;;;;;28924:16:0;;;:30;;;;;28953:1;28944:6;-1:-1:-1;;;;;28944:10:0;;28924:30;28920:847;;;-1:-1:-1;;;;;28975:20:0;;;28971:385;;-1:-1:-1;;;;;29035:22:0;;29016:16;29035:22;;;:14;:22;;;;;;;;;29095:13;:60;;29154:1;29095:60;;;-1:-1:-1;;;;;29111:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;29131:13:0;;29111:34;;;;;;;;;:40;-1:-1:-1;;;29111:40:0;;-1:-1:-1;;;;;29111:40:0;29095:60;29076:79;;29174:16;29193:71;29199:9;29210:6;29193:71;;;;;;;;;;;;;;;;;:5;:71::i;:::-;29174:90;;29283:57;29300:6;29308:9;29319;29330;29283:16;:57::i;:::-;28971:385;;;;-1:-1:-1;;;;;29376:20:0;;;29372:384;;-1:-1:-1;;;;;29436:22:0;;29417:16;29436:22;;;:14;:22;;;;;;;;;29496:13;:60;;29555:1;29496:60;;;-1:-1:-1;;;;;29512:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;29532:13:0;;29512:34;;;;;;;;;:40;-1:-1:-1;;;29512:40:0;;-1:-1:-1;;;;;29512:40:0;29496:60;29477:79;;29575:16;29594:70;29600:9;29611:6;29594:70;;;;;;;;;;;;;;;;;:5;:70::i;:::-;29575:89;;29683:57;29700:6;29708:9;29719;29730;29683:16;:57::i;2340:192::-;2426:7;2462:12;2454:6;;;;2446:29;;;;-1:-1:-1;;;2446:29:0;;;;;;;;;7146:189;-1:-1:-1;;;;;7226:21:0;;7218:30;;;;;;7267:18;7271:4;7277:7;7267:3;:18::i;:::-;7259:27;;;;;;-1:-1:-1;;;;;7299:20:0;7322:5;7299:20;;;;;;;;;;;:28;;-1:-1:-1;;7299:28:0;;;7146:189::o;6881:186::-;-1:-1:-1;;;;;6958:21:0;;6950:30;;;;;;7000:18;7004:4;7010:7;7000:3;:18::i;:::-;6999:19;6991:28;;;;;;-1:-1:-1;;;;;7032:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;7032:27:0;7055:4;7032:27;;;6881:186::o;29782:628::-;29900:18;29921:75;29928:12;29921:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;29900:96;;30026:1;30011:12;:16;;;:85;;;;-1:-1:-1;;;;;;30031:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;30054:16:0;;30031:40;;;;;;;;;:50;:65;;;:50;;:65;30011:85;30007:329;;;-1:-1:-1;;;;;30111:22:0;;;;;;:11;:22;;;;;;;;-1:-1:-1;;30134:16:0;;30111:40;;;;;;;;;:57;;-1:-1:-1;;30111:57:0;-1:-1:-1;;;;;;;;30111:57:0;;;;;;30007:329;;;30236:33;;;;;;;;;;;;;;-1:-1:-1;;;;;30236:33:0;;;;;;;;;;-1:-1:-1;;;;;30197:22:0;;-1:-1:-1;30197:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;-1:-1:-1;;;30197:72:0;-1:-1:-1;;30197:72:0;;;-1:-1:-1;;30197:72:0;;;;;;;;;;;;;;;30282:25;;;:14;:25;;;;;;;:44;;30197:72;30310:16;;30282:44;;;;;;;;;;;;;30007:329;30372:9;-1:-1:-1;;;;;30351:51:0;;30383:8;30393;30351:51;;;;;;;;;;;;;;;;29782:628;;;;;:::o;30418:161::-;30493:6;30531:12;-1:-1:-1;;;30520:9:0;;30512:32;;;;-1:-1:-1;;;30512:32:0;;;;;;;;;16397:16956;;;;;;;;;;-1:-1:-1;16397:16956:0;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:128;217:13;;235:30;217:13;235:30;;277:130;344:20;;369:33;344:20;369:33;;415:440;;516:3;509:4;501:6;497:17;493:27;483:2;;534:1;531;524:12;483:2;571:6;558:20;593:64;608:48;649:6;608:48;;;593:64;;;584:73;;677:6;670:5;663:21;713:4;705:6;701:17;746:4;739:5;735:16;781:3;772:6;767:3;763:16;760:25;757:2;;;798:1;795;788:12;757:2;808:41;842:6;837:3;832;808:41;;;476:379;;;;;;;;1000:128;1066:20;;1091:32;1066:20;1091:32;;1135:126;1200:20;;1225:31;1200:20;1225:31;;1268:241;;1372:2;1360:9;1351:7;1347:23;1343:32;1340:2;;;1388:1;1385;1378:12;1340:2;1423:1;1440:53;1485:7;1465:9;1440:53;;;1430:63;1334:175;-1:-1;;;;1334:175;1516:366;;;1637:2;1625:9;1616:7;1612:23;1608:32;1605:2;;;1653:1;1650;1643:12;1605:2;1688:1;1705:53;1750:7;1730:9;1705:53;;;1695:63;;1667:97;1795:2;1813:53;1858:7;1849:6;1838:9;1834:22;1813:53;;;1803:63;;1774:98;1599:283;;;;;;1889:491;;;;2027:2;2015:9;2006:7;2002:23;1998:32;1995:2;;;2043:1;2040;2033:12;1995:2;2078:1;2095:53;2140:7;2120:9;2095:53;;;2085:63;;2057:97;2185:2;2203:53;2248:7;2239:6;2228:9;2224:22;2203:53;;;2193:63;;2164:98;2293:2;2311:53;2356:7;2347:6;2336:9;2332:22;2311:53;;;2301:63;;2272:98;1989:391;;;;;;2387:991;;;;;;;;2591:3;2579:9;2570:7;2566:23;2562:33;2559:2;;;2608:1;2605;2598:12;2559:2;2643:1;2660:53;2705:7;2685:9;2660:53;;;2650:63;;2622:97;2750:2;2768:53;2813:7;2804:6;2793:9;2789:22;2768:53;;;2758:63;;2729:98;2858:2;2876:53;2921:7;2912:6;2901:9;2897:22;2876:53;;;2866:63;;2837:98;2966:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;;;2974:63;;2945:98;3074:3;3093:51;3136:7;3127:6;3116:9;3112:22;3093:51;;;3083:61;;3053:97;3181:3;3200:53;3245:7;3236:6;3225:9;3221:22;3200:53;;;3190:63;;3160:99;3290:3;3309:53;3354:7;3345:6;3334:9;3330:22;3309:53;;;3299:63;;3269:99;2553:825;;;;;;;;;;;3385:366;;;3506:2;3494:9;3485:7;3481:23;3477:32;3474:2;;;3522:1;3519;3512:12;3474:2;3557:1;3574:53;3619:7;3599:9;3574:53;;;3564:63;;3536:97;3664:2;3682:53;3727:7;3718:6;3707:9;3703:22;3682:53;;3758:595;;;;3905:2;3893:9;3884:7;3880:23;3876:32;3873:2;;;3921:1;3918;3911:12;3873:2;3956:1;3973:53;4018:7;3998:9;3973:53;;;3963:63;;3935:97;4063:2;4081:53;4126:7;4117:6;4106:9;4102:22;4081:53;;;4071:63;;4042:98;4199:2;4188:9;4184:18;4171:32;4223:18;4215:6;4212:30;4209:2;;;4255:1;4252;4245:12;4209:2;4275:62;4329:7;4320:6;4309:9;4305:22;4275:62;;4360:865;;;;;;;4547:3;4535:9;4526:7;4522:23;4518:33;4515:2;;;4564:1;4561;4554:12;4515:2;4599:1;4616:53;4661:7;4641:9;4616:53;;;4606:63;;4578:97;4706:2;4724:53;4769:7;4760:6;4749:9;4745:22;4724:53;;;4714:63;;4685:98;4814:2;4832:53;4877:7;4868:6;4857:9;4853:22;4832:53;;;4822:63;;4793:98;4922:2;4940:51;4983:7;4974:6;4963:9;4959:22;4940:51;;;4930:61;;4901:96;5028:3;5047:53;5092:7;5083:6;5072:9;5068:22;5047:53;;;5037:63;;5007:99;5137:3;5156:53;5201:7;5192:6;5181:9;5177:22;5156:53;;;5146:63;;5116:99;4509:716;;;;;;;;;5232:364;;;5352:2;5340:9;5331:7;5327:23;5323:32;5320:2;;;5368:1;5365;5358:12;5320:2;5403:1;5420:53;5465:7;5445:9;5420:53;;;5410:63;;5382:97;5510:2;5528:52;5572:7;5563:6;5552:9;5548:22;5528:52;;5603:257;;5715:2;5703:9;5694:7;5690:23;5686:32;5683:2;;;5731:1;5728;5721:12;5683:2;5766:1;5783:61;5836:7;5816:9;5783:61;;5867:241;;5971:2;5959:9;5950:7;5946:23;5942:32;5939:2;;;5987:1;5984;5977:12;5939:2;6022:1;6039:53;6084:7;6064:9;6039:53;;6115:142;6206:45;6245:5;6206:45;;;6201:3;6194:58;6188:69;;;6264:113;6347:24;6365:5;6347:24;;6384:104;6461:21;6476:5;6461:21;;6495:113;6578:24;6596:5;6578:24;;6615:152;6716:45;6736:24;6754:5;6736:24;;;6716:45;;6774:343;;6884:38;6916:5;6884:38;;;6934:70;6997:6;6992:3;6934:70;;;6927:77;;7009:52;7054:6;7049:3;7042:4;7035:5;7031:16;7009:52;;;7082:29;7104:6;7082:29;;;7073:39;;;;6864:253;-1:-1;;;6864:253;7825:330;;7985:67;8049:2;8044:3;7985:67;;;8085:32;8065:53;;8146:2;8137:12;;7971:184;-1:-1;;7971:184;8164:374;;8324:67;8388:2;8383:3;8324:67;;;8424:34;8404:55;;-1:-1;;;8488:2;8479:12;;8472:29;8529:2;8520:12;;8310:228;-1:-1;;8310:228;8547:394;;8707:67;8771:2;8766:3;8707:67;;;8807:34;8787:55;;8876:27;8871:2;8862:12;;8855:49;8932:2;8923:12;;8693:248;-1:-1;;8693:248;8950:375;;9110:67;9174:2;9169:3;9110:67;;;9210:34;9190:55;;-1:-1;;;9274:2;9265:12;;9258:30;9316:2;9307:12;;9096:229;-1:-1;;9096:229;9334:370;;9494:67;9558:2;9553:3;9494:67;;;9594:34;9574:55;;-1:-1;;;9658:2;9649:12;;9642:25;9695:2;9686:12;;9480:224;-1:-1;;9480:224;9713:398;;9891:84;9973:1;9968:3;9891:84;;;-1:-1;;;9988:87;;10103:1;10094:11;;9877:234;-1:-1;;9877:234;10120:330;;10280:67;10344:2;10339:3;10280:67;;;10380:32;10360:53;;10441:2;10432:12;;10266:184;-1:-1;;10266:184;10459:329;;10619:67;10683:2;10678:3;10619:67;;;10719:31;10699:52;;10779:2;10770:12;;10605:183;-1:-1;;10605:183;10797:325;;10957:67;11021:2;11016:3;10957:67;;;11057:27;11037:48;;11113:2;11104:12;;10943:179;-1:-1;;10943:179;11131:492;;11309:85;11391:2;11386:3;11309:85;;;11427:34;11407:55;;11496:34;11491:2;11482:12;;11475:56;-1:-1;;;11560:2;11551:12;;11544:42;11614:2;11605:12;;11295:328;-1:-1;;11295:328;11632:374;;11792:67;11856:2;11851:3;11792:67;;;11892:34;11872:55;;-1:-1;;;11956:2;11947:12;;11940:29;11997:2;11988:12;;11778:228;-1:-1;;11778:228;12015:383;;12175:67;12239:2;12234:3;12175:67;;;12275:34;12255:55;;-1:-1;;;12339:2;12330:12;;12323:38;12389:2;12380:12;;12161:237;-1:-1;;12161:237;12407:477;;12585:85;12667:2;12662:3;12585:85;;;12703:34;12683:55;;12772:34;12767:2;12758:12;;12751:56;-1:-1;;;12836:2;12827:12;;12820:27;12875:2;12866:12;;12571:313;-1:-1;;12571:313;12893:332;;13053:67;13117:2;13112:3;13053:67;;;13153:34;13133:55;;13216:2;13207:12;;13039:186;-1:-1;;13039:186;13234:375;;13394:67;13458:2;13453:3;13394:67;;;13494:34;13474:55;;-1:-1;;;13558:2;13549:12;;13542:30;13600:2;13591:12;;13380:229;-1:-1;;13380:229;13618:396;;13778:67;13842:2;13837:3;13778:67;;;13878:34;13858:55;;13947:29;13942:2;13933:12;;13926:51;14005:2;13996:12;;13764:250;-1:-1;;13764:250;14023:431;;14201:85;14283:2;14278:3;14201:85;;;14319:34;14299:55;;14388:28;14383:2;14374:12;;14367:50;14445:2;14436:12;;14187:267;-1:-1;;14187:267;14582:110;14663:23;14680:5;14663:23;;14699:107;14778:22;14794:5;14778:22;;14813:124;14895:36;14925:5;14895:36;;14944:110;15025:23;15042:5;15025:23;;15061:650;;15316:148;15460:3;15316:148;;;15309:155;;15475:75;15546:3;15537:6;15475:75;;;15572:2;15567:3;15563:12;15556:19;;15586:75;15657:3;15648:6;15586:75;;;-1:-1;15683:2;15674:12;;15297:414;-1:-1;;15297:414;15718:372;;15917:148;16061:3;15917:148;;16097:372;;16296:148;16440:3;16296:148;;16476:372;;16675:148;16819:3;16675:148;;16855:213;16973:2;16958:18;;16987:71;16962:9;17031:6;16987:71;;17075:229;17201:2;17186:18;;17215:79;17190:9;17267:6;17215:79;;17311:340;17465:2;17450:18;;17479:79;17454:9;17531:6;17479:79;;;17569:72;17637:2;17626:9;17622:18;17613:6;17569:72;;17658:647;17886:3;17871:19;;17901:79;17875:9;17953:6;17901:79;;;17991:72;18059:2;18048:9;18044:18;18035:6;17991:72;;;18074;18142:2;18131:9;18127:18;18118:6;18074:72;;;18194:9;18188:4;18184:20;18179:2;18168:9;18164:18;18157:48;18219:76;18290:4;18281:6;18219:76;;;18211:84;17857:448;-1:-1;;;;;;17857:448;18312:324;18458:2;18443:18;;18472:71;18447:9;18516:6;18472:71;;18643:201;18755:2;18740:18;;18769:65;18744:9;18807:6;18769:65;;18851:213;18969:2;18954:18;;18983:71;18958:9;19027:6;18983:71;;19071:771;19329:3;19314:19;;19344:71;19318:9;19388:6;19344:71;;;19426:72;19494:2;19483:9;19479:18;19470:6;19426:72;;;19509;19577:2;19566:9;19562:18;19553:6;19509:72;;;19592;19660:2;19649:9;19645:18;19636:6;19592:72;;;19675:73;19743:3;19732:9;19728:19;19719:6;19675:73;;;19759;19827:3;19816:9;19812:19;19803:6;19759:73;;;19300:542;;;;;;;;;;19849:547;20051:3;20036:19;;20066:71;20040:9;20110:6;20066:71;;;20148:72;20216:2;20205:9;20201:18;20192:6;20148:72;;;20231;20299:2;20288:9;20284:18;20275:6;20231:72;;;20314;20382:2;20371:9;20367:18;20358:6;20314:72;;;20022:374;;;;;;;;20403:547;20605:3;20590:19;;20620:71;20594:9;20664:6;20620:71;;;20702:72;20770:2;20759:9;20755:18;20746:6;20702:72;;;20785;20853:2;20842:9;20838:18;20829:6;20785:72;;;20868;20936:2;20925:9;20921:18;20912:6;20868:72;;20957:539;21155:3;21140:19;;21170:71;21144:9;21214:6;21170:71;;;21252:68;21316:2;21305:9;21301:18;21292:6;21252:68;;21503:293;21637:2;21651:47;;;21622:18;;21712:74;21622:18;21772:6;21712:74;;22111:407;22302:2;22316:47;;;22287:18;;22377:131;22287:18;22377:131;;22525:407;22716:2;22730:47;;;22701:18;;22791:131;22701:18;22791:131;;22939:407;23130:2;23144:47;;;23115:18;;23205:131;23115:18;23205:131;;23353:407;23544:2;23558:47;;;23529:18;;23619:131;23529:18;23619:131;;23767:407;23958:2;23972:47;;;23943:18;;24033:131;23943:18;24033:131;;24181:407;24372:2;24386:47;;;24357:18;;24447:131;24357:18;24447:131;;24595:407;24786:2;24800:47;;;24771:18;;24861:131;24771:18;24861:131;;25009:407;25200:2;25214:47;;;25185:18;;25275:131;25185:18;25275:131;;25423:407;25614:2;25628:47;;;25599:18;;25689:131;25599:18;25689:131;;25837:407;26028:2;26042:47;;;26013:18;;26103:131;26013:18;26103:131;;26251:407;26442:2;26456:47;;;26427:18;;26517:131;26427:18;26517:131;;26665:407;26856:2;26870:47;;;26841:18;;26931:131;26841:18;26931:131;;27079:407;27270:2;27284:47;;;27255:18;;27345:131;27255:18;27345:131;;27713:209;27829:2;27814:18;;27843:69;27818:9;27885:6;27843:69;;27929:316;28071:2;28056:18;;28085:69;28060:9;28127:6;28085:69;;;28165:70;28231:2;28220:9;28216:18;28207:6;28165:70;;28252:205;28366:2;28351:18;;28380:67;28355:9;28420:6;28380:67;;28464:211;28581:2;28566:18;;28595:70;28570:9;28638:6;28595:70;;28682:209;28798:2;28783:18;;28812:69;28787:9;28854:6;28812:69;;28898:320;29042:2;29027:18;;29056:70;29031:9;29099:6;29056:70;;;29137:71;29204:2;29193:9;29189:18;29180:6;29137:71;;29225:256;29287:2;29281:9;29313:17;;;29388:18;29373:34;;29409:22;;;29370:62;29367:2;;;29445:1;29442;29435:12;29367:2;29461;29454:22;29265:216;;-1:-1;29265:216;29488:321;;29631:18;29623:6;29620:30;29617:2;;;29663:1;29660;29653:12;29617:2;-1:-1;29794:4;29730;29707:17;;;;-1:-1;;29703:33;29784:15;;29554:255;29816:121;29903:12;;29874:63;30199:162;30301:19;;;30350:4;30341:14;;30294:67;30542:145;30678:3;30656:31;-1:-1;30656:31;30695:91;;30757:24;30775:5;30757:24;;30793:85;30859:13;30852:21;;30835:43;30885:72;30947:5;30930:27;30964:121;-1:-1;;;;;31026:54;;31009:76;31171:88;31243:10;31232:22;;31215:44;31266:81;31337:4;31326:16;;31309:38;31354:104;-1:-1;;;;;31415:38;;31398:60;31465:129;;31552:37;31583:5;31601:121;31680:37;31711:5;31680:37;;31844:106;;31922:23;31939:5;31922:23;;31958:145;32039:6;32034:3;32029;32016:30;-1:-1;32095:1;32077:16;;32070:27;32009:94;32112:268;32177:1;32184:101;32198:6;32195:1;32192:13;32184:101;;;32265:11;;;32259:18;32246:11;;;32239:39;32220:2;32213:10;32184:101;;;32300:6;32297:1;32294:13;32291:2;;;-1:-1;;32365:1;32347:16;;32340:27;32161:219;32469:97;32557:2;32537:14;-1:-1;;32533:28;;32517:49;32574:117;32643:24;32661:5;32643:24;;;32636:5;32633:35;32623:2;;32682:1;32679;32672:12;32698:111;32764:21;32779:5;32764:21;;32816:117;32885:24;32903:5;32885:24;;33064:115;33132:23;33149:5;33132:23;;33186:113;33253:22;33269:5;33253:22;

Swarm Source

bzzr://897ca5cf3872e9c93dab470f64e0327621f94ede76e01e18ec9e251b40064fe0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.