ETH Price: $2,994.45 (-4.41%)
Gas: 3 Gwei

Token

OneCuPFP (CUPFP)
 

Overview

Max Total Supply

0 CUPFP

Holders

321

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CUPFP
0x4eb173b2a73875921facbf9e048c4b71ec8c8818
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:
OneCuPFP

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : OneCuPFP.sol
// SPDX-License-Identifier: MIT
// Creator: @casareafer at 1TM.io

pragma solidity ^0.8.17;

import "./OneCuPFPToken.sol";

contract OneCuPFP is OneCuPFPToken {
    constructor(
        string memory name,
        string memory symbol,
        string memory _notRevealedUri,
        string memory contractUri,
        uint256 _burnSupply)
    OneCuPFPToken(name, symbol, _notRevealedUri, contractUri, _burnSupply) {}

    /**
    *   Mint function
    */

    function mint(uint256 amount, bool whitelisted, bytes32[] calldata merkleProof) external payable callerIsUser {
        require(mintActive || preMintActive, "No active sales");
        require(ValidateMint(amount, whitelisted, merkleProof));
        for (uint bar = 0; bar < amount; bar++) {
            _safeMint(msg.sender, totalMinted);
            totalMinted += 1;
        }
    }

    function reservedMint(uint256 amount) external onlyOwner {
        require(maxSupply >= (amount + totalMinted), "Exceeds available supply");
        for (uint bar = 0; bar < amount; bar++) {
            _safeMint(msg.sender, totalMinted);
            totalMinted += 1;
        }
    }
}

File 2 of 15 : OneCuPFPToken.sol
// SPDX-License-Identifier: MIT
// Creator: @casareafer at 1TM.io

pragma solidity ^0.8.17;

import "./openzeppelin/ERC721.sol";
import "./openzeppelin/Strings.sol";
import "./openzeppelin/MerkleProof.sol";
import "./openzeppelin/Ownable.sol";
import "./ContractURI.sol";

contract OneCuPFPToken is ERC721, ContractURI, Ownable {
    using Strings for uint256;
    using Strings for address;
    address public royaltyAddress;

    /**
    *   Burn event values
    */

    uint256 private constant burnedId = 1;
    uint256 private burnSupply;
    address private pioneerPass;
    uint256 private totalBurned;
    bool private burnActive;
    bool private earlyBirdsDiscount;

    /**
    *   Mint event values
    */

    bytes32 internal whitelistRoot;
    uint256 internal maxMint;
    uint256 internal maxSupply;
    uint256 internal totalMinted;
    uint256 internal price;
    uint256 internal whitelistPrice;
    bool internal mintActive;
    bool internal preMintActive;

    /**
    *   Metadata values
    */

    string private baseUri;
    string public notRevealedUri;
    bool public revealed;

    /**
    *   Mappings
    */

    mapping(address => bool) private preSaleMinted;
    mapping(address => uint256) internal _userBurned;

    constructor(
        string memory name,
        string memory symbol,
        string memory _notRevealedUri,
        string memory contractUri,
        uint256 _burnSupply) ERC721(name, symbol) {
        maxSupply = 1111;
        burnActive = false;
        mintActive = false;
        preMintActive = false;
        revealed = false;
        transferLock = false;
        earlyBirdsDiscount = false;
        notRevealedUri = _notRevealedUri;
        _setContractURI(contractUri);
        burnSupply = _burnSupply;
    }

    /**
    *   Art controls
    */

    function reveal(bool _revealed) external onlyOwner {
        revealed = _revealed;
    }

    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    /**
    *   Burning Tools
    */

    function setPioneerPass(address PioneerPassAddress) external onlyOwner {
        pioneerPass = PioneerPassAddress;
    }

    function setBurnActive(bool burnIt) external onlyOwner {
        burnActive = burnIt;
    }

    function setEarlyBirdsEvent(bool crankIt) external onlyOwner {
        earlyBirdsDiscount = crankIt;
    }

    function setBurnSupply(uint256 _burnSupply) external onlyOwner {
        burnSupply = _burnSupply;
    }

    /**
    *   Manual mint controls
    */

    function setWhitelist(bytes32 root) external onlyOwner {
        whitelistRoot = root;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setWhitelistPrice(uint256 _whitelistPrice) external onlyOwner {
        whitelistPrice = _whitelistPrice;
    }

    function setActiveSales(bool preMint, bool mint) external onlyOwner {
        mintActive = mint;
        preMintActive = preMint;
    }

    function setMaxMint(uint256 amount) external onlyOwner {
        maxMint = amount;
    }

    function setMaxSupply(uint256 amount) external onlyOwner {
        maxSupply = amount;
    }

    /**
    *   Miscellaneous
    */

    function setRoyaltyWallet(address receiver) external onlyOwner {
        royaltyAddress = receiver;
    }

    function lock(bool lockTransfers) external onlyOwner {
        transferLock = lockTransfers;
    }

    /**
    *   Withdraw
    */

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /**
    *   Detail getters
    */

    function getUserStatus(address user) external view returns (uint256 userBurned, bool minted) {
        return (_userBurned[user], preSaleMinted[user]);
    }

    function getSalesStatus() external view returns (
        bytes32 _whitelistRoot,
        uint256 _maxMint,
        uint256 _maxSupply,
        uint256 _totalMinted,
        uint256 _price,
        uint256 _whitelistPrice,
        bool _mintActive,
        bool _preMintActive) {

        return (whitelistRoot, maxMint, maxSupply, totalMinted, price, whitelistPrice, mintActive, preMintActive);
    }

    function getBurnStatus() external view returns (
        address _pioneerPass,
        uint256 _burnSupply,
        uint256 _burnedId,
        uint256 _totalBurned,
        bool _burnActive,
        bool _earlyBirdsDiscount) {
        return (pioneerPass, burnSupply, burnedId, totalBurned, burnActive, earlyBirdsDiscount);
    }

    /**
    *   EIP-2981 Royalty Info
    */

    function royaltyInfo(uint256 tokenId, uint256 salePrice)
    external view returns (address receiver, uint256 royaltyAmount){
        return (royaltyAddress, salePrice * 80 / 1000);
    }

    /**
    *   Overrides
    */

    function onERC1155Received(
        address,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata
    ) external override(ERC721) returns (bytes4){
        if (burnActive) {
            require(burnedId == id, "Wrong token");
            uint256 receivedArks = value;
            if (earlyBirdsDiscount) {
                value += value;
            }
            require(_userBurned[from] + receivedArks <= 10, "Max 10 burns per wallet");
            require((totalBurned + receivedArks) <= burnSupply, "Burn amount exceeds the available burnable supply");

            require(value + totalMinted <= maxSupply, "Exceeds available supply");

            totalBurned += receivedArks;
            _userBurned[from] += receivedArks;

            (bool burned,) = address(pioneerPass).call(
                abi.encodeWithSignature("burn(address,uint256,uint256)", address(this), burnedId, receivedArks)
            );
            require(burned, "Burn Failed");
            for (uint bar = 0; bar < value; bar++) {
                totalMinted += 1;
                _safeMint(from, (totalMinted - 1));
            }
            return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"));
        } else {
            revert("Unable to receive tokens");
        }
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external pure override(ERC721) returns (bytes4){
        revert("No transfers allowed");
    }

    /**
    *   Token Metadata
    */

    function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override(ERC721)
    returns (string memory)
    {
        require(_exists(tokenId), "Token does not exist");
        if (revealed == false) {
            return notRevealedUri;
        }
        return string(abi.encodePacked(baseUri, tokenId.toString()));
    }

    /**
    *   Miscellaneous
    */

    function ValidateMint(
        uint256 _amount,
        bool _whitelisted,
        bytes32[] calldata merkleProof
    ) internal returns (bool){
        require(maxSupply >= (_amount + totalMinted), "Exceeds available supply");
        require(_amount <= maxMint, "Too many mints");
        if (_whitelisted) {
            require(preMintActive, "No presale active");
            require(!preSaleMinted[msg.sender], "Already minted");
            require(MerkleProof.verify(
                    merkleProof, whitelistRoot, keccak256(abi.encodePacked(msg.sender))
                ), "Invalid proof");
            require(msg.value == whitelistPrice * _amount, "Invalid tx amount");
            preSaleMinted[msg.sender] = true;
        } else {
            require(msg.value == price * _amount, "Invalid tx amount");
        }
        return true;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }
}

File 3 of 15 : ContractURI.sol
// SPDX-License-Identifier: MIT
// Creator: @casareafer at 1TM.io
pragma solidity ^0.8.17;

contract ContractURI {
    string internal contractURI_ = "";

    function _setContractURI(string memory _contractURI) internal {
        contractURI_ = _contractURI;
    }

    function contractURI() external view returns (string memory) {
        return contractURI_;
    }
}

File 4 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.17;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }


    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

File 5 of 15 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.17;

/**
 * @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 proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _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}
     *
     * _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 the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _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}
     *
     * _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)
        }
    }
}

File 6 of 15 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.17;

import "./interfaces/IERC721.sol";
import "./interfaces/IERC721Receiver.sol";
import "./interfaces/IERC721Metadata.sol";
import "./interfaces/IERC1155Receiver.sol";

import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
abstract contract ERC721 is Context, IERC721, ERC165 {
    bool internal transferLock;
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;

    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    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");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    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"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) private {
        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);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");
        require(!transferLock, "Transfers locked");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) 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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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



    /**
    * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     */
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external virtual override(IERC1155Receiver) returns (bytes4){
        return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"));
    }

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     */
    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external virtual override(IERC1155Receiver) returns (bytes4){
        return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"));
    }
}

