ETH Price: $1,995.91 (+0.26%)

Token

CORN (CORN)
 

Overview

Max Total Supply

0 CORN

Holders

0

Transfers

-
0 (0%)

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

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:
WWStakingPool

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-06-03
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

/// @title WingWars
/// @author André Costa @ Terratecc

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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 virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: raribots.sol


// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.0;






/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * 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
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * 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);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferToStakingPool(
        address from,
        address to,
        uint256 tokenId
    ) external;  

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);

    //see the tokens in oglist
    function tokensOGList() external view returns(uint);

    //see the tokens in whitelist
    function tokensWhitelist() external view returns(uint);

    function publicSaleLaunchTime() external view returns(uint256);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


contract WWStakingPool is ERC20, Ownable {
    //last time that tokens where retrieved
    mapping(uint => uint256) public checkpoints;

    //see how many nfts are being staked
    mapping(address => uint256[]) public stakedTokens;

    IERC721Enumerable public NFTCollection;

    uint[] private tids;

    uint256 private minTimeForRewards = 864000;

    constructor() ERC20("CORN", "CORN") {
        NFTCollection = IERC721Enumerable(0x8785a9143D22E7001C16b64592ebc31dCd82a1b7);
    }

    //set ERC721Enumerable
    function setNFTInterface(address newInterface) public onlyOwner {
        NFTCollection = IERC721Enumerable(newInterface);
    }

    function depositAll() external {
        uint balance = NFTCollection.balanceOf(msg.sender);
        require(balance > 0, "No tokens to stake!");

        delete tids;
        for (uint i = 0; i < balance; i++) {
            tids.push(NFTCollection.tokenOfOwnerByIndex(msg.sender, i));
        }
        for (uint i = 0; i < tids.length; i++) {
            _deposit(tids[i]);
        }
        
    }

    function deposit(uint tokenId) public {
        //they have to be the owner of tokenID
        require(msg.sender == NFTCollection.ownerOf(tokenId), "Sender must be owner");
        _deposit(tokenId);
        
    }

    function _deposit(uint tokenId) internal {
        //set the time of staking to now
        checkpoints[tokenId] = block.timestamp;

        //transfer NFT to contract
        NFTCollection.transferFrom(msg.sender, address(this), tokenId);

        //add to their staked tokens
        stakedTokens[msg.sender].push(tokenId);
    }

    function withdrawAll() external {
        getAllRewards();

        for (uint i = 0; i < stakedTokens[msg.sender].length; i++) {
            NFTCollection.transferFrom(address(this), msg.sender, stakedTokens[msg.sender][i]);
            //popFromStakedTokens(stakedTokens[msg.sender][i]);
            checkpoints[stakedTokens[msg.sender][i]] = 0; 
        }
        delete stakedTokens[msg.sender];
    }

    function withdraw(uint tokenId)  public {
        getReward(tokenId);
        NFTCollection.transferFrom(address(this), msg.sender, tokenId);
        checkpoints[tokenId] = 0;
        popFromStakedTokens(tokenId);      
    }

    function popFromStakedTokens(uint tokenId) internal {
        uint pos = positionInStakedTokens(tokenId);
        
        uint firstValue = stakedTokens[msg.sender][pos];
        uint secondValue = stakedTokens[msg.sender][stakedTokens[msg.sender].length - 1];
        stakedTokens[msg.sender][pos] = secondValue;
        stakedTokens[msg.sender][stakedTokens[msg.sender].length - 1] = firstValue;
        stakedTokens[msg.sender].pop();
    }

    function positionInStakedTokens(uint tokenId) internal view returns(uint) {
        uint index;
        for (uint i = 0; i < stakedTokens[msg.sender].length; i++) {
            if (stakedTokens[msg.sender][i] == tokenId) {
                index = i;
                break;
            }
        }
        return index;
    }

    function getReward(uint tokenId) public {
        bool check = false;
        for (uint i = 0; i < stakedTokens[msg.sender].length; i++) {
            if (stakedTokens[msg.sender][i] == tokenId) {
                check = true;
                break;
            }
        }
        require(check == true, 'You have not staked this token!');

        uint256 reward = calculateReward(tokenId);     
        _mint(msg.sender, reward);
        checkpoints[tokenId] = block.timestamp;
    }

    function getAllRewards() public {
        require(stakedTokens[msg.sender].length > 0, "No tokens staked");

        uint rewards = 0;
        for (uint i = 0; i < stakedTokens[msg.sender].length; i++) {
            rewards += calculateReward(stakedTokens[msg.sender][i]);
            checkpoints[stakedTokens[msg.sender][i]] = block.timestamp;
        }

        _mint(msg.sender, rewards);
    }

    function calculateAllRewards(address who) public view returns(uint256) {
        require(stakedTokens[who].length > 0, "No tokens staked");

        uint256 total;
        for (uint i = 0; i < stakedTokens[who].length; i++) {
            total += calculateReward(stakedTokens[who][i]);
        }
        return total;
    }

    function calculateReward(uint tokenId) public view returns(uint256) {
        require(tokenId >= 0 && tokenId <= NFTCollection.totalSupply(), "Non-existent Token ID!");
        uint256 checkpoint = checkpoints[tokenId];
        require(checkpoint != 0, "Token not Staked!");

        if (block.timestamp - checkpoints[tokenId] < minTimeForRewards) {
            return 0;
        }

        if (tokenId <= NFTCollection.tokensOGList()) {
            uint256 publicSaleLaunchTime_ = NFTCollection.publicSaleLaunchTime();
            if (publicSaleLaunchTime_ == 0) {
                return ((block.timestamp - checkpoints[tokenId]) / 86400) * 15000000000;
            }
            else if (checkpoints[tokenId] < NFTCollection.publicSaleLaunchTime()) {
                return (((publicSaleLaunchTime_ - checkpoints[tokenId]) / 86400) * 15000000000) + (((block.timestamp - publicSaleLaunchTime_) / 86400) * 8000000000);
            }
            else {
                return ((block.timestamp - checkpoints[tokenId]) / 86400) * 8000000000;
            }
        }
        else if (tokenId <= NFTCollection.tokensWhitelist()) {
            uint256 publicSaleLaunchTime_ = NFTCollection.publicSaleLaunchTime();
            if (publicSaleLaunchTime_ == 0) {
                return ((block.timestamp - checkpoints[tokenId]) / 86400) * 15000000000;
            }
            else if (checkpoints[tokenId] < NFTCollection.publicSaleLaunchTime()) {
                return (((publicSaleLaunchTime_ - checkpoints[tokenId]) / 86400) * 15000000000) + (((block.timestamp - publicSaleLaunchTime_) / 86400) * 7000000000);
            }
            else {
                return ((block.timestamp - checkpoints[tokenId]) / 86400) * 7000000000;
            }
        }
        else {
            return ((block.timestamp - checkpoints[tokenId]) / 86400) * 6000000000;
        }
        
    }

    function seeStakedTokens(address who) public view returns(uint256[] memory) {
        return stakedTokens[who];
    }

    function setMinTimeForRewards(uint256 newTime) public onlyOwner {
        minTimeForRewards = newTime;
    }
    
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NFTCollection","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calculateAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"seeStakedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setMinTimeForRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newInterface","type":"address"}],"name":"setNFTInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052620d2f00600a553480156200001857600080fd5b5060408051808201825260048082526321a7a92760e11b60208084018281528551808701909652928552840152815191929162000058916003916200010d565b5080516200006e9060049060208401906200010d565b5050506200008b62000085620000b760201b60201c565b620000bb565b600880546001600160a01b031916738785a9143d22e7001c16b64592ebc31dcd82a1b7179055620001f0565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b611f9780620002006000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063853828b6116100f9578063d2d7231f11610097578063de5f626811610071578063de5f6268146103e9578063e81c7127146103f1578063ecda010114610404578063f2fde38b1461041757600080fd5b8063d2d7231f1461037d578063dcca1b3314610390578063dd62ed3e146103b057600080fd5b8063a457c2d7116100d3578063a457c2d714610324578063a9059cbb14610337578063b6b55f251461034a578063b8a242521461035d57600080fd5b8063853828b6146103035780638da5cb5b1461030b57806395d89b411461031c57600080fd5b8063395093511161016657806370a082311161014057806370a0823114610294578063715018a6146102bd57806378b2e3a9146102c557806379a59c13146102f057600080fd5b8063395093511461026657806345b35f5614610279578063486975d91461028157600080fd5b80631c4b774b116101a25780631c4b774b1461021c57806323b872dd146102315780632e1a7d4d14610244578063313ce5671461025757600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d161042a565b6040516101de9190611c6a565b60405180910390f35b6101fa6101f5366004611cd4565b6104bc565b60405190151581526020016101de565b6002545b6040519081526020016101de565b61022f61022a366004611d00565b6104d2565b005b6101fa61023f366004611d19565b6105c1565b61022f610252366004611d00565b61066b565b604051600981526020016101de565b6101fa610274366004611cd4565b6106f9565b61022f610735565b61022f61028f366004611d5a565b610845565b61020e6102a2366004611d5a565b6001600160a01b031660009081526020819052604090205490565b61022f610891565b6008546102d8906001600160a01b031681565b6040516001600160a01b0390911681526020016101de565b61020e6102fe366004611d5a565b6108c7565b61022f610997565b6005546001600160a01b03166102d8565b6101d1610ad7565b6101fa610332366004611cd4565b610ae6565b6101fa610345366004611cd4565b610b7f565b61022f610358366004611d00565b610b8c565b61020e61036b366004611d00565b60066020526000908152604090205481565b61020e61038b366004611d00565b610c68565b6103a361039e366004611d5a565b61129c565b6040516101de9190611d77565b61020e6103be366004611dbb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61022f611308565b61020e6103ff366004611cd4565b6114d8565b61022f610412366004611d00565b611509565b61022f610425366004611d5a565b611538565b60606003805461043990611df4565b80601f016020809104026020016040519081016040528092919081815260200182805461046590611df4565b80156104b25780601f10610487576101008083540402835291602001916104b2565b820191906000526020600020905b81548152906001019060200180831161049557829003601f168201915b5050505050905090565b60006104c93384846115d0565b50600192915050565b6000805b3360009081526007602052604090205481101561053d5733600090815260076020526040902080548491908390811061051157610511611e29565b9060005260206000200154141561052b576001915061053d565b8061053581611e55565b9150506104d6565b506001811515146105955760405162461bcd60e51b815260206004820152601f60248201527f596f752068617665206e6f74207374616b6564207468697320746f6b656e210060448201526064015b60405180910390fd5b60006105a083610c68565b90506105ac33826116f4565b50506000908152600660205260409020429055565b60006105ce8484846117d3565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106535760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161058c565b61066085338584036115d0565b506001949350505050565b610674816104d2565b6008546040516323b872dd60e01b8152306004820152336024820152604481018390526001600160a01b03909116906323b872dd90606401600060405180830381600087803b1580156106c657600080fd5b505af11580156106da573d6000803e3d6000fd5b505050600082815260066020526040812055506106f6816119a2565b50565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104c9918590610730908690611e70565b6115d0565b336000908152600760205260409020546107845760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b9cc81cdd185ad95960821b604482015260640161058c565b6000805b3360009081526007602052604090205481101561083a5733600090815260076020526040902080546107d59190839081106107c5576107c5611e29565b9060005260206000200154610c68565b6107df9083611e70565b3360009081526007602052604081208054929450429260069291908590811061080a5761080a611e29565b9060005260206000200154815260200190815260200160002081905550808061083290611e55565b915050610788565b506106f633826116f4565b6005546001600160a01b0316331461086f5760405162461bcd60e51b815260040161058c90611e88565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146108bb5760405162461bcd60e51b815260040161058c90611e88565b6108c56000611ad9565b565b6001600160a01b03811660009081526007602052604081205461091f5760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b9cc81cdd185ad95960821b604482015260640161058c565b6000805b6001600160a01b038416600090815260076020526040902054811015610990576001600160a01b038416600090815260076020526040902080546109729190839081106107c5576107c5611e29565b61097c9083611e70565b91508061098881611e55565b915050610923565b5092915050565b61099f610735565b60005b33600090815260076020526040902054811015610abe5760085433600081815260076020526040902080546001600160a01b03909316926323b872dd9230929091869081106109f3576109f3611e29565b6000918252602090912001546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610a4e57600080fd5b505af1158015610a62573d6000803e3d6000fd5b5050336000908152600760205260408120805491935060069250839185908110610a8e57610a8e611e29565b90600052602060002001548152602001908152602001600020819055508080610ab690611e55565b9150506109a2565b503360009081526007602052604081206108c591611c38565b60606004805461043990611df4565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610b685760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161058c565b610b7533858584036115d0565b5060019392505050565b60006104c93384846117d3565b6008546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c089190611ebd565b6001600160a01b0316336001600160a01b031614610c5f5760405162461bcd60e51b815260206004820152601460248201527329b2b73232b91036bab9ba1031329037bbb732b960611b604482015260640161058c565b6106f681611b2b565b600854604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190611eda565b821115610d2d5760405162461bcd60e51b81526020600482015260166024820152754e6f6e2d6578697374656e7420546f6b656e2049442160501b604482015260640161058c565b60008281526006602052604090205480610d7d5760405162461bcd60e51b8152602060048201526011602482015270546f6b656e206e6f74205374616b65642160781b604482015260640161058c565b600a54600084815260066020526040902054610d999042611ef3565b1015610da85750600092915050565b600860009054906101000a90046001600160a01b03166001600160a01b0316636ea078156040518163ffffffff1660e01b815260040160206040518083038186803b158015610df657600080fd5b505afa158015610e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2e9190611eda565b83116110315760085460408051630d0bff2f60e11b815290516000926001600160a01b031691631a17fe5e916004808301926020929190829003018186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb19190611eda565b905080610ef7576000848152600660205260409020546201518090610ed69042611ef3565b610ee09190611f0a565b610eef9064037e11d600611f2c565b949350505050565b600860009054906101000a90046001600160a01b03166001600160a01b0316631a17fe5e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4557600080fd5b505afa158015610f59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7d9190611eda565b6000858152600660205260409020541015610ffa5762015180610fa08242611ef3565b610faa9190611f0a565b610fb9906401dcd65000611f2c565b6000858152600660205260409020546201518090610fd79084611ef3565b610fe19190611f0a565b610ff09064037e11d600611f2c565b610eef9190611e70565b60008481526006602052604090205462015180906110189042611ef3565b6110229190611f0a565b610eef906401dcd65000611f2c565b600860009054906101000a90046001600160a01b03166001600160a01b03166397f3da1c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561107f57600080fd5b505afa158015611093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b79190611eda565b83116112585760085460408051630d0bff2f60e11b815290516000926001600160a01b031691631a17fe5e916004808301926020929190829003018186803b15801561110257600080fd5b505afa158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190611eda565b90508061115f576000848152600660205260409020546201518090610ed69042611ef3565b600860009054906101000a90046001600160a01b03166001600160a01b0316631a17fe5e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e59190611eda565b600085815260066020526040902054101561122157620151806112088242611ef3565b6112129190611f0a565b610fb9906401a13b8600611f2c565b600084815260066020526040902054620151809061123f9042611ef3565b6112499190611f0a565b610eef906401a13b8600611f2c565b60008381526006602052604090205462015180906112769042611ef3565b6112809190611f0a565b61128f90640165a0bc00611f2c565b9392505050565b50919050565b6001600160a01b0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156112fc57602002820191906000526020600020905b8154815260200190600101908083116112e8575b50505050509050919050565b6008546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561134c57600080fd5b505afa158015611360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113849190611eda565b9050600081116113cc5760405162461bcd60e51b81526020600482015260136024820152724e6f20746f6b656e7320746f207374616b652160681b604482015260640161058c565b6113d860096000611c38565b60005b8181101561148e57600854604051632f745c5960e01b8152336004820152602481018390526009916001600160a01b031690632f745c599060440160206040518083038186803b15801561142e57600080fd5b505afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190611eda565b815460018101835560009283526020909220909101558061148681611e55565b9150506113db565b5060005b6009548110156114d4576114c2600982815481106114b2576114b2611e29565b9060005260206000200154611b2b565b806114cc81611e55565b915050611492565b5050565b600760205281600052604060002081815481106114f457600080fd5b90600052602060002001600091509150505481565b6005546001600160a01b031633146115335760405162461bcd60e51b815260040161058c90611e88565b600a55565b6005546001600160a01b031633146115625760405162461bcd60e51b815260040161058c90611e88565b6001600160a01b0381166115c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161058c565b6106f681611ad9565b6001600160a01b0383166116325760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161058c565b6001600160a01b0382166116935760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161058c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821661174a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058c565b806002600082825461175c9190611e70565b90915550506001600160a01b03821660009081526020819052604081208054839290611789908490611e70565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166118375760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161058c565b6001600160a01b0382166118995760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161058c565b6001600160a01b038316600090815260208190526040902054818110156119115760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161058c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611948908490611e70565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161199491815260200190565b60405180910390a350505050565b60006119ad82611bcc565b33600090815260076020526040812080549293509091839081106119d3576119d3611e29565b60009182526020808320909101543383526007909152604082208054919350906119ff90600190611ef3565b81548110611a0f57611a0f611e29565b906000526020600020015490508060076000336001600160a01b03166001600160a01b031681526020019081526020016000208481548110611a5357611a53611e29565b60009182526020808320909101929092553381526007909152604090208054839190611a8190600190611ef3565b81548110611a9157611a91611e29565b6000918252602080832090910192909255338152600790915260409020805480611abd57611abd611f4b565b6001900381819060005260206000200160009055905550505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000818152600660205260409081902042905560085490516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015611b8f57600080fd5b505af1158015611ba3573d6000803e3d6000fd5b505033600090815260076020908152604082208054600181018255908352912001929092555050565b60008060005b3360009081526007602052604090205481101561099057336000908152600760205260409020805485919083908110611c0d57611c0d611e29565b90600052602060002001541415611c2657809150610990565b80611c3081611e55565b915050611bd2565b50805460008255906000526020600020908101906106f691905b80821115611c665760008155600101611c52565b5090565b600060208083528351808285015260005b81811015611c9757858101830151858201604001528201611c7b565b81811115611ca9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146106f657600080fd5b60008060408385031215611ce757600080fd5b8235611cf281611cbf565b946020939093013593505050565b600060208284031215611d1257600080fd5b5035919050565b600080600060608486031215611d2e57600080fd5b8335611d3981611cbf565b92506020840135611d4981611cbf565b929592945050506040919091013590565b600060208284031215611d6c57600080fd5b813561128f81611cbf565b6020808252825182820181905260009190848201906040850190845b81811015611daf57835183529284019291840191600101611d93565b50909695505050505050565b60008060408385031215611dce57600080fd5b8235611dd981611cbf565b91506020830135611de981611cbf565b809150509250929050565b600181811c90821680611e0857607f821691505b6020821081141561129657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611e6957611e69611e3f565b5060010190565b60008219821115611e8357611e83611e3f565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ecf57600080fd5b815161128f81611cbf565b600060208284031215611eec57600080fd5b5051919050565b600082821015611f0557611f05611e3f565b500390565b600082611f2757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611f4657611f46611e3f565b500290565b634e487b7160e01b600052603160045260246000fdfea26469706673582212204fe40b4263b40bea3ee9e8719397371481ddbe15dfaba1e6b764989cd0cd218564736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063853828b6116100f9578063d2d7231f11610097578063de5f626811610071578063de5f6268146103e9578063e81c7127146103f1578063ecda010114610404578063f2fde38b1461041757600080fd5b8063d2d7231f1461037d578063dcca1b3314610390578063dd62ed3e146103b057600080fd5b8063a457c2d7116100d3578063a457c2d714610324578063a9059cbb14610337578063b6b55f251461034a578063b8a242521461035d57600080fd5b8063853828b6146103035780638da5cb5b1461030b57806395d89b411461031c57600080fd5b8063395093511161016657806370a082311161014057806370a0823114610294578063715018a6146102bd57806378b2e3a9146102c557806379a59c13146102f057600080fd5b8063395093511461026657806345b35f5614610279578063486975d91461028157600080fd5b80631c4b774b116101a25780631c4b774b1461021c57806323b872dd146102315780632e1a7d4d14610244578063313ce5671461025757600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d161042a565b6040516101de9190611c6a565b60405180910390f35b6101fa6101f5366004611cd4565b6104bc565b60405190151581526020016101de565b6002545b6040519081526020016101de565b61022f61022a366004611d00565b6104d2565b005b6101fa61023f366004611d19565b6105c1565b61022f610252366004611d00565b61066b565b604051600981526020016101de565b6101fa610274366004611cd4565b6106f9565b61022f610735565b61022f61028f366004611d5a565b610845565b61020e6102a2366004611d5a565b6001600160a01b031660009081526020819052604090205490565b61022f610891565b6008546102d8906001600160a01b031681565b6040516001600160a01b0390911681526020016101de565b61020e6102fe366004611d5a565b6108c7565b61022f610997565b6005546001600160a01b03166102d8565b6101d1610ad7565b6101fa610332366004611cd4565b610ae6565b6101fa610345366004611cd4565b610b7f565b61022f610358366004611d00565b610b8c565b61020e61036b366004611d00565b60066020526000908152604090205481565b61020e61038b366004611d00565b610c68565b6103a361039e366004611d5a565b61129c565b6040516101de9190611d77565b61020e6103be366004611dbb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61022f611308565b61020e6103ff366004611cd4565b6114d8565b61022f610412366004611d00565b611509565b61022f610425366004611d5a565b611538565b60606003805461043990611df4565b80601f016020809104026020016040519081016040528092919081815260200182805461046590611df4565b80156104b25780601f10610487576101008083540402835291602001916104b2565b820191906000526020600020905b81548152906001019060200180831161049557829003601f168201915b5050505050905090565b60006104c93384846115d0565b50600192915050565b6000805b3360009081526007602052604090205481101561053d5733600090815260076020526040902080548491908390811061051157610511611e29565b9060005260206000200154141561052b576001915061053d565b8061053581611e55565b9150506104d6565b506001811515146105955760405162461bcd60e51b815260206004820152601f60248201527f596f752068617665206e6f74207374616b6564207468697320746f6b656e210060448201526064015b60405180910390fd5b60006105a083610c68565b90506105ac33826116f4565b50506000908152600660205260409020429055565b60006105ce8484846117d3565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106535760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161058c565b61066085338584036115d0565b506001949350505050565b610674816104d2565b6008546040516323b872dd60e01b8152306004820152336024820152604481018390526001600160a01b03909116906323b872dd90606401600060405180830381600087803b1580156106c657600080fd5b505af11580156106da573d6000803e3d6000fd5b505050600082815260066020526040812055506106f6816119a2565b50565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104c9918590610730908690611e70565b6115d0565b336000908152600760205260409020546107845760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b9cc81cdd185ad95960821b604482015260640161058c565b6000805b3360009081526007602052604090205481101561083a5733600090815260076020526040902080546107d59190839081106107c5576107c5611e29565b9060005260206000200154610c68565b6107df9083611e70565b3360009081526007602052604081208054929450429260069291908590811061080a5761080a611e29565b9060005260206000200154815260200190815260200160002081905550808061083290611e55565b915050610788565b506106f633826116f4565b6005546001600160a01b0316331461086f5760405162461bcd60e51b815260040161058c90611e88565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146108bb5760405162461bcd60e51b815260040161058c90611e88565b6108c56000611ad9565b565b6001600160a01b03811660009081526007602052604081205461091f5760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b9cc81cdd185ad95960821b604482015260640161058c565b6000805b6001600160a01b038416600090815260076020526040902054811015610990576001600160a01b038416600090815260076020526040902080546109729190839081106107c5576107c5611e29565b61097c9083611e70565b91508061098881611e55565b915050610923565b5092915050565b61099f610735565b60005b33600090815260076020526040902054811015610abe5760085433600081815260076020526040902080546001600160a01b03909316926323b872dd9230929091869081106109f3576109f3611e29565b6000918252602090912001546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610a4e57600080fd5b505af1158015610a62573d6000803e3d6000fd5b5050336000908152600760205260408120805491935060069250839185908110610a8e57610a8e611e29565b90600052602060002001548152602001908152602001600020819055508080610ab690611e55565b9150506109a2565b503360009081526007602052604081206108c591611c38565b60606004805461043990611df4565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610b685760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161058c565b610b7533858584036115d0565b5060019392505050565b60006104c93384846117d3565b6008546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c089190611ebd565b6001600160a01b0316336001600160a01b031614610c5f5760405162461bcd60e51b815260206004820152601460248201527329b2b73232b91036bab9ba1031329037bbb732b960611b604482015260640161058c565b6106f681611b2b565b600854604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190611eda565b821115610d2d5760405162461bcd60e51b81526020600482015260166024820152754e6f6e2d6578697374656e7420546f6b656e2049442160501b604482015260640161058c565b60008281526006602052604090205480610d7d5760405162461bcd60e51b8152602060048201526011602482015270546f6b656e206e6f74205374616b65642160781b604482015260640161058c565b600a54600084815260066020526040902054610d999042611ef3565b1015610da85750600092915050565b600860009054906101000a90046001600160a01b03166001600160a01b0316636ea078156040518163ffffffff1660e01b815260040160206040518083038186803b158015610df657600080fd5b505afa158015610e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2e9190611eda565b83116110315760085460408051630d0bff2f60e11b815290516000926001600160a01b031691631a17fe5e916004808301926020929190829003018186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb19190611eda565b905080610ef7576000848152600660205260409020546201518090610ed69042611ef3565b610ee09190611f0a565b610eef9064037e11d600611f2c565b949350505050565b600860009054906101000a90046001600160a01b03166001600160a01b0316631a17fe5e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4557600080fd5b505afa158015610f59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7d9190611eda565b6000858152600660205260409020541015610ffa5762015180610fa08242611ef3565b610faa9190611f0a565b610fb9906401dcd65000611f2c565b6000858152600660205260409020546201518090610fd79084611ef3565b610fe19190611f0a565b610ff09064037e11d600611f2c565b610eef9190611e70565b60008481526006602052604090205462015180906110189042611ef3565b6110229190611f0a565b610eef906401dcd65000611f2c565b600860009054906101000a90046001600160a01b03166001600160a01b03166397f3da1c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561107f57600080fd5b505afa158015611093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b79190611eda565b83116112585760085460408051630d0bff2f60e11b815290516000926001600160a01b031691631a17fe5e916004808301926020929190829003018186803b15801561110257600080fd5b505afa158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190611eda565b90508061115f576000848152600660205260409020546201518090610ed69042611ef3565b600860009054906101000a90046001600160a01b03166001600160a01b0316631a17fe5e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e59190611eda565b600085815260066020526040902054101561122157620151806112088242611ef3565b6112129190611f0a565b610fb9906401a13b8600611f2c565b600084815260066020526040902054620151809061123f9042611ef3565b6112499190611f0a565b610eef906401a13b8600611f2c565b60008381526006602052604090205462015180906112769042611ef3565b6112809190611f0a565b61128f90640165a0bc00611f2c565b9392505050565b50919050565b6001600160a01b0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156112fc57602002820191906000526020600020905b8154815260200190600101908083116112e8575b50505050509050919050565b6008546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561134c57600080fd5b505afa158015611360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113849190611eda565b9050600081116113cc5760405162461bcd60e51b81526020600482015260136024820152724e6f20746f6b656e7320746f207374616b652160681b604482015260640161058c565b6113d860096000611c38565b60005b8181101561148e57600854604051632f745c5960e01b8152336004820152602481018390526009916001600160a01b031690632f745c599060440160206040518083038186803b15801561142e57600080fd5b505afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190611eda565b815460018101835560009283526020909220909101558061148681611e55565b9150506113db565b5060005b6009548110156114d4576114c2600982815481106114b2576114b2611e29565b9060005260206000200154611b2b565b806114cc81611e55565b915050611492565b5050565b600760205281600052604060002081815481106114f457600080fd5b90600052602060002001600091509150505481565b6005546001600160a01b031633146115335760405162461bcd60e51b815260040161058c90611e88565b600a55565b6005546001600160a01b031633146115625760405162461bcd60e51b815260040161058c90611e88565b6001600160a01b0381166115c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161058c565b6106f681611ad9565b6001600160a01b0383166116325760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161058c565b6001600160a01b0382166116935760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161058c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821661174a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058c565b806002600082825461175c9190611e70565b90915550506001600160a01b03821660009081526020819052604081208054839290611789908490611e70565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166118375760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161058c565b6001600160a01b0382166118995760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161058c565b6001600160a01b038316600090815260208190526040902054818110156119115760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161058c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611948908490611e70565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161199491815260200190565b60405180910390a350505050565b60006119ad82611bcc565b33600090815260076020526040812080549293509091839081106119d3576119d3611e29565b60009182526020808320909101543383526007909152604082208054919350906119ff90600190611ef3565b81548110611a0f57611a0f611e29565b906000526020600020015490508060076000336001600160a01b03166001600160a01b031681526020019081526020016000208481548110611a5357611a53611e29565b60009182526020808320909101929092553381526007909152604090208054839190611a8190600190611ef3565b81548110611a9157611a91611e29565b6000918252602080832090910192909255338152600790915260409020805480611abd57611abd611f4b565b6001900381819060005260206000200160009055905550505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000818152600660205260409081902042905560085490516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015611b8f57600080fd5b505af1158015611ba3573d6000803e3d6000fd5b505033600090815260076020908152604082208054600181018255908352912001929092555050565b60008060005b3360009081526007602052604090205481101561099057336000908152600760205260409020805485919083908110611c0d57611c0d611e29565b90600052602060002001541415611c2657809150610990565b80611c3081611e55565b915050611bd2565b50805460008255906000526020600020908101906106f691905b80821115611c665760008155600101611c52565b5090565b600060208083528351808285015260005b81811015611c9757858101830151858201604001528201611c7b565b81811115611ca9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146106f657600080fd5b60008060408385031215611ce757600080fd5b8235611cf281611cbf565b946020939093013593505050565b600060208284031215611d1257600080fd5b5035919050565b600080600060608486031215611d2e57600080fd5b8335611d3981611cbf565b92506020840135611d4981611cbf565b929592945050506040919091013590565b600060208284031215611d6c57600080fd5b813561128f81611cbf565b6020808252825182820181905260009190848201906040850190845b81811015611daf57835183529284019291840191600101611d93565b50909695505050505050565b60008060408385031215611dce57600080fd5b8235611dd981611cbf565b91506020830135611de981611cbf565b809150509250929050565b600181811c90821680611e0857607f821691505b6020821081141561129657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611e6957611e69611e3f565b5060010190565b60008219821115611e8357611e83611e3f565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ecf57600080fd5b815161128f81611cbf565b600060208284031215611eec57600080fd5b5051919050565b600082821015611f0557611f05611e3f565b500390565b600082611f2757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611f4657611f46611e3f565b500290565b634e487b7160e01b600052603160045260246000fdfea26469706673582212204fe40b4263b40bea3ee9e8719397371481ddbe15dfaba1e6b764989cd0cd218564736f6c63430008090033

