ETH Price: $2,617.31 (+0.78%)

Token

SuperPlayerEquipment (SPE)
 

Overview

Max Total Supply

521 SPE

Holders

70

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 SPE
0xaf898fc38e04824985bdd9b461b71cc4e0363646
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:
SuperplayerEquipmentV001

Compiler Version
v0.5.1+commit.c8a2cb62

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-09
*/

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * [EIP](https://eips.ethereum.org/EIPS/eip-165).
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others (`ERC165Checker`).
 *
 * For an implementation, see `ERC165`.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * 
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either `approve` or `setApproveForAll`.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either `approve` or `setApproveForAll`.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safeTransfer`. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

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

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.0;

/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

// File: openzeppelin-solidity/contracts/drafts/Counters.sol

pragma solidity ^0.5.0;


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.5.0;


/**
 * @dev Implementation of the `IERC165` interface.
 *
 * Contracts may inherit from this and call `_registerInterface` to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See `IERC165.supportsInterface`.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See `IERC165.supportsInterface`.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.5.0;







/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke `onERC721Received` on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This function is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity ^0.5.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol

pragma solidity ^0.5.0;




contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return _tokenURIs[tokenId];
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @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(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        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), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol

pragma solidity ^0.5.0;


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), "PauserRole: caller does not have the Pauser role");
        _;
    }

    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);
    }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.5.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
contract Pausable is PauserRole {
    /**
     * @dev Emitted when the pause is triggered by a pauser (`account`).
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by a pauser (`account`).
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state. Assigns the Pauser role
     * to the deployer.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and 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, "Pausable: paused");
        _;
    }

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

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

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

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.0;

/**
 * @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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

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

    /**
     * @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(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _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;
    }
}

// File: contracts/eth_superplayer_nft.sol

pragma solidity ^0.5.0;






/*





*/







/**
 * @title Whitelist
 * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.
 * @dev This simplifies the implementation of "user permissions".
 */
contract EquipGeneratorWhitelist is Ownable {
  mapping(address => string) public whitelist;
  mapping(string => address)  cat2address;

  event WhitelistedAddressAdded(address addr,string category);
  event WhitelistedAddressRemoved(address addr);

  /**
   * @dev Throws if called by any account that's not whitelisted.
   */
  modifier canGenerate() {
    //require(keccak256(whitelist[msg.sender]) == keccak256(category));
    require(bytes(whitelist[msg.sender]).length >0 );
    _;
  }

  /**
   * @dev add an address to the whitelist
   * @param addr address
   * @return true if the address was added to the whitelist, false if the address was already in the whitelist
   */
  function addAddressToWhitelist(address addr,string memory category) onlyOwner internal returns(bool success) {
    require( bytes(category).length > 0 );
    if (bytes(whitelist[addr]).length == 0) {
      require( cat2address[category] == address(0));
      whitelist[addr] = category;
      emit WhitelistedAddressAdded(addr,category);
      success = true;
    }
  }


  /**
   * @dev remove an address from the whitelist
   * @param addr address
   * @return true if the address was removed from the whitelist,
   * false if the address wasn't in the whitelist in the first place
   */
  function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) {
    string storage category = whitelist[addr];
    if (bytes(category).length != 0) {
      delete cat2address[category] ;
      delete whitelist[addr]  ;
      emit WhitelistedAddressRemoved(addr);
      success = true;
    }
  }



}



contract SuperplayerEquipmentInterface {
  function createEquip(address to, string memory key, uint[] memory randomProps )  public returns(uint256);
}

contract SuperplayerRandomEquipmentInterface {
  function getRandomEquipment(uint256 seed) public view returns(uint blockNo,string memory ekey,uint[] memory randomProps) ;
}

   
contract SuperplayerEquipmentV001 is EquipGeneratorWhitelist,ERC721 ,ERC721Metadata("SuperPlayerEquipment","SPE") {

  using SafeMath for uint256;

  enum EquipmentPart {Weapon ,Head,Coat,Pants ,Shoes ,Bag}
  enum EquipmentRareness {Blue,Purple, Orange,Red }

  struct Equipment {
    string key; //using key to contains part and rareness format : rareness_part_name
//    EquipmentPart part;
 //   EquipmentRareness rareness;
    uint[] randomProperties;
    uint[] advancedProperties; //for equipment enhance
  }



  event Birth(address where,uint256 tokenId , string key,  uint[] randomProps);
  event GetAdvancedProperties(address where,uint256 tokenId,uint[] advancedProps);


  mapping (uint256 => uint256) private typeLimitsMap;
  mapping (uint256 => uint256) private typeCurrCntMap;

  uint256 TotalEquipNum; // for ERC721


  Equipment[] private equips;

  constructor() public{

  }

  function totalSupply() public view returns (uint) {
    return TotalEquipNum;
  }

  function addEquipmentGenerator(address addr, string memory category) onlyOwner public returns(bool success){
    return addAddressToWhitelist(addr,category);
  }

  function removeEquipmentGenerator(address addr) onlyOwner public returns(bool success){
    return removeAddressFromWhitelist(addr);
  }

  function setLimit(string memory key, uint256 limit) onlyOwner public {
    uint256 uintkey =  uint256(keccak256(abi.encodePacked(bytes(key))));
    //only can set once
    require( typeLimitsMap[uintkey] == uint256(0) ) ;
    typeLimitsMap[ uintkey ] = limit;
  }

  function setLimits(uint256[] memory uintkeys, uint256[] memory limits) onlyOwner public {
    require(uintkeys.length == limits.length);
    uint len = uintkeys.length;
    for (uint i = 0;i < len ; i++){
    //only can set once
      uint256 uintkey = uintkeys[i];
      if( typeLimitsMap[ uintkey]  == 0 ) {
        typeLimitsMap[ uintkey ] = limits[i];
      }
    }
  }



  function getLimit(string memory key)  public view returns(uint256 current, uint256 limit){
    uint256 uintkey = uint256(keccak256(abi.encodePacked(bytes(key))));
    current = typeCurrCntMap[uintkey];
    limit = typeLimitsMap[uintkey];
  }

  /*
   * This privilege should transfer to the community nodes ,but as the beginning,our team control it for game's quickly  iteration
   */
  function createEquip(address to, string memory key, uint[] memory randomProps) canGenerate public returns(uint256){
    uint256 uintkey =  uint256(keccak256(abi.encodePacked(bytes(key))));
    uint256 currentTypCnt = typeCurrCntMap[uintkey]; 

    // limit checkt
    require(currentTypCnt < typeLimitsMap[uintkey]) ;

    uint[] memory emptyProps = new uint[](0); 
    Equipment memory newEquip = Equipment({
      key : key,
      randomProperties : randomProps,
      advancedProperties : emptyProps
    });
    TotalEquipNum = TotalEquipNum.add(1);
    uint256 newEquipId = equips.push(newEquip).sub(1);
    emit Birth(msg.sender,newEquipId,key,randomProps);
    _mint(to,newEquipId);

    typeCurrCntMap[uintkey] =  currentTypCnt + 1;

    return newEquipId;
  }


  function accquireAdvancedProps(uint256 tokenId,uint[] memory advancedProps) canGenerate public  {
    require(tokenId < TotalEquipNum );
    require( _isApprovedOrOwner( msg.sender,tokenId));
    Equipment storage equip = equips[tokenId];
    equip.advancedProperties = advancedProps;
  }

  function getEquip(uint256 idx) public view returns(
    string memory key,
    uint[] memory randomProps,
    uint[] memory advancedProperties
  ){
      require(idx < TotalEquipNum);
      Equipment storage equip = equips[idx];
      key = equip.key;
      randomProps = equip.randomProperties;
      advancedProperties = equip.advancedProperties;
  }
}




/*
 * 
 */

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"uintkeys","type":"uint256[]"},{"name":"limits","type":"uint256[]"}],"name":"setLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"advancedProps","type":"uint256[]"}],"name":"accquireAdvancedProps","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"key","type":"string"},{"name":"limit","type":"uint256"}],"name":"setLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"key","type":"string"}],"name":"getLimit","outputs":[{"name":"current","type":"uint256"},{"name":"limit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"key","type":"string"},{"name":"randomProps","type":"uint256[]"}],"name":"createEquip","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeEquipmentGenerator","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"category","type":"string"}],"name":"addEquipmentGenerator","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"idx","type":"uint256"}],"name":"getEquip","outputs":[{"name":"key","type":"string"},{"name":"randomProps","type":"uint256[]"},{"name":"advancedProperties","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"where","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"key","type":"string"},{"indexed":false,"name":"randomProps","type":"uint256[]"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"where","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"advancedProps","type":"uint256[]"}],"name":"GetAdvancedProperties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"category","type":"string"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040523480156200001157600080fd5b50604080518082018252601481527f5375706572506c6179657245717569706d656e7400000000000000000000000060208083019190915282518084018452600381527f53504500000000000000000000000000000000000000000000000000000000009181019190915260008054600160a060020a0319163317808255935192939192600160a060020a0392909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3620000fb7f01ffc9a70000000000000000000000000000000000000000000000000000000064010000000062000197810204565b6200012f7f80ac58cd0000000000000000000000000000000000000000000000000000000064010000000062000197810204565b81516200014490600890602085019062000266565b5080516200015a90600990602084019062000266565b506200018f7f5b5e139f0000000000000000000000000000000000000000000000000000000064010000000062000197810204565b50506200030b565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200022957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600360205260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002a957805160ff1916838001178555620002d9565b82800160010185558215620002d9579182015b82811115620002d9578251825591602001919060010190620002bc565b50620002e7929150620002eb565b5090565b6200030891905b80821115620002e75760008155600101620002f2565b90565b612b01806200031b6000396000f3fe608060405260043610610163577c0100000000000000000000000000000000000000000000000000000000600035046301ffc9a7811461016857806306fdde03146101c5578063081812fc1461024f578063095ea7b3146102955780631558bff0146102d057806318160ddd1461040457806323b872dd1461042b578063286dd3f51461046e57806341da8e08146104a157806342842e0e146105585780636352211e1461059b5780636562ec42146105c557806370a082311461067a578063715018a6146106ad578063860f1681146106c257806389ea4dcf1461078e5780638da5cb5b146108d55780638f32d59b146108ea57806395d89b41146108ff5780639b19251a146109145780639fc2fd5714610947578063a22cb4651461097a578063b88d4fde146109b5578063c87b56dd14610a88578063ca328eb914610ab2578063e985e9c514610b75578063f2fde38b14610bb0578063ffb1019b14610be3575b600080fd5b34801561017457600080fd5b506101b16004803603602081101561018b57600080fd5b50357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610d0b565b604080519115158252519081900360200190f35b3480156101d157600080fd5b506101da610d3f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102145781810151838201526020016101fc565b50505050905090810190601f1680156102415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025b57600080fd5b506102796004803603602081101561027257600080fd5b5035610dd6565b60408051600160a060020a039092168252519081900360200190f35b3480156102a157600080fd5b506102ce600480360360408110156102b857600080fd5b50600160a060020a038135169060200135610e79565b005b3480156102dc57600080fd5b506102ce600480360360408110156102f357600080fd5b81019060208101813564010000000081111561030e57600080fd5b82018360208201111561032057600080fd5b8035906020019184602083028401116401000000008311171561034257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561039257600080fd5b8201836020820111156103a457600080fd5b803590602001918460208302840111640100000000831117156103c657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611004945050505050565b34801561041057600080fd5b506104196110dc565b60408051918252519081900360200190f35b34801561043757600080fd5b506102ce6004803603606081101561044e57600080fd5b50600160a060020a038135811691602081013590911690604001356110e2565b34801561047a57600080fd5b506101b16004803603602081101561049157600080fd5b5035600160a060020a0316611178565b3480156104ad57600080fd5b506102ce600480360360408110156104c457600080fd5b813591908101906040810160208201356401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184602083028401116401000000008311171561051a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506112e3945050505050565b34801561056457600080fd5b506102ce6004803603606081101561057b57600080fd5b50600160a060020a0381358116916020810135909116906040013561136b565b3480156105a757600080fd5b50610279600480360360208110156105be57600080fd5b5035611387565b3480156105d157600080fd5b506102ce600480360360408110156105e857600080fd5b81019060208101813564010000000081111561060357600080fd5b82018360208201111561061557600080fd5b8035906020019184600183028401116401000000008311171561063757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611422915050565b34801561068657600080fd5b506104196004803603602081101561069d57600080fd5b5035600160a060020a031661150b565b3480156106b957600080fd5b506102ce6115b4565b3480156106ce57600080fd5b50610775600480360360208110156106e557600080fd5b81019060208101813564010000000081111561070057600080fd5b82018360208201111561071257600080fd5b8035906020019184600183028401116401000000008311171561073457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061164a945050505050565b6040805192835260208301919091528051918290030190f35b34801561079a57600080fd5b50610419600480360360608110156107b157600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156107dc57600080fd5b8201836020820111156107ee57600080fd5b8035906020019184600183028401116401000000008311171561081057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561086357600080fd5b82018360208201111561087557600080fd5b8035906020019184602083028401116401000000008311171561089757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506116de945050505050565b3480156108e157600080fd5b506102796119b0565b3480156108f657600080fd5b506101b16119bf565b34801561090b57600080fd5b506101da6119d0565b34801561092057600080fd5b506101da6004803603602081101561093757600080fd5b5035600160a060020a0316611a31565b34801561095357600080fd5b506101b16004803603602081101561096a57600080fd5b5035600160a060020a0316611acb565b34801561098657600080fd5b506102ce6004803603604081101561099d57600080fd5b50600160a060020a0381351690602001351515611b22565b3480156109c157600080fd5b506102ce600480360360808110156109d857600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610a1357600080fd5b820183602082011115610a2557600080fd5b80359060200191846001830284011164010000000083111715610a4757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bf1945050505050565b348015610a9457600080fd5b506101da60048036036020811015610aab57600080fd5b5035611c84565b348015610abe57600080fd5b506101b160048036036040811015610ad557600080fd5b600160a060020a038235169190810190604081016020820135640100000000811115610b0057600080fd5b820183602082011115610b1257600080fd5b80359060200191846001830284011164010000000083111715610b3457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611daa945050505050565b348015610b8157600080fd5b506101b160048036036040811015610b9857600080fd5b50600160a060020a0381358116916020013516611e09565b348015610bbc57600080fd5b506102ce60048036036020811015610bd357600080fd5b5035600160a060020a0316611e37565b348015610bef57600080fd5b50610c0d60048036036020811015610c0657600080fd5b5035611e8f565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015610c52578181015183820152602001610c3a565b50505050905090810190601f168015610c7f5780820380516001836020036101000a031916815260200191505b508481038352865181528651602091820191808901910280838360005b83811015610cb4578181015183820152602001610c9c565b50505050905001848103825285818151815260200191508051906020019060200280838360005b83811015610cf3578181015183820152602001610cdb565b50505050905001965050505050505060405180910390f35b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526003602052604090205460ff1690565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610dcb5780601f10610da057610100808354040283529160200191610dcb565b820191906000526020600020905b815481529060010190602001808311610dae57829003601f168201915b505050505090505b90565b6000610de182612007565b1515610e5d576040805160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015290519081900360840190fd5b50600090815260056020526040902054600160a060020a031690565b6000610e8482611387565b9050600160a060020a038381169082161415610f10576040805160e560020a62461bcd02815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a0382161480610f2c5750610f2c8133611e09565b1515610fa8576040805160e560020a62461bcd02815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015290519081900360840190fd5b6000828152600560205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61100c6119bf565b1515611050576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b805182511461105e57600080fd5b815160005b818110156110d6576000848281518110151561107b57fe5b906020019060200201519050600b600082815260200190815260200160002054600014156110cd5783828151811015156110b157fe5b60209081029091018101516000838152600b9092526040909120555b50600101611063565b50505050565b600d5490565b6110ec3382612024565b1515611168576040805160e560020a62461bcd02815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015290519081900360840190fd5b611173838383612109565b505050565b60006111826119bf565b15156111c6576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b600160a060020a038216600090815260016020819052604090912080549091600290821615610100026000190190911604156112dd57600281604051808280546001816001161561010002031660029004801561125a5780601f1061123857610100808354040283529182019161125a565b820191906000526020600020905b815481529060010190602001808311611246575b5050928352505060408051602092819003830190208054600160a060020a0319169055600160a060020a03851660009081526001909252812061129c9161297d565b60408051600160a060020a038516815290517ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a9181900360200190a1600191505b50919050565b336000908152600160208190526040822054600291811615610100026000190116041161130f57600080fd5b600d54821061131d57600080fd5b6113273383612024565b151561133257600080fd5b6000600e8381548110151561134357fe5b90600052602060002090600302019050818160020190805190602001906110d69291906129c1565b6111738383836020604051908101604052806000815250611bf1565b600081815260046020526040812054600160a060020a031680151561141c576040805160e560020a62461bcd02815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b92915050565b61142a6119bf565b151561146e576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b6000826040516020018082805190602001908083835b602083106114a35780518252601f199092019160209182019101611484565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835284528151918101919091206000818152600b90925292902054919450501591506114f9905057600080fd5b6000908152600b602052604090205550565b6000600160a060020a0382161515611593576040805160e560020a62461bcd02815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038216600090815260066020526040902061141c906122cc565b6115bc6119bf565b1515611600576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054600160a060020a0319169055565b6000806000836040516020018082805190602001908083835b602083106116825780518252601f199092019160209182019101611663565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835284528151918101919091206000908152600c825283812054600b909252929092205491989197509095505050505050565b33600090815260016020819052604082205460029181161561010002600019011604811061170b57600080fd5b6000836040516020018082805190602001908083835b602083106117405780518252601f199092019160209182019101611721565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835284528151918101919091206000818152600c835284812054600b9093529390932054929550935050821090506117a057600080fd5b6040805160008152602081019091526117b7612a0c565b506040805160608101825287815260208101879052908101829052600d546117e690600163ffffffff6122d016565b600d55600e8054600181810180845560009384528451805161188494879260039091027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd019161183e91839160209190910190612a2e565b50602082810151805161185792600185019201906129c1565b50604082015180516118739160028401916020909101906129c1565b50505061232d90919063ffffffff16565b90507f5ab992d1d92f944a16f8181e78676c06d55e08e3e65019a7fbadcf91c7327ec333828a8a6040518085600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561190a5781810151838201526020016118f2565b50505050905090810190601f1680156119375780820380516001836020036101000a031916815260200191505b508381038252845181528451602091820191808701910280838360005b8381101561196c578181015183820152602001611954565b50505050905001965050505050505060405180910390a161198d898261238d565b6000948552600c6020526040909420600190930190925550909150509392505050565b600054600160a060020a031690565b600054600160a060020a0316331490565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610dcb5780601f10610da057610100808354040283529160200191610dcb565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f8101839004830284018301909452838352919290830182828015611ac35780601f10611a9857610100808354040283529160200191611ac3565b820191906000526020600020905b815481529060010190602001808311611aa657829003601f168201915b505050505081565b6000611ad56119bf565b1515611b19576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b61141c82611178565b600160a060020a038216331415611b83576040805160e560020a62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b611bfc8484846110e2565b611c08848484846124c6565b15156110d6576040805160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015290519081900360840190fd5b6060611c8f82612007565b1515611d0b576040805160e560020a62461bcd02815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015290519081900360840190fd5b6000828152600a602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015611d9e5780601f10611d7357610100808354040283529160200191611d9e565b820191906000526020600020905b815481529060010190602001808311611d8157829003601f168201915b50505050509050919050565b6000611db46119bf565b1515611df8576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b611e028383612642565b9392505050565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b611e3f6119bf565b1515611e83576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b611e8c81612839565b50565b6060806060600d5484101515611ea457600080fd5b6000600e85815481101515611eb557fe5b60009182526020918290206003919091020180546040805160026001841615610100026000190190931692909204601f810185900485028301850190915280825291935091839190830182828015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050935080600101805480602002602001604051908101604052809291908181526020018280548015611fa357602002820191906000526020600020905b815481526020019060010190808311611f8f575b5050505050925080600201805480602002602001604051908101604052809291908181526020018280548015611ff857602002820191906000526020600020905b815481526020019060010190808311611fe4575b50505050509150509193909250565b600090815260046020526040902054600160a060020a0316151590565b600061202f82612007565b15156120ab576040805160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015290519081900360840190fd5b60006120b683611387565b905080600160a060020a031684600160a060020a031614806120f1575083600160a060020a03166120e684610dd6565b600160a060020a0316145b8061210157506121018185611e09565b949350505050565b82600160a060020a031661211c82611387565b600160a060020a0316146121a0576040805160e560020a62461bcd02815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382161515612225576040805160e560020a62461bcd028152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61222e8161291a565b600160a060020a038316600090815260066020526040902061224f90612955565b600160a060020a03821660009081526006602052604090206122709061296c565b6000818152600460205260408082208054600160a060020a031916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5490565b600082820183811015611e02576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115612387576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600160a060020a03821615156123ed576040805160e560020a62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6123f681612007565b1561244b576040805160e560020a62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b60008181526004602090815260408083208054600160a060020a031916600160a060020a03871690811790915583526006909152902061248a9061296c565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006124da84600160a060020a0316612975565b15156124e857506001612101565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561257b578181015183820152602001612563565b50505050905090810190601f1680156125a85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b505050506040513d60208110156125f457600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f150b7a020000000000000000000000000000000000000000000000000000000014915050949350505050565b600061264c6119bf565b1515612690576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b815160001061269e57600080fd5b600160a060020a03831660009081526001602081905260409091205460029181161561010002600019011604151561141c576000600160a060020a03166002836040518082805190602001908083835b6020831061270d5780518252601f1990920191602091820191016126ee565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054600160a060020a0316929092149150612753905057600080fd5b600160a060020a0383166000908152600160209081526040909120835161277c92850190612a2e565b507f7d02e6403c89cb5aa8f22321b96fd9357cf8895e4a77c10e16c55aa5fc589d2083836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156127f55781810151838201526020016127dd565b50505050905090810190601f1680156128225780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150600192915050565b600160a060020a03811615156128bf576040805160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b600081815260056020526040902054600160a060020a031615611e8c5760009081526005602052604090208054600160a060020a0319169055565b805461296890600163ffffffff61232d16565b9055565b80546001019055565b6000903b1190565b50805460018160011615610100020316600290046000825580601f106129a35750611e8c565b601f016020900490600052602060002090810190611e8c9190612a9b565b8280548282559060005260206000209081019282156129fc579160200282015b828111156129fc5782518255916020019190600101906129e1565b50612a08929150612a9b565b5090565b6060604051908101604052806060815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a6f57805160ff19168380011785556129fc565b828001600101855582156129fc57918201828111156129fc5782518255916020019190600101906129e1565b610dd391905b80821115612a085760008155600101612aa156fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a165627a7a723058200a089dae5cb0d28600f752c077a9e40cfc90c78b0f658f8f9fb40cef77939a770029

Deployed Bytecode

0x608060405260043610610163577c0100000000000000000000000000000000000000000000000000000000600035046301ffc9a7811461016857806306fdde03146101c5578063081812fc1461024f578063095ea7b3146102955780631558bff0146102d057806318160ddd1461040457806323b872dd1461042b578063286dd3f51461046e57806341da8e08146104a157806342842e0e146105585780636352211e1461059b5780636562ec42146105c557806370a082311461067a578063715018a6146106ad578063860f1681146106c257806389ea4dcf1461078e5780638da5cb5b146108d55780638f32d59b146108ea57806395d89b41146108ff5780639b19251a146109145780639fc2fd5714610947578063a22cb4651461097a578063b88d4fde146109b5578063c87b56dd14610a88578063ca328eb914610ab2578063e985e9c514610b75578063f2fde38b14610bb0578063ffb1019b14610be3575b600080fd5b34801561017457600080fd5b506101b16004803603602081101561018b57600080fd5b50357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610d0b565b604080519115158252519081900360200190f35b3480156101d157600080fd5b506101da610d3f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102145781810151838201526020016101fc565b50505050905090810190601f1680156102415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025b57600080fd5b506102796004803603602081101561027257600080fd5b5035610dd6565b60408051600160a060020a039092168252519081900360200190f35b3480156102a157600080fd5b506102ce600480360360408110156102b857600080fd5b50600160a060020a038135169060200135610e79565b005b3480156102dc57600080fd5b506102ce600480360360408110156102f357600080fd5b81019060208101813564010000000081111561030e57600080fd5b82018360208201111561032057600080fd5b8035906020019184602083028401116401000000008311171561034257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561039257600080fd5b8201836020820111156103a457600080fd5b803590602001918460208302840111640100000000831117156103c657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611004945050505050565b34801561041057600080fd5b506104196110dc565b60408051918252519081900360200190f35b34801561043757600080fd5b506102ce6004803603606081101561044e57600080fd5b50600160a060020a038135811691602081013590911690604001356110e2565b34801561047a57600080fd5b506101b16004803603602081101561049157600080fd5b5035600160a060020a0316611178565b3480156104ad57600080fd5b506102ce600480360360408110156104c457600080fd5b813591908101906040810160208201356401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184602083028401116401000000008311171561051a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506112e3945050505050565b34801561056457600080fd5b506102ce6004803603606081101561057b57600080fd5b50600160a060020a0381358116916020810135909116906040013561136b565b3480156105a757600080fd5b50610279600480360360208110156105be57600080fd5b5035611387565b3480156105d157600080fd5b506102ce600480360360408110156105e857600080fd5b81019060208101813564010000000081111561060357600080fd5b82018360208201111561061557600080fd5b8035906020019184600183028401116401000000008311171561063757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611422915050565b34801561068657600080fd5b506104196004803603602081101561069d57600080fd5b5035600160a060020a031661150b565b3480156106b957600080fd5b506102ce6115b4565b3480156106ce57600080fd5b50610775600480360360208110156106e557600080fd5b81019060208101813564010000000081111561070057600080fd5b82018360208201111561071257600080fd5b8035906020019184600183028401116401000000008311171561073457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061164a945050505050565b6040805192835260208301919091528051918290030190f35b34801561079a57600080fd5b50610419600480360360608110156107b157600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156107dc57600080fd5b8201836020820111156107ee57600080fd5b8035906020019184600183028401116401000000008311171561081057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561086357600080fd5b82018360208201111561087557600080fd5b8035906020019184602083028401116401000000008311171561089757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506116de945050505050565b3480156108e157600080fd5b506102796119b0565b3480156108f657600080fd5b506101b16119bf565b34801561090b57600080fd5b506101da6119d0565b34801561092057600080fd5b506101da6004803603602081101561093757600080fd5b5035600160a060020a0316611a31565b34801561095357600080fd5b506101b16004803603602081101561096a57600080fd5b5035600160a060020a0316611acb565b34801561098657600080fd5b506102ce6004803603604081101561099d57600080fd5b50600160a060020a0381351690602001351515611b22565b3480156109c157600080fd5b506102ce600480360360808110156109d857600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610a1357600080fd5b820183602082011115610a2557600080fd5b80359060200191846001830284011164010000000083111715610a4757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bf1945050505050565b348015610a9457600080fd5b506101da60048036036020811015610aab57600080fd5b5035611c84565b348015610abe57600080fd5b506101b160048036036040811015610ad557600080fd5b600160a060020a038235169190810190604081016020820135640100000000811115610b0057600080fd5b820183602082011115610b1257600080fd5b80359060200191846001830284011164010000000083111715610b3457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611daa945050505050565b348015610b8157600080fd5b506101b160048036036040811015610b9857600080fd5b50600160a060020a0381358116916020013516611e09565b348015610bbc57600080fd5b506102ce60048036036020811015610bd357600080fd5b5035600160a060020a0316611e37565b348015610bef57600080fd5b50610c0d60048036036020811015610c0657600080fd5b5035611e8f565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015610c52578181015183820152602001610c3a565b50505050905090810190601f168015610c7f5780820380516001836020036101000a031916815260200191505b508481038352865181528651602091820191808901910280838360005b83811015610cb4578181015183820152602001610c9c565b50505050905001848103825285818151815260200191508051906020019060200280838360005b83811015610cf3578181015183820152602001610cdb565b50505050905001965050505050505060405180910390f35b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526003602052604090205460ff1690565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610dcb5780601f10610da057610100808354040283529160200191610dcb565b820191906000526020600020905b815481529060010190602001808311610dae57829003601f168201915b505050505090505b90565b6000610de182612007565b1515610e5d576040805160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015290519081900360840190fd5b50600090815260056020526040902054600160a060020a031690565b6000610e8482611387565b9050600160a060020a038381169082161415610f10576040805160e560020a62461bcd02815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a0382161480610f2c5750610f2c8133611e09565b1515610fa8576040805160e560020a62461bcd02815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015290519081900360840190fd5b6000828152600560205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61100c6119bf565b1515611050576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b805182511461105e57600080fd5b815160005b818110156110d6576000848281518110151561107b57fe5b906020019060200201519050600b600082815260200190815260200160002054600014156110cd5783828151811015156110b157fe5b60209081029091018101516000838152600b9092526040909120555b50600101611063565b50505050565b600d5490565b6110ec3382612024565b1515611168576040805160e560020a62461bcd02815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015290519081900360840190fd5b611173838383612109565b505050565b60006111826119bf565b15156111c6576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b600160a060020a038216600090815260016020819052604090912080549091600290821615610100026000190190911604156112dd57600281604051808280546001816001161561010002031660029004801561125a5780601f1061123857610100808354040283529182019161125a565b820191906000526020600020905b815481529060010190602001808311611246575b5050928352505060408051602092819003830190208054600160a060020a0319169055600160a060020a03851660009081526001909252812061129c9161297d565b60408051600160a060020a038516815290517ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a9181900360200190a1600191505b50919050565b336000908152600160208190526040822054600291811615610100026000190116041161130f57600080fd5b600d54821061131d57600080fd5b6113273383612024565b151561133257600080fd5b6000600e8381548110151561134357fe5b90600052602060002090600302019050818160020190805190602001906110d69291906129c1565b6111738383836020604051908101604052806000815250611bf1565b600081815260046020526040812054600160a060020a031680151561141c576040805160e560020a62461bcd02815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b92915050565b61142a6119bf565b151561146e576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b6000826040516020018082805190602001908083835b602083106114a35780518252601f199092019160209182019101611484565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835284528151918101919091206000818152600b90925292902054919450501591506114f9905057600080fd5b6000908152600b602052604090205550565b6000600160a060020a0382161515611593576040805160e560020a62461bcd02815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038216600090815260066020526040902061141c906122cc565b6115bc6119bf565b1515611600576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054600160a060020a0319169055565b6000806000836040516020018082805190602001908083835b602083106116825780518252601f199092019160209182019101611663565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835284528151918101919091206000908152600c825283812054600b909252929092205491989197509095505050505050565b33600090815260016020819052604082205460029181161561010002600019011604811061170b57600080fd5b6000836040516020018082805190602001908083835b602083106117405780518252601f199092019160209182019101611721565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835284528151918101919091206000818152600c835284812054600b9093529390932054929550935050821090506117a057600080fd5b6040805160008152602081019091526117b7612a0c565b506040805160608101825287815260208101879052908101829052600d546117e690600163ffffffff6122d016565b600d55600e8054600181810180845560009384528451805161188494879260039091027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd019161183e91839160209190910190612a2e565b50602082810151805161185792600185019201906129c1565b50604082015180516118739160028401916020909101906129c1565b50505061232d90919063ffffffff16565b90507f5ab992d1d92f944a16f8181e78676c06d55e08e3e65019a7fbadcf91c7327ec333828a8a6040518085600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561190a5781810151838201526020016118f2565b50505050905090810190601f1680156119375780820380516001836020036101000a031916815260200191505b508381038252845181528451602091820191808701910280838360005b8381101561196c578181015183820152602001611954565b50505050905001965050505050505060405180910390a161198d898261238d565b6000948552600c6020526040909420600190930190925550909150509392505050565b600054600160a060020a031690565b600054600160a060020a0316331490565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610dcb5780601f10610da057610100808354040283529160200191610dcb565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f8101839004830284018301909452838352919290830182828015611ac35780601f10611a9857610100808354040283529160200191611ac3565b820191906000526020600020905b815481529060010190602001808311611aa657829003601f168201915b505050505081565b6000611ad56119bf565b1515611b19576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b61141c82611178565b600160a060020a038216331415611b83576040805160e560020a62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b611bfc8484846110e2565b611c08848484846124c6565b15156110d6576040805160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015290519081900360840190fd5b6060611c8f82612007565b1515611d0b576040805160e560020a62461bcd02815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015290519081900360840190fd5b6000828152600a602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015611d9e5780601f10611d7357610100808354040283529160200191611d9e565b820191906000526020600020905b815481529060010190602001808311611d8157829003601f168201915b50505050509050919050565b6000611db46119bf565b1515611df8576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b611e028383612642565b9392505050565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b611e3f6119bf565b1515611e83576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b611e8c81612839565b50565b6060806060600d5484101515611ea457600080fd5b6000600e85815481101515611eb557fe5b60009182526020918290206003919091020180546040805160026001841615610100026000190190931692909204601f810185900485028301850190915280825291935091839190830182828015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050935080600101805480602002602001604051908101604052809291908181526020018280548015611fa357602002820191906000526020600020905b815481526020019060010190808311611f8f575b5050505050925080600201805480602002602001604051908101604052809291908181526020018280548015611ff857602002820191906000526020600020905b815481526020019060010190808311611fe4575b50505050509150509193909250565b600090815260046020526040902054600160a060020a0316151590565b600061202f82612007565b15156120ab576040805160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015290519081900360840190fd5b60006120b683611387565b905080600160a060020a031684600160a060020a031614806120f1575083600160a060020a03166120e684610dd6565b600160a060020a0316145b8061210157506121018185611e09565b949350505050565b82600160a060020a031661211c82611387565b600160a060020a0316146121a0576040805160e560020a62461bcd02815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382161515612225576040805160e560020a62461bcd028152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61222e8161291a565b600160a060020a038316600090815260066020526040902061224f90612955565b600160a060020a03821660009081526006602052604090206122709061296c565b6000818152600460205260408082208054600160a060020a031916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5490565b600082820183811015611e02576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115612387576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600160a060020a03821615156123ed576040805160e560020a62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6123f681612007565b1561244b576040805160e560020a62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b60008181526004602090815260408083208054600160a060020a031916600160a060020a03871690811790915583526006909152902061248a9061296c565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006124da84600160a060020a0316612975565b15156124e857506001612101565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561257b578181015183820152602001612563565b50505050905090810190601f1680156125a85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b505050506040513d60208110156125f457600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f150b7a020000000000000000000000000000000000000000000000000000000014915050949350505050565b600061264c6119bf565b1515612690576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612ab6833981519152604482015290519081900360640190fd5b815160001061269e57600080fd5b600160a060020a03831660009081526001602081905260409091205460029181161561010002600019011604151561141c576000600160a060020a03166002836040518082805190602001908083835b6020831061270d5780518252601f1990920191602091820191016126ee565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054600160a060020a0316929092149150612753905057600080fd5b600160a060020a0383166000908152600160209081526040909120835161277c92850190612a2e565b507f7d02e6403c89cb5aa8f22321b96fd9357cf8895e4a77c10e16c55aa5fc589d2083836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156127f55781810151838201526020016127dd565b50505050905090810190601f1680156128225780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150600192915050565b600160a060020a03811615156128bf576040805160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b600081815260056020526040902054600160a060020a031615611e8c5760009081526005602052604090208054600160a060020a0319169055565b805461296890600163ffffffff61232d16565b9055565b80546001019055565b6000903b1190565b50805460018160011615610100020316600290046000825580601f106129a35750611e8c565b601f016020900490600052602060002090810190611e8c9190612a9b565b8280548282559060005260206000209081019282156129fc579160200282015b828111156129fc5782518255916020019190600101906129e1565b50612a08929150612a9b565b5090565b6060604051908101604052806060815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a6f57805160ff19168380011785556129fc565b828001600101855582156129fc57918201828111156129fc5782518255916020019190600101906129e1565b610dd391905b80821115612a085760008155600101612aa156fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a165627a7a723058200a089dae5cb0d28600f752c077a9e40cfc90c78b0f658f8f9fb40cef77939a770029

Deployed Bytecode Sourcemap

37105:3855:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11388:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11388:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11388:135:0;-1:-1:-1;;11388:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;26378:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26378:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26378:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16342:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16342:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16342:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;16342:204:0;;;;;;;;;;;;;;15628:421;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15628:421:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15628:421:0;;;;;;;;:::i;:::-;;38711:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38711:383:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38711:383:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38711:383:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38711:383:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38711:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38711:383:0;;;;;;;;-1:-1:-1;38711:383:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;38711:383:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38711:383:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38711:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38711:383:0;;-1:-1:-1;38711:383:0;;-1:-1:-1;;;;;38711:383:0:i;38035:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38035:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;18019:290;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18019:290:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18019:290:0;;;;;;;;;;;;;;;;;:::i;36419:329::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36419:329:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36419:329:0;-1:-1:-1;;;;;36419:329:0;;:::i;40296:293::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40296:293:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40296:293:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;40296:293:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40296:293:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40296:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40296:293:0;;-1:-1:-1;40296:293:0;;-1:-1:-1;;;;;40296:293:0:i;18955:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18955:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18955:134:0;;;;;;;;;;;;;;;;;:::i;14969:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14969:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14969:228:0;;:::i;38437:268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38437:268:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38437:268:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38437:268:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38437:268:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38437:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38437:268:0;;-1:-1:-1;;38437:268:0;;;-1:-1:-1;38437:268:0;;-1:-1:-1;;38437:268:0:i;14532:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14532:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14532:211:0;-1:-1:-1;;;;;14532:211:0;;:::i;34031:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34031:140:0;;;:::i;39104:245::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39104:245:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39104:245:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;39104:245:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39104:245:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39104:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39104:245:0;;-1:-1:-1;39104:245:0;;-1:-1:-1;;;;;39104:245:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;39500:788;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39500:788:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;39500:788:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;39500:788:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39500:788:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39500:788:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39500:788:0;;;;;;;;-1:-1:-1;39500:788:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;39500:788:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39500:788:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39500:788:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39500:788:0;;-1:-1:-1;39500:788:0;;-1:-1:-1;;;;;39500:788:0:i;33220:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33220:79:0;;;:::i;33586:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33586:92:0;;;:::i;26578:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26578:89:0;;;:::i;35153:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35153:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35153:43:0;-1:-1:-1;;;;;35153:43:0;;:::i;38293:138::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38293:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38293:138:0;-1:-1:-1;;;;;38293:138:0;;:::i;16847:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16847:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16847:248:0;;;;;;;;;;:::i;19808:268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19808:268:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;19808:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;19808:268:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19808:268:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19808:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19808:268:0;;-1:-1:-1;19808:268:0;;-1:-1:-1;;;;;19808:268:0:i;26874:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26874:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26874:205:0;;:::i;38124:163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38124:163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;38124:163:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38124:163:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38124:163:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38124:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38124:163:0;;-1:-1:-1;38124:163:0;;-1:-1:-1;;;;;38124:163:0:i;17425:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17425:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17425:147:0;;;;;;;;;;:::i;34326:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34326:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34326:109:0;-1:-1:-1;;;;;34326:109:0;;:::i;40595:362::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40595:362:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40595:362:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40595:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40595:362:0;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40595:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40595:362:0;;;;;;;;;;;;;;;;;;;;;11388:135;-1:-1:-1;;11482:33:0;11458:4;11482:33;;;:20;:33;;;;;;;;;11388:135::o;26378:85::-;26450:5;26443:12;;;;;;;;-1:-1:-1;;26443:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26417:13;;26443:12;;26450:5;;26443:12;;26450:5;26443:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26378:85;;:::o;16342:204::-;16401:7;16429:16;16437:7;16429;:16::i;:::-;16421:73;;;;;;;-1:-1:-1;;;;;16421:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16514:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;16514:24:0;;16342:204::o;15628:421::-;15692:13;15708:16;15716:7;15708;:16::i;:::-;15692:32;-1:-1:-1;;;;;;15743:11:0;;;;;;;;15735:57;;;;;-1:-1:-1;;;;;15735:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15813:10;-1:-1:-1;;;;;15813:19:0;;;;:58;;;15836:35;15853:5;15860:10;15836:16;:35::i;:::-;15805:150;;;;;;;-1:-1:-1;;;;;15805:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15968:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;15968:29:0;-1:-1:-1;;;;;15968:29:0;;;;;;;;;16013:28;;15968:24;;16013:28;;;;;;;15628:421;;;:::o;38711:383::-;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;38833:13;;38814:15;;:32;38806:41;;;;;;38865:15;;38854:8;38887:202;38907:3;38903:1;:7;38887:202;;;38951:15;38969:8;38978:1;38969:11;;;;;;;;;;;;;;;;;;38951:29;;38993:13;:23;39008:7;38993:23;;;;;;;;;;;;39021:1;38993:29;38989:93;;;39063:6;39070:1;39063:9;;;;;;;;;;;;;;;;;;;;39036:24;;;;:13;:24;;;;;;;:36;38989:93;-1:-1:-1;38913:3:0;;38887:202;;;;33489:1;38711:383;;:::o;38035:83::-;38099:13;;38035:83;:::o;18019:290::-;18163:39;18182:10;18194:7;18163:18;:39::i;:::-;18155:101;;;;;;;-1:-1:-1;;;;;18155:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18269:32;18283:4;18289:2;18293:7;18269:13;:32::i;:::-;18019:290;;;:::o;36419:329::-;36494:12;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36541:15:0;;36515:23;36541:15;;;:9;:15;;;;;;;;36567:22;;36541:15;;36567:22;;;;;;;-1:-1:-1;;36567:22:0;;;;;:27;36563:180;;36612:11;36624:8;36612:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36612:21:0;;;-1:-1:-1;;36612:21:0;;;;;;;;;;;;36605:28;;-1:-1:-1;;;;;;36605:28:0;;;-1:-1:-1;;;;;36650:15:0;;-1:-1:-1;36650:15:0;;;-1:-1:-1;36650:15:0;;;;;36643:22;;;:::i;:::-;36681:31;;;-1:-1:-1;;;;;36681:31:0;;;;;;;;;;;;;;;36731:4;36721:14;;36563:180;33489:1;36419:329;;;:::o;40296:293::-;35571:10;35592:1;35561:21;;;:9;:21;;;;;;;35555:35;;;;;;;;-1:-1:-1;;35555:35:0;;;:38;35547:48;;;;;;40417:13;;40407:23;;40399:33;;;;;;40448:39;40468:10;40479:7;40448:18;:39::i;:::-;40439:49;;;;;;;;40495:23;40521:6;40528:7;40521:15;;;;;;;;;;;;;;;;;;;;40495:41;;40570:13;40543:5;:24;;:40;;;;;;;;;;;;:::i;18955:134::-;19042:39;19059:4;19065:2;19069:7;19042:39;;;;;;;;;;;;;:16;:39::i;14969:228::-;15024:7;15060:20;;;:11;:20;;;;;;-1:-1:-1;;;;;15060:20:0;15099:19;;;15091:73;;;;;-1:-1:-1;;;;;15091:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15184:5;14969:228;-1:-1:-1;;14969:228:0:o;38437:268::-;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;38513:15;38573:3;38550:28;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;38550:28:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;38550:28:0;;38540:39;;;;;;;;;-1:-1:-1;38621:22:0;;;:13;:22;;;;;;;38540:39;;-1:-1:-1;;38621:36:0;;-1:-1:-1;38612:47:0;;-1:-1:-1;38612:47:0;;;;;38667:24;;;;:13;:24;;;;;:32;-1:-1:-1;38437:268:0:o;14532:211::-;14587:7;-1:-1:-1;;;;;14615:19:0;;;;14607:74;;;;;-1:-1:-1;;;;;14607:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14701:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;34031:140::-;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;34130:1;34114:6;;34093:40;;-1:-1:-1;;;;;34114:6:0;;;;34093:40;;34130:1;;34093:40;34161:1;34144:19;;-1:-1:-1;;;;;;34144:19:0;;;34031:140::o;39104:245::-;39162:15;39179:13;39200:15;39259:3;39236:28;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;39236:28:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;39236:28:0;;39226:39;;;;;;;;;-1:-1:-1;39283:23:0;;;:14;:23;;;;;;39321:13;:22;;;;;;;;39283:23;;39321:22;;-1:-1:-1;39283:23:0;;-1:-1:-1;;;;;;39104:245:0:o;39500:788::-;35571:10;39606:7;35561:21;;;:9;:21;;;;;;;35555:35;;;;;;;;-1:-1:-1;;35555:35:0;;;-1:-1:-1;;35547:48:0;;;;;;39621:15;39681:3;39658:28;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;39658:28:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;39658:28:0;;39648:39;;;;;;;;;-1:-1:-1;39719:23:0;;;:14;:23;;;;;;39797:13;:22;;;;;;;;39648:39;;-1:-1:-1;39719:23:0;-1:-1:-1;;39781:38:0;;;-1:-1:-1;39773:47:0;;;;;;39857:13;;;39868:1;39857:13;;;;;;;;39878:25;;:::i;:::-;-1:-1:-1;39906:115:0;;;;;;;;;;;;;;;;;;;;;;;40044:13;;:20;;40062:1;40044:20;:17;:20;:::i;:::-;40028:13;:36;40092:6;27:10:-1;;40118:1:0;23:18:-1;;;45:23;;;40071:18:0;40092:21;;;;;;;:28;;40104:8;;40092:21;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40092:21:0;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40092:21:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:25;;:28;;;;:::i;:::-;40071:49;;40132:44;40138:10;40149;40160:3;40164:11;40132:44;;;;-1:-1:-1;;;;;40132:44:0;-1:-1:-1;;;;;40132:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40132:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40132:44:0;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40132:44:0;;;;;;;;;;;;;;;;;;;;;40183:20;40189:2;40192:10;40183:5;:20::i;:::-;40212:23;;;;:14;:23;;;;;;40255:1;40239:17;;;40212:44;;;-1:-1:-1;40272:10:0;;-1:-1:-1;;39500:788:0;;;;;:::o;33220:79::-;33258:7;33285:6;-1:-1:-1;;;;;33285:6:0;33220:79;:::o;33586:92::-;33626:4;33664:6;-1:-1:-1;;;;;33664:6:0;33650:10;:20;;33586:92::o;26578:89::-;26652:7;26645:14;;;;;;;;-1:-1:-1;;26645:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26619:13;;26645:14;;26652:7;;26645:14;;26652:7;26645:14;;;;;;;;;;;;;;;;;;;;;;;;35153:43;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35153:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38293:138::-;38366:12;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;38393:32;38420:4;38393:26;:32::i;16847:248::-;-1:-1:-1;;;;;16927:16:0;;16933:10;16927:16;;16919:54;;;;;-1:-1:-1;;;;;16919:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17005:10;16986:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;16986:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;16986:45:0;;;;;;;;;;17047:40;;;;;;;16986:34;;17005:10;17047:40;;;;;;;;;;;16847:248;;:::o;19808:268::-;19915:31;19928:4;19934:2;19938:7;19915:12;:31::i;:::-;19965:48;19988:4;19994:2;19998:7;20007:5;19965:22;:48::i;:::-;19957:111;;;;;;;-1:-1:-1;;;;;19957:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26874:205;26932:13;26966:16;26974:7;26966;:16::i;:::-;26958:76;;;;;;;-1:-1:-1;;;;;26958:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27052:19;;;;:10;:19;;;;;;;;;27045:26;;;;;;-1:-1:-1;;27045:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27052:19;;27045:26;;27052:19;27045:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26874:205;;;:::o;38124:163::-;38218:12;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;38245:36;38267:4;38272:8;38245:21;:36::i;:::-;38238:43;38124:163;-1:-1:-1;;;38124:163:0:o;17425:147::-;-1:-1:-1;;;;;17529:25:0;;;17505:4;17529:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17425:147::o;34326:109::-;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;34399:28;34418:8;34399:18;:28::i;:::-;34326:109;:::o;40595:362::-;40652:17;40676:25;40708:32;40768:13;;40762:3;:19;40754:28;;;;;;;;40791:23;40817:6;40824:3;40817:11;;;;;;;;;;;;;;;;;;;;;;;;;40837:15;;;;;;;;;;;;-1:-1:-1;;40837:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;40817:11;;-1:-1:-1;40837:15:0;40817:11;;40837:15;;;40817:11;40837:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40875:5;:22;;40861:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40927:5;:24;;40906:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40595:362;;;;;;:::o;20278:155::-;20335:4;20368:20;;;:11;:20;;;;;;-1:-1:-1;;;;;20368:20:0;20406:19;;;20278:155::o;20803:333::-;20888:4;20913:16;20921:7;20913;:16::i;:::-;20905:73;;;;;;;-1:-1:-1;;;;;20905:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20989:13;21005:16;21013:7;21005;:16::i;:::-;20989:32;;21051:5;-1:-1:-1;;;;;21040:16:0;:7;-1:-1:-1;;;;;21040:16:0;;:51;;;;21084:7;-1:-1:-1;;;;;21060:31:0;:20;21072:7;21060:11;:20::i;:::-;-1:-1:-1;;;;;21060:31:0;;21040:51;:87;;;;21095:32;21112:5;21119:7;21095:16;:32::i;:::-;21032:96;20803:333;-1:-1:-1;;;;20803:333:0:o;23005:459::-;23119:4;-1:-1:-1;;;;;23099:24:0;:16;23107:7;23099;:16::i;:::-;-1:-1:-1;;;;;23099:24:0;;23091:78;;;;;-1:-1:-1;;;;;23091:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23188:16:0;;;;23180:65;;;;;-1:-1:-1;;;;;23180:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23258:23;23273:7;23258:14;:23::i;:::-;-1:-1:-1;;;;;23294:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;23340:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;23386:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;23386:25:0;-1:-1:-1;;;;;23386:25:0;;;;;;;;;23429:27;;23386:20;;23429:27;;;;;;;23005:459;;;:::o;10059:114::-;10151:14;;10059:114::o;5112:181::-;5170:7;5202:5;;;5226:6;;;;5218:46;;;;;-1:-1:-1;;;;;5218:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5568:184;5626:7;5654:6;;;;5646:49;;;;;-1:-1:-1;;;;;5646:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5718:5:0;;;5568:184::o;21389:335::-;-1:-1:-1;;;;;21461:16:0;;;;21453:61;;;;;-1:-1:-1;;;;;21453:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21534:16;21542:7;21534;:16::i;:::-;21533:17;21525:58;;;;;-1:-1:-1;;;;;21525:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21596:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;21596:25:0;-1:-1:-1;;;;;21596:25:0;;;;;;;;21632:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;21683;;21708:7;;-1:-1:-1;;;;;21683:33:0;;;21700:1;;21683:33;;21700:1;;21683:33;21389:335;;:::o;24050:356::-;24172:4;24199:15;:2;-1:-1:-1;;;;;24199:13:0;;:15::i;:::-;24198:16;24194:60;;;-1:-1:-1;24238:4:0;24231:11;;24194:60;24282:70;;;;;24319:10;24282:70;;;;;;-1:-1:-1;;;;;24282:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24266:13;;24282:36;;;;;;24319:10;;24331:4;;24337:7;;24346:5;;24282:70;;;;;;;;;;;24266:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24282:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24282:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24282:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24282:70:0;-1:-1:-1;;24371:26:0;24381:16;24371:26;;-1:-1:-1;;24050:356:0;;;;;;:::o;35810:377::-;35905:12;33432:9;:7;:9::i;:::-;33424:54;;;;;;;-1:-1:-1;;;;;33424:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33424:54:0;;;;;;;;;;;;;;;35935:22;;35960:1;-1:-1:-1;35926:37:0;;;;;;-1:-1:-1;;;;;35980:15:0;;;;;;:9;:15;;;;;;;;35974:29;;;;;;;;-1:-1:-1;;35974:29:0;;;:34;35970:212;;;36061:1;-1:-1:-1;;;;;36028:35:0;:11;36040:8;36028:21;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;36028:21:0;;;;;-1:-1:-1;36028:21:0;;;;;;;;;;;-1:-1:-1;;;;;36028:21:0;:35;;;;;-1:-1:-1;36019:45:0;;-1:-1:-1;36019:45:0;;;;;-1:-1:-1;;;;;36073:15:0;;;;;;:9;:15;;;;;;;;:26;;;;;;;;:::i;:::-;;36113:38;36137:4;36142:8;36113:38;;;;-1:-1:-1;;;;;36113:38:0;-1:-1:-1;;;;;36113:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36113:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36170:4:0;35810:377;;;;:::o;34541:229::-;-1:-1:-1;;;;;34615:22:0;;;;34607:73;;;;;-1:-1:-1;;;;;34607:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34717:6;;;34696:38;;-1:-1:-1;;;;;34696:38:0;;;;34717:6;;;34696:38;;;34745:6;:17;;-1:-1:-1;;;;;;34745:17:0;-1:-1:-1;;;;;34745:17:0;;;;;;;;;;34541:229::o;24574:175::-;24674:1;24638:24;;;:15;:24;;;;;;-1:-1:-1;;;;;24638:24:0;:38;24634:108;;24728:1;24693:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;24693:37:0;;;24574:175::o;10280:110::-;10361:14;;:21;;10380:1;10361:21;:18;:21;:::i;:::-;10344:38;;10280:110::o;10181:91::-;10245:19;;10263:1;10245:19;;;10181:91::o;8510:422::-;8570:4;8877:20;;8916:8;;8510:422::o;37105:3855::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37105:3855:0;;;-1:-1:-1;37105:3855:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://0a089dae5cb0d28600f752c077a9e40cfc90c78b0f658f8f9fb40cef77939a77
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.