File 7 of 15 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.17;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed 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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 8 of 15 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.17;

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

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

File 9 of 15 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.17;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 10 of 15 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.17;

import "./interfaces/IERC165.sol";
import "./interfaces/IERC1155Receiver.sol";
import "./interfaces/IERC721Metadata.sol";

abstract contract ERC165 is IERC165, IERC1155Receiver, IERC721Metadata {
    mapping(bytes4 => bool) private interfaces;
    bytes4 private constant INTERFACE_ID_ERC2981 = 0x2a55205a;

    constructor () {
        /**
        *   I guess I will just register everything here, to keep it simple
        */
        registerInterface(type(IERC165).interfaceId);
        registerInterface(type(IERC721).interfaceId);
        registerInterface(type(IERC721Metadata).interfaceId);
        registerInterface(type(IERC1155Receiver).interfaceId);
        registerInterface(INTERFACE_ID_ERC2981);
    }

    function supportsInterface(bytes4 interfaceId) public view returns (bool) {
        return interfaces[interfaceId];
    }

    function registerInterface(bytes4 interfaceId) private {
        interfaces[interfaceId] = true;
    }
}

File 11 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.17;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 15 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.17;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 15 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.17;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver{
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 14 of 15 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.17;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 15 of 15 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.17;

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"_notRevealedUri","type":"string"},{"internalType":"string","name":"contractUri","type":"string"},{"internalType":"uint256","name":"_burnSupply","type":"uint256"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnStatus","outputs":[{"internalType":"address","name":"_pioneerPass","type":"address"},{"internalType":"uint256","name":"_burnSupply","type":"uint256"},{"internalType":"uint256","name":"_burnedId","type":"uint256"},{"internalType":"uint256","name":"_totalBurned","type":"uint256"},{"internalType":"bool","name":"_burnActive","type":"bool"},{"internalType":"bool","name":"_earlyBirdsDiscount","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalesStatus","outputs":[{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxMint","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_totalMinted","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_whitelistPrice","type":"uint256"},{"internalType":"bool","name":"_mintActive","type":"bool"},{"internalType":"bool","name":"_preMintActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStatus","outputs":[{"internalType":"uint256","name":"userBurned","type":"uint256"},{"internalType":"bool","name":"minted","type":"bool"}],"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":[{"internalType":"bool","name":"lockTransfers","type":"bool"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"whitelisted","type":"bool"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"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":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"bool","name":"preMint","type":"bool"},{"internalType":"bool","name":"mint","type":"bool"}],"name":"setActiveSales","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":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"burnIt","type":"bool"}],"name":"setBurnActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnSupply","type":"uint256"}],"name":"setBurnSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"crankIt","type":"bool"}],"name":"setEarlyBirdsEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"PioneerPassAddress","type":"address"}],"name":"setPioneerPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistPrice","type":"uint256"}],"name":"setWhitelistPrice","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":[{"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890816200002491906200062f565b503480156200003257600080fd5b5060405162005953380380620059538339818101604052810190620000589190620008ab565b84848484848484620000907f01ffc9a7000000000000000000000000000000000000000000000000000000006200026660201b60201c565b620000c17f80ac58cd000000000000000000000000000000000000000000000000000000006200026660201b60201c565b620000f27f5b5e139f000000000000000000000000000000000000000000000000000000006200026660201b60201c565b620001237f4e2312e0000000000000000000000000000000000000000000000000000000006200026660201b60201c565b6200013b632a55205a60e01b6200026660201b60201c565b81600290816200014c91906200062f565b5080600390816200015e91906200062f565b5050506200018162000175620002d260201b60201c565b620002da60201b60201c565b6104576011819055506000600e60006101000a81548160ff0219169083151502179055506000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506000601860006101000a81548160ff0219169083151502179055506000600160006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555082601790816200023d91906200062f565b506200024f82620003a060201b60201c565b80600b8190555050505050505050505050620009af565b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060089081620003b191906200062f565b5050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200043757607f821691505b6020821081036200044d576200044c620003ef565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000478565b620004c3868362000478565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005106200050a6200050484620004db565b620004e5565b620004db565b9050919050565b6000819050919050565b6200052c83620004ef565b620005446200053b8262000517565b84845462000485565b825550505050565b600090565b6200055b6200054c565b6200056881848462000521565b505050565b5b8181101562000590576200058460008262000551565b6001810190506200056e565b5050565b601f821115620005df57620005a98162000453565b620005b48462000468565b81016020851015620005c4578190505b620005dc620005d38562000468565b8301826200056d565b50505b505050565b600082821c905092915050565b60006200060460001984600802620005e4565b1980831691505092915050565b60006200061f8383620005f1565b9150826002028217905092915050565b6200063a82620003b5565b67ffffffffffffffff811115620006565762000655620003c0565b5b6200066282546200041e565b6200066f82828562000594565b600060209050601f831160018114620006a7576000841562000692578287015190505b6200069e858262000611565b8655506200070e565b601f198416620006b78662000453565b60005b82811015620006e157848901518255600182019150602085019450602081019050620006ba565b86831015620007015784890151620006fd601f891682620005f1565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007508262000734565b810181811067ffffffffffffffff82111715620007725762000771620003c0565b5b80604052505050565b60006200078762000716565b905062000795828262000745565b919050565b600067ffffffffffffffff821115620007b857620007b7620003c0565b5b620007c38262000734565b9050602081019050919050565b60005b83811015620007f0578082015181840152602081019050620007d3565b60008484015250505050565b6000620008136200080d846200079a565b6200077b565b9050828152602081018484840111156200083257620008316200072f565b5b6200083f848285620007d0565b509392505050565b600082601f8301126200085f576200085e6200072a565b5b815162000871848260208601620007fc565b91505092915050565b6200088581620004db565b81146200089157600080fd5b50565b600081519050620008a5816200087a565b92915050565b600080600080600060a08688031215620008ca57620008c962000720565b5b600086015167ffffffffffffffff811115620008eb57620008ea62000725565b5b620008f98882890162000847565b955050602086015167ffffffffffffffff8111156200091d576200091c62000725565b5b6200092b8882890162000847565b945050604086015167ffffffffffffffff8111156200094f576200094e62000725565b5b6200095d8882890162000847565b935050606086015167ffffffffffffffff81111562000981576200098062000725565b5b6200098f8882890162000847565b9250506080620009a28882890162000894565b9150509295509295909350565b614f9480620009bf6000396000f3fe6080604052600436106102515760003560e01c806370a0823111610139578063aae732ad116100b6578063cdeee6371161007a578063cdeee637146108a4578063e8a3d485146108cd578063e985e9c5146108f8578063ea0d5dcd14610935578063f23a6e6114610973578063f2fde38b146109b057610251565b8063aae732ad146107a6578063ad2f852a146107d6578063b88d4fde14610801578063bc197c811461082a578063c87b56dd1461086757610251565b806391b7f5ed116100fd57806391b7f5ed146106d7578063940cd05b1461070057806395d89b4114610729578063a0bcfc7f14610754578063a22cb4651461077d57610251565b806370a08231146105eb578063717d57d3146106285780638b2c92ab146106515780638c74bf0e146106835780638da5cb5b146106ac57610251565b806323b872dd116101d2578063440bc7f311610196578063440bc7f3146104ec5780635183022714610515578063547520fe1461054057806354f83046146105695780636352211e146105855780636f8b44b0146105c257610251565b806323b872dd1461041c5780632a55205a146104455780633723eff6146104835780633ccfd60b146104ac57806342842e0e146104c357610251565b8063095ea7b311610219578063095ea7b31461034f5780630abaca7d146103785780630bc25355146103a15780630dd0a042146103ca5780631f842aa1146103f357610251565b806301ffc9a71461025657806305462f101461029357806306fdde03146102bc578063081812fc146102e7578063081c8c4414610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612eb2565b6109d9565b60405161028a9190612efa565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190612f41565b610a40565b005b3480156102c857600080fd5b506102d1610a65565b6040516102de9190612ffe565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613056565b610af7565b60405161031b91906130c4565b60405180910390f35b34801561033057600080fd5b50610339610b3d565b6040516103469190612ffe565b60405180910390f35b34801561035b57600080fd5b506103766004803603810190610371919061310b565b610bcb565b005b34801561038457600080fd5b5061039f600480360381019061039a919061314b565b610ce2565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612f41565b610d22565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612f41565b610d47565b005b3480156103ff57600080fd5b5061041a6004803603810190610415919061318b565b610d6c565b005b34801561042857600080fd5b50610443600480360381019061043e91906131b8565b610db8565b005b34801561045157600080fd5b5061046c6004803603810190610467919061320b565b610e18565b60405161047a92919061325a565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613056565b610e63565b005b3480156104b857600080fd5b506104c1610e75565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906131b8565b610ecd565b005b3480156104f857600080fd5b50610513600480360381019061050e91906132b9565b610eed565b005b34801561052157600080fd5b5061052a610eff565b6040516105379190612efa565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613056565b610f12565b005b610583600480360381019061057e919061334b565b610f24565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613056565b611058565b6040516105b991906130c4565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190613056565b611109565b005b3480156105f757600080fd5b50610612600480360381019061060d919061318b565b61111b565b60405161061f91906133bf565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613056565b6111d2565b005b34801561065d57600080fd5b506106666111e4565b60405161067a9897969594939291906133e9565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190613056565b61123c565b005b3480156106b857600080fd5b506106c16112de565b6040516106ce91906130c4565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613056565b611308565b005b34801561070c57600080fd5b5061072760048036038101906107229190612f41565b61131a565b005b34801561073557600080fd5b5061073e61133f565b60405161074b9190612ffe565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190613597565b6113d1565b005b34801561078957600080fd5b506107a4600480360381019061079f91906135e0565b6113ec565b005b3480156107b257600080fd5b506107bb611402565b6040516107cd96959493929190613620565b60405180910390f35b3480156107e257600080fd5b506107eb61146a565b6040516107f891906130c4565b60405180910390f35b34801561080d57600080fd5b5061082860048036038101906108239190613722565b611490565b005b34801561083657600080fd5b50610851600480360381019061084c9190613851565b6114f2565b60405161085e919061393c565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190613056565b61152f565b60405161089b9190612ffe565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c6919061318b565b611659565b005b3480156108d957600080fd5b506108e26116a5565b6040516108ef9190612ffe565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613957565b611737565b60405161092c9190612efa565b60405180910390f35b34801561094157600080fd5b5061095c6004803603810190610957919061318b565b6117cb565b60405161096a929190613997565b60405180910390f35b34801561097f57600080fd5b5061099a600480360381019061099591906139c0565b611864565b6040516109a7919061393c565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d2919061318b565b611ca9565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610a48611d2c565b80600e60016101000a81548160ff02191690831515021790555050565b606060028054610a7490613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090613a89565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000610b0282611daa565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60178054610b4a90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7690613a89565b8015610bc35780601f10610b9857610100808354040283529160200191610bc3565b820191906000526020600020905b815481529060010190602001808311610ba657829003601f168201915b505050505081565b6000610bd682611058565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90613b2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c65611df5565b73ffffffffffffffffffffffffffffffffffffffff161480610c945750610c9381610c8e611df5565b611737565b5b610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613bbe565b60405180910390fd5b610cdd8383611dfd565b505050565b610cea611d2c565b80601560006101000a81548160ff02191690831515021790555081601560016101000a81548160ff0219169083151502179055505050565b610d2a611d2c565b80600e60006101000a81548160ff02191690831515021790555050565b610d4f611d2c565b80600160006101000a81548160ff02191690831515021790555050565b610d74611d2c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dc9610dc3611df5565b82611eb6565b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613c50565b60405180910390fd5b610e13838383611f4b565b505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8605085610e4e9190613c9f565b610e589190613d10565b915091509250929050565b610e6b611d2c565b80600b8190555050565b610e7d611d2c565b610e856112de565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eca573d6000803e3d6000fd5b50565b610ee883838360405180602001604052806000815250611490565b505050565b610ef5611d2c565b80600f8190555050565b601860009054906101000a900460ff1681565b610f1a611d2c565b8060108190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990613d8d565b60405180910390fd5b601560009054906101000a900460ff1680610fb95750601560019054906101000a900460ff165b610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90613df9565b60405180910390fd5b61100484848484612201565b61100d57600080fd5b60005b848110156110515761102433601254612537565b6001601260008282546110379190613e19565b92505081905550808061104990613e4d565b915050611010565b5050505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f790613ee1565b60405180910390fd5b80915050919050565b611111611d2c565b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290613f73565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111da611d2c565b8060148190555050565b600080600080600080600080600f54601054601154601254601354601454601560009054906101000a900460ff16601560019054906101000a900460ff16975097509750975097509750975097509091929394959697565b611244611d2c565b601254816112529190613e19565b6011541015611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613fdf565b60405180910390fd5b60005b818110156112da576112ad33601254612537565b6001601260008282546112c09190613e19565b9250508190555080806112d290613e4d565b915050611299565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611310611d2c565b8060138190555050565b611322611d2c565b80601860006101000a81548160ff02191690831515021790555050565b60606003805461134e90613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461137a90613a89565b80156113c75780601f1061139c576101008083540402835291602001916113c7565b820191906000526020600020905b8154815290600101906020018083116113aa57829003601f168201915b5050505050905090565b6113d9611d2c565b80601690816113e891906141ab565b5050565b6113fe6113f7611df5565b8383612555565b5050565b600080600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546001600d54600e60009054906101000a900460ff16600e60019054906101000a900460ff16955095509550955095509550909192939495565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114a161149b611df5565b83611eb6565b6114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d790613c50565b60405180910390fd5b6114ec848484846126c1565b50505050565b60006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611526906142c9565b60405180910390fd5b606061153a8261271d565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614335565b60405180910390fd5b60001515601860009054906101000a900460ff1615150361162657601780546115a190613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90613a89565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050611654565b601661163183612789565b604051602001611642929190614414565b60405160208183030381529060405290505b919050565b611661611d2c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600880546116b490613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546116e090613a89565b801561172d5780601f106117025761010080835404028352916020019161172d565b820191906000526020600020905b81548152906001019060200180831161171057829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691509150915091565b6000600e60009054906101000a900460ff1615611c6457846001146118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590614484565b60405180910390fd5b6000849050600e60019054906101000a900460ff16156118e75784856118e49190613e19565b94505b600a81601a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119349190613e19565b1115611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c906144f0565b60405180910390fd5b600b5481600d546119869190613e19565b11156119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90614582565b60405180910390fd5b601154601254866119d89190613e19565b1115611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1090613fdf565b60405180910390fd5b80600d6000828254611a2b9190613e19565b9250508190555080601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a819190613e19565b925050819055506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1630600184604051602401611ad9939291906145a2565b6040516020818303038152906040527ff5298aca000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b639190614620565b6000604051808303816000865af19150503d8060008114611ba0576040519150601f19603f3d011682016040523d82523d6000602084013e611ba5565b606091505b5050905080611be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be090614683565b60405180910390fd5b60005b86811015611c3957600160126000828254611c079190613e19565b92505081905550611c26896001601254611c2191906146a3565b612537565b8080611c3190613e4d565b915050611bec565b507ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf9792505050611c9f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9690614723565b60405180910390fd5b9695505050505050565b611cb1611d2c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d17906147b5565b60405180910390fd5b611d29816128e9565b50565b611d34611df5565b73ffffffffffffffffffffffffffffffffffffffff16611d526112de565b73ffffffffffffffffffffffffffffffffffffffff1614611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f90614821565b60405180910390fd5b565b611db38161271d565b611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990613ee1565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7083611058565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ec283611058565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f045750611f038185611737565b5b80611f4257508373ffffffffffffffffffffffffffffffffffffffff16611f2a84610af7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6b82611058565b73ffffffffffffffffffffffffffffffffffffffff1614611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb8906148b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614945565b60405180910390fd5b600160009054906101000a900460ff1615612080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612077906149b1565b60405180910390fd5b61208b8383836129af565b612096600082611dfd565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e691906146a3565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461213d9190613e19565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fc8383836129b4565b505050565b6000601254856122119190613e19565b6011541015612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90613fdf565b60405180910390fd5b60105485111561229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190614a1d565b60405180910390fd5b83156124db57601560019054906101000a900460ff166122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690614a89565b60405180910390fd5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561237c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237390614af5565b60405180910390fd5b6123f0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f54336040516020016123d59190614b5d565b604051602081830303815290604052805190602001206129b9565b61242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614bc4565b60405180910390fd5b8460145461243d9190613c9f565b341461247e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247590614c30565b60405180910390fd5b6001601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061252b565b846013546124e99190613c9f565b341461252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252190614c30565b60405180910390fd5b5b60019050949350505050565b6125518282604051806020016040528060008152506129d0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90614c9c565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126b49190612efa565b60405180910390a3505050565b6126cc848484611f4b565b6126d884848484612a2b565b612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90614d2e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600082036127d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128e4565b600082905060005b600082146128025780806127eb90613e4d565b915050600a826127fb9190613d10565b91506127d8565b60008167ffffffffffffffff81111561281e5761281d61346c565b5b6040519080825280601f01601f1916602001820160405280156128505781602001600182028036833780820191505090505b5090505b600085146128dd5760018261286991906146a3565b9150600a856128789190614d4e565b60306128849190613e19565b60f81b81838151811061289a57612899614d7f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128d69190613d10565b9450612854565b8093505050505b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b6000826129c68584612bb2565b1490509392505050565b6129da8383612c08565b6129e76000848484612a2b565b612a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1d90614d2e565b60405180910390fd5b505050565b6000612a4c8473ffffffffffffffffffffffffffffffffffffffff16612de1565b15612ba5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a75611df5565b8786866040518563ffffffff1660e01b8152600401612a979493929190614df8565b6020604051808303816000875af1925050508015612ad357506040513d601f19601f82011682018060405250810190612ad09190614e59565b60015b612b55573d8060008114612b03576040519150601f19603f3d011682016040523d82523d6000602084013e612b08565b606091505b506000815103612b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4490614d2e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612baa565b600190505b949350505050565b60008082905060005b8451811015612bfd57612be882868381518110612bdb57612bda614d7f565b5b6020026020010151612e04565b91508080612bf590613e4d565b915050612bbb565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6e90614ed2565b60405180910390fd5b612c808161271d565b15612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790614f3e565b60405180910390fd5b612ccc600083836129af565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d1c9190613e19565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ddd600083836129b4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000818310612e1c57612e178284612e2f565b612e27565b612e268383612e2f565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e8f81612e5a565b8114612e9a57600080fd5b50565b600081359050612eac81612e86565b92915050565b600060208284031215612ec857612ec7612e50565b5b6000612ed684828501612e9d565b91505092915050565b60008115159050919050565b612ef481612edf565b82525050565b6000602082019050612f0f6000830184612eeb565b92915050565b612f1e81612edf565b8114612f2957600080fd5b50565b600081359050612f3b81612f15565b92915050565b600060208284031215612f5757612f56612e50565b5b6000612f6584828501612f2c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa8578082015181840152602081019050612f8d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fd082612f6e565b612fda8185612f79565b9350612fea818560208601612f8a565b612ff381612fb4565b840191505092915050565b600060208201905081810360008301526130188184612fc5565b905092915050565b6000819050919050565b61303381613020565b811461303e57600080fd5b50565b6000813590506130508161302a565b92915050565b60006020828403121561306c5761306b612e50565b5b600061307a84828501613041565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130ae82613083565b9050919050565b6130be816130a3565b82525050565b60006020820190506130d960008301846130b5565b92915050565b6130e8816130a3565b81146130f357600080fd5b50565b600081359050613105816130df565b92915050565b6000806040838503121561312257613121612e50565b5b6000613130858286016130f6565b925050602061314185828601613041565b9150509250929050565b6000806040838503121561316257613161612e50565b5b600061317085828601612f2c565b925050602061318185828601612f2c565b9150509250929050565b6000602082840312156131a1576131a0612e50565b5b60006131af848285016130f6565b91505092915050565b6000806000606084860312156131d1576131d0612e50565b5b60006131df868287016130f6565b93505060206131f0868287016130f6565b925050604061320186828701613041565b9150509250925092565b6000806040838503121561322257613221612e50565b5b600061323085828601613041565b925050602061324185828601613041565b9150509250929050565b61325481613020565b82525050565b600060408201905061326f60008301856130b5565b61327c602083018461324b565b9392505050565b6000819050919050565b61329681613283565b81146132a157600080fd5b50565b6000813590506132b38161328d565b92915050565b6000602082840312156132cf576132ce612e50565b5b60006132dd848285016132a4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261330b5761330a6132e6565b5b8235905067ffffffffffffffff811115613328576133276132eb565b5b602083019150836020820283011115613344576133436132f0565b5b9250929050565b6000806000806060858703121561336557613364612e50565b5b600061337387828801613041565b945050602061338487828801612f2c565b935050604085013567ffffffffffffffff8111156133a5576133a4612e55565b5b6133b1878288016132f5565b925092505092959194509250565b60006020820190506133d4600083018461324b565b92915050565b6133e381613283565b82525050565b6000610100820190506133ff600083018b6133da565b61340c602083018a61324b565b613419604083018961324b565b613426606083018861324b565b613433608083018761324b565b61344060a083018661324b565b61344d60c0830185612eeb565b61345a60e0830184612eeb565b9998505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134a482612fb4565b810181811067ffffffffffffffff821117156134c3576134c261346c565b5b80604052505050565b60006134d6612e46565b90506134e2828261349b565b919050565b600067ffffffffffffffff8211156135025761350161346c565b5b61350b82612fb4565b9050602081019050919050565b82818337600083830152505050565b600061353a613535846134e7565b6134cc565b90508281526020810184848401111561355657613555613467565b5b613561848285613518565b509392505050565b600082601f83011261357e5761357d6132e6565b5b813561358e848260208601613527565b91505092915050565b6000602082840312156135ad576135ac612e50565b5b600082013567ffffffffffffffff8111156135cb576135ca612e55565b5b6135d784828501613569565b91505092915050565b600080604083850312156135f7576135f6612e50565b5b6000613605858286016130f6565b925050602061361685828601612f2c565b9150509250929050565b600060c08201905061363560008301896130b5565b613642602083018861324b565b61364f604083018761324b565b61365c606083018661324b565b6136696080830185612eeb565b61367660a0830184612eeb565b979650505050505050565b600067ffffffffffffffff82111561369c5761369b61346c565b5b6136a582612fb4565b9050602081019050919050565b60006136c56136c084613681565b6134cc565b9050828152602081018484840111156136e1576136e0613467565b5b6136ec848285613518565b509392505050565b600082601f830112613709576137086132e6565b5b81356137198482602086016136b2565b91505092915050565b6000806000806080858703121561373c5761373b612e50565b5b600061374a878288016130f6565b945050602061375b878288016130f6565b935050604061376c87828801613041565b925050606085013567ffffffffffffffff81111561378d5761378c612e55565b5b613799878288016136f4565b91505092959194509250565b60008083601f8401126137bb576137ba6132e6565b5b8235905067ffffffffffffffff8111156137d8576137d76132eb565b5b6020830191508360208202830111156137f4576137f36132f0565b5b9250929050565b60008083601f840112613811576138106132e6565b5b8235905067ffffffffffffffff81111561382e5761382d6132eb565b5b60208301915083600182028301111561384a576138496132f0565b5b9250929050565b60008060008060008060008060a0898b03121561387157613870612e50565b5b600061387f8b828c016130f6565b98505060206138908b828c016130f6565b975050604089013567ffffffffffffffff8111156138b1576138b0612e55565b5b6138bd8b828c016137a5565b9650965050606089013567ffffffffffffffff8111156138e0576138df612e55565b5b6138ec8b828c016137a5565b9450945050608089013567ffffffffffffffff81111561390f5761390e612e55565b5b61391b8b828c016137fb565b92509250509295985092959890939650565b61393681612e5a565b82525050565b6000602082019050613951600083018461392d565b92915050565b6000806040838503121561396e5761396d612e50565b5b600061397c858286016130f6565b925050602061398d858286016130f6565b9150509250929050565b60006040820190506139ac600083018561324b565b6139b96020830184612eeb565b9392505050565b60008060008060008060a087890312156139dd576139dc612e50565b5b60006139eb89828a016130f6565b96505060206139fc89828a016130f6565b9550506040613a0d89828a01613041565b9450506060613a1e89828a01613041565b935050608087013567ffffffffffffffff811115613a3f57613a3e612e55565b5b613a4b89828a016137fb565b92509250509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aa157607f821691505b602082108103613ab457613ab3613a5a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b16602183612f79565b9150613b2182613aba565b604082019050919050565b60006020820190508181036000830152613b4581613b09565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613ba8603e83612f79565b9150613bb382613b4c565b604082019050919050565b60006020820190508181036000830152613bd781613b9b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613c3a602e83612f79565b9150613c4582613bde565b604082019050919050565b60006020820190508181036000830152613c6981613c2d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caa82613020565b9150613cb583613020565b9250828202613cc381613020565b91508282048414831517613cda57613cd9613c70565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d1b82613020565b9150613d2683613020565b925082613d3657613d35613ce1565b5b828204905092915050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613d77601e83612f79565b9150613d8282613d41565b602082019050919050565b60006020820190508181036000830152613da681613d6a565b9050919050565b7f4e6f206163746976652073616c65730000000000000000000000000000000000600082015250565b6000613de3600f83612f79565b9150613dee82613dad565b602082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b6000613e2482613020565b9150613e2f83613020565b9250828201905080821115613e4757613e46613c70565b5b92915050565b6000613e5882613020565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e8a57613e89613c70565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ecb601883612f79565b9150613ed682613e95565b602082019050919050565b60006020820190508181036000830152613efa81613ebe565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f5d602983612f79565b9150613f6882613f01565b604082019050919050565b60006020820190508181036000830152613f8c81613f50565b9050919050565b7f4578636565647320617661696c61626c6520737570706c790000000000000000600082015250565b6000613fc9601883612f79565b9150613fd482613f93565b602082019050919050565b60006020820190508181036000830152613ff881613fbc565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614024565b61406b8683614024565b95508019841693508086168417925050509392505050565b6000819050919050565b60006140a86140a361409e84613020565b614083565b613020565b9050919050565b6000819050919050565b6140c28361408d565b6140d66140ce826140af565b848454614031565b825550505050565b600090565b6140eb6140de565b6140f68184846140b9565b505050565b5b8181101561411a5761410f6000826140e3565b6001810190506140fc565b5050565b601f82111561415f5761413081613fff565b61413984614014565b81016020851015614148578190505b61415c61415485614014565b8301826140fb565b50505b505050565b600082821c905092915050565b600061418260001984600802614164565b1980831691505092915050565b600061419b8383614171565b9150826002028217905092915050565b6141b482612f6e565b67ffffffffffffffff8111156141cd576141cc61346c565b5b6141d78254613a89565b6141e282828561411e565b600060209050601f8311600181146142155760008415614203578287015190505b61420d858261418f565b865550614275565b601f19841661422386613fff565b60005b8281101561424b57848901518255600182019150602085019450602081019050614226565b868310156142685784890151614264601f891682614171565b8355505b6001600288020188555050505b505050505050565b7f4e6f207472616e736665727320616c6c6f776564000000000000000000000000600082015250565b60006142b3601483612f79565b91506142be8261427d565b602082019050919050565b600060208201905081810360008301526142e2816142a6565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061431f601483612f79565b915061432a826142e9565b602082019050919050565b6000602082019050818103600083015261434e81614312565b9050919050565b600081905092915050565b6000815461436d81613a89565b6143778186614355565b9450600182166000811461439257600181146143a7576143da565b60ff19831686528115158202860193506143da565b6143b085613fff565b60005b838110156143d2578154818901526001820191506020810190506143b3565b838801955050505b50505092915050565b60006143ee82612f6e565b6143f88185614355565b9350614408818560208601612f8a565b80840191505092915050565b60006144208285614360565b915061442c82846143e3565b91508190509392505050565b7f57726f6e6720746f6b656e000000000000000000000000000000000000000000600082015250565b600061446e600b83612f79565b915061447982614438565b602082019050919050565b6000602082019050818103600083015261449d81614461565b9050919050565b7f4d6178203130206275726e73207065722077616c6c6574000000000000000000600082015250565b60006144da601783612f79565b91506144e5826144a4565b602082019050919050565b60006020820190508181036000830152614509816144cd565b9050919050565b7f4275726e20616d6f756e7420657863656564732074686520617661696c61626c60008201527f65206275726e61626c6520737570706c79000000000000000000000000000000602082015250565b600061456c603183612f79565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b60006060820190506145b760008301866130b5565b6145c4602083018561324b565b6145d1604083018461324b565b949350505050565b600081519050919050565b600081905092915050565b60006145fa826145d9565b61460481856145e4565b9350614614818560208601612f8a565b80840191505092915050565b600061462c82846145ef565b915081905092915050565b7f4275726e204661696c6564000000000000000000000000000000000000000000600082015250565b600061466d600b83612f79565b915061467882614637565b602082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b60006146ae82613020565b91506146b983613020565b92508282039050818111156146d1576146d0613c70565b5b92915050565b7f556e61626c6520746f207265636569766520746f6b656e730000000000000000600082015250565b600061470d601883612f79565b9150614718826146d7565b602082019050919050565b6000602082019050818103600083015261473c81614700565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061479f602683612f79565b91506147aa82614743565b604082019050919050565b600060208201905081810360008301526147ce81614792565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061480b602083612f79565b9150614816826147d5565b602082019050919050565b6000602082019050818103600083015261483a816147fe565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061489d602583612f79565b91506148a882614841565b604082019050919050565b600060208201905081810360008301526148cc81614890565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061492f602483612f79565b915061493a826148d3565b604082019050919050565b6000602082019050818103600083015261495e81614922565b9050919050565b7f5472616e7366657273206c6f636b656400000000000000000000000000000000600082015250565b600061499b601083612f79565b91506149a682614965565b602082019050919050565b600060208201905081810360008301526149ca8161498e565b9050919050565b7f546f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000614a07600e83612f79565b9150614a12826149d1565b602082019050919050565b60006020820190508181036000830152614a36816149fa565b9050919050565b7f4e6f2070726573616c6520616374697665000000000000000000000000000000600082015250565b6000614a73601183612f79565b9150614a7e82614a3d565b602082019050919050565b60006020820190508181036000830152614aa281614a66565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000614adf600e83612f79565b9150614aea82614aa9565b602082019050919050565b60006020820190508181036000830152614b0e81614ad2565b9050919050565b60008160601b9050919050565b6000614b2d82614b15565b9050919050565b6000614b3f82614b22565b9050919050565b614b57614b52826130a3565b614b34565b82525050565b6000614b698284614b46565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614bae600d83612f79565b9150614bb982614b78565b602082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b7f496e76616c696420747820616d6f756e74000000000000000000000000000000600082015250565b6000614c1a601183612f79565b9150614c2582614be4565b602082019050919050565b60006020820190508181036000830152614c4981614c0d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c86601983612f79565b9150614c9182614c50565b602082019050919050565b60006020820190508181036000830152614cb581614c79565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d18603283612f79565b9150614d2382614cbc565b604082019050919050565b60006020820190508181036000830152614d4781614d0b565b9050919050565b6000614d5982613020565b9150614d6483613020565b925082614d7457614d73613ce1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b6000614dca826145d9565b614dd48185614dae565b9350614de4818560208601612f8a565b614ded81612fb4565b840191505092915050565b6000608082019050614e0d60008301876130b5565b614e1a60208301866130b5565b614e27604083018561324b565b8181036060830152614e398184614dbf565b905095945050505050565b600081519050614e5381612e86565b92915050565b600060208284031215614e6f57614e6e612e50565b5b6000614e7d84828501614e44565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ebc602083612f79565b9150614ec782614e86565b602082019050919050565b60006020820190508181036000830152614eeb81614eaf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f28601c83612f79565b9150614f3382614ef2565b602082019050919050565b60006020820190508181036000830152614f5781614f1b565b905091905056fea2646970667358221220356776067f7940cea9e9cbb15f0bc549a4f3a2b392a2120ae395e6e8512128e664736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000045700000000000000000000000000000000000000000000000000000000000000084f6e65437550465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054355504650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d6235746d584d63736f3968776359725a354b384547597566543871427247374d62786469324d77436b55757a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d59657a434a373973795a4a44367462536177656a5766685463664d3765624c4b6254334334745633536e43500000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c806370a0823111610139578063aae732ad116100b6578063cdeee6371161007a578063cdeee637146108a4578063e8a3d485146108cd578063e985e9c5146108f8578063ea0d5dcd14610935578063f23a6e6114610973578063f2fde38b146109b057610251565b8063aae732ad146107a6578063ad2f852a146107d6578063b88d4fde14610801578063bc197c811461082a578063c87b56dd1461086757610251565b806391b7f5ed116100fd57806391b7f5ed146106d7578063940cd05b1461070057806395d89b4114610729578063a0bcfc7f14610754578063a22cb4651461077d57610251565b806370a08231146105eb578063717d57d3146106285780638b2c92ab146106515780638c74bf0e146106835780638da5cb5b146106ac57610251565b806323b872dd116101d2578063440bc7f311610196578063440bc7f3146104ec5780635183022714610515578063547520fe1461054057806354f83046146105695780636352211e146105855780636f8b44b0146105c257610251565b806323b872dd1461041c5780632a55205a146104455780633723eff6146104835780633ccfd60b146104ac57806342842e0e146104c357610251565b8063095ea7b311610219578063095ea7b31461034f5780630abaca7d146103785780630bc25355146103a15780630dd0a042146103ca5780631f842aa1146103f357610251565b806301ffc9a71461025657806305462f101461029357806306fdde03146102bc578063081812fc146102e7578063081c8c4414610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612eb2565b6109d9565b60405161028a9190612efa565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190612f41565b610a40565b005b3480156102c857600080fd5b506102d1610a65565b6040516102de9190612ffe565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613056565b610af7565b60405161031b91906130c4565b60405180910390f35b34801561033057600080fd5b50610339610b3d565b6040516103469190612ffe565b60405180910390f35b34801561035b57600080fd5b506103766004803603810190610371919061310b565b610bcb565b005b34801561038457600080fd5b5061039f600480360381019061039a919061314b565b610ce2565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612f41565b610d22565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612f41565b610d47565b005b3480156103ff57600080fd5b5061041a6004803603810190610415919061318b565b610d6c565b005b34801561042857600080fd5b50610443600480360381019061043e91906131b8565b610db8565b005b34801561045157600080fd5b5061046c6004803603810190610467919061320b565b610e18565b60405161047a92919061325a565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613056565b610e63565b005b3480156104b857600080fd5b506104c1610e75565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906131b8565b610ecd565b005b3480156104f857600080fd5b50610513600480360381019061050e91906132b9565b610eed565b005b34801561052157600080fd5b5061052a610eff565b6040516105379190612efa565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613056565b610f12565b005b610583600480360381019061057e919061334b565b610f24565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613056565b611058565b6040516105b991906130c4565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190613056565b611109565b005b3480156105f757600080fd5b50610612600480360381019061060d919061318b565b61111b565b60405161061f91906133bf565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613056565b6111d2565b005b34801561065d57600080fd5b506106666111e4565b60405161067a9897969594939291906133e9565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190613056565b61123c565b005b3480156106b857600080fd5b506106c16112de565b6040516106ce91906130c4565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613056565b611308565b005b34801561070c57600080fd5b5061072760048036038101906107229190612f41565b61131a565b005b34801561073557600080fd5b5061073e61133f565b60405161074b9190612ffe565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190613597565b6113d1565b005b34801561078957600080fd5b506107a4600480360381019061079f91906135e0565b6113ec565b005b3480156107b257600080fd5b506107bb611402565b6040516107cd96959493929190613620565b60405180910390f35b3480156107e257600080fd5b506107eb61146a565b6040516107f891906130c4565b60405180910390f35b34801561080d57600080fd5b5061082860048036038101906108239190613722565b611490565b005b34801561083657600080fd5b50610851600480360381019061084c9190613851565b6114f2565b60405161085e919061393c565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190613056565b61152f565b60405161089b9190612ffe565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c6919061318b565b611659565b005b3480156108d957600080fd5b506108e26116a5565b6040516108ef9190612ffe565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613957565b611737565b60405161092c9190612efa565b60405180910390f35b34801561094157600080fd5b5061095c6004803603810190610957919061318b565b6117cb565b60405161096a929190613997565b60405180910390f35b34801561097f57600080fd5b5061099a600480360381019061099591906139c0565b611864565b6040516109a7919061393c565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d2919061318b565b611ca9565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610a48611d2c565b80600e60016101000a81548160ff02191690831515021790555050565b606060028054610a7490613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090613a89565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000610b0282611daa565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60178054610b4a90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7690613a89565b8015610bc35780601f10610b9857610100808354040283529160200191610bc3565b820191906000526020600020905b815481529060010190602001808311610ba657829003601f168201915b505050505081565b6000610bd682611058565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90613b2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c65611df5565b73ffffffffffffffffffffffffffffffffffffffff161480610c945750610c9381610c8e611df5565b611737565b5b610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613bbe565b60405180910390fd5b610cdd8383611dfd565b505050565b610cea611d2c565b80601560006101000a81548160ff02191690831515021790555081601560016101000a81548160ff0219169083151502179055505050565b610d2a611d2c565b80600e60006101000a81548160ff02191690831515021790555050565b610d4f611d2c565b80600160006101000a81548160ff02191690831515021790555050565b610d74611d2c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dc9610dc3611df5565b82611eb6565b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613c50565b60405180910390fd5b610e13838383611f4b565b505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8605085610e4e9190613c9f565b610e589190613d10565b915091509250929050565b610e6b611d2c565b80600b8190555050565b610e7d611d2c565b610e856112de565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eca573d6000803e3d6000fd5b50565b610ee883838360405180602001604052806000815250611490565b505050565b610ef5611d2c565b80600f8190555050565b601860009054906101000a900460ff1681565b610f1a611d2c565b8060108190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990613d8d565b60405180910390fd5b601560009054906101000a900460ff1680610fb95750601560019054906101000a900460ff165b610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90613df9565b60405180910390fd5b61100484848484612201565b61100d57600080fd5b60005b848110156110515761102433601254612537565b6001601260008282546110379190613e19565b92505081905550808061104990613e4d565b915050611010565b5050505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f790613ee1565b60405180910390fd5b80915050919050565b611111611d2c565b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290613f73565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111da611d2c565b8060148190555050565b600080600080600080600080600f54601054601154601254601354601454601560009054906101000a900460ff16601560019054906101000a900460ff16975097509750975097509750975097509091929394959697565b611244611d2c565b601254816112529190613e19565b6011541015611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613fdf565b60405180910390fd5b60005b818110156112da576112ad33601254612537565b6001601260008282546112c09190613e19565b9250508190555080806112d290613e4d565b915050611299565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611310611d2c565b8060138190555050565b611322611d2c565b80601860006101000a81548160ff02191690831515021790555050565b60606003805461134e90613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461137a90613a89565b80156113c75780601f1061139c576101008083540402835291602001916113c7565b820191906000526020600020905b8154815290600101906020018083116113aa57829003601f168201915b5050505050905090565b6113d9611d2c565b80601690816113e891906141ab565b5050565b6113fe6113f7611df5565b8383612555565b5050565b600080600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546001600d54600e60009054906101000a900460ff16600e60019054906101000a900460ff16955095509550955095509550909192939495565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114a161149b611df5565b83611eb6565b6114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d790613c50565b60405180910390fd5b6114ec848484846126c1565b50505050565b60006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611526906142c9565b60405180910390fd5b606061153a8261271d565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614335565b60405180910390fd5b60001515601860009054906101000a900460ff1615150361162657601780546115a190613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90613a89565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050611654565b601661163183612789565b604051602001611642929190614414565b60405160208183030381529060405290505b919050565b611661611d2c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600880546116b490613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546116e090613a89565b801561172d5780601f106117025761010080835404028352916020019161172d565b820191906000526020600020905b81548152906001019060200180831161171057829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691509150915091565b6000600e60009054906101000a900460ff1615611c6457846001146118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590614484565b60405180910390fd5b6000849050600e60019054906101000a900460ff16156118e75784856118e49190613e19565b94505b600a81601a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119349190613e19565b1115611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c906144f0565b60405180910390fd5b600b5481600d546119869190613e19565b11156119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90614582565b60405180910390fd5b601154601254866119d89190613e19565b1115611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1090613fdf565b60405180910390fd5b80600d6000828254611a2b9190613e19565b9250508190555080601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a819190613e19565b925050819055506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1630600184604051602401611ad9939291906145a2565b6040516020818303038152906040527ff5298aca000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b639190614620565b6000604051808303816000865af19150503d8060008114611ba0576040519150601f19603f3d011682016040523d82523d6000602084013e611ba5565b606091505b5050905080611be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be090614683565b60405180910390fd5b60005b86811015611c3957600160126000828254611c079190613e19565b92505081905550611c26896001601254611c2191906146a3565b612537565b8080611c3190613e4d565b915050611bec565b507ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf9792505050611c9f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9690614723565b60405180910390fd5b9695505050505050565b611cb1611d2c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d17906147b5565b60405180910390fd5b611d29816128e9565b50565b611d34611df5565b73ffffffffffffffffffffffffffffffffffffffff16611d526112de565b73ffffffffffffffffffffffffffffffffffffffff1614611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f90614821565b60405180910390fd5b565b611db38161271d565b611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990613ee1565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7083611058565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ec283611058565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f045750611f038185611737565b5b80611f4257508373ffffffffffffffffffffffffffffffffffffffff16611f2a84610af7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6b82611058565b73ffffffffffffffffffffffffffffffffffffffff1614611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb8906148b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614945565b60405180910390fd5b600160009054906101000a900460ff1615612080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612077906149b1565b60405180910390fd5b61208b8383836129af565b612096600082611dfd565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e691906146a3565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461213d9190613e19565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fc8383836129b4565b505050565b6000601254856122119190613e19565b6011541015612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90613fdf565b60405180910390fd5b60105485111561229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190614a1d565b60405180910390fd5b83156124db57601560019054906101000a900460ff166122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690614a89565b60405180910390fd5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561237c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237390614af5565b60405180910390fd5b6123f0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f54336040516020016123d59190614b5d565b604051602081830303815290604052805190602001206129b9565b61242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614bc4565b60405180910390fd5b8460145461243d9190613c9f565b341461247e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247590614c30565b60405180910390fd5b6001601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061252b565b846013546124e99190613c9f565b341461252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252190614c30565b60405180910390fd5b5b60019050949350505050565b6125518282604051806020016040528060008152506129d0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90614c9c565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126b49190612efa565b60405180910390a3505050565b6126cc848484611f4b565b6126d884848484612a2b565b612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90614d2e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600082036127d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128e4565b600082905060005b600082146128025780806127eb90613e4d565b915050600a826127fb9190613d10565b91506127d8565b60008167ffffffffffffffff81111561281e5761281d61346c565b5b6040519080825280601f01601f1916602001820160405280156128505781602001600182028036833780820191505090505b5090505b600085146128dd5760018261286991906146a3565b9150600a856128789190614d4e565b60306128849190613e19565b60f81b81838151811061289a57612899614d7f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128d69190613d10565b9450612854565b8093505050505b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b6000826129c68584612bb2565b1490509392505050565b6129da8383612c08565b6129e76000848484612a2b565b612a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1d90614d2e565b60405180910390fd5b505050565b6000612a4c8473ffffffffffffffffffffffffffffffffffffffff16612de1565b15612ba5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a75611df5565b8786866040518563ffffffff1660e01b8152600401612a979493929190614df8565b6020604051808303816000875af1925050508015612ad357506040513d601f19601f82011682018060405250810190612ad09190614e59565b60015b612b55573d8060008114612b03576040519150601f19603f3d011682016040523d82523d6000602084013e612b08565b606091505b506000815103612b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4490614d2e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612baa565b600190505b949350505050565b60008082905060005b8451811015612bfd57612be882868381518110612bdb57612bda614d7f565b5b6020026020010151612e04565b91508080612bf590613e4d565b915050612bbb565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6e90614ed2565b60405180910390fd5b612c808161271d565b15612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790614f3e565b60405180910390fd5b612ccc600083836129af565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d1c9190613e19565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ddd600083836129b4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000818310612e1c57612e178284612e2f565b612e27565b612e268383612e2f565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e8f81612e5a565b8114612e9a57600080fd5b50565b600081359050612eac81612e86565b92915050565b600060208284031215612ec857612ec7612e50565b5b6000612ed684828501612e9d565b91505092915050565b60008115159050919050565b612ef481612edf565b82525050565b6000602082019050612f0f6000830184612eeb565b92915050565b612f1e81612edf565b8114612f2957600080fd5b50565b600081359050612f3b81612f15565b92915050565b600060208284031215612f5757612f56612e50565b5b6000612f6584828501612f2c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa8578082015181840152602081019050612f8d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fd082612f6e565b612fda8185612f79565b9350612fea818560208601612f8a565b612ff381612fb4565b840191505092915050565b600060208201905081810360008301526130188184612fc5565b905092915050565b6000819050919050565b61303381613020565b811461303e57600080fd5b50565b6000813590506130508161302a565b92915050565b60006020828403121561306c5761306b612e50565b5b600061307a84828501613041565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130ae82613083565b9050919050565b6130be816130a3565b82525050565b60006020820190506130d960008301846130b5565b92915050565b6130e8816130a3565b81146130f357600080fd5b50565b600081359050613105816130df565b92915050565b6000806040838503121561312257613121612e50565b5b6000613130858286016130f6565b925050602061314185828601613041565b9150509250929050565b6000806040838503121561316257613161612e50565b5b600061317085828601612f2c565b925050602061318185828601612f2c565b9150509250929050565b6000602082840312156131a1576131a0612e50565b5b60006131af848285016130f6565b91505092915050565b6000806000606084860312156131d1576131d0612e50565b5b60006131df868287016130f6565b93505060206131f0868287016130f6565b925050604061320186828701613041565b9150509250925092565b6000806040838503121561322257613221612e50565b5b600061323085828601613041565b925050602061324185828601613041565b9150509250929050565b61325481613020565b82525050565b600060408201905061326f60008301856130b5565b61327c602083018461324b565b9392505050565b6000819050919050565b61329681613283565b81146132a157600080fd5b50565b6000813590506132b38161328d565b92915050565b6000602082840312156132cf576132ce612e50565b5b60006132dd848285016132a4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261330b5761330a6132e6565b5b8235905067ffffffffffffffff811115613328576133276132eb565b5b602083019150836020820283011115613344576133436132f0565b5b9250929050565b6000806000806060858703121561336557613364612e50565b5b600061337387828801613041565b945050602061338487828801612f2c565b935050604085013567ffffffffffffffff8111156133a5576133a4612e55565b5b6133b1878288016132f5565b925092505092959194509250565b60006020820190506133d4600083018461324b565b92915050565b6133e381613283565b82525050565b6000610100820190506133ff600083018b6133da565b61340c602083018a61324b565b613419604083018961324b565b613426606083018861324b565b613433608083018761324b565b61344060a083018661324b565b61344d60c0830185612eeb565b61345a60e0830184612eeb565b9998505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134a482612fb4565b810181811067ffffffffffffffff821117156134c3576134c261346c565b5b80604052505050565b60006134d6612e46565b90506134e2828261349b565b919050565b600067ffffffffffffffff8211156135025761350161346c565b5b61350b82612fb4565b9050602081019050919050565b82818337600083830152505050565b600061353a613535846134e7565b6134cc565b90508281526020810184848401111561355657613555613467565b5b613561848285613518565b509392505050565b600082601f83011261357e5761357d6132e6565b5b813561358e848260208601613527565b91505092915050565b6000602082840312156135ad576135ac612e50565b5b600082013567ffffffffffffffff8111156135cb576135ca612e55565b5b6135d784828501613569565b91505092915050565b600080604083850312156135f7576135f6612e50565b5b6000613605858286016130f6565b925050602061361685828601612f2c565b9150509250929050565b600060c08201905061363560008301896130b5565b613642602083018861324b565b61364f604083018761324b565b61365c606083018661324b565b6136696080830185612eeb565b61367660a0830184612eeb565b979650505050505050565b600067ffffffffffffffff82111561369c5761369b61346c565b5b6136a582612fb4565b9050602081019050919050565b60006136c56136c084613681565b6134cc565b9050828152602081018484840111156136e1576136e0613467565b5b6136ec848285613518565b509392505050565b600082601f830112613709576137086132e6565b5b81356137198482602086016136b2565b91505092915050565b6000806000806080858703121561373c5761373b612e50565b5b600061374a878288016130f6565b945050602061375b878288016130f6565b935050604061376c87828801613041565b925050606085013567ffffffffffffffff81111561378d5761378c612e55565b5b613799878288016136f4565b91505092959194509250565b60008083601f8401126137bb576137ba6132e6565b5b8235905067ffffffffffffffff8111156137d8576137d76132eb565b5b6020830191508360208202830111156137f4576137f36132f0565b5b9250929050565b60008083601f840112613811576138106132e6565b5b8235905067ffffffffffffffff81111561382e5761382d6132eb565b5b60208301915083600182028301111561384a576138496132f0565b5b9250929050565b60008060008060008060008060a0898b03121561387157613870612e50565b5b600061387f8b828c016130f6565b98505060206138908b828c016130f6565b975050604089013567ffffffffffffffff8111156138b1576138b0612e55565b5b6138bd8b828c016137a5565b9650965050606089013567ffffffffffffffff8111156138e0576138df612e55565b5b6138ec8b828c016137a5565b9450945050608089013567ffffffffffffffff81111561390f5761390e612e55565b5b61391b8b828c016137fb565b92509250509295985092959890939650565b61393681612e5a565b82525050565b6000602082019050613951600083018461392d565b92915050565b6000806040838503121561396e5761396d612e50565b5b600061397c858286016130f6565b925050602061398d858286016130f6565b9150509250929050565b60006040820190506139ac600083018561324b565b6139b96020830184612eeb565b9392505050565b60008060008060008060a087890312156139dd576139dc612e50565b5b60006139eb89828a016130f6565b96505060206139fc89828a016130f6565b9550506040613a0d89828a01613041565b9450506060613a1e89828a01613041565b935050608087013567ffffffffffffffff811115613a3f57613a3e612e55565b5b613a4b89828a016137fb565b92509250509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aa157607f821691505b602082108103613ab457613ab3613a5a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b16602183612f79565b9150613b2182613aba565b604082019050919050565b60006020820190508181036000830152613b4581613b09565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613ba8603e83612f79565b9150613bb382613b4c565b604082019050919050565b60006020820190508181036000830152613bd781613b9b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613c3a602e83612f79565b9150613c4582613bde565b604082019050919050565b60006020820190508181036000830152613c6981613c2d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caa82613020565b9150613cb583613020565b9250828202613cc381613020565b91508282048414831517613cda57613cd9613c70565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d1b82613020565b9150613d2683613020565b925082613d3657613d35613ce1565b5b828204905092915050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613d77601e83612f79565b9150613d8282613d41565b602082019050919050565b60006020820190508181036000830152613da681613d6a565b9050919050565b7f4e6f206163746976652073616c65730000000000000000000000000000000000600082015250565b6000613de3600f83612f79565b9150613dee82613dad565b602082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b6000613e2482613020565b9150613e2f83613020565b9250828201905080821115613e4757613e46613c70565b5b92915050565b6000613e5882613020565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e8a57613e89613c70565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ecb601883612f79565b9150613ed682613e95565b602082019050919050565b60006020820190508181036000830152613efa81613ebe565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f5d602983612f79565b9150613f6882613f01565b604082019050919050565b60006020820190508181036000830152613f8c81613f50565b9050919050565b7f4578636565647320617661696c61626c6520737570706c790000000000000000600082015250565b6000613fc9601883612f79565b9150613fd482613f93565b602082019050919050565b60006020820190508181036000830152613ff881613fbc565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614024565b61406b8683614024565b95508019841693508086168417925050509392505050565b6000819050919050565b60006140a86140a361409e84613020565b614083565b613020565b9050919050565b6000819050919050565b6140c28361408d565b6140d66140ce826140af565b848454614031565b825550505050565b600090565b6140eb6140de565b6140f68184846140b9565b505050565b5b8181101561411a5761410f6000826140e3565b6001810190506140fc565b5050565b601f82111561415f5761413081613fff565b61413984614014565b81016020851015614148578190505b61415c61415485614014565b8301826140fb565b50505b505050565b600082821c905092915050565b600061418260001984600802614164565b1980831691505092915050565b600061419b8383614171565b9150826002028217905092915050565b6141b482612f6e565b67ffffffffffffffff8111156141cd576141cc61346c565b5b6141d78254613a89565b6141e282828561411e565b600060209050601f8311600181146142155760008415614203578287015190505b61420d858261418f565b865550614275565b601f19841661422386613fff565b60005b8281101561424b57848901518255600182019150602085019450602081019050614226565b868310156142685784890151614264601f891682614171565b8355505b6001600288020188555050505b505050505050565b7f4e6f207472616e736665727320616c6c6f776564000000000000000000000000600082015250565b60006142b3601483612f79565b91506142be8261427d565b602082019050919050565b600060208201905081810360008301526142e2816142a6565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061431f601483612f79565b915061432a826142e9565b602082019050919050565b6000602082019050818103600083015261434e81614312565b9050919050565b600081905092915050565b6000815461436d81613a89565b6143778186614355565b9450600182166000811461439257600181146143a7576143da565b60ff19831686528115158202860193506143da565b6143b085613fff565b60005b838110156143d2578154818901526001820191506020810190506143b3565b838801955050505b50505092915050565b60006143ee82612f6e565b6143f88185614355565b9350614408818560208601612f8a565b80840191505092915050565b60006144208285614360565b915061442c82846143e3565b91508190509392505050565b7f57726f6e6720746f6b656e000000000000000000000000000000000000000000600082015250565b600061446e600b83612f79565b915061447982614438565b602082019050919050565b6000602082019050818103600083015261449d81614461565b9050919050565b7f4d6178203130206275726e73207065722077616c6c6574000000000000000000600082015250565b60006144da601783612f79565b91506144e5826144a4565b602082019050919050565b60006020820190508181036000830152614509816144cd565b9050919050565b7f4275726e20616d6f756e7420657863656564732074686520617661696c61626c60008201527f65206275726e61626c6520737570706c79000000000000000000000000000000602082015250565b600061456c603183612f79565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b60006060820190506145b760008301866130b5565b6145c4602083018561324b565b6145d1604083018461324b565b949350505050565b600081519050919050565b600081905092915050565b60006145fa826145d9565b61460481856145e4565b9350614614818560208601612f8a565b80840191505092915050565b600061462c82846145ef565b915081905092915050565b7f4275726e204661696c6564000000000000000000000000000000000000000000600082015250565b600061466d600b83612f79565b915061467882614637565b602082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b60006146ae82613020565b91506146b983613020565b92508282039050818111156146d1576146d0613c70565b5b92915050565b7f556e61626c6520746f207265636569766520746f6b656e730000000000000000600082015250565b600061470d601883612f79565b9150614718826146d7565b602082019050919050565b6000602082019050818103600083015261473c81614700565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061479f602683612f79565b91506147aa82614743565b604082019050919050565b600060208201905081810360008301526147ce81614792565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061480b602083612f79565b9150614816826147d5565b602082019050919050565b6000602082019050818103600083015261483a816147fe565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061489d602583612f79565b91506148a882614841565b604082019050919050565b600060208201905081810360008301526148cc81614890565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061492f602483612f79565b915061493a826148d3565b604082019050919050565b6000602082019050818103600083015261495e81614922565b9050919050565b7f5472616e7366657273206c6f636b656400000000000000000000000000000000600082015250565b600061499b601083612f79565b91506149a682614965565b602082019050919050565b600060208201905081810360008301526149ca8161498e565b9050919050565b7f546f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000614a07600e83612f79565b9150614a12826149d1565b602082019050919050565b60006020820190508181036000830152614a36816149fa565b9050919050565b7f4e6f2070726573616c6520616374697665000000000000000000000000000000600082015250565b6000614a73601183612f79565b9150614a7e82614a3d565b602082019050919050565b60006020820190508181036000830152614aa281614a66565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000614adf600e83612f79565b9150614aea82614aa9565b602082019050919050565b60006020820190508181036000830152614b0e81614ad2565b9050919050565b60008160601b9050919050565b6000614b2d82614b15565b9050919050565b6000614b3f82614b22565b9050919050565b614b57614b52826130a3565b614b34565b82525050565b6000614b698284614b46565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614bae600d83612f79565b9150614bb982614b78565b602082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b7f496e76616c696420747820616d6f756e74000000000000000000000000000000600082015250565b6000614c1a601183612f79565b9150614c2582614be4565b602082019050919050565b60006020820190508181036000830152614c4981614c0d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c86601983612f79565b9150614c9182614c50565b602082019050919050565b60006020820190508181036000830152614cb581614c79565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d18603283612f79565b9150614d2382614cbc565b604082019050919050565b60006020820190508181036000830152614d4781614d0b565b9050919050565b6000614d5982613020565b9150614d6483613020565b925082614d7457614d73613ce1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b6000614dca826145d9565b614dd48185614dae565b9350614de4818560208601612f8a565b614ded81612fb4565b840191505092915050565b6000608082019050614e0d60008301876130b5565b614e1a60208301866130b5565b614e27604083018561324b565b8181036060830152614e398184614dbf565b905095945050505050565b600081519050614e5381612e86565b92915050565b600060208284031215614e6f57614e6e612e50565b5b6000614e7d84828501614e44565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ebc602083612f79565b9150614ec782614e86565b602082019050919050565b60006020820190508181036000830152614eeb81614eaf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f28601c83612f79565b9150614f3382614ef2565b602082019050919050565b60006020820190508181036000830152614f5781614f1b565b905091905056fea2646970667358221220356776067f7940cea9e9cbb15f0bc549a4f3a2b392a2120ae395e6e8512128e664736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000045700000000000000000000000000000000000000000000000000000000000000084f6e65437550465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054355504650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d6235746d584d63736f3968776359725a354b384547597566543871427247374d62786469324d77436b55757a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d59657a434a373973795a4a44367462536177656a5766685463664d3765624c4b6254334334745633536e43500000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): OneCuPFP
Arg [1] : symbol (string): CUPFP
Arg [2] : _notRevealedUri (string): https://ipfs.filebase.io/ipfs/Qmb5tmXMcso9hwcYrZ5K8EGYufT8qBrG7Mbxdi2MwCkUuz
Arg [3] : contractUri (string): https://ipfs.filebase.io/ipfs/QmYezCJ79syZJD6tbSawejWfhTcfM7ebLKbT3C4tV3SnCP
Arg [4] : _burnSupply (uint256): 1111

-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000457
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4f6e654375504650000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 4355504650000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [10] : 68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d
Arg [11] : 6235746d584d63736f3968776359725a354b384547597566543871427247374d
Arg [12] : 62786469324d77436b55757a0000000000000000000000000000000000000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [14] : 68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d
Arg [15] : 59657a434a373973795a4a44367462536177656a5766685463664d3765624c4b
Arg [16] : 6254334334745633536e43500000000000000000000000000000000000000000


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.