ETH Price: $2,622.72 (+1.60%)

Token

Spooky SZN (SPKYSZN)
 

Overview

Max Total Supply

6,666 SPKYSZN

Holders

1,550

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SPKYSZN
0x8bb97f08e78a951e835eafd46b0c4f62442c480e
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:
SpookySZN

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-18
*/

// SPDX-License-Identifier: MIT

//  https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;

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

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


pragma solidity ^0.8.0;
// conerts to ASCII
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";


    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

  
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

   
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol

pragma solidity ^0.8.0;
//address functions
library Address {
  
    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

 
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }


    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

  
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

  
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

   
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

   
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

   
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

  
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }


    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

  
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {
                

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;


//ERC-721 Token Standard
 
interface 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);
}

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;



interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;
//coolection constructor
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

   
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }


    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }


    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

   
    function name() public view virtual override returns (string memory) {
        return _name;
    }

 
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

  
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

 
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

   
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

   
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

  
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }
 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
  
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }


    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }
  
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
   
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

  
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

 
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

   
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

  
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol

pragma solidity ^0.8.0;
// owner only commands
abstract contract Ownable is Context {
    address private _owner;

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

 //owner constructor
    constructor() {
        _setOwner(_msgSender());
    }

  
    function owner() public view virtual returns (address) {
        return _owner;
    }

   
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }


    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


/*  

                                                                                               
   @@@@@@   @@@@@@@    @@@@@@    @@@@@@   @@@  @@@  @@@ @@@         @@@@@@   @@@@@@@@  @@@  @@@  
  @@@@@@@   @@@@@@@@  @@@@@@@@  @@@@@@@@  @@@  @@@  @@@ @@@        @@@@@@@   @@@@@@@@  @@@@ @@@  
  !@@       @@!  @@@  @@!  @@@  @@!  @@@  @@!  !@@  @@! !@@        !@@            @@!  @@!@!@@@  
  !@!       !@!  @!@  !@!  @!@  !@!  @!@  !@!  @!!  !@! @!!        !@!           !@!   !@!!@!@!  
  !!@@!!    @!@@!@!   @!@  !@!  @!@  !@!  @!@@!@!    !@!@!         !!@@!!       @!!    @!@ !!@!  
   !!@!!!   !!@!!!    !@!  !!!  !@!  !!!  !!@!!!      @!!!          !!@!!!     !!!     !@!  !!!  
       !:!  !!:       !!:  !!!  !!:  !!!  !!: :!!     !!:               !:!   !!:      !!:  !!!  
      !:!   :!:       :!:  !:!  :!:  !:!  :!:  !:!    :!:              !:!   :!:       :!:  !:!  
  :::: ::    ::       ::::: ::  ::::: ::   ::  :::     ::          :::: ::    :: ::::   ::   ::  
  :: : :     :         : :  :    : :  :    :   :::     :           :: : :    : :: : :  ::    :   
                                                                                               
                                                                                               

	
                            Contract provided By B.A.S.S Studios 
                            (Blockchain and Software Solutions)
                                    f i r e b u g 5 0 9                     
*/
pragma solidity >=0.7.0 <0.9.0;

abstract contract IParent {
    
    function ownerOf(uint256 tokenId) external view virtual returns (address);
    function walletOfOwner(address _owner) external view virtual returns (uint256[] memory);
    function totalSupply() external view virtual returns (uint256);
    function balanceOf(address owner) external view virtual returns (uint256);

}

contract SpookySZN is ERC721, Ownable, ReentrancyGuard {
  using Strings for uint256;

  bytes32 public merkleRoot;
  mapping(address => uint256) public whitelistClaimed;
  //collection details
  string public _collectionName= "Spooky SZN";
  string public _collectionSymbol="SPKYSZN";

  //metadata details
  string baseURI="ipfs://CID/";
  string public baseExtension = ".json";

  //mint details
  uint256 public cost = 0 ether;
  uint256 public whiteListCost = 0 ether;
  uint256 public maxSupply = 6666;
  uint256 public maxMintAmountPerTx = 5;
  uint256 public whiteListMintAmount=3;
  string public notRevealedUri;

  //track mints
  uint256 public amountMinted;
  uint256 public WLClaimed;


  //manage states
  //public sale toggle
  bool public publicPaused = true;
  //white list toggle
  bool public whitelistMintEnabled = false;
  //reveal toggle
  bool public revealed = false;
  //Mint pass claim toggle
  bool public parentClaimActive=false;

    //MintPass interface management
    mapping(address=>uint256) public _parentsClaimedPerAddress;
    // tracking Used partent claims / used mint passes
    uint256 public parentClaims;
    //v2 address change this to nft adress needed to hold for claim
    address public v2Address =0x3b8e3C1a29C5cA73Dd47Dc57781d3E7551c0A2aB;


    //initialize v2 as the parent interface
    IParent public v2;

  constructor() ERC721(_collectionName, _collectionSymbol)
   {
    setNotRevealedURI("ipfs://QmdC8LcRr5Xxzqdx3YCgs5uCEQBCApaCFXGRK7tdTwAp9P/HiddenMetadata.json");
    //assign v2 a contract address to act as the (parent/mint pass)
    v2= IParent(v2Address);
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  // public minting fuction + WL check
  function mint(uint256 _mintAmount) public payable {

    uint256 mintSupply = totalSupply();

//manage public mint
    require(!publicPaused, "Contract is paused");
    require(_mintAmount > 0, "mint amount cant be 0");
    require(_mintAmount <= maxMintAmountPerTx, "Cant mint over the max mint amount");
    require(mintSupply + _mintAmount <= maxSupply, "Mint amount is too high there may not be enough left to mint that many");

    if (msg.sender != owner()) {
      require(msg.value >= cost * _mintAmount);
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, mintSupply + i);
    }
    amountMinted+=_mintAmount;
  }
  
function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable{

      uint256 mintSupply = totalSupply();
//manage whitelist request

    require(whitelistMintEnabled, "whitelist not active");
    require((whitelistClaimed[msg.sender] +_mintAmount) <= whiteListMintAmount, "Address already claimed! or you have requested more than allowed");
    require(_mintAmount > 0, "mint amount cant be 0");
    require(mintSupply + _mintAmount <= maxSupply, "Purchase would exceed max supply");
    require(msg.value>= whiteListCost*_mintAmount,"Eth value sent is not correct");
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); 
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof!");

    whitelistClaimed[msg.sender] += _mintAmount;
    amountMinted+=_mintAmount;
    WLClaimed+=_mintAmount;

        for (uint256 i = 1; i <= _mintAmount; i++) {
      
    _safeMint(msg.sender, mintSupply + i);
      
      }

}

  //claimable list mint funtion
//claim from parent (mint pass implementation)
function claimForParentNFT(uint256 numberOfTokens) external payable {

    uint256 balance= v2.balanceOf(msg.sender);
    uint256 currentSupplyGlobal = totalSupply();
    uint256 currentClaimed =_parentsClaimedPerAddress[msg.sender];
    require(parentClaimActive, "Claim is not active");
    require(numberOfTokens+currentClaimed <=balance, "Exceeded max available to purchase");
    require(currentSupplyGlobal + numberOfTokens <= maxSupply, "Purchase would exceed max supply");

    for (uint256 i = 1; i <= (numberOfTokens); i++) {
                _safeMint(msg.sender, currentSupplyGlobal + i);
    }
                    parentClaims+=numberOfTokens;
                    _parentsClaimedPerAddress[msg.sender]+=numberOfTokens;
                    amountMinted+=numberOfTokens;
 }

//return total supply minted
 function totalSupply() public view returns (uint256) {
    return amountMinted;
  }

//gas efficient function to find token ids owned by address
   function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;
        ownedTokenIndex++;
      }
      currentTokenId++;
    }
    return ownedTokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    
    if(revealed == false) {
        return notRevealedUri;
    }
    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //Access Functions
  //actions for the owner to interact with contract
  function setRevealed(bool _newBool) public onlyOwner() {
      revealed = _newBool;
  }
// update mint cost
  function setCost(uint256 _newCost) public onlyOwner() {
    cost = _newCost;
  }
  // update WL mint cost
  function setWhiteListCost(uint256 _newCost) public onlyOwner() {
    whiteListCost = _newCost;
  }
// max mint amount
  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() {
    maxMintAmountPerTx = _newmaxMintAmount;
  }
// max WL amount
  function setMaxWlAmount(uint256 _newMaxWlAmount) public onlyOwner() {
    whiteListMintAmount= _newMaxWlAmount;
  }
//revealed bool  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }
//base URI extension
  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }
//set extension (.json)
  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
//contract paused state
  function setPaused(bool _state) public onlyOwner {
    publicPaused = _state;
  }

 
  //set white list to true or false for active
    function setWhitelistMintEnabled(bool _whiteListActive) external onlyOwner {
        whitelistMintEnabled = _whiteListActive;
    }

//mint pass access functions
function setV2Contract(address _newV2Contract) external onlyOwner {
    v2Address = _newV2Contract;
    v2=IParent(v2Address);
  }


function setParentClaim(bool choice) public onlyOwner{
    parentClaimActive=choice;
}
//distrubute
  function distribute(address walletAddress, uint256 amount) public onlyOwner{
      uint256 mintSupply=totalSupply();
          require(mintSupply + amount <= maxSupply, "Mint amount is too high there may not be enough left to mint that many");
          for(uint256 i=1; i<= amount;i++){
       _safeMint(walletAddress, mintSupply + i);
          }
          amountMinted+=amount;
  }

 function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