Deployed Bytecode Sourcemap

24675:6561:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14713:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16879:169;;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;16879:169:0;1072:187:1;15832:108:0;15920:12;;15832:108;;;1410:25:1;;;1398:2;1383:18;15832:108:0;1264:177:1;27808:499:0;;;;;;:::i;:::-;;:::i;:::-;;17530:492;;;;;;:::i;:::-;;:::i;26769:230::-;;;;;;:::i;:::-;;:::i;15675:92::-;;;15758:1;2234:36:1;;2222:2;2207:18;15675:92:0;2092:184:1;18431:215:0;;;;;;:::i;:::-;;:::i;28315:407::-;;;:::i;25214:130::-;;;;;;:::i;:::-;;:::i;16003:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;16104:18:0;16077:7;16104:18;;;;;;;;;;;;16003:127;6418:103;;;:::i;24920:38::-;;;;;-1:-1:-1;;;;;24920:38:0;;;;;;-1:-1:-1;;;;;2722:32:1;;;2704:51;;2692:2;2677:18;24920:38:0;2533:228:1;28730:331:0;;;;;;:::i;:::-;;:::i;26348:413::-;;;:::i;5767:87::-;5840:6;;-1:-1:-1;;;;;5840:6:0;5767:87;;14932:104;;;:::i;19149:413::-;;;;;;:::i;:::-;;:::i;16343:175::-;;;;;;:::i;:::-;;:::i;25772:220::-;;;;;;:::i;:::-;;:::i;24768:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;29069:1913;;;;;;:::i;:::-;;:::i;30990:119::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16581:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;16697:18:0;;;16670:7;16697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16581:151;25352:412;;;:::i;24862:49::-;;;;;;:::i;:::-;;:::i;31117:110::-;;;;;;:::i;:::-;;:::i;6676:201::-;;;;;;:::i;:::-;;:::i;14713:100::-;14767:13;14800:5;14793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14713:100;:::o;16879:169::-;16962:4;16979:39;4571:10;17002:7;17011:6;16979:8;:39::i;:::-;-1:-1:-1;17036:4:0;16879:169;;;;:::o;27808:499::-;27859:10;27893:6;27888:200;27922:10;27909:24;;;;:12;:24;;;;;:31;27905:35;;27888:200;;;27979:10;27966:24;;;;:12;:24;;;;;:27;;27997:7;;27966:24;27991:1;;27966:27;;;;;;:::i;:::-;;;;;;;;;:38;27962:115;;;28033:4;28025:12;;28056:5;;27962:115;27942:3;;;;:::i;:::-;;;;27888:200;;;-1:-1:-1;28115:4:0;28106:13;;;;28098:57;;;;-1:-1:-1;;;28098:57:0;;4995:2:1;28098:57:0;;;4977:21:1;5034:2;5014:18;;;5007:30;5073:33;5053:18;;;5046:61;5124:18;;28098:57:0;;;;;;;;;28168:14;28185:24;28201:7;28185:15;:24::i;:::-;28168:41;;28225:25;28231:10;28243:6;28225:5;:25::i;:::-;-1:-1:-1;;28261:20:0;;;;:11;:20;;;;;28284:15;28261:38;;27808:499::o;17530:492::-;17670:4;17687:36;17697:6;17705:9;17716:6;17687:9;:36::i;:::-;-1:-1:-1;;;;;17763:19:0;;17736:24;17763:19;;;:11;:19;;;;;;;;4571:10;17763:33;;;;;;;;17815:26;;;;17807:79;;;;-1:-1:-1;;;17807:79:0;;5355:2:1;17807:79:0;;;5337:21:1;5394:2;5374:18;;;5367:30;5433:34;5413:18;;;5406:62;-1:-1:-1;;;5484:18:1;;;5477:38;5532:19;;17807:79:0;5153:404:1;17807:79:0;17922:57;17931:6;4571:10;17972:6;17953:16;:25;17922:8;:57::i;:::-;-1:-1:-1;18010:4:0;;17530:492;-1:-1:-1;;;;17530:492:0:o;26769:230::-;26820:18;26830:7;26820:9;:18::i;:::-;26849:13;;:62;;-1:-1:-1;;;26849:62:0;;26884:4;26849:62;;;5802:34:1;26891:10:0;5852:18:1;;;5845:43;5904:18;;;5897:34;;;-1:-1:-1;;;;;26849:13:0;;;;:26;;5737:18:1;;26849:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26945:1:0;26922:20;;;:11;:20;;;;;:24;-1:-1:-1;26957:28:0;26934:7;26957:19;:28::i;:::-;26769:230;:::o;18431:215::-;4571:10;18519:4;18568:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18568:34:0;;;;;;;;;;18519:4;;18536:80;;18559:7;;18568:47;;18605:10;;18568:47;:::i;:::-;18536:8;:80::i;28315:407::-;28379:10;28400:1;28366:24;;;:12;:24;;;;;:31;28358:64;;;;-1:-1:-1;;;28358:64:0;;6277:2:1;28358:64:0;;;6259:21:1;6316:2;6296:18;;;6289:30;-1:-1:-1;;;6335:18:1;;;6328:46;6391:18;;28358:64:0;6075:340:1;28358:64:0;28435:12;28467:6;28462:214;28496:10;28483:24;;;;:12;:24;;;;;:31;28479:35;;28462:214;;;28576:10;28563:24;;;;:12;:24;;;;;:27;;28547:44;;28563:24;28588:1;;28563:27;;;;;;:::i;:::-;;;;;;;;;28547:15;:44::i;:::-;28536:55;;;;:::i;:::-;28631:10;28606:40;28618:24;;;:12;:24;;;;;:27;;28536:55;;-1:-1:-1;28649:15:0;;28606:11;;:40;28618:24;28643:1;;28618:27;;;;;;:::i;:::-;;;;;;;;;28606:40;;;;;;;;;;;:58;;;;28516:3;;;;;:::i;:::-;;;;28462:214;;;;28688:26;28694:10;28706:7;28688:5;:26::i;25214:130::-;5840:6;;-1:-1:-1;;;;;5840:6:0;4571:10;5987:23;5979:68;;;;-1:-1:-1;;;5979:68:0;;;;;;;:::i;:::-;25289:13:::1;:47:::0;;-1:-1:-1;;;;;;25289:47:0::1;-1:-1:-1::0;;;;;25289:47:0;;;::::1;::::0;;;::::1;::::0;;25214:130::o;6418:103::-;5840:6;;-1:-1:-1;;;;;5840:6:0;4571:10;5987:23;5979:68;;;;-1:-1:-1;;;5979:68:0;;;;;;;:::i;:::-;6483:30:::1;6510:1;6483:18;:30::i;:::-;6418:103::o:0;28730:331::-;-1:-1:-1;;;;;28820:17:0;;28792:7;28820:17;;;:12;:17;;;;;:24;28812:57;;;;-1:-1:-1;;;28812:57:0;;6277:2:1;28812:57:0;;;6259:21:1;6316:2;6296:18;;;6289:30;-1:-1:-1;;;6335:18:1;;;6328:46;6391:18;;28812:57:0;6075:340:1;28812:57:0;28882:13;;28906:125;-1:-1:-1;;;;;28927:17:0;;;;;;:12;:17;;;;;:24;28923:28;;28906:125;;;-1:-1:-1;;;;;28998:17:0;;;;;;:12;:17;;;;;:20;;28982:37;;28998:17;29016:1;;28998:20;;;;;;:::i;28982:37::-;28973:46;;;;:::i;:::-;;-1:-1:-1;28953:3:0;;;;:::i;:::-;;;;28906:125;;;-1:-1:-1;29048:5:0;28730:331;-1:-1:-1;;28730:331:0:o;26348:413::-;26391:15;:13;:15::i;:::-;26424:6;26419:293;26453:10;26440:24;;;;:12;:24;;;;;:31;26436:35;;26419:293;;;26493:13;;26535:10;26493:13;26547:24;;;:12;:24;;;;;:27;;-1:-1:-1;;;;;26493:13:0;;;;:26;;26528:4;;26535:10;;26572:1;;26547:27;;;;;;:::i;:::-;;;;;;;;;;;26493:82;;-1:-1:-1;;;;;;26493:82:0;;;;;;;-1:-1:-1;;;;;5820:15:1;;;26493:82:0;;;5802:34:1;5872:15;;;;5852:18;;;5845:43;5904:18;;;5897:34;5737:18;;26493:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26680:10:0;26698:1;26667:24;;;:12;:24;;;;;:27;;26698:1;;-1:-1:-1;26655:11:0;;-1:-1:-1;26698:1:0;;26692;;26667:27;;;;;;:::i;:::-;;;;;;;;;26655:40;;;;;;;;;;;:44;;;;26473:3;;;;;:::i;:::-;;;;26419:293;;;-1:-1:-1;26742:10:0;26729:24;;;;:12;:24;;;;;26722:31;;;:::i;14932:104::-;14988:13;15021:7;15014:14;;;;;:::i;19149:413::-;4571:10;19242:4;19286:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19286:34:0;;;;;;;;;;19339:35;;;;19331:85;;;;-1:-1:-1;;;19331:85:0;;6983:2:1;19331:85:0;;;6965:21:1;7022:2;7002:18;;;6995:30;7061:34;7041:18;;;7034:62;-1:-1:-1;;;7112:18:1;;;7105:35;7157:19;;19331:85:0;6781:401:1;19331:85:0;19452:67;4571:10;19475:7;19503:15;19484:16;:34;19452:8;:67::i;:::-;-1:-1:-1;19550:4:0;;19149:413;-1:-1:-1;;;19149:413:0:o;16343:175::-;16429:4;16446:42;4571:10;16470:9;16481:6;16446:9;:42::i;25772:220::-;25891:13;;:30;;-1:-1:-1;;;25891:30:0;;;;;1410:25:1;;;-1:-1:-1;;;;;25891:13:0;;;;:21;;1383:18:1;;25891:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25877:44:0;:10;-1:-1:-1;;;;;25877:44:0;;25869:77;;;;-1:-1:-1;;;25869:77:0;;7645:2:1;25869:77:0;;;7627:21:1;7684:2;7664:18;;;7657:30;-1:-1:-1;;;7703:18:1;;;7696:50;7763:18;;25869:77:0;7443:344:1;25869:77:0;25957:17;25966:7;25957:8;:17::i;29069:1913::-;29183:13;;:27;;;-1:-1:-1;;;29183:27:0;;;;29128:7;;-1:-1:-1;;;;;29183:13:0;;:25;;:27;;;;;;;;;;;;;;:13;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29172:7;:38;;29148:89;;;;-1:-1:-1;;;29148:89:0;;8183:2:1;29148:89:0;;;8165:21:1;8222:2;8202:18;;;8195:30;-1:-1:-1;;;8241:18:1;;;8234:52;8303:18;;29148:89:0;7981:346:1;29148:89:0;29248:18;29269:20;;;:11;:20;;;;;;29308:15;29300:45;;;;-1:-1:-1;;;29300:45:0;;8534:2:1;29300:45:0;;;8516:21:1;8573:2;8553:18;;;8546:30;-1:-1:-1;;;8592:18:1;;;8585:47;8649:18;;29300:45:0;8332:341:1;29300:45:0;29403:17;;29380:20;;;;:11;:20;;;;;;29362:38;;:15;:38;:::i;:::-;:58;29358:99;;;-1:-1:-1;29444:1:0;;29069:1913;-1:-1:-1;;29069:1913:0:o;29358:99::-;29484:13;;;;;;;;;-1:-1:-1;;;;;29484:13:0;-1:-1:-1;;;;;29484:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29473:7;:39;29469:1496;;29561:13;;:36;;;-1:-1:-1;;;29561:36:0;;;;29529:29;;-1:-1:-1;;;;;29561:13:0;;:34;;:36;;;;;;;;;;;;;;:13;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29529:68;-1:-1:-1;29616:26:0;29612:529;;29690:20;;;;:11;:20;;;;;;29714:5;;29672:38;;:15;:38;:::i;:::-;29671:48;;;;:::i;:::-;29670:64;;29723:11;29670:64;:::i;:::-;29663:71;29069:1913;-1:-1:-1;;;;29069:1913:0:o;29612:529::-;29796:13;;;;;;;;;-1:-1:-1;;;;;29796:13:0;-1:-1:-1;;;;;29796:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29773:20;;;;:11;:20;;;;;;:59;29769:372;;;29981:5;29938:39;29956:21;29938:15;:39;:::i;:::-;29937:49;;;;:::i;:::-;29936:64;;29990:10;29936:64;:::i;:::-;29887:20;;;;:11;:20;;;;;;29911:5;;29863:44;;:21;:44;:::i;:::-;29862:54;;;;:::i;:::-;29861:70;;29920:11;29861:70;:::i;:::-;29860:141;;;;:::i;29769:372::-;30082:20;;;;:11;:20;;;;;;30106:5;;30064:38;;:15;:38;:::i;:::-;30063:48;;;;:::i;:::-;30062:63;;30115:10;30062:63;:::i;29469:1496::-;30182:13;;;;;;;;;-1:-1:-1;;;;;30182:13:0;-1:-1:-1;;;;;30182:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30171:7;:42;30167:798;;30262:13;;:36;;;-1:-1:-1;;;30262:36:0;;;;30230:29;;-1:-1:-1;;;;;30262:13:0;;:34;;:36;;;;;;;;;;;;;;:13;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30230:68;-1:-1:-1;30317:26:0;30313:529;;30391:20;;;;:11;:20;;;;;;30415:5;;30373:38;;:15;:38;:::i;30313:529::-;30497:13;;;;;;;;;-1:-1:-1;;;;;30497:13:0;-1:-1:-1;;;;;30497:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30474:20;;;;:11;:20;;;;;;:59;30470:372;;;30682:5;30639:39;30657:21;30639:15;:39;:::i;:::-;30638:49;;;;:::i;:::-;30637:64;;30691:10;30637:64;:::i;30470:372::-;30783:20;;;;:11;:20;;;;;;30807:5;;30765:38;;:15;:38;:::i;:::-;30764:48;;;;:::i;:::-;30763:63;;30816:10;30763:63;:::i;30167:798::-;30910:20;;;;:11;:20;;;;;;30934:5;;30892:38;;:15;:38;:::i;:::-;30891:48;;;;:::i;:::-;30890:63;;30943:10;30890:63;:::i;:::-;30883:70;29069:1913;-1:-1:-1;;;29069:1913:0:o;30167:798::-;29137:1845;29069:1913;;;:::o;30990:119::-;-1:-1:-1;;;;;31084:17:0;;;;;;:12;:17;;;;;;;;;31077:24;;;;;;;;;;;;;;;;;31048:16;;31077:24;;;31084:17;31077:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30990:119;;;:::o;25352:412::-;25409:13;;:35;;-1:-1:-1;;;25409:35:0;;25433:10;25409:35;;;2704:51:1;25394:12:0;;-1:-1:-1;;;;;25409:13:0;;:23;;2677:18:1;;25409:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25394:50;;25473:1;25463:7;:11;25455:43;;;;-1:-1:-1;;;25455:43:0;;9405:2:1;25455:43:0;;;9387:21:1;9444:2;9424:18;;;9417:30;-1:-1:-1;;;9463:18:1;;;9456:49;9522:18;;25455:43:0;9203:343:1;25455:43:0;25511:11;25518:4;;25511:11;:::i;:::-;25538:6;25533:121;25554:7;25550:1;:11;25533:121;;;25593:13;;:48;;-1:-1:-1;;;25593:48:0;;25627:10;25593:48;;;9725:51:1;9792:18;;;9785:34;;;25583:4:0;;-1:-1:-1;;;;;25593:13:0;;:33;;9698:18:1;;25593:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25583:59;;;;;;;-1:-1:-1;25583:59:0;;;;;;;;;;;25563:3;;;;:::i;:::-;;;;25533:121;;;;25669:6;25664:83;25685:4;:11;25681:15;;25664:83;;;25718:17;25727:4;25732:1;25727:7;;;;;;;;:::i;:::-;;;;;;;;;25718:8;:17::i;:::-;25698:3;;;;:::i;:::-;;;;25664:83;;;;25383:381;25352:412::o;24862:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31117:110::-;5840:6;;-1:-1:-1;;;;;5840:6:0;4571:10;5987:23;5979:68;;;;-1:-1:-1;;;5979:68:0;;;;;;;:::i;:::-;31192:17:::1;:27:::0;31117:110::o;6676:201::-;5840:6;;-1:-1:-1;;;;;5840:6:0;4571:10;5987:23;5979:68;;;;-1:-1:-1;;;5979:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6765:22:0;::::1;6757:73;;;::::0;-1:-1:-1;;;6757:73:0;;10032:2:1;6757:73:0::1;::::0;::::1;10014:21:1::0;10071:2;10051:18;;;10044:30;10110:34;10090:18;;;10083:62;-1:-1:-1;;;10161:18:1;;;10154:36;10207:19;;6757:73:0::1;9830:402:1::0;6757:73:0::1;6841:28;6860:8;6841:18;:28::i;22833:380::-:0;-1:-1:-1;;;;;22969:19:0;;22961:68;;;;-1:-1:-1;;;22961:68:0;;10439:2:1;22961:68:0;;;10421:21:1;10478:2;10458:18;;;10451:30;10517:34;10497:18;;;10490:62;-1:-1:-1;;;10568:18:1;;;10561:34;10612:19;;22961:68:0;10237:400:1;22961:68:0;-1:-1:-1;;;;;23048:21:0;;23040:68;;;;-1:-1:-1;;;23040:68:0;;10844:2:1;23040:68:0;;;10826:21:1;10883:2;10863:18;;;10856:30;10922:34;10902:18;;;10895:62;-1:-1:-1;;;10973:18:1;;;10966:32;11015:19;;23040:68:0;10642:398:1;23040:68:0;-1:-1:-1;;;;;23121:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23173:32;;1410:25:1;;;23173:32:0;;1383:18:1;23173:32:0;;;;;;;22833:380;;;:::o;21072:399::-;-1:-1:-1;;;;;21156:21:0;;21148:65;;;;-1:-1:-1;;;21148:65:0;;11247:2:1;21148:65:0;;;11229:21:1;11286:2;11266:18;;;11259:30;11325:33;11305:18;;;11298:61;11376:18;;21148:65:0;11045:355:1;21148:65:0;21304:6;21288:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;21321:18:0;;:9;:18;;;;;;;;;;:28;;21343:6;;21321:9;:28;;21343:6;;21321:28;:::i;:::-;;;;-1:-1:-1;;21365:37:0;;1410:25:1;;;-1:-1:-1;;;;;21365:37:0;;;21382:1;;21365:37;;1398:2:1;1383:18;21365:37:0;;;;;;;25664:83;25383:381;25352:412::o;20052:733::-;-1:-1:-1;;;;;20192:20:0;;20184:70;;;;-1:-1:-1;;;20184:70:0;;11607:2:1;20184:70:0;;;11589:21:1;11646:2;11626:18;;;11619:30;11685:34;11665:18;;;11658:62;-1:-1:-1;;;11736:18:1;;;11729:35;11781:19;;20184:70:0;11405:401:1;20184:70:0;-1:-1:-1;;;;;20273:23:0;;20265:71;;;;-1:-1:-1;;;20265:71:0;;12013:2:1;20265:71:0;;;11995:21:1;12052:2;12032:18;;;12025:30;12091:34;12071:18;;;12064:62;-1:-1:-1;;;12142:18:1;;;12135:33;12185:19;;20265:71:0;11811:399:1;20265:71:0;-1:-1:-1;;;;;20433:17:0;;20409:21;20433:17;;;;;;;;;;;20469:23;;;;20461:74;;;;-1:-1:-1;;;20461:74:0;;12417:2:1;20461:74:0;;;12399:21:1;12456:2;12436:18;;;12429:30;12495:34;12475:18;;;12468:62;-1:-1:-1;;;12546:18:1;;;12539:36;12592:19;;20461:74:0;12215:402:1;20461:74:0;-1:-1:-1;;;;;20571:17:0;;;:9;:17;;;;;;;;;;;20591:22;;;20571:42;;20635:20;;;;;;;;:30;;20607:6;;20571:9;20635:30;;20607:6;;20635:30;:::i;:::-;;;;;;;;20700:9;-1:-1:-1;;;;;20683:35:0;20692:6;-1:-1:-1;;;;;20683:35:0;;20711:6;20683:35;;;;1410:25:1;;1398:2;1383:18;;1264:177;20683:35:0;;;;;;;;20173:612;20052:733;;;:::o;27007:452::-;27070:8;27081:31;27104:7;27081:22;:31::i;:::-;27164:10;27133:15;27151:24;;;:12;:24;;;;;:29;;27070:42;;-1:-1:-1;27133:15:0;;27070:42;;27151:29;;;;;;:::i;:::-;;;;;;;;;;;;;27223:10;27210:24;;:12;:24;;;;;;27235:31;;27151:29;;-1:-1:-1;27210:24:0;27235:35;;27269:1;;27235:35;:::i;:::-;27210:61;;;;;;;;:::i;:::-;;;;;;;;;27191:80;;27314:11;27282:12;:24;27295:10;-1:-1:-1;;;;;27282:24:0;-1:-1:-1;;;;;27282:24:0;;;;;;;;;;;;27307:3;27282:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;;27349:10;27336:24;;:12;:24;;;;;;27361:31;;27400:10;;27336:24;27361:35;;27395:1;;27361:35;:::i;:::-;27336:61;;;;;;;;:::i;:::-;;;;;;;;;;;;:74;;;;27434:10;27421:24;;:12;:24;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27059:400;;;27007:452;:::o;7037:191::-;7130:6;;;-1:-1:-1;;;;;7147:17:0;;;-1:-1:-1;;;;;;7147:17:0;;;;;;;7180:40;;7130:6;;;7147:17;7130:6;;7180:40;;7111:16;;7180:40;7100:128;7037:191;:::o;26000:340::-;26094:20;;;;:11;:20;;;;;;;26117:15;26094:38;;26181:13;;:62;;-1:-1:-1;;;26181:62:0;;26208:10;26181:62;;;5802:34:1;26228:4:0;5852:18:1;;;5845:43;5904:18;;;5897:34;;;-1:-1:-1;;;;;26181:13:0;;;;:26;;5737:18:1;;26181:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26307:10:0;26294:24;;;;:12;:24;;;;;;;:38;;;;;;;;;;;;;;;;;-1:-1:-1;;26000:340:0:o;27467:333::-;27535:4;27552:10;27578:6;27573:197;27607:10;27594:24;;;;:12;:24;;;;;:31;27590:35;;27573:197;;;27664:10;27651:24;;;;:12;:24;;;;;:27;;27682:7;;27651:24;27676:1;;27651:27;;;;;;:::i;:::-;;;;;;;;;:38;27647:112;;;27718:1;27710:9;;27738:5;;27647:112;27627:3;;;;:::i;:::-;;;;27573:197;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1446:180::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;-1:-1:-1;1597:23:1;;1446:180;-1:-1:-1;1446:180:1:o;1631:456::-;1708:6;1716;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;1832:9;1819:23;1851:31;1876:5;1851:31;:::i;:::-;1901:5;-1:-1:-1;1958:2:1;1943:18;;1930:32;1971:33;1930:32;1971:33;:::i;:::-;1631:456;;2023:7;;-1:-1:-1;;;2077:2:1;2062:18;;;;2049:32;;1631:456::o;2281:247::-;2340:6;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2448:9;2435:23;2467:31;2492:5;2467:31;:::i;2974:632::-;3145:2;3197:21;;;3267:13;;3170:18;;;3289:22;;;3116:4;;3145:2;3368:15;;;;3342:2;3327:18;;;3116:4;3411:169;3425:6;3422:1;3419:13;3411:169;;;3486:13;;3474:26;;3555:15;;;;3520:12;;;;3447:1;3440:9;3411:169;;;-1:-1:-1;3597:3:1;;2974:632;-1:-1:-1;;;;;;2974:632:1:o;3611:388::-;3679:6;3687;3740:2;3728:9;3719:7;3715:23;3711:32;3708:52;;;3756:1;3753;3746:12;3708:52;3795:9;3782:23;3814:31;3839:5;3814:31;:::i;:::-;3864:5;-1:-1:-1;3921:2:1;3906:18;;3893:32;3934:33;3893:32;3934:33;:::i;:::-;3986:7;3976:17;;;3611:388;;;;;:::o;4004:380::-;4083:1;4079:12;;;;4126;;;4147:61;;4201:4;4193:6;4189:17;4179:27;;4147:61;4254:2;4246:6;4243:14;4223:18;4220:38;4217:161;;;4300:10;4295:3;4291:20;4288:1;4281:31;4335:4;4332:1;4325:15;4363:4;4360:1;4353:15;4389:127;4450:10;4445:3;4441:20;4438:1;4431:31;4481:4;4478:1;4471:15;4505:4;4502:1;4495:15;4521:127;4582:10;4577:3;4573:20;4570:1;4563:31;4613:4;4610:1;4603:15;4637:4;4634:1;4627:15;4653:135;4692:3;-1:-1:-1;;4713:17:1;;4710:43;;;4733:18;;:::i;:::-;-1:-1:-1;4780:1:1;4769:13;;4653:135::o;5942:128::-;5982:3;6013:1;6009:6;6006:1;6003:13;6000:39;;;6019:18;;:::i;:::-;-1:-1:-1;6055:9:1;;5942:128::o;6420:356::-;6622:2;6604:21;;;6641:18;;;6634:30;6700:34;6695:2;6680:18;;6673:62;6767:2;6752:18;;6420:356::o;7187:251::-;7257:6;7310:2;7298:9;7289:7;7285:23;7281:32;7278:52;;;7326:1;7323;7316:12;7278:52;7358:9;7352:16;7377:31;7402:5;7377:31;:::i;7792:184::-;7862:6;7915:2;7903:9;7894:7;7890:23;7886:32;7883:52;;;7931:1;7928;7921:12;7883:52;-1:-1:-1;7954:16:1;;7792:184;-1:-1:-1;7792:184:1:o;8678:125::-;8718:4;8746:1;8743;8740:8;8737:34;;;8751:18;;:::i;:::-;-1:-1:-1;8788:9:1;;8678:125::o;8808:217::-;8848:1;8874;8864:132;;8918:10;8913:3;8909:20;8906:1;8899:31;8953:4;8950:1;8943:15;8981:4;8978:1;8971:15;8864:132;-1:-1:-1;9010:9:1;;8808:217::o;9030:168::-;9070:7;9136:1;9132;9128:6;9124:14;9121:1;9118:21;9113:1;9106:9;9099:17;9095:45;9092:71;;;9143:18;;:::i;:::-;-1:-1:-1;9183:9:1;;9030:168::o;12622:127::-;12683:10;12678:3;12674:20;12671:1;12664:31;12714:4;12711:1;12704:15;12738:4;12735:1;12728:15

Swarm Source

ipfs://4fe40b4263b40bea3ee9e8719397371481ddbe15dfaba1e6b764989cd0cd2185
Loading...
Loading
Loading...
Loading
[ 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.