//backup witdraw to retrieve all funds to deployment account 
  function backupWithdraw() public payable onlyOwner nonReentrant{
 
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"WLClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_collectionName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_collectionSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_parentsClaimedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backupWithdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"claimForParentNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxWlAmount","type":"uint256"}],"name":"setMaxWlAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"choice","type":"bool"}],"name":"setParentClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newBool","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newV2Contract","type":"address"}],"name":"setV2Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhiteListCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whiteListActive","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"v2","outputs":[{"internalType":"contract IParent","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"v2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c0604052600a60808181526929b837b7b5bc9029ad2760b11b60a05262000028908262000436565b5060408051808201909152600781526629a825aca9ad2760c91b6020820152600b9062000056908262000436565b5060408051808201909152600b81526a697066733a2f2f4349442f60a81b6020820152600c9062000088908262000436565b50604080518082019091526005815264173539b7b760d91b6020820152600d90620000b4908262000436565b506000600e819055600f55611a0a601055600560115560036012556016805463ffffffff19166001179055601980546001600160a01b031916733b8e3c1a29c5ca73dd47dc57781d3e7551c0a2ab1790553480156200011257600080fd5b50600a80546200012290620003a7565b80601f01602080910402602001604051908101604052809291908181526020018280546200015090620003a7565b8015620001a15780601f106200017557610100808354040283529160200191620001a1565b820191906000526020600020905b8154815290600101906020018083116200018357829003601f168201915b5050505050600b8054620001b590620003a7565b80601f0160208091040260200160405190810160405280929190818152602001828054620001e390620003a7565b8015620002345780601f10620002085761010080835404028352916020019162000234565b820191906000526020600020905b8154815290600101906020018083116200021657829003601f168201915b505050505081600090816200024a919062000436565b50600162000259828262000436565b5050506200027662000270620002ca60201b60201c565b620002ce565b6001600781905550620002a2604051806080016040528060498152602001620033a06049913962000320565b601954601a80546001600160a01b0319166001600160a01b0390921691909117905562000502565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200037f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b60136200038d828262000436565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003bc57607f821691505b602082108103620003dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043157600081815260208120601f850160051c810160208610156200040c5750805b601f850160051c820191505b818110156200042d5782815560010162000418565b5050505b505050565b81516001600160401b0381111562000452576200045262000391565b6200046a81620004638454620003a7565b84620003e3565b602080601f831160018114620004a25760008415620004895750858301515b600019600386901b1c1916600185901b1785556200042d565b600085815260208120601f198616915b82811015620004d357888601518255948401946001909101908401620004b2565b5085821015620004f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612e8e80620005126000396000f3fe6080604052600436106103765760003560e01c80637f00c7a6116101d1578063c904a7f011610102578063e0a80853116100a0578063f2fde38b1161006f578063f2fde38b1461099e578063f3acae3a146109be578063fab1f9b1146109de578063fb932108146109f357600080fd5b8063e0a808531461091d578063e985e9c51461093d578063eb780c621461095d578063f2c4ce1e1461097e57600080fd5b8063da387082116100dc578063da387082146108b2578063da3ef23f146108ba578063da61ee4a146108da578063db4bec44146108f057600080fd5b8063c904a7f014610873578063d2cab05614610889578063d5abeb011461089c57600080fd5b8063b767a0981161016f578063c5517fd711610149578063c5517fd7146107f1578063c66828621461081e578063c7e9d14114610833578063c87b56dd1461085357600080fd5b8063b767a09814610791578063b88d4fde146107b1578063c17589d7146107d157600080fd5b806394354fd0116101ab57806394354fd01461073357806395d89b4114610749578063a0712d681461075e578063a22cb4651461077157600080fd5b80637f00c7a6146106df5780638da5cb5b146106ff5780639257e0441461071d57600080fd5b8063438b6300116102ab5780636352211e11610249578063715018a611610223578063715018a61461067e5780637af284d5146106935780637cb64759146106a95780637dae85c6146106c957600080fd5b80636352211e1461061f5780636caede3d1461063f57806370a082311461065e57600080fd5b80634c66d26c116102855780634c66d26c1461059f5780634f432812146105bf57806351830227146105df57806355f804b3146105ff57600080fd5b8063438b63001461053f57806344a0d68a1461056c57806345d0ffd01461058c57600080fd5b806316c38b3c116103185780632eb4a7ab116102f25780632eb4a7ab146104d4578063349cd113146104ea57806335ac0fcb146104ff57806342842e0e1461051f57600080fd5b806316c38b3c1461047f57806318160ddd1461049f57806323b872dd146104b457600080fd5b8063081c8c4411610354578063081c8c441461040a578063095ea7b31461041f5780630bb12bb81461044157806313faede61461045b57600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b61039636600461262f565b610a13565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610a65565b6040516103a7919061269c565b3480156103de57600080fd5b506103f26103ed3660046126af565b610af7565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b506103c5610b91565b34801561042b57600080fd5b5061043f61043a3660046126e4565b610c1f565b005b34801561044d57600080fd5b5060165461039b9060ff1681565b34801561046757600080fd5b50610471600e5481565b6040519081526020016103a7565b34801561048b57600080fd5b5061043f61049a36600461271e565b610d34565b3480156104ab57600080fd5b50601454610471565b3480156104c057600080fd5b5061043f6104cf366004612739565b610d71565b3480156104e057600080fd5b5061047160085481565b3480156104f657600080fd5b506103c5610da2565b34801561050b57600080fd5b5061043f61051a3660046126af565b610daf565b34801561052b57600080fd5b5061043f61053a366004612739565b610dde565b34801561054b57600080fd5b5061055f61055a366004612775565b610df9565b6040516103a79190612790565b34801561057857600080fd5b5061043f6105873660046126af565b610ed9565b61043f61059a3660046126af565b610f08565b3480156105ab57600080fd5b5061043f6105ba36600461271e565b61112e565b3480156105cb57600080fd5b506019546103f2906001600160a01b031681565b3480156105eb57600080fd5b5060165461039b9062010000900460ff1681565b34801561060b57600080fd5b5061043f61061a366004612860565b611176565b34801561062b57600080fd5b506103f261063a3660046126af565b6111b0565b34801561064b57600080fd5b5060165461039b90610100900460ff1681565b34801561066a57600080fd5b50610471610679366004612775565b611227565b34801561068a57600080fd5b5061043f6112ae565b34801561069f57600080fd5b5061047160145481565b3480156106b557600080fd5b5061043f6106c43660046126af565b6112e4565b3480156106d557600080fd5b5061047160155481565b3480156106eb57600080fd5b5061043f6106fa3660046126af565b611313565b34801561070b57600080fd5b506006546001600160a01b03166103f2565b34801561072957600080fd5b50610471600f5481565b34801561073f57600080fd5b5061047160115481565b34801561075557600080fd5b506103c5611342565b61043f61076c3660046126af565b611351565b34801561077d57600080fd5b5061043f61078c3660046128a9565b6114e9565b34801561079d57600080fd5b5061043f6107ac36600461271e565b6115ad565b3480156107bd57600080fd5b5061043f6107cc3660046128dc565b6115f1565b3480156107dd57600080fd5b5061043f6107ec366004612775565b611629565b3480156107fd57600080fd5b5061047161080c366004612775565b60176020526000908152604090205481565b34801561082a57600080fd5b506103c561167f565b34801561083f57600080fd5b5061043f61084e3660046126af565b61168c565b34801561085f57600080fd5b506103c561086e3660046126af565b6116bb565b34801561087f57600080fd5b5061047160125481565b61043f610897366004612958565b611840565b3480156108a857600080fd5b5061047160105481565b61043f611b70565b3480156108c657600080fd5b5061043f6108d5366004612860565b611c4e565b3480156108e657600080fd5b5061047160185481565b3480156108fc57600080fd5b5061047161090b366004612775565b60096020526000908152604090205481565b34801561092957600080fd5b5061043f61093836600461271e565b611c84565b34801561094957600080fd5b5061039b6109583660046129d7565b611cca565b34801561096957600080fd5b5060165461039b906301000000900460ff1681565b34801561098a57600080fd5b5061043f610999366004612860565b611cf8565b3480156109aa57600080fd5b5061043f6109b9366004612775565b611d2e565b3480156109ca57600080fd5b50601a546103f2906001600160a01b031681565b3480156109ea57600080fd5b506103c5611dc9565b3480156109ff57600080fd5b5061043f610a0e3660046126e4565b611dd6565b60006001600160e01b031982166380ac58cd60e01b1480610a4457506001600160e01b03198216635b5e139f60e01b145b80610a5f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610a7490612a01565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090612a01565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b755760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60138054610b9e90612a01565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca90612a01565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b505050505081565b6000610c2a826111b0565b9050806001600160a01b0316836001600160a01b031603610c975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b6c565b336001600160a01b0382161480610cb35750610cb38133611cca565b610d255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b6c565b610d2f8383611e80565b505050565b6006546001600160a01b03163314610d5e5760405162461bcd60e51b8152600401610b6c90612a3b565b6016805460ff1916911515919091179055565b610d7b3382611eee565b610d975760405162461bcd60e51b8152600401610b6c90612a70565b610d2f838383611fc5565b600a8054610b9e90612a01565b6006546001600160a01b03163314610dd95760405162461bcd60e51b8152600401610b6c90612a3b565b601255565b610d2f838383604051806020016040528060008152506115f1565b60606000610e0683611227565b905060008167ffffffffffffffff811115610e2357610e236127d4565b604051908082528060200260200182016040528015610e4c578160200160208202803683370190505b509050600160005b8381108015610e6557506010548211155b15610ecf576000610e75836111b0565b9050866001600160a01b0316816001600160a01b031603610ebc5782848381518110610ea357610ea3612ac1565b602090810291909101015281610eb881612aed565b9250505b82610ec681612aed565b93505050610e54565b5090949350505050565b6006546001600160a01b03163314610f035760405162461bcd60e51b8152600401610b6c90612a3b565b600e55565b601a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f759190612b06565b90506000610f8260145490565b33600090815260176020526040902054601654919250906301000000900460ff16610fe55760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610b6c565b82610ff08286612b1f565b11156110495760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401610b6c565b6010546110568584612b1f565b11156110a45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610b6c565b60015b8481116110d3576110c1336110bc8386612b1f565b612165565b806110cb81612aed565b9150506110a7565b5083601860008282546110e69190612b1f565b9091555050336000908152601760205260408120805486929061110a908490612b1f565b9250508190555083601460008282546111239190612b1f565b909155505050505050565b6006546001600160a01b031633146111585760405162461bcd60e51b8152600401610b6c90612a3b565b6016805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146111a05760405162461bcd60e51b8152600401610b6c90612a3b565b600c6111ac8282612b78565b5050565b6000818152600260205260408120546001600160a01b031680610a5f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b6c565b60006001600160a01b0382166112925760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b6c565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146112d85760405162461bcd60e51b8152600401610b6c90612a3b565b6112e2600061217f565b565b6006546001600160a01b0316331461130e5760405162461bcd60e51b8152600401610b6c90612a3b565b600855565b6006546001600160a01b0316331461133d5760405162461bcd60e51b8152600401610b6c90612a3b565b601155565b606060018054610a7490612a01565b600061135c60145490565b60165490915060ff16156113a75760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b6044820152606401610b6c565b600082116113ef5760405162461bcd60e51b815260206004820152601560248201527406d696e7420616d6f756e742063616e74206265203605c1b6044820152606401610b6c565b60115482111561144c5760405162461bcd60e51b815260206004820152602260248201527f43616e74206d696e74206f76657220746865206d6178206d696e7420616d6f756044820152611b9d60f21b6064820152608401610b6c565b6010546114598383612b1f565b11156114775760405162461bcd60e51b8152600401610b6c90612c38565b6006546001600160a01b031633146114a35781600e546114979190612ca4565b3410156114a357600080fd5b60015b8281116114cd576114bb336110bc8385612b1f565b806114c581612aed565b9150506114a6565b5081601460008282546114e09190612b1f565b90915550505050565b336001600160a01b038316036115415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b6c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146115d75760405162461bcd60e51b8152600401610b6c90612a3b565b601680549115156101000261ff0019909216919091179055565b6115fb3383611eee565b6116175760405162461bcd60e51b8152600401610b6c90612a70565b611623848484846121d1565b50505050565b6006546001600160a01b031633146116535760405162461bcd60e51b8152600401610b6c90612a3b565b601980546001600160a01b039092166001600160a01b03199283168117909155601a8054909216179055565b600d8054610b9e90612a01565b6006546001600160a01b031633146116b65760405162461bcd60e51b8152600401610b6c90612a3b565b600f55565b6000818152600260205260409020546060906001600160a01b031661173a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b6c565b60165462010000900460ff1615156000036117e1576013805461175c90612a01565b80601f016020809104026020016040519081016040528092919081815260200182805461178890612a01565b80156117d55780601f106117aa576101008083540402835291602001916117d5565b820191906000526020600020905b8154815290600101906020018083116117b857829003601f168201915b50505050509050919050565b60006117eb612204565b9050600081511161180b5760405180602001604052806000815250611839565b8061181584612213565b600d60405160200161182993929190612cbb565b6040516020818303038152906040525b9392505050565b600061184b60145490565b601654909150610100900460ff1661189c5760405162461bcd60e51b815260206004820152601460248201527377686974656c697374206e6f742061637469766560601b6044820152606401610b6c565b601254336000908152600960205260409020546118ba908690612b1f565b1115611930576040805162461bcd60e51b81526020600482015260248101919091527f4164647265737320616c726561647920636c61696d656421206f7220796f752060448201527f6861766520726571756573746564206d6f7265207468616e20616c6c6f7765646064820152608401610b6c565b600084116119785760405162461bcd60e51b815260206004820152601560248201527406d696e7420616d6f756e742063616e74206265203605c1b6044820152606401610b6c565b6010546119858583612b1f565b11156119d35760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610b6c565b83600f546119e19190612ca4565b341015611a305760405162461bcd60e51b815260206004820152601d60248201527f4574682076616c75652073656e74206973206e6f7420636f72726563740000006044820152606401610b6c565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611aaa848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612314565b611ae75760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610b6c565b3360009081526009602052604081208054879290611b06908490612b1f565b925050819055508460146000828254611b1f9190612b1f565b925050819055508460156000828254611b389190612b1f565b90915550600190505b858111611b6857611b56336110bc8386612b1f565b80611b6081612aed565b915050611b41565b505050505050565b6006546001600160a01b03163314611b9a5760405162461bcd60e51b8152600401610b6c90612a3b565b600260075403611bec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b6c565b6002600755604051600090339047908381818185875af1925050503d8060008114611c33576040519150601f19603f3d011682016040523d82523d6000602084013e611c38565b606091505b5050905080611c4657600080fd5b506001600755565b6006546001600160a01b03163314611c785760405162461bcd60e51b8152600401610b6c90612a3b565b600d6111ac8282612b78565b6006546001600160a01b03163314611cae5760405162461bcd60e51b8152600401610b6c90612a3b565b60168054911515620100000262ff000019909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b03163314611d225760405162461bcd60e51b8152600401610b6c90612a3b565b60136111ac8282612b78565b6006546001600160a01b03163314611d585760405162461bcd60e51b8152600401610b6c90612a3b565b6001600160a01b038116611dbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b6c565b611dc68161217f565b50565b600b8054610b9e90612a01565b6006546001600160a01b03163314611e005760405162461bcd60e51b8152600401610b6c90612a3b565b6000611e0b60145490565b601054909150611e1b8383612b1f565b1115611e395760405162461bcd60e51b8152600401610b6c90612c38565b60015b828111611e6357611e51846110bc8385612b1f565b80611e5b81612aed565b915050611e3c565b508160146000828254611e769190612b1f565b9091555050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611eb5826111b0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611f675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b6c565b6000611f72836111b0565b9050806001600160a01b0316846001600160a01b03161480611fad5750836001600160a01b0316611fa284610af7565b6001600160a01b0316145b80611fbd5750611fbd8185611cca565b949350505050565b826001600160a01b0316611fd8826111b0565b6001600160a01b0316146120405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b6c565b6001600160a01b0382166120a25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b6c565b6120ad600082611e80565b6001600160a01b03831660009081526003602052604081208054600192906120d6908490612d5b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612104908490612b1f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6111ac82826040518060200160405280600081525061232a565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6121dc848484611fc5565b6121e88484848461235d565b6116235760405162461bcd60e51b8152600401610b6c90612d6e565b6060600c8054610a7490612a01565b60608160000361223a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612264578061224e81612aed565b915061225d9050600a83612dd6565b915061223e565b60008167ffffffffffffffff81111561227f5761227f6127d4565b6040519080825280601f01601f1916602001820160405280156122a9576020820181803683370190505b5090505b8415611fbd576122be600183612d5b565b91506122cb600a86612dea565b6122d6906030612b1f565b60f81b8183815181106122eb576122eb612ac1565b60200101906001600160f81b031916908160001a90535061230d600a86612dd6565b94506122ad565b600082612321858461245e565b14949350505050565b61233483836124ab565b612341600084848461235d565b610d2f5760405162461bcd60e51b8152600401610b6c90612d6e565b60006001600160a01b0384163b1561245357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123a1903390899088908890600401612dfe565b6020604051808303816000875af19250505080156123dc575060408051601f3d908101601f191682019092526123d991810190612e3b565b60015b612439573d80801561240a576040519150601f19603f3d011682016040523d82523d6000602084013e61240f565b606091505b5080516000036124315760405162461bcd60e51b8152600401610b6c90612d6e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fbd565b506001949350505050565b600081815b84518110156124a35761248f8286838151811061248257612482612ac1565b60200260200101516125ed565b91508061249b81612aed565b915050612463565b509392505050565b6001600160a01b0382166125015760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b6c565b6000818152600260205260409020546001600160a01b0316156125665760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b6c565b6001600160a01b038216600090815260036020526040812080546001929061258f908490612b1f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612609576000828152602084905260409020611839565b5060009182526020526040902090565b6001600160e01b031981168114611dc657600080fd5b60006020828403121561264157600080fd5b813561183981612619565b60005b8381101561266757818101518382015260200161264f565b50506000910152565b6000815180845261268881602086016020860161264c565b601f01601f19169290920160200192915050565b6020815260006118396020830184612670565b6000602082840312156126c157600080fd5b5035919050565b80356001600160a01b03811681146126df57600080fd5b919050565b600080604083850312156126f757600080fd5b612700836126c8565b946020939093013593505050565b803580151581146126df57600080fd5b60006020828403121561273057600080fd5b6118398261270e565b60008060006060848603121561274e57600080fd5b612757846126c8565b9250612765602085016126c8565b9150604084013590509250925092565b60006020828403121561278757600080fd5b611839826126c8565b6020808252825182820181905260009190848201906040850190845b818110156127c8578351835292840192918401916001016127ac565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612805576128056127d4565b604051601f8501601f19908116603f0116810190828211818310171561282d5761282d6127d4565b8160405280935085815286868601111561284657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561287257600080fd5b813567ffffffffffffffff81111561288957600080fd5b8201601f8101841361289a57600080fd5b611fbd848235602084016127ea565b600080604083850312156128bc57600080fd5b6128c5836126c8565b91506128d36020840161270e565b90509250929050565b600080600080608085870312156128f257600080fd5b6128fb856126c8565b9350612909602086016126c8565b925060408501359150606085013567ffffffffffffffff81111561292c57600080fd5b8501601f8101871361293d57600080fd5b61294c878235602084016127ea565b91505092959194509250565b60008060006040848603121561296d57600080fd5b83359250602084013567ffffffffffffffff8082111561298c57600080fd5b818601915086601f8301126129a057600080fd5b8135818111156129af57600080fd5b8760208260051b85010111156129c457600080fd5b6020830194508093505050509250925092565b600080604083850312156129ea57600080fd5b6129f3836126c8565b91506128d3602084016126c8565b600181811c90821680612a1557607f821691505b602082108103612a3557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612aff57612aff612ad7565b5060010190565b600060208284031215612b1857600080fd5b5051919050565b80820180821115610a5f57610a5f612ad7565b601f821115610d2f57600081815260208120601f850160051c81016020861015612b595750805b601f850160051c820191505b81811015611b6857828155600101612b65565b815167ffffffffffffffff811115612b9257612b926127d4565b612ba681612ba08454612a01565b84612b32565b602080601f831160018114612bdb5760008415612bc35750858301515b600019600386901b1c1916600185901b178555611b68565b600085815260208120601f198616915b82811015612c0a57888601518255948401946001909101908401612beb565b5085821015612c285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526046908201527f4d696e7420616d6f756e7420697320746f6f2068696768207468657265206d6160408201527f79206e6f7420626520656e6f756768206c65667420746f206d696e742074686160608201526574206d616e7960d01b608082015260a00190565b8082028115828204841417610a5f57610a5f612ad7565b600084516020612cce8285838a0161264c565b855191840191612ce18184848a0161264c565b8554920191600090612cf281612a01565b60018281168015612d0a5760018114612d1f57612d4b565b60ff1984168752821515830287019450612d4b565b896000528560002060005b84811015612d4357815489820152908301908701612d2a565b505082870194505b50929a9950505050505050505050565b81810381811115610a5f57610a5f612ad7565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612de557612de5612dc0565b500490565b600082612df957612df9612dc0565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e3190830184612670565b9695505050505050565b600060208284031215612e4d57600080fd5b81516118398161261956fea2646970667358221220378cc87f0632050e3f82d54091db41955b50965608120907ba334d066642c3fa64736f6c63430008110033697066733a2f2f516d6443384c6352723558787a71647833594367733575434551424341706143465847524b3774645477417039502f48696464656e4d657461646174612e6a736f6e

Deployed Bytecode

0x6080604052600436106103765760003560e01c80637f00c7a6116101d1578063c904a7f011610102578063e0a80853116100a0578063f2fde38b1161006f578063f2fde38b1461099e578063f3acae3a146109be578063fab1f9b1146109de578063fb932108146109f357600080fd5b8063e0a808531461091d578063e985e9c51461093d578063eb780c621461095d578063f2c4ce1e1461097e57600080fd5b8063da387082116100dc578063da387082146108b2578063da3ef23f146108ba578063da61ee4a146108da578063db4bec44146108f057600080fd5b8063c904a7f014610873578063d2cab05614610889578063d5abeb011461089c57600080fd5b8063b767a0981161016f578063c5517fd711610149578063c5517fd7146107f1578063c66828621461081e578063c7e9d14114610833578063c87b56dd1461085357600080fd5b8063b767a09814610791578063b88d4fde146107b1578063c17589d7146107d157600080fd5b806394354fd0116101ab57806394354fd01461073357806395d89b4114610749578063a0712d681461075e578063a22cb4651461077157600080fd5b80637f00c7a6146106df5780638da5cb5b146106ff5780639257e0441461071d57600080fd5b8063438b6300116102ab5780636352211e11610249578063715018a611610223578063715018a61461067e5780637af284d5146106935780637cb64759146106a95780637dae85c6146106c957600080fd5b80636352211e1461061f5780636caede3d1461063f57806370a082311461065e57600080fd5b80634c66d26c116102855780634c66d26c1461059f5780634f432812146105bf57806351830227146105df57806355f804b3146105ff57600080fd5b8063438b63001461053f57806344a0d68a1461056c57806345d0ffd01461058c57600080fd5b806316c38b3c116103185780632eb4a7ab116102f25780632eb4a7ab146104d4578063349cd113146104ea57806335ac0fcb146104ff57806342842e0e1461051f57600080fd5b806316c38b3c1461047f57806318160ddd1461049f57806323b872dd146104b457600080fd5b8063081c8c4411610354578063081c8c441461040a578063095ea7b31461041f5780630bb12bb81461044157806313faede61461045b57600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b61039636600461262f565b610a13565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610a65565b6040516103a7919061269c565b3480156103de57600080fd5b506103f26103ed3660046126af565b610af7565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b506103c5610b91565b34801561042b57600080fd5b5061043f61043a3660046126e4565b610c1f565b005b34801561044d57600080fd5b5060165461039b9060ff1681565b34801561046757600080fd5b50610471600e5481565b6040519081526020016103a7565b34801561048b57600080fd5b5061043f61049a36600461271e565b610d34565b3480156104ab57600080fd5b50601454610471565b3480156104c057600080fd5b5061043f6104cf366004612739565b610d71565b3480156104e057600080fd5b5061047160085481565b3480156104f657600080fd5b506103c5610da2565b34801561050b57600080fd5b5061043f61051a3660046126af565b610daf565b34801561052b57600080fd5b5061043f61053a366004612739565b610dde565b34801561054b57600080fd5b5061055f61055a366004612775565b610df9565b6040516103a79190612790565b34801561057857600080fd5b5061043f6105873660046126af565b610ed9565b61043f61059a3660046126af565b610f08565b3480156105ab57600080fd5b5061043f6105ba36600461271e565b61112e565b3480156105cb57600080fd5b506019546103f2906001600160a01b031681565b3480156105eb57600080fd5b5060165461039b9062010000900460ff1681565b34801561060b57600080fd5b5061043f61061a366004612860565b611176565b34801561062b57600080fd5b506103f261063a3660046126af565b6111b0565b34801561064b57600080fd5b5060165461039b90610100900460ff1681565b34801561066a57600080fd5b50610471610679366004612775565b611227565b34801561068a57600080fd5b5061043f6112ae565b34801561069f57600080fd5b5061047160145481565b3480156106b557600080fd5b5061043f6106c43660046126af565b6112e4565b3480156106d557600080fd5b5061047160155481565b3480156106eb57600080fd5b5061043f6106fa3660046126af565b611313565b34801561070b57600080fd5b506006546001600160a01b03166103f2565b34801561072957600080fd5b50610471600f5481565b34801561073f57600080fd5b5061047160115481565b34801561075557600080fd5b506103c5611342565b61043f61076c3660046126af565b611351565b34801561077d57600080fd5b5061043f61078c3660046128a9565b6114e9565b34801561079d57600080fd5b5061043f6107ac36600461271e565b6115ad565b3480156107bd57600080fd5b5061043f6107cc3660046128dc565b6115f1565b3480156107dd57600080fd5b5061043f6107ec366004612775565b611629565b3480156107fd57600080fd5b5061047161080c366004612775565b60176020526000908152604090205481565b34801561082a57600080fd5b506103c561167f565b34801561083f57600080fd5b5061043f61084e3660046126af565b61168c565b34801561085f57600080fd5b506103c561086e3660046126af565b6116bb565b34801561087f57600080fd5b5061047160125481565b61043f610897366004612958565b611840565b3480156108a857600080fd5b5061047160105481565b61043f611b70565b3480156108c657600080fd5b5061043f6108d5366004612860565b611c4e565b3480156108e657600080fd5b5061047160185481565b3480156108fc57600080fd5b5061047161090b366004612775565b60096020526000908152604090205481565b34801561092957600080fd5b5061043f61093836600461271e565b611c84565b34801561094957600080fd5b5061039b6109583660046129d7565b611cca565b34801561096957600080fd5b5060165461039b906301000000900460ff1681565b34801561098a57600080fd5b5061043f610999366004612860565b611cf8565b3480156109aa57600080fd5b5061043f6109b9366004612775565b611d2e565b3480156109ca57600080fd5b50601a546103f2906001600160a01b031681565b3480156109ea57600080fd5b506103c5611dc9565b3480156109ff57600080fd5b5061043f610a0e3660046126e4565b611dd6565b60006001600160e01b031982166380ac58cd60e01b1480610a4457506001600160e01b03198216635b5e139f60e01b145b80610a5f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610a7490612a01565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090612a01565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b755760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60138054610b9e90612a01565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca90612a01565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b505050505081565b6000610c2a826111b0565b9050806001600160a01b0316836001600160a01b031603610c975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b6c565b336001600160a01b0382161480610cb35750610cb38133611cca565b610d255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b6c565b610d2f8383611e80565b505050565b6006546001600160a01b03163314610d5e5760405162461bcd60e51b8152600401610b6c90612a3b565b6016805460ff1916911515919091179055565b610d7b3382611eee565b610d975760405162461bcd60e51b8152600401610b6c90612a70565b610d2f838383611fc5565b600a8054610b9e90612a01565b6006546001600160a01b03163314610dd95760405162461bcd60e51b8152600401610b6c90612a3b565b601255565b610d2f838383604051806020016040528060008152506115f1565b60606000610e0683611227565b905060008167ffffffffffffffff811115610e2357610e236127d4565b604051908082528060200260200182016040528015610e4c578160200160208202803683370190505b509050600160005b8381108015610e6557506010548211155b15610ecf576000610e75836111b0565b9050866001600160a01b0316816001600160a01b031603610ebc5782848381518110610ea357610ea3612ac1565b602090810291909101015281610eb881612aed565b9250505b82610ec681612aed565b93505050610e54565b5090949350505050565b6006546001600160a01b03163314610f035760405162461bcd60e51b8152600401610b6c90612a3b565b600e55565b601a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f759190612b06565b90506000610f8260145490565b33600090815260176020526040902054601654919250906301000000900460ff16610fe55760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610b6c565b82610ff08286612b1f565b11156110495760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401610b6c565b6010546110568584612b1f565b11156110a45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610b6c565b60015b8481116110d3576110c1336110bc8386612b1f565b612165565b806110cb81612aed565b9150506110a7565b5083601860008282546110e69190612b1f565b9091555050336000908152601760205260408120805486929061110a908490612b1f565b9250508190555083601460008282546111239190612b1f565b909155505050505050565b6006546001600160a01b031633146111585760405162461bcd60e51b8152600401610b6c90612a3b565b6016805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146111a05760405162461bcd60e51b8152600401610b6c90612a3b565b600c6111ac8282612b78565b5050565b6000818152600260205260408120546001600160a01b031680610a5f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b6c565b60006001600160a01b0382166112925760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b6c565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146112d85760405162461bcd60e51b8152600401610b6c90612a3b565b6112e2600061217f565b565b6006546001600160a01b0316331461130e5760405162461bcd60e51b8152600401610b6c90612a3b565b600855565b6006546001600160a01b0316331461133d5760405162461bcd60e51b8152600401610b6c90612a3b565b601155565b606060018054610a7490612a01565b600061135c60145490565b60165490915060ff16156113a75760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b6044820152606401610b6c565b600082116113ef5760405162461bcd60e51b815260206004820152601560248201527406d696e7420616d6f756e742063616e74206265203605c1b6044820152606401610b6c565b60115482111561144c5760405162461bcd60e51b815260206004820152602260248201527f43616e74206d696e74206f76657220746865206d6178206d696e7420616d6f756044820152611b9d60f21b6064820152608401610b6c565b6010546114598383612b1f565b11156114775760405162461bcd60e51b8152600401610b6c90612c38565b6006546001600160a01b031633146114a35781600e546114979190612ca4565b3410156114a357600080fd5b60015b8281116114cd576114bb336110bc8385612b1f565b806114c581612aed565b9150506114a6565b5081601460008282546114e09190612b1f565b90915550505050565b336001600160a01b038316036115415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b6c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146115d75760405162461bcd60e51b8152600401610b6c90612a3b565b601680549115156101000261ff0019909216919091179055565b6115fb3383611eee565b6116175760405162461bcd60e51b8152600401610b6c90612a70565b611623848484846121d1565b50505050565b6006546001600160a01b031633146116535760405162461bcd60e51b8152600401610b6c90612a3b565b601980546001600160a01b039092166001600160a01b03199283168117909155601a8054909216179055565b600d8054610b9e90612a01565b6006546001600160a01b031633146116b65760405162461bcd60e51b8152600401610b6c90612a3b565b600f55565b6000818152600260205260409020546060906001600160a01b031661173a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b6c565b60165462010000900460ff1615156000036117e1576013805461175c90612a01565b80601f016020809104026020016040519081016040528092919081815260200182805461178890612a01565b80156117d55780601f106117aa576101008083540402835291602001916117d5565b820191906000526020600020905b8154815290600101906020018083116117b857829003601f168201915b50505050509050919050565b60006117eb612204565b9050600081511161180b5760405180602001604052806000815250611839565b8061181584612213565b600d60405160200161182993929190612cbb565b6040516020818303038152906040525b9392505050565b600061184b60145490565b601654909150610100900460ff1661189c5760405162461bcd60e51b815260206004820152601460248201527377686974656c697374206e6f742061637469766560601b6044820152606401610b6c565b601254336000908152600960205260409020546118ba908690612b1f565b1115611930576040805162461bcd60e51b81526020600482015260248101919091527f4164647265737320616c726561647920636c61696d656421206f7220796f752060448201527f6861766520726571756573746564206d6f7265207468616e20616c6c6f7765646064820152608401610b6c565b600084116119785760405162461bcd60e51b815260206004820152601560248201527406d696e7420616d6f756e742063616e74206265203605c1b6044820152606401610b6c565b6010546119858583612b1f565b11156119d35760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610b6c565b83600f546119e19190612ca4565b341015611a305760405162461bcd60e51b815260206004820152601d60248201527f4574682076616c75652073656e74206973206e6f7420636f72726563740000006044820152606401610b6c565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611aaa848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612314565b611ae75760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610b6c565b3360009081526009602052604081208054879290611b06908490612b1f565b925050819055508460146000828254611b1f9190612b1f565b925050819055508460156000828254611b389190612b1f565b90915550600190505b858111611b6857611b56336110bc8386612b1f565b80611b6081612aed565b915050611b41565b505050505050565b6006546001600160a01b03163314611b9a5760405162461bcd60e51b8152600401610b6c90612a3b565b600260075403611bec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b6c565b6002600755604051600090339047908381818185875af1925050503d8060008114611c33576040519150601f19603f3d011682016040523d82523d6000602084013e611c38565b606091505b5050905080611c4657600080fd5b506001600755565b6006546001600160a01b03163314611c785760405162461bcd60e51b8152600401610b6c90612a3b565b600d6111ac8282612b78565b6006546001600160a01b03163314611cae5760405162461bcd60e51b8152600401610b6c90612a3b565b60168054911515620100000262ff000019909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b03163314611d225760405162461bcd60e51b8152600401610b6c90612a3b565b60136111ac8282612b78565b6006546001600160a01b03163314611d585760405162461bcd60e51b8152600401610b6c90612a3b565b6001600160a01b038116611dbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b6c565b611dc68161217f565b50565b600b8054610b9e90612a01565b6006546001600160a01b03163314611e005760405162461bcd60e51b8152600401610b6c90612a3b565b6000611e0b60145490565b601054909150611e1b8383612b1f565b1115611e395760405162461bcd60e51b8152600401610b6c90612c38565b60015b828111611e6357611e51846110bc8385612b1f565b80611e5b81612aed565b915050611e3c565b508160146000828254611e769190612b1f565b9091555050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611eb5826111b0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611f675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b6c565b6000611f72836111b0565b9050806001600160a01b0316846001600160a01b03161480611fad5750836001600160a01b0316611fa284610af7565b6001600160a01b0316145b80611fbd5750611fbd8185611cca565b949350505050565b826001600160a01b0316611fd8826111b0565b6001600160a01b0316146120405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b6c565b6001600160a01b0382166120a25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b6c565b6120ad600082611e80565b6001600160a01b03831660009081526003602052604081208054600192906120d6908490612d5b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612104908490612b1f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6111ac82826040518060200160405280600081525061232a565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6121dc848484611fc5565b6121e88484848461235d565b6116235760405162461bcd60e51b8152600401610b6c90612d6e565b6060600c8054610a7490612a01565b60608160000361223a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612264578061224e81612aed565b915061225d9050600a83612dd6565b915061223e565b60008167ffffffffffffffff81111561227f5761227f6127d4565b6040519080825280601f01601f1916602001820160405280156122a9576020820181803683370190505b5090505b8415611fbd576122be600183612d5b565b91506122cb600a86612dea565b6122d6906030612b1f565b60f81b8183815181106122eb576122eb612ac1565b60200101906001600160f81b031916908160001a90535061230d600a86612dd6565b94506122ad565b600082612321858461245e565b14949350505050565b61233483836124ab565b612341600084848461235d565b610d2f5760405162461bcd60e51b8152600401610b6c90612d6e565b60006001600160a01b0384163b1561245357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123a1903390899088908890600401612dfe565b6020604051808303816000875af19250505080156123dc575060408051601f3d908101601f191682019092526123d991810190612e3b565b60015b612439573d80801561240a576040519150601f19603f3d011682016040523d82523d6000602084013e61240f565b606091505b5080516000036124315760405162461bcd60e51b8152600401610b6c90612d6e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fbd565b506001949350505050565b600081815b84518110156124a35761248f8286838151811061248257612482612ac1565b60200260200101516125ed565b91508061249b81612aed565b915050612463565b509392505050565b6001600160a01b0382166125015760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b6c565b6000818152600260205260409020546001600160a01b0316156125665760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b6c565b6001600160a01b038216600090815260036020526040812080546001929061258f908490612b1f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612609576000828152602084905260409020611839565b5060009182526020526040902090565b6001600160e01b031981168114611dc657600080fd5b60006020828403121561264157600080fd5b813561183981612619565b60005b8381101561266757818101518382015260200161264f565b50506000910152565b6000815180845261268881602086016020860161264c565b601f01601f19169290920160200192915050565b6020815260006118396020830184612670565b6000602082840312156126c157600080fd5b5035919050565b80356001600160a01b03811681146126df57600080fd5b919050565b600080604083850312156126f757600080fd5b612700836126c8565b946020939093013593505050565b803580151581146126df57600080fd5b60006020828403121561273057600080fd5b6118398261270e565b60008060006060848603121561274e57600080fd5b612757846126c8565b9250612765602085016126c8565b9150604084013590509250925092565b60006020828403121561278757600080fd5b611839826126c8565b6020808252825182820181905260009190848201906040850190845b818110156127c8578351835292840192918401916001016127ac565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612805576128056127d4565b604051601f8501601f19908116603f0116810190828211818310171561282d5761282d6127d4565b8160405280935085815286868601111561284657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561287257600080fd5b813567ffffffffffffffff81111561288957600080fd5b8201601f8101841361289a57600080fd5b611fbd848235602084016127ea565b600080604083850312156128bc57600080fd5b6128c5836126c8565b91506128d36020840161270e565b90509250929050565b600080600080608085870312156128f257600080fd5b6128fb856126c8565b9350612909602086016126c8565b925060408501359150606085013567ffffffffffffffff81111561292c57600080fd5b8501601f8101871361293d57600080fd5b61294c878235602084016127ea565b91505092959194509250565b60008060006040848603121561296d57600080fd5b83359250602084013567ffffffffffffffff8082111561298c57600080fd5b818601915086601f8301126129a057600080fd5b8135818111156129af57600080fd5b8760208260051b85010111156129c457600080fd5b6020830194508093505050509250925092565b600080604083850312156129ea57600080fd5b6129f3836126c8565b91506128d3602084016126c8565b600181811c90821680612a1557607f821691505b602082108103612a3557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612aff57612aff612ad7565b5060010190565b600060208284031215612b1857600080fd5b5051919050565b80820180821115610a5f57610a5f612ad7565b601f821115610d2f57600081815260208120601f850160051c81016020861015612b595750805b601f850160051c820191505b81811015611b6857828155600101612b65565b815167ffffffffffffffff811115612b9257612b926127d4565b612ba681612ba08454612a01565b84612b32565b602080601f831160018114612bdb5760008415612bc35750858301515b600019600386901b1c1916600185901b178555611b68565b600085815260208120601f198616915b82811015612c0a57888601518255948401946001909101908401612beb565b5085821015612c285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526046908201527f4d696e7420616d6f756e7420697320746f6f2068696768207468657265206d6160408201527f79206e6f7420626520656e6f756768206c65667420746f206d696e742074686160608201526574206d616e7960d01b608082015260a00190565b8082028115828204841417610a5f57610a5f612ad7565b600084516020612cce8285838a0161264c565b855191840191612ce18184848a0161264c565b8554920191600090612cf281612a01565b60018281168015612d0a5760018114612d1f57612d4b565b60ff1984168752821515830287019450612d4b565b896000528560002060005b84811015612d4357815489820152908301908701612d2a565b505082870194505b50929a9950505050505050505050565b81810381811115610a5f57610a5f612ad7565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612de557612de5612dc0565b500490565b600082612df957612df9612dc0565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e3190830184612670565b9695505050505050565b600060208284031215612e4d57600080fd5b81516118398161261956fea2646970667358221220378cc87f0632050e3f82d54091db41955b50965608120907ba334d066642c3fa64736f6c63430008110033

Deployed Bytecode Sourcemap

31512:8121:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9265:305;;;;;;;;;;-1:-1:-1;9265:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;9265:305:0;;;;;;;;10050:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11148:221::-;;;;;;;;;;-1:-1:-1;11148:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;11148:221:0;1533:203:1;32123:28:0;;;;;;;;;;;;;:::i;10724:411::-;;;;;;;;;;-1:-1:-1;10724:411:0;;;;;:::i;:::-;;:::i;:::-;;32283:31;;;;;;;;;;-1:-1:-1;32283:31:0;;;;;;;;31927:29;;;;;;;;;;;;;;;;;;;2324:25:1;;;2312:2;2297:18;31927:29:0;2178:177:1;38334:83:0;;;;;;;;;;-1:-1:-1;38334:83:0;;;;;:::i;:::-;;:::i;35933:85::-;;;;;;;;;;-1:-1:-1;36000:12:0;;35933:85;;11861:296;;;;;;;;;;-1:-1:-1;11861:296:0;;;;;:::i;:::-;;:::i;31604:25::-;;;;;;;;;;;;;;;;31714:43;;;;;;;;;;;;;:::i;37770:117::-;;;;;;;;;;-1:-1:-1;37770:117:0;;;;;:::i;:::-;;:::i;12166:185::-;;;;;;;;;;-1:-1:-1;12166:185:0;;;;;:::i;:::-;;:::i;36086:629::-;;;;;;;;;;-1:-1:-1;36086:629:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37389:82::-;;;;;;;;;;-1:-1:-1;37389:82:0;;;;;:::i;:::-;;:::i;35100:798::-;;;;;;:::i;:::-;;:::i;38782:88::-;;;;;;;;;;-1:-1:-1;38782:88:0;;;;;:::i;:::-;;:::i;32772:68::-;;;;;;;;;;-1:-1:-1;32772:68:0;;;;-1:-1:-1;;;;;32772:68:0;;;32406:28;;;;;;;;;;-1:-1:-1;32406:28:0;;;;;;;;;;;38056:98;;;;;;;;;;-1:-1:-1;38056:98:0;;;;;:::i;:::-;;:::i;9798:239::-;;;;;;;;;;-1:-1:-1;9798:239:0;;;;;:::i;:::-;;:::i;32342:40::-;;;;;;;;;;-1:-1:-1;32342:40:0;;;;;;;;;;;9580:208;;;;;;;;;;-1:-1:-1;9580:208:0;;;;;:::i;:::-;;:::i;19632:94::-;;;;;;;;;;;;;:::i;32175:27::-;;;;;;;;;;;;;;;;39284:98;;;;;;;;;;-1:-1:-1;39284:98:0;;;;;:::i;:::-;;:::i;32207:24::-;;;;;;;;;;;;;;;;37625:123;;;;;;;;;;-1:-1:-1;37625:123:0;;;;;:::i;:::-;;:::i;19402:87::-;;;;;;;;;;-1:-1:-1;19475:6:0;;-1:-1:-1;;;;;19475:6:0;19402:87;;31961:38;;;;;;;;;;;;;;;;32040:37;;;;;;;;;;;;;;;;10161:104;;;;;;;;;;;;;:::i;33340:673::-;;;;;;:::i;:::-;;:::i;11382:295::-;;;;;;;;;;-1:-1:-1;11382:295:0;;;;;:::i;:::-;;:::i;38476:133::-;;;;;;;;;;-1:-1:-1;38476:133:0;;;;;:::i;:::-;;:::i;12361:328::-;;;;;;;;;;-1:-1:-1;12361:328:0;;;;;:::i;:::-;;:::i;38643:133::-;;;;;;;;;;-1:-1:-1;38643:133:0;;;;;:::i;:::-;;:::i;32548:58::-;;;;;;;;;;-1:-1:-1;32548:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;31865:37;;;;;;;;;;;;;:::i;37501:100::-;;;;;;;;;;-1:-1:-1;37501:100:0;;;;;:::i;:::-;;:::i;36721:473::-;;;;;;;;;;-1:-1:-1;36721:473:0;;;;;:::i;:::-;;:::i;32082:36::-;;;;;;;;;;;;;;;;34019:996;;;;;;:::i;:::-;;:::i;32004:31::-;;;;;;;;;;;;;;;;39451:179;;;:::i;38183:122::-;;;;;;;;;;-1:-1:-1;38183:122:0;;;;;:::i;:::-;;:::i;32669:27::-;;;;;;;;;;;;;;;;31634:51;;;;;;;;;;-1:-1:-1;31634:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;37275:89;;;;;;;;;;-1:-1:-1;37275:89:0;;;;;:::i;:::-;;:::i;11689:164::-;;;;;;;;;;-1:-1:-1;11689:164:0;;;;;:::i;:::-;;:::i;32467:35::-;;;;;;;;;;-1:-1:-1;32467:35:0;;;;;;;;;;;37910:120;;;;;;;;;;-1:-1:-1;37910:120:0;;;;;:::i;:::-;;:::i;19737:192::-;;;;;;;;;;-1:-1:-1;19737:192:0;;;;;:::i;:::-;;:::i;32896:17::-;;;;;;;;;;-1:-1:-1;32896:17:0;;;;-1:-1:-1;;;;;32896:17:0;;;31762:41;;;;;;;;;;;;;:::i;38888:391::-;;;;;;;;;;-1:-1:-1;38888:391:0;;;;;:::i;:::-;;:::i;9265:305::-;9367:4;-1:-1:-1;;;;;;9404:40:0;;-1:-1:-1;;;9404:40:0;;:105;;-1:-1:-1;;;;;;;9461:48:0;;-1:-1:-1;;;9461:48:0;9404:105;:158;;;-1:-1:-1;;;;;;;;;;1859:40:0;;;9526:36;9384:178;9265:305;-1:-1:-1;;9265:305:0:o;10050:100::-;10104:13;10137:5;10130:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10050:100;:::o;11148:221::-;11224:7;13111:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13111:16:0;11244:73;;;;-1:-1:-1;;;11244:73:0;;8158:2:1;11244:73:0;;;8140:21:1;8197:2;8177:18;;;8170:30;8236:34;8216:18;;;8209:62;-1:-1:-1;;;8287:18:1;;;8280:42;8339:19;;11244:73:0;;;;;;;;;-1:-1:-1;11337:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;11337:24:0;;11148:221::o;32123:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10724:411::-;10805:13;10821:23;10836:7;10821:14;:23::i;:::-;10805:39;;10869:5;-1:-1:-1;;;;;10863:11:0;:2;-1:-1:-1;;;;;10863:11:0;;10855:57;;;;-1:-1:-1;;;10855:57:0;;8571:2:1;10855:57:0;;;8553:21:1;8610:2;8590:18;;;8583:30;8649:34;8629:18;;;8622:62;-1:-1:-1;;;8700:18:1;;;8693:31;8741:19;;10855:57:0;8369:397:1;10855:57:0;8404:10;-1:-1:-1;;;;;10947:21:0;;;;:62;;-1:-1:-1;10972:37:0;10989:5;8404:10;11689:164;:::i;10972:37::-;10925:168;;;;-1:-1:-1;;;10925:168:0;;8973:2:1;10925:168:0;;;8955:21:1;9012:2;8992:18;;;8985:30;9051:34;9031:18;;;9024:62;9122:26;9102:18;;;9095:54;9166:19;;10925:168:0;8771:420:1;10925:168:0;11106:21;11115:2;11119:7;11106:8;:21::i;:::-;10794:341;10724:411;;:::o;38334:83::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38390:12:::1;:21:::0;;-1:-1:-1;;38390:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38334:83::o;11861:296::-;12013:41;8404:10;12046:7;12013:18;:41::i;:::-;12005:103;;;;-1:-1:-1;;;12005:103:0;;;;;;;:::i;:::-;12121:28;12131:4;12137:2;12141:7;12121:9;:28::i;31714:43::-;;;;;;;:::i;37770:117::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;37845:19:::1;:36:::0;37770:117::o;12166:185::-;12304:39;12321:4;12327:2;12331:7;12304:39;;;;;;;;;;;;:16;:39::i;36086:629::-;36161:16;36189:23;36215:17;36225:6;36215:9;:17::i;:::-;36189:43;;36239:30;36286:15;36272:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36272:30:0;-1:-1:-1;36239:63:0;-1:-1:-1;36334:1:0;36309:22;36378:305;36403:15;36385;:33;:64;;;;;36440:9;;36422:14;:27;;36385:64;36378:305;;;36460:25;36488:23;36496:14;36488:7;:23::i;:::-;36460:51;;36547:6;-1:-1:-1;;;;;36526:27:0;:17;-1:-1:-1;;;;;36526:27:0;;36522:129;;36599:14;36566:13;36580:15;36566:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;36624:17;;;;:::i;:::-;;;;36522:129;36659:16;;;;:::i;:::-;;;;36451:232;36378:305;;;-1:-1:-1;36696:13:0;;36086:629;-1:-1:-1;;;;36086:629:0:o;37389:82::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;37450:4:::1;:15:::0;37389:82::o;35100:798::-;35194:2;;:24;;-1:-1:-1;;;35194:24:0;;35207:10;35194:24;;;1679:51:1;35177:15:0;;-1:-1:-1;;;;;35194:2:0;;:12;;1652:18:1;;35194:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35177:41;;35225:27;35255:13;36000:12;;;35933:85;35255:13;35325:10;35275:22;35299:37;;;:25;:37;;;;;;35351:17;;35225:43;;-1:-1:-1;35299:37:0;35351:17;;;;;35343:49;;;;-1:-1:-1;;;35343:49:0;;10770:2:1;35343:49:0;;;10752:21:1;10809:2;10789:18;;;10782:30;-1:-1:-1;;;10828:18:1;;;10821:49;10887:18;;35343:49:0;10568:343:1;35343:49:0;35439:7;35407:29;35422:14;35407;:29;:::i;:::-;:39;;35399:86;;;;-1:-1:-1;;;35399:86:0;;11248:2:1;35399:86:0;;;11230:21:1;11287:2;11267:18;;;11260:30;11326:34;11306:18;;;11299:62;-1:-1:-1;;;11377:18:1;;;11370:32;11419:19;;35399:86:0;11046:398:1;35399:86:0;35540:9;;35500:36;35522:14;35500:19;:36;:::i;:::-;:49;;35492:94;;;;-1:-1:-1;;;35492:94:0;;11651:2:1;35492:94:0;;;11633:21:1;;;11670:18;;;11663:30;11729:34;11709:18;;;11702:62;11781:18;;35492:94:0;11449:356:1;35492:94:0;35612:1;35595:121;35621:14;35615:1;:21;35595:121;;35662:46;35672:10;35684:23;35706:1;35684:19;:23;:::i;:::-;35662:9;:46::i;:::-;35638:3;;;;:::i;:::-;;;;35595:121;;;;35752:14;35738:12;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;35815:10:0;35789:37;;;;:25;:37;;;;;:53;;35828:14;;35789:37;:53;;35828:14;;35789:53;:::i;:::-;;;;;;;;35879:14;35865:12;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;35100:798:0:o;38782:88::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38842:17:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;38842:24:0;;::::1;::::0;;;::::1;::::0;;38782:88::o;38056:98::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38127:7:::1;:21;38137:11:::0;38127:7;:21:::1;:::i;:::-;;38056:98:::0;:::o;9798:239::-;9870:7;9906:16;;;:7;:16;;;;;;-1:-1:-1;;;;;9906:16:0;;9933:73;;;;-1:-1:-1;;;9933:73:0;;14216:2:1;9933:73:0;;;14198:21:1;14255:2;14235:18;;;14228:30;14294:34;14274:18;;;14267:62;-1:-1:-1;;;14345:18:1;;;14338:39;14394:19;;9933:73:0;14014:405:1;9580:208:0;9652:7;-1:-1:-1;;;;;9680:19:0;;9672:74;;;;-1:-1:-1;;;9672:74:0;;14626:2:1;9672:74:0;;;14608:21:1;14665:2;14645:18;;;14638:30;14704:34;14684:18;;;14677:62;-1:-1:-1;;;14755:18:1;;;14748:40;14805:19;;9672:74:0;14424:406:1;9672:74:0;-1:-1:-1;;;;;;9764:16:0;;;;;:9;:16;;;;;;;9580:208::o;19632:94::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;19697:21:::1;19715:1;19697:9;:21::i;:::-;19632:94::o:0;39284:98::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;39352:10:::1;:24:::0;39284:98::o;37625:123::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;37704:18:::1;:38:::0;37625:123::o;10161:104::-;10217:13;10250:7;10243:14;;;;;:::i;33340:673::-;33399:18;33420:13;36000:12;;;35933:85;33420:13;33473:12;;33399:34;;-1:-1:-1;33473:12:0;;33472:13;33464:44;;;;-1:-1:-1;;;33464:44:0;;15037:2:1;33464:44:0;;;15019:21:1;15076:2;15056:18;;;15049:30;-1:-1:-1;;;15095:18:1;;;15088:48;15153:18;;33464:44:0;14835:342:1;33464:44:0;33537:1;33523:11;:15;33515:49;;;;-1:-1:-1;;;33515:49:0;;15384:2:1;33515:49:0;;;15366:21:1;15423:2;15403:18;;;15396:30;-1:-1:-1;;;15442:18:1;;;15435:51;15503:18;;33515:49:0;15182:345:1;33515:49:0;33594:18;;33579:11;:33;;33571:80;;;;-1:-1:-1;;;33571:80:0;;15734:2:1;33571:80:0;;;15716:21:1;15773:2;15753:18;;;15746:30;15812:34;15792:18;;;15785:62;-1:-1:-1;;;15863:18:1;;;15856:32;15905:19;;33571:80:0;15532:398:1;33571:80:0;33694:9;;33666:24;33679:11;33666:10;:24;:::i;:::-;:37;;33658:120;;;;-1:-1:-1;;;33658:120:0;;;;;;;:::i;:::-;19475:6;;-1:-1:-1;;;;;19475:6:0;33791:10;:21;33787:84;;33851:11;33844:4;;:18;;;;:::i;:::-;33831:9;:31;;33823:40;;;;;;33896:1;33879:97;33904:11;33899:1;:16;33879:97;;33931:37;33941:10;33953:14;33966:1;33953:10;:14;:::i;33931:37::-;33917:3;;;;:::i;:::-;;;;33879:97;;;;33996:11;33982:12;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;33340:673:0:o;11382:295::-;8404:10;-1:-1:-1;;;;;11485:24:0;;;11477:62;;;;-1:-1:-1;;;11477:62:0;;16789:2:1;11477:62:0;;;16771:21:1;16828:2;16808:18;;;16801:30;16867:27;16847:18;;;16840:55;16912:18;;11477:62:0;16587:349:1;11477:62:0;8404:10;11552:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;11552:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;11552:53:0;;;;;;;;;;11621:48;;540:41:1;;;11552:42:0;;8404:10;11621:48;;513:18:1;11621:48:0;;;;;;;11382:295;;:::o;38476:133::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38562:20:::1;:39:::0;;;::::1;;;;-1:-1:-1::0;;38562:39:0;;::::1;::::0;;;::::1;::::0;;38476:133::o;12361:328::-;12536:41;8404:10;12569:7;12536:18;:41::i;:::-;12528:103;;;;-1:-1:-1;;;12528:103:0;;;;;;;:::i;:::-;12642:39;12656:4;12662:2;12666:7;12675:5;12642:13;:39::i;:::-;12361:328;;;;:::o;38643:133::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38716:9:::1;:26:::0;;-1:-1:-1;;;;;38716:26:0;;::::1;-1:-1:-1::0;;;;;;38716:26:0;;::::1;::::0;::::1;::::0;;;38749:2:::1;:21:::0;;;;::::1;;::::0;;38643:133::o;31865:37::-;;;;;;;:::i;37501:100::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;37571:13:::1;:24:::0;37501:100::o;36721:473::-;13087:4;13111:16;;;:7;:16;;;;;;36819:13;;-1:-1:-1;;;;;13111:16:0;36844:75;;;;-1:-1:-1;;;36844:75:0;;17143:2:1;36844:75:0;;;17125:21:1;17182:2;17162:18;;;17155:30;17221:34;17201:18;;;17194:62;-1:-1:-1;;;17272:18:1;;;17265:45;17327:19;;36844:75:0;16941:411:1;36844:75:0;36935:8;;;;;;;:17;;36947:5;36935:17;36932:62;;36972:14;36965:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36721:473;;;:::o;36932:62::-;37000:28;37031:10;:8;:10::i;:::-;37000:41;;37086:1;37061:14;37055:28;:32;:133;;;;;;;;;;;;;;;;;37123:14;37139:18;:7;:16;:18::i;:::-;37159:13;37106:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37055:133;37048:140;36721:473;-1:-1:-1;;;36721:473:0:o;34019:996::-;34121:18;34142:13;36000:12;;;35933:85;34142:13;34200:20;;34121:34;;-1:-1:-1;34200:20:0;;;;;34192:53;;;;-1:-1:-1;;;34192:53:0;;18820:2:1;34192:53:0;;;18802:21:1;18859:2;18839:18;;;18832:30;-1:-1:-1;;;18878:18:1;;;18871:50;18938:18;;34192:53:0;18618:344:1;34192:53:0;34307:19;;34278:10;34261:28;;;;:16;:28;;;;;;:41;;34291:11;;34261:41;:::i;:::-;34260:66;;34252:143;;;;;-1:-1:-1;;;34252:143:0;;19169:2:1;34252:143:0;;;19151:21:1;19188:18;;;19181:30;;;;19247:34;19227:18;;;19220:62;19318:34;19298:18;;;19291:62;19370:19;;34252:143:0;18967:428:1;34252:143:0;34424:1;34410:11;:15;34402:49;;;;-1:-1:-1;;;34402:49:0;;15384:2:1;34402:49:0;;;15366:21:1;15423:2;15403:18;;;15396:30;-1:-1:-1;;;15442:18:1;;;15435:51;15503:18;;34402:49:0;15182:345:1;34402:49:0;34494:9;;34466:24;34479:11;34466:10;:24;:::i;:::-;:37;;34458:82;;;;-1:-1:-1;;;34458:82:0;;11651:2:1;34458:82:0;;;11633:21:1;;;11670:18;;;11663:30;11729:34;11709:18;;;11702:62;11781:18;;34458:82:0;11449:356:1;34458:82:0;34581:11;34567:13;;:25;;;;:::i;:::-;34555:9;:37;;34547:78;;;;-1:-1:-1;;;34547:78:0;;19602:2:1;34547:78:0;;;19584:21:1;19641:2;19621:18;;;19614:30;19680:31;19660:18;;;19653:59;19729:18;;34547:78:0;19400:353:1;34547:78:0;34657:28;;-1:-1:-1;;34674:10:0;19907:2:1;19903:15;19899:53;34657:28:0;;;19887:66:1;34632:12:0;;19969::1;;34657:28:0;;;;;;;;;;;;34647:39;;;;;;34632:54;;34702:50;34721:12;;34702:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34735:10:0;;;-1:-1:-1;34747:4:0;;-1:-1:-1;34702:18:0;:50::i;:::-;34694:77;;;;-1:-1:-1;;;34694:77:0;;20194:2:1;34694:77:0;;;20176:21:1;20233:2;20213:18;;;20206:30;-1:-1:-1;;;20252:18:1;;;20245:44;20306:18;;34694:77:0;19992:338:1;34694:77:0;34797:10;34780:28;;;;:16;:28;;;;;:43;;34812:11;;34780:28;:43;;34812:11;;34780:43;:::i;:::-;;;;;;;;34844:11;34830:12;;:25;;;;;;;:::i;:::-;;;;;;;;34873:11;34862:9;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34914:1:0;;-1:-1:-1;34897:113:0;34922:11;34917:1;:16;34897:113;;34955:37;34965:10;34977:14;34990:1;34977:10;:14;:::i;34955:37::-;34935:3;;;;:::i;:::-;;;;34897:113;;;;34110:905;;34019:996;;;:::o;39451:179::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;18047:1:::1;18643:7;;:19:::0;18635:63:::1;;;::::0;-1:-1:-1;;;18635:63:0;;20537:2:1;18635:63:0::1;::::0;::::1;20519:21:1::0;20576:2;20556:18;;;20549:30;20615:33;20595:18;;;20588:61;20666:18;;18635:63:0::1;20335:355:1::0;18635:63:0::1;18047:1;18776:7;:18:::0;39543:58:::2;::::0;39525:12:::2;::::0;39551:10:::2;::::0;39575:21:::2;::::0;39525:12;39543:58;39525:12;39543:58;39575:21;39551:10;39543:58:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39524:77;;;39616:7;39608:16;;;::::0;::::2;;-1:-1:-1::0;18003:1:0::1;18955:7;:22:::0;39451:179::o;38183:122::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38266:13:::1;:33;38282:17:::0;38266:13;:33:::1;:::i;37275:89::-:0;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;37339:8:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;37339:19:0;;::::1;::::0;;;::::1;::::0;;37275:89::o;11689:164::-;-1:-1:-1;;;;;11810:25:0;;;11786:4;11810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;11689:164::o;37910:120::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;37992:14:::1;:32;38009:15:::0;37992:14;:32:::1;:::i;19737:192::-:0;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19826:22:0;::::1;19818:73;;;::::0;-1:-1:-1;;;19818:73:0;;21107:2:1;19818:73:0::1;::::0;::::1;21089:21:1::0;21146:2;21126:18;;;21119:30;21185:34;21165:18;;;21158:62;-1:-1:-1;;;21236:18:1;;;21229:36;21282:19;;19818:73:0::1;20905:402:1::0;19818:73:0::1;19902:19;19912:8;19902:9;:19::i;:::-;19737:192:::0;:::o;31762:41::-;;;;;;;:::i;38888:391::-;19475:6;;-1:-1:-1;;;;;19475:6:0;8404:10;19542:23;19534:68;;;;-1:-1:-1;;;19534:68:0;;;;;;;:::i;:::-;38972:18:::1;38991:13;36000:12:::0;;;35933:85;38991:13:::1;39048:9;::::0;38972:32;;-1:-1:-1;39025:19:0::1;39038:6:::0;38972:32;39025:19:::1;:::i;:::-;:32;;39017:115;;;;-1:-1:-1::0;;;39017:115:0::1;;;;;;;:::i;:::-;39159:1;39145:96;39166:6;39162:1;:10;39145:96;;39187:40;39197:13:::0;39212:14:::1;39225:1:::0;39212:10;:14:::1;:::i;39187:40::-;39173:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39145:96;;;;39267:6;39253:12;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;38888:391:0:o;15245:174::-;15320:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15320:29:0;-1:-1:-1;;;;;15320:29:0;;;;;;;;:24;;15374:23;15320:24;15374:14;:23::i;:::-;-1:-1:-1;;;;;15365:46:0;;;;;;;;;;;15245:174;;:::o;13159:348::-;13252:4;13111:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13111:16:0;13269:73;;;;-1:-1:-1;;;13269:73:0;;21514:2:1;13269:73:0;;;21496:21:1;21553:2;21533:18;;;21526:30;21592:34;21572:18;;;21565:62;-1:-1:-1;;;21643:18:1;;;21636:42;21695:19;;13269:73:0;21312:408:1;13269:73:0;13353:13;13369:23;13384:7;13369:14;:23::i;:::-;13353:39;;13422:5;-1:-1:-1;;;;;13411:16:0;:7;-1:-1:-1;;;;;13411:16:0;;:51;;;;13455:7;-1:-1:-1;;;;;13431:31:0;:20;13443:7;13431:11;:20::i;:::-;-1:-1:-1;;;;;13431:31:0;;13411:51;:87;;;;13466:32;13483:5;13490:7;13466:16;:32::i;:::-;13403:96;13159:348;-1:-1:-1;;;;13159:348:0:o;14707:526::-;14866:4;-1:-1:-1;;;;;14839:31:0;:23;14854:7;14839:14;:23::i;:::-;-1:-1:-1;;;;;14839:31:0;;14831:85;;;;-1:-1:-1;;;14831:85:0;;21927:2:1;14831:85:0;;;21909:21:1;21966:2;21946:18;;;21939:30;22005:34;21985:18;;;21978:62;-1:-1:-1;;;22056:18:1;;;22049:39;22105:19;;14831:85:0;21725:405:1;14831:85:0;-1:-1:-1;;;;;14935:16:0;;14927:65;;;;-1:-1:-1;;;14927:65:0;;22337:2:1;14927:65:0;;;22319:21:1;22376:2;22356:18;;;22349:30;22415:34;22395:18;;;22388:62;-1:-1:-1;;;22466:18:1;;;22459:34;22510:19;;14927:65:0;22135:400:1;14927:65:0;15057:29;15074:1;15078:7;15057:8;:29::i;:::-;-1:-1:-1;;;;;15099:15:0;;;;;;:9;:15;;;;;:20;;15118:1;;15099:15;:20;;15118:1;;15099:20;:::i;:::-;;;;-1:-1:-1;;;;;;;15130:13:0;;;;;;:9;:13;;;;;:18;;15147:1;;15130:13;:18;;15147:1;;15130:18;:::i;:::-;;;;-1:-1:-1;;15159:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;15159:21:0;-1:-1:-1;;;;;15159:21:0;;;;;;;;;15198:27;;15159:16;;15198:27;;;;;;;14707:526;;;:::o;13518:110::-;13594:26;13604:2;13608:7;13594:26;;;;;;;;;;;;:9;:26::i;19937:173::-;20012:6;;;-1:-1:-1;;;;;20029:17:0;;;-1:-1:-1;;;;;;20029:17:0;;;;;;;20062:40;;20012:6;;;20029:17;20012:6;;20062:40;;19993:16;;20062:40;19982:128;19937:173;:::o;12697:315::-;12854:28;12864:4;12870:2;12874:7;12854:9;:28::i;:::-;12901:48;12924:4;12930:2;12934:7;12943:5;12901:22;:48::i;:::-;12893:111;;;;-1:-1:-1;;;12893:111:0;;;;;;;:::i;33192:102::-;33252:13;33281:7;33274:14;;;;;:::i;2054:723::-;2110:13;2331:5;2340:1;2331:10;2327:53;;-1:-1:-1;;2358:10:0;;;;;;;;;;;;-1:-1:-1;;;2358:10:0;;;;;2054:723::o;2327:53::-;2405:5;2390:12;2446:78;2453:9;;2446:78;;2479:8;;;;:::i;:::-;;-1:-1:-1;2502:10:0;;-1:-1:-1;2510:2:0;2502:10;;:::i;:::-;;;2446:78;;;2534:19;2566:6;2556:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2556:17:0;;2534:39;;2584:154;2591:10;;2584:154;;2618:11;2628:1;2618:11;;:::i;:::-;;-1:-1:-1;2687:10:0;2695:2;2687:5;:10;:::i;:::-;2674:24;;:2;:24;:::i;:::-;2661:39;;2644:6;2651;2644:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2644:56:0;;;;;;;;-1:-1:-1;2715:11:0;2724:2;2715:11;;:::i;:::-;;;2584:154;;21263:190;21388:4;21441;21412:25;21425:5;21432:4;21412:12;:25::i;:::-;:33;;21263:190;-1:-1:-1;;;;21263:190:0:o;13640:321::-;13770:18;13776:2;13780:7;13770:5;:18::i;:::-;13821:54;13852:1;13856:2;13860:7;13869:5;13821:22;:54::i;:::-;13799:154;;;;-1:-1:-1;;;13799:154:0;;;;;;;:::i;15427:799::-;15582:4;-1:-1:-1;;;;;15603:13:0;;3908:20;3956:8;15599:620;;15639:72;;-1:-1:-1;;;15639:72:0;;-1:-1:-1;;;;;15639:36:0;;;;;:72;;8404:10;;15690:4;;15696:7;;15705:5;;15639:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15639:72:0;;;;;;;;-1:-1:-1;;15639:72:0;;;;;;;;;;;;:::i;:::-;;;15635:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15881:6;:13;15898:1;15881:18;15877:272;;15924:60;;-1:-1:-1;;;15924:60:0;;;;;;;:::i;15877:272::-;16099:6;16093:13;16084:6;16080:2;16076:15;16069:38;15635:529;-1:-1:-1;;;;;;15762:51:0;-1:-1:-1;;;15762:51:0;;-1:-1:-1;15755:58:0;;15599:620;-1:-1:-1;16203:4:0;15427:799;;;;;;:::o;22130:296::-;22213:7;22256:4;22213:7;22271:118;22295:5;:12;22291:1;:16;22271:118;;;22344:33;22354:12;22368:5;22374:1;22368:8;;;;;;;;:::i;:::-;;;;;;;22344:9;:33::i;:::-;22329:48;-1:-1:-1;22309:3:0;;;;:::i;:::-;;;;22271:118;;;-1:-1:-1;22406:12:0;22130:296;-1:-1:-1;;;22130:296:0:o;13972:382::-;-1:-1:-1;;;;;14052:16:0;;14044:61;;;;-1:-1:-1;;;14044:61:0;;24416:2:1;14044:61:0;;;24398:21:1;;;24435:18;;;24428:30;24494:34;24474:18;;;24467:62;24546:18;;14044:61:0;24214:356:1;14044:61:0;13087:4;13111:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13111:16:0;:30;14116:58;;;;-1:-1:-1;;;14116:58:0;;24777:2:1;14116:58:0;;;24759:21:1;24816:2;24796:18;;;24789:30;24855;24835:18;;;24828:58;24903:18;;14116:58:0;24575:352:1;14116:58:0;-1:-1:-1;;;;;14245:13:0;;;;;;:9;:13;;;;;:18;;14262:1;;14245:13;:18;;14262:1;;14245:18;:::i;:::-;;;;-1:-1:-1;;14274:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;14274:21:0;-1:-1:-1;;;;;14274:21:0;;;;;;;;14313:33;;14274:16;;;14313:33;;14274:16;;14313:33;13972:382;;:::o;29170:149::-;29233:7;29264:1;29260;:5;:51;;29395:13;29489:15;;;29525:4;29518:15;;;29572:4;29556:21;;29260:51;;;-1:-1:-1;29395:13:0;29489:15;;;29525:4;29518:15;29572:4;29556:21;;;29170:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:160::-;2425:20;;2481:13;;2474:21;2464:32;;2454:60;;2510:1;2507;2500:12;2525:180;2581:6;2634:2;2622:9;2613:7;2609:23;2605:32;2602:52;;;2650:1;2647;2640:12;2602:52;2673:26;2689:9;2673:26;:::i;2710:328::-;2787:6;2795;2803;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;2895:29;2914:9;2895:29;:::i;:::-;2885:39;;2943:38;2977:2;2966:9;2962:18;2943:38;:::i;:::-;2933:48;;3028:2;3017:9;3013:18;3000:32;2990:42;;2710:328;;;;;:::o;3225:186::-;3284:6;3337:2;3325:9;3316:7;3312:23;3308:32;3305:52;;;3353:1;3350;3343:12;3305:52;3376:29;3395:9;3376:29;:::i;3416:632::-;3587:2;3639:21;;;3709:13;;3612:18;;;3731:22;;;3558:4;;3587:2;3810:15;;;;3784:2;3769:18;;;3558:4;3853:169;3867:6;3864:1;3861:13;3853:169;;;3928:13;;3916:26;;3997:15;;;;3962:12;;;;3889:1;3882:9;3853:169;;;-1:-1:-1;4039:3:1;;3416:632;-1:-1:-1;;;;;;3416:632:1:o;4053:127::-;4114:10;4109:3;4105:20;4102:1;4095:31;4145:4;4142:1;4135:15;4169:4;4166:1;4159:15;4185:632;4250:5;4280:18;4321:2;4313:6;4310:14;4307:40;;;4327:18;;:::i;:::-;4402:2;4396:9;4370:2;4456:15;;-1:-1:-1;;4452:24:1;;;4478:2;4448:33;4444:42;4432:55;;;4502:18;;;4522:22;;;4499:46;4496:72;;;4548:18;;:::i;:::-;4588:10;4584:2;4577:22;4617:6;4608:15;;4647:6;4639;4632:22;4687:3;4678:6;4673:3;4669:16;4666:25;4663:45;;;4704:1;4701;4694:12;4663:45;4754:6;4749:3;4742:4;4734:6;4730:17;4717:44;4809:1;4802:4;4793:6;4785;4781:19;4777:30;4770:41;;;;4185:632;;;;;:::o;4822:451::-;4891:6;4944:2;4932:9;4923:7;4919:23;4915:32;4912:52;;;4960:1;4957;4950:12;4912:52;5000:9;4987:23;5033:18;5025:6;5022:30;5019:50;;;5065:1;5062;5055:12;5019:50;5088:22;;5141:4;5133:13;;5129:27;-1:-1:-1;5119:55:1;;5170:1;5167;5160:12;5119:55;5193:74;5259:7;5254:2;5241:16;5236:2;5232;5228:11;5193:74;:::i;5463:254::-;5528:6;5536;5589:2;5577:9;5568:7;5564:23;5560:32;5557:52;;;5605:1;5602;5595:12;5557:52;5628:29;5647:9;5628:29;:::i;:::-;5618:39;;5676:35;5707:2;5696:9;5692:18;5676:35;:::i;:::-;5666:45;;5463:254;;;;;:::o;5722:667::-;5817:6;5825;5833;5841;5894:3;5882:9;5873:7;5869:23;5865:33;5862:53;;;5911:1;5908;5901:12;5862:53;5934:29;5953:9;5934:29;:::i;:::-;5924:39;;5982:38;6016:2;6005:9;6001:18;5982:38;:::i;:::-;5972:48;;6067:2;6056:9;6052:18;6039:32;6029:42;;6122:2;6111:9;6107:18;6094:32;6149:18;6141:6;6138:30;6135:50;;;6181:1;6178;6171:12;6135:50;6204:22;;6257:4;6249:13;;6245:27;-1:-1:-1;6235:55:1;;6286:1;6283;6276:12;6235:55;6309:74;6375:7;6370:2;6357:16;6352:2;6348;6344:11;6309:74;:::i;:::-;6299:84;;;5722:667;;;;;;;:::o;6394:683::-;6489:6;6497;6505;6558:2;6546:9;6537:7;6533:23;6529:32;6526:52;;;6574:1;6571;6564:12;6526:52;6610:9;6597:23;6587:33;;6671:2;6660:9;6656:18;6643:32;6694:18;6735:2;6727:6;6724:14;6721:34;;;6751:1;6748;6741:12;6721:34;6789:6;6778:9;6774:22;6764:32;;6834:7;6827:4;6823:2;6819:13;6815:27;6805:55;;6856:1;6853;6846:12;6805:55;6896:2;6883:16;6922:2;6914:6;6911:14;6908:34;;;6938:1;6935;6928:12;6908:34;6991:7;6986:2;6976:6;6973:1;6969:14;6965:2;6961:23;6957:32;6954:45;6951:65;;;7012:1;7009;7002:12;6951:65;7043:2;7039;7035:11;7025:21;;7065:6;7055:16;;;;;6394:683;;;;;:::o;7082:260::-;7150:6;7158;7211:2;7199:9;7190:7;7186:23;7182:32;7179:52;;;7227:1;7224;7217:12;7179:52;7250:29;7269:9;7250:29;:::i;:::-;7240:39;;7298:38;7332:2;7321:9;7317:18;7298:38;:::i;7571:380::-;7650:1;7646:12;;;;7693;;;7714:61;;7768:4;7760:6;7756:17;7746:27;;7714:61;7821:2;7813:6;7810:14;7790:18;7787:38;7784:161;;7867:10;7862:3;7858:20;7855:1;7848:31;7902:4;7899:1;7892:15;7930:4;7927:1;7920:15;7784:161;;7571:380;;;:::o;9196:356::-;9398:2;9380:21;;;9417:18;;;9410:30;9476:34;9471:2;9456:18;;9449:62;9543:2;9528:18;;9196:356::o;9557:413::-;9759:2;9741:21;;;9798:2;9778:18;;;9771:30;9837:34;9832:2;9817:18;;9810:62;-1:-1:-1;;;9903:2:1;9888:18;;9881:47;9960:3;9945:19;;9557:413::o;9975:127::-;10036:10;10031:3;10027:20;10024:1;10017:31;10067:4;10064:1;10057:15;10091:4;10088:1;10081:15;10107:127;10168:10;10163:3;10159:20;10156:1;10149:31;10199:4;10196:1;10189:15;10223:4;10220:1;10213:15;10239:135;10278:3;10299:17;;;10296:43;;10319:18;;:::i;:::-;-1:-1:-1;10366:1:1;10355:13;;10239:135::o;10379:184::-;10449:6;10502:2;10490:9;10481:7;10477:23;10473:32;10470:52;;;10518:1;10515;10508:12;10470:52;-1:-1:-1;10541:16:1;;10379:184;-1:-1:-1;10379:184:1:o;10916:125::-;10981:9;;;11002:10;;;10999:36;;;11015:18;;:::i;11936:545::-;12038:2;12033:3;12030:11;12027:448;;;12074:1;12099:5;12095:2;12088:17;12144:4;12140:2;12130:19;12214:2;12202:10;12198:19;12195:1;12191:27;12185:4;12181:38;12250:4;12238:10;12235:20;12232:47;;;-1:-1:-1;12273:4:1;12232:47;12328:2;12323:3;12319:12;12316:1;12312:20;12306:4;12302:31;12292:41;;12383:82;12401:2;12394:5;12391:13;12383:82;;;12446:17;;;12427:1;12416:13;12383:82;;12657:1352;12783:3;12777:10;12810:18;12802:6;12799:30;12796:56;;;12832:18;;:::i;:::-;12861:97;12951:6;12911:38;12943:4;12937:11;12911:38;:::i;:::-;12905:4;12861:97;:::i;:::-;13013:4;;13077:2;13066:14;;13094:1;13089:663;;;;13796:1;13813:6;13810:89;;;-1:-1:-1;13865:19:1;;;13859:26;13810:89;-1:-1:-1;;12614:1:1;12610:11;;;12606:24;12602:29;12592:40;12638:1;12634:11;;;12589:57;13912:81;;13059:944;;13089:663;11883:1;11876:14;;;11920:4;11907:18;;-1:-1:-1;;13125:20:1;;;13243:236;13257:7;13254:1;13251:14;13243:236;;;13346:19;;;13340:26;13325:42;;13438:27;;;;13406:1;13394:14;;;;13273:19;;13243:236;;;13247:3;13507:6;13498:7;13495:19;13492:201;;;13568:19;;;13562:26;-1:-1:-1;;13651:1:1;13647:14;;;13663:3;13643:24;13639:37;13635:42;13620:58;13605:74;;13492:201;-1:-1:-1;;;;;13739:1:1;13723:14;;;13719:22;13706:36;;-1:-1:-1;12657:1352:1:o;15935:474::-;16137:2;16119:21;;;16176:2;16156:18;;;16149:30;16215:34;16210:2;16195:18;;16188:62;16286:34;16281:2;16266:18;;16259:62;-1:-1:-1;;;16352:3:1;16337:19;;16330:37;16399:3;16384:19;;15935:474::o;16414:168::-;16487:9;;;16518;;16535:15;;;16529:22;;16515:37;16505:71;;16556:18;;:::i;17357:1256::-;17581:3;17619:6;17613:13;17645:4;17658:64;17715:6;17710:3;17705:2;17697:6;17693:15;17658:64;:::i;:::-;17785:13;;17744:16;;;;17807:68;17785:13;17744:16;17842:15;;;17807:68;:::i;:::-;17964:13;;17897:20;;;17937:1;;18002:36;17964:13;18002:36;:::i;:::-;18057:1;18074:18;;;18101:141;;;;18256:1;18251:337;;;;18067:521;;18101:141;-1:-1:-1;;18136:24:1;;18122:39;;18213:16;;18206:24;18192:39;;18181:51;;;-1:-1:-1;18101:141:1;;18251:337;18282:6;18279:1;18272:17;18330:2;18327:1;18317:16;18355:1;18369:169;18383:8;18380:1;18377:15;18369:169;;;18465:14;;18450:13;;;18443:37;18508:16;;;;18400:10;;18369:169;;;18373:3;;18569:8;18562:5;18558:20;18551:27;;18067:521;-1:-1:-1;18604:3:1;;17357:1256;-1:-1:-1;;;;;;;;;;17357:1256:1:o;22540:128::-;22607:9;;;22628:11;;;22625:37;;;22642:18;;:::i;22673:414::-;22875:2;22857:21;;;22914:2;22894:18;;;22887:30;22953:34;22948:2;22933:18;;22926:62;-1:-1:-1;;;23019:2:1;23004:18;;22997:48;23077:3;23062:19;;22673:414::o;23092:127::-;23153:10;23148:3;23144:20;23141:1;23134:31;23184:4;23181:1;23174:15;23208:4;23205:1;23198:15;23224:120;23264:1;23290;23280:35;;23295:18;;:::i;:::-;-1:-1:-1;23329:9:1;;23224:120::o;23349:112::-;23381:1;23407;23397:35;;23412:18;;:::i;:::-;-1:-1:-1;23446:9:1;;23349:112::o;23466:489::-;-1:-1:-1;;;;;23735:15:1;;;23717:34;;23787:15;;23782:2;23767:18;;23760:43;23834:2;23819:18;;23812:34;;;23882:3;23877:2;23862:18;;23855:31;;;23660:4;;23903:46;;23929:19;;23921:6;23903:46;:::i;:::-;23895:54;23466:489;-1:-1:-1;;;;;;23466:489:1:o;23960:249::-;24029:6;24082:2;24070:9;24061:7;24057:23;24053:32;24050:52;;;24098:1;24095;24088:12;24050:52;24130:9;24124:16;24149:30;24173:5;24149:30;:::i

Swarm Source

ipfs://378cc87f0632050e3f82d54091db41955b50965608120907ba334d066642c3fa
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.