ETH Price: $3,159.95 (+2.56%)

Token

Copium Is One Helluva Drug (COPIUM)
 

Overview

Max Total Supply

6,969 COPIUM

Holders

179

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 COPIUM
0xf7949b6a49ce4784b26ca6d80e80625dc769ba06
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:
CopiumDen

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : CopiumDen.sol
// SPDX-License-Identifier: UNLICENSE
// Creator: 0xYeety; Based Pixel Labs/Yeety Labs; 1 yeet = 1 yeet; 1 cope = 1 cope
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "./ERC721Storage.sol";
import "./ENSResolver.sol";
import "./RoyaltyReceiver.sol";

////--------------------------------------------------------------------||||
////--------------------------------------------------------------------||||
////    ________    ____  __    __    ____     ____     _____   _____   ||||
////   ||  ||  ||  ||  ||  \\  //    //   \   //  \\   ||   \\ ||       ||||
////   ||  ||  ||  ||__||   \\//    //       //    \\  ||___// ||___    ||||
////   ||  ||  ||  ||  ||   //\\    \\       \\    //  ||      ||       ||||
////   ||      ||  ||  || _//  \\_   \\___/   \\__//   ||      ||____   ||||
////____________________________________________________________________||||
////____________________________________________________________________||||

contract CopiumDen is Ownable, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    string public PROVENANCE;
    bool provenanceSet;

    string private contractURI_;

    uint256 public mintPrice;
    uint256 public maxPossibleSupply;
    uint256 public maxAllowedMints;

    uint256 royaltyBasisPoints;

    address public immutable currency;
    address public immutable wrappedNativeCoinAddress;

    RoyaltyReceiver royaltyReceiver;
    ENSResolver resolver;
    ERC721Storage storageLayer;

    address private signerAddress;

    bool public _metadataFrozen = false;

    mapping(address => bool) public agreements;
    uint256 numAgreements = 0;

    enum MintStatus {
        NotStarted,
        Public,
        Finished
    }

    MintStatus public mintStatus = MintStatus.NotStarted;

    uint256 numPayees;
    mapping(uint256 => address) private indexer;
    mapping(address => uint256) public earningsSplit;
    mapping(address => uint256) public balances;

    //////////

    mapping(uint256 => mapping(address => uint256)) public listings;

    struct OfferData {
        string openBrk;
        address addr;
        uint256 offer;
        uint256 pos;
        string closeBrk;
    }
    mapping(uint256 => mapping(address => uint256)) public offers;
    mapping(uint256 => mapping(uint256 => address)) public offerAddressPositions;
    mapping(uint256 => uint256) public offerCounts;

    event Sale(address _from, address _to, uint256 _price);


    /**
     * @dev Throws if called by any account other than a royalty receiver/payee.
     */
    modifier onlyPayee() {
        _isPayee();
        _;
    }

    /**
     * @dev Throws if the sender is not on the royalty receiver/payee list.
     */
    function _isPayee() internal view virtual {
        require(earningsSplit[_msgSender()] > 0, "not a royalty payee");
    }

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _maxPossibleSupply,
        uint256 _mintPrice,
        uint256 _royaltyBasisPoints,
        uint256 _maxAllowedMints,
        address _currency,
        address _wrappedNativeCoinAddress,
        address _royaltyReceiverAddress,
        address[] memory payees,
        uint256[] memory percentages
    ) {
        require(payees.length == percentages.length, "length mismatch");
        numPayees = payees.length;
        for (uint i = 0; i < numPayees; i++) {
            indexer[i] = payees[i];
            earningsSplit[payees[i]] = percentages[i];
        }
        maxPossibleSupply = _maxPossibleSupply;
        mintPrice = _mintPrice;
        royaltyBasisPoints = _royaltyBasisPoints;
        maxAllowedMints = _maxAllowedMints;
        currency = _currency;
        wrappedNativeCoinAddress = _wrappedNativeCoinAddress;

        resolver = new ENSResolver();

        storageLayer = new ERC721Storage(
            _name,
            _symbol,
            _maxAllowedMints,
            _mintPrice,
            _maxPossibleSupply,
            _currency,
            _wrappedNativeCoinAddress
        );

        royaltyReceiver = RoyaltyReceiver(payable(_royaltyReceiverAddress));
    }

    function _ENSResolverAddress() public view returns (address) {
        return address(resolver);
    }

    function _ERC721StorageAddress() public view returns (address) {
        return address(storageLayer);
    }

    function _RoyaltyReceiverAddress() public view returns (address) {
        return address(royaltyReceiver);
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        contractURI_ = _contractURI;
    }

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        interfaceId == type(IERC721Enumerable).interfaceId ||
        super.supportsInterface(interfaceId);
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        require(!provenanceSet);
        PROVENANCE = provenanceHash;
        provenanceSet = true;
    }

    function freezeMetadata() public onlyOwner {
        _metadataFrozen = true;
    }

    function metadataFrozen() public view returns (bool) {
        return _metadataFrozen;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        require(!_metadataFrozen, "mf");
        storageLayer._setBaseURI(baseURI);
    }

    function revealMetadata() public onlyOwner {
        storageLayer._revealMetadata();
    }

    function changeMintStatus(MintStatus _status) external onlyOwner {
        require(_status != MintStatus.NotStarted && mintStatus != MintStatus.NotStarted);
        mintStatus = _status;
    }

    function agreeToMint() external onlyPayee {
        require(!(agreements[msg.sender]), "already agreed");
        agreements[msg.sender] = true;
        numAgreements += 1;
        if (numAgreements == numPayees) {
            mintStatus = MintStatus.Public;
        }
    }

    function giftMint(uint amount, address to) public payable {
        _mint(amount, address(msg.sender), to);
    }

    function giftMintENS(uint amount, string memory ENSAddr) public payable {
        address to = resolver.resolve(ENSAddr);
        _mint(amount, address(msg.sender), to);
    }

    function mintPublic(uint amount) public payable {
        _mint(amount, address(0), address(msg.sender));
    }

    function _mint(uint _amount, address _from, address _to) internal {
        require(mintStatus == MintStatus.Public, "s");

        storageLayer.mintFn(msg.sender, _amount, _from, _to, msg.value);

        uint256 value = msg.value;
        uint256 split = value/100;
        for (uint256 i = 0; i < numPayees; i++) {
            uint256 allocation = split*(earningsSplit[indexer[i]]);
            balances[indexer[i]] += allocation;
            value -= allocation;
        }
        balances[indexer[0]] += value;

        if (totalSupply() == maxPossibleSupply) {
            mintStatus = MintStatus.Finished;
        }
    }

    // Marketplace functionality ====================
    function MKT_list(uint256 tokenId, uint256 price) public {
        require(ownerOf(tokenId) == msg.sender, "mbo");
        require(price > 0, "zp");
        listings[tokenId][msg.sender] = price;
    }

    function MKT_deList(uint256 tokenId) public {
        require(ownerOf(tokenId) == msg.sender && listings[tokenId][msg.sender] > 0, "mbo;nl");
        listings[tokenId][msg.sender] = 0;
    }

    function MKT_buy(uint256 tokenId) public payable {
        address tokenOwner = ownerOf(tokenId);
        require(listings[tokenId][tokenOwner] > 0 && tokenOwner != msg.sender, "nl;io");
        require(listings[tokenId][tokenOwner] == msg.value, "wp");
        listings[tokenId][tokenOwner] = 0;
        payForSale(msg.value, tokenOwner);
        storageLayer.transferBySale(tokenOwner, msg.sender, tokenId);
        emit Sale(tokenOwner, msg.sender, msg.value);
    }

    function MKT_isListed(uint256 tokenId) public view returns (bool) {
        return (listings[tokenId][ownerOf(tokenId)] > 0);
    }

    function MKT_getPrice(uint256 tokenId) public view returns (uint256) {
        require(listings[tokenId][ownerOf(tokenId)] > 0, "nl");
        return listings[tokenId][ownerOf(tokenId)];
    }

    //////////

    function MKT_makeOffer(uint256 tokenId, uint256 price) public payable {
        require(ownerOf(tokenId) != msg.sender, "io");

        // Check if there is already an offer
        uint256 currentOffer = offers[tokenId][msg.sender];

        // Check that the supplied funds are sufficient to update the price
        require(currentOffer + msg.value == price, "ifa");

        if (currentOffer == 0) {
            offerAddressPositions[tokenId][offerCounts[tokenId]] = msg.sender;
            offerCounts[tokenId] += 1;
        }

        offers[tokenId][msg.sender] = price;
    }

    function mkt_deleteOfferInternal(uint256 tokenId, address offerer, uint256 position) private {
        offers[tokenId][offerer] = 0;

        uint256 lastIndex = offerCounts[tokenId] - 1;
        offerAddressPositions[tokenId][position] = offerAddressPositions[tokenId][lastIndex];
        offerAddressPositions[tokenId][lastIndex] = address(0);
        offerCounts[tokenId] -= 1;
    }

    function MKT_cancelOffer(uint256 tokenId, uint256 position) public {
        uint256 currentOffer = offers[tokenId][msg.sender];
        require(offerAddressPositions[tokenId][position] == msg.sender && currentOffer != 0, "no/odne");

        mkt_deleteOfferInternal(tokenId, msg.sender, position);
        (bool success, ) = payable(msg.sender).call{value: currentOffer}("");
        require(success, "tf");
    }

    function MKT_acceptOffer(uint256 tokenId, address offerer, uint256 price, uint256 position) public {
        uint256 currentOffer = offers[tokenId][offerer];
        if (msg.sender == offerer && offerer == ownerOf(tokenId)) {
            mkt_deleteOfferInternal(tokenId, msg.sender, position);
            (bool success, ) = payable(msg.sender).call{value: currentOffer}("");
            require(success, "tf");
        }
        else {
            require(ownerOf(tokenId) == msg.sender && currentOffer != 0
            && currentOffer == price && offerer == offerAddressPositions[tokenId][position], "mbo/odne/wp1/wp2");

            mkt_deleteOfferInternal(tokenId, offerer, position);
            payForSale(currentOffer, msg.sender);

            listings[tokenId][msg.sender] = 0;
            storageLayer.transferBySale(msg.sender, offerer, tokenId);
            emit Sale(msg.sender, offerer, currentOffer);
        }
    }

    function MKT_getOffers(uint256 tokenId) public view returns (OfferData[] memory) {
        OfferData[] memory offerList = new OfferData[](offerCounts[tokenId]);

        for (uint i = 0; i < offerCounts[tokenId]; i++) {
            address addr_i = offerAddressPositions[tokenId][i];
            OfferData memory od = OfferData({openBrk: "[", addr: addr_i, offer: offers[tokenId][addr_i], pos: i, closeBrk: "]"});
            offerList[i] = od;
        }

        return offerList;
    }

    function MKT_getHighestOffer(uint256 tokenId) public view returns (OfferData memory) {
        uint256 highestOffer = 0;
        address highestOfferAddress = address(0);
        uint256 highestPos = 0;

        for (uint i = 0; i < offerCounts[tokenId]; i++) {
            address addr_i = offerAddressPositions[tokenId][i];
            if (offers[tokenId][addr_i] > highestOffer) {
                highestOffer = offers[tokenId][addr_i];
                highestOfferAddress = addr_i;
                highestPos = i;
            }
        }

        return OfferData({openBrk: "[", addr: highestOfferAddress, offer: highestOffer, pos: highestPos, closeBrk: "]"});
    }

    ////////////////////////////////////////


    function payForSale(uint256 paymentValue, address paymentReceiver) private {
        uint256 royaltyPayment = ((paymentValue/100)*royaltyBasisPoints)/100;
        (bool success1, ) = payable(address(royaltyReceiver)).call{value: royaltyPayment}("");
        require(success1, "t1f");
        (bool success2, ) = payable(paymentReceiver).call{value: paymentValue - royaltyPayment}("");
        require(success2, "t2f");
    }

    receive() external payable {
        mintPublic(msg.value / mintPrice);
    }

    function withdraw() external onlyPayee() {
        uint256 amount = balances[msg.sender];
        balances[msg.sender] = 0;
        (bool success, ) = payable(msg.sender).call{value:amount}("");
        require(success, "tf");
    }

    function withdrawTokens(address tokenAddress) external onlyOwner() {
        IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this)));
    }

    ////////////////////////////////////////

    // ERC721 Required Functionality

    function balanceOf(address owner) public view virtual override returns (uint256) {
        return storageLayer.balanceOf(owner);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
        storageLayer.safeTransferFrom(msg.sender, from, to, tokenId, _data);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override {
        storageLayer.safeTransferFrom(msg.sender, from, to, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override {
        storageLayer.transferFrom(msg.sender, from, to, tokenId);
    }

    function approve(address to, uint256 tokenId) public override {
        storageLayer.approve(msg.sender, to, tokenId);
    }

    function setApprovalForAll(address operator, bool approved) public override {
        storageLayer.setApprovalForAll(msg.sender, operator, approved);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        return storageLayer.getApproved(tokenId);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return storageLayer.isApprovedForAll(owner, operator);
    }

    //////////

    // Extra 721A Functionality

    function totalSupply() public view virtual override returns (uint256) {
        return storageLayer.totalSupply();
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return storageLayer.ownerOf(tokenId);
    }

    function name() external view override returns (string memory) {
        return storageLayer.name();
    }

    function symbol() external view override returns (string memory) {
        return storageLayer.symbol();
    }

    function tokenByIndex(uint256 index) external view override returns (uint256) {
        return storageLayer.tokenByIndex(index);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) external view override returns (uint256) {
        return storageLayer.tokenOfOwnerByIndex(owner, index);
    }

    function tokenURI(uint256 tokenId) external view override returns (string memory) {
        return storageLayer.tokenURI(tokenId);
    }

    ////////////////////////////////////////

    function emitTransfer(address _from, address _to, uint256 _tokenId) public {
        emit Transfer(_from, _to, _tokenId);
    }

    function emitApproval(address _owner, address _approved, uint256 _tokenId) public {
        emit Approval(_owner, _approved, _tokenId);
    }

    function emitApprovalForAll(address _owner, address _operator, bool _approved) public {
        emit ApprovalForAll(_owner, _operator, _approved);
    }
}

File 2 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

File 3 of 15 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "../../utils/introspection/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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

    /**
     * @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 5 of 15 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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 6 of 15 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 7 of 15 : ERC721Storage.sol
// SPDX-License-Identifier: UNLICENSE
// Creator: 0xYeety; Based Pixel Labs/Yeety Labs; 1 yeet = 1 yeet; 1 cope = 1 cope
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721Storage is Ownable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;
    bool revealed = false;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;


    uint256 private mintPrice;
    uint256 private maxPossibleSupply;
    uint256 private maxAllowedMints;
    address private immutable currency;
    address private immutable wrappedNativeCoinAddress;

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 mintPrice_,
        uint256 maxPossibleSupply_,
        address currency_,
        address wrappedNativeCoinAddress_
    ) {
        require(maxBatchSize_ > 0, "b");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        mintPrice = mintPrice_;
        maxPossibleSupply = maxPossibleSupply_;
        currency = currency_;
        wrappedNativeCoinAddress = wrappedNativeCoinAddress_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual returns (uint256) {
        require(index < totalSupply(), "g");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) {
        require(index < balanceOf(owner), "b");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("u");
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "0");
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "0");
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), "t");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("o");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(_exists(tokenId), "z");

        if (revealed) {
            return bytes(_baseURI).length > 0 ? string(abi.encodePacked(_baseURI, "/", tokenId.toString(), ".json")) : "";
        }
        else {
            return _baseURI;
        }
    }

    /**
     * @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 overriden in child contracts.
     */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) public virtual onlyOwner {
        _baseURI = baseURI_;
    }

    function _revealMetadata() public virtual onlyOwner {
        revealed = true;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address msgSender, address to, uint256 tokenId) public onlyOwner {
        address owner = ownerOf(tokenId);
        require(to != owner, "o");

        require(
            msgSender == owner || isApprovedForAll(owner, msgSender),
            "a"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "a");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address msgSender, address operator, bool approved) public onlyOwner {
        require(operator != msgSender, "a");

        _operatorApprovals[msgSender][operator] = approved;
//        emit ApprovalForAll(msgSender, operator, approved);
        ERC721TopLevel(msg.sender).emitApprovalForAll(msgSender, operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address msgSender,
        address from,
        address to,
        uint256 tokenId
    ) public onlyOwner {
        _transfer(msgSender, from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address msgSender,
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public onlyOwner {
        _transfer(msgSender, from, to, tokenId);
        require(
            _checkOnERC721Received(msgSender, from, to, tokenId, _data),
            "z"
        );
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address msgSender, address from, address to, uint256 quantity) public onlyOwner {
        _safeMint(msgSender, from, to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits either one or two {Transfer} events, depending on the
     * values of {from} and {to}.
     */
    function _safeMint(
        address msgSender,
        address from,
        address to,
        uint256 quantity,
        bytes memory _data
    ) public onlyOwner {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "0");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "a");
        require(quantity <= maxBatchSize, "m");

        if (from != address(0)) {
            _beforeTokenTransfers(address(0), from, startTokenId, quantity);
        }
        if (from != to) {
            _beforeTokenTransfers(from, to, startTokenId, quantity);
        }

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            if (from != address(0)) {
                ERC721TopLevel(msg.sender).emitTransfer(address(0), from, updatedIndex);
            }
            if (from != to) {
                ERC721TopLevel(msg.sender).emitTransfer(from, to, updatedIndex);
            }
            require(
                _checkOnERC721Received(msgSender, address(0), from, updatedIndex, _data) && _checkOnERC721Received(msgSender, from, to, updatedIndex, _data),
                "z"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        if (from != address(0)) {
            _afterTokenTransfers(address(0), from, startTokenId, quantity);
        }
        if (from != to) {
            _afterTokenTransfers(from, to, startTokenId, quantity);
        }
    }

    function mintFn(
        address msgSender,
        uint _amount,
        address _from,
        address _to,
        uint256 _msgValue
    ) public onlyOwner {
        require(totalSupply() + _amount <= maxPossibleSupply, "m");
        require(_numberMinted(_to) + _amount <= maxBatchSize, "l");

        if (currency == wrappedNativeCoinAddress) {
            if (address(msg.sender) != owner()) {
                require(mintPrice * _amount <= _msgValue, "a");
            }
        }
        else {
            IERC20 _currency = IERC20(currency);
            _currency.transferFrom(msg.sender, address(msg.sender), _amount * mintPrice);
        }

        _safeMint(msgSender, _from, _to, _amount);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transferMain(address from, address to, uint256 tokenId, TokenOwnership memory prevOwnership) private {
        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // De-list item if it was previously listed

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

        ERC721TopLevel(msg.sender).emitTransfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function _transfer(
        address msgSender,
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (msgSender == prevOwnership.addr ||
        getApproved(tokenId) == msgSender ||
        isApprovedForAll(prevOwnership.addr, msgSender));

        require(isApprovedOrOwner, "a");

        require(prevOwnership.addr == from, "o");
        require(to != address(0), "0");

        _transferMain(from, to, tokenId, prevOwnership);
    }

    /**
     * Called only by the owner's marketplace functions
     */
//    function transferBySale(
//        address from,
//        address to,
//        uint256 tokenId
//    ) public onlyOwner {
//        _transfer(msg.sender, from, to, tokenId);
//    }
    function transferBySale(
        address from,
        address to,
        uint256 tokenId
    ) public onlyOwner {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _transferMain(from, to, tokenId, prevOwnership);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
//        emit Approval(owner, to, tokenId);
        ERC721TopLevel(msg.sender).emitApproval(owner, to, tokenId);
    }

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "q");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > currentIndex - 1) {
            endIndex = currentIndex - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "n");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(ownership.addr, ownership.startTimestamp);
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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 msgSender,
        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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("z");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

abstract contract ERC721TopLevel {
    function emitTransfer(address _from, address _to, uint256 _tokenId) public virtual;
    function emitApproval(address _owner, address _approved, uint256 _tokenId) public virtual;
    function emitApprovalForAll(address _owner, address _operator, bool _approved) public virtual;

//    function isListed(uint256 tokenId) public virtual returns (bool);
    function deList(uint256 tokenId) public virtual;
}

File 8 of 15 : ENSResolver.sol
// SPDX-License-Identifier: UNLICENSE
// Creator: 0xYeety; Based Pixel Labs/Yeety Labs; 1 yeet = 1 yeet; 1 cope = 1 cope
pragma solidity ^0.8.7;

contract ENSResolver {
    // Same address for Mainnet, Ropsten, Rinkerby, Gorli and other networks;
    ENS ens = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e);

    function computeNameHash(bytes memory _name) private pure returns (bytes32 nameHash) {
        nameHash = 0x0000000000000000000000000000000000000000000000000000000000000000;
        nameHash = keccak256(abi.encodePacked(keccak256(abi.encodePacked(nameHash, keccak256(abi.encodePacked("eth")))),keccak256(abi.encodePacked(_name))));
    }

    function resolve(string memory _name) public virtual view returns (address) {
        bytes memory name = abi.encodePacked(_name);
        uint nameLength = name.length;
        require(nameLength > 7, "impossible ENS address");
        require(
            name[nameLength-4] == 0x2E &&
            name[nameLength-3] == 0x65 &&
            name[nameLength-2] == 0x74 &&
            name[nameLength-1] == 0x68,
            "ENS name must end with \".eth\""
        );

        bytes memory strippedName = new bytes(nameLength-4);
        for (uint i = 0; i < nameLength-4; i++) {
            strippedName[i] = name[i];
        }

        Resolver resolver = ens.resolver(computeNameHash(strippedName));
        return resolver.addr(computeNameHash(strippedName));
    }
}

abstract contract ENS {
    function resolver(bytes32 node) public virtual view returns (Resolver);
}

abstract contract Resolver {
    function addr(bytes32 node) public virtual view returns (address);
}

File 9 of 15 : RoyaltyReceiver.sol
// SPDX-License-Identifier: UNLICENSE
// Creator: 0xYeety; Based Pixel Labs/Yeety Labs; 1 yeet = 1 yeet; 1 cope = 1 cope
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract RoyaltyReceiver is Ownable {
    uint256 numPayees;
    mapping(uint256 => address) private indexer;
    mapping(address => uint256) public royaltySplit;
    mapping(address => uint256) public balances;

    string public name;

    /**
     * @dev Throws if called by any account other than a royalty receiver/payee.
     */
    modifier onlyPayee() {
        _isPayee();
        _;
    }

    /**
     * @dev Throws if the sender is not on the royalty receiver/payee list.
     */
    function _isPayee() internal view virtual {
        require(royaltySplit[address(msg.sender)] > 0, "not a royalty payee");
    }

    constructor(string memory _name, address[] memory payees, uint256[] memory percentages) {
        require(payees.length == percentages.length, "lengths must match");
        numPayees = payees.length;
        for (uint i = 0; i < numPayees; i++) {
            indexer[i] = payees[i];
            royaltySplit[payees[i]] = percentages[i];
            balances[payees[i]] = 0;
        }
        name = _name;
    }

    receive() external payable {
        uint256 value = msg.value;
        uint256 split = value/100;
        for (uint256 i = 0; i < numPayees; i++) {
            uint256 allocation = split*(royaltySplit[indexer[i]]);
            balances[indexer[i]] += allocation;
            value -= allocation;
        }
        balances[indexer[0]] += value;
    }

    function withdraw() external onlyPayee() {
        uint256 amount = balances[msg.sender];
        balances[msg.sender] = 0;
        (bool success, ) = payable(msg.sender).call{value:amount}("");
        require(success, "Transfer failed.");
    }

    function withdrawTokens(address tokenAddress) external onlyOwner() {
        IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this)));
    }

    function messageSender() public view returns (address) {
        return msg.sender;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

/**
 * @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 13 of 15 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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

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

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

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxPossibleSupply","type":"uint256"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_royaltyBasisPoints","type":"uint256"},{"internalType":"uint256","name":"_maxAllowedMints","type":"uint256"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"address","name":"_wrappedNativeCoinAddress","type":"address"},{"internalType":"address","name":"_royaltyReceiverAddress","type":"address"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"percentages","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":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"Sale","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"MKT_acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MKT_buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"MKT_cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MKT_deList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MKT_getHighestOffer","outputs":[{"components":[{"internalType":"string","name":"openBrk","type":"string"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"offer","type":"uint256"},{"internalType":"uint256","name":"pos","type":"uint256"},{"internalType":"string","name":"closeBrk","type":"string"}],"internalType":"struct CopiumDen.OfferData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MKT_getOffers","outputs":[{"components":[{"internalType":"string","name":"openBrk","type":"string"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"offer","type":"uint256"},{"internalType":"uint256","name":"pos","type":"uint256"},{"internalType":"string","name":"closeBrk","type":"string"}],"internalType":"struct CopiumDen.OfferData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MKT_getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MKT_isListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"MKT_list","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"MKT_makeOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ENSResolverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ERC721StorageAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_RoyaltyReceiverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"agreeToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"agreements","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum CopiumDen.MintStatus","name":"_status","type":"uint8"}],"name":"changeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earningsSplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"emitApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"emitApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"emitTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"giftMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"ENSAddr","type":"string"}],"name":"giftMintENS","outputs":[],"stateMutability":"payable","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":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"listings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPossibleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"enum CopiumDen.MintStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"offerAddressPositions","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offerCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"offers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNativeCoinAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600b60146101000a81548160ff0219169083151502179055506000600d556000600e60006101000a81548160ff021916908360028111156200004d576200004c62000b83565b5b02179055503480156200005f57600080fd5b506040516200c27c3803806200c27c8339818101604052810190620000859190620006c3565b620000a562000099620003d360201b60201c565b620003db60201b60201c565b8051825114620000ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e39062000961565b60405180910390fd5b8151600f8190555060005b600f54811015620002055782818151811062000118576200011762000bb2565b5b60200260200101516010600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081818151811062000187576200018662000bb2565b5b602002602001015160116000858481518110620001a957620001a862000bb2565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080620001fc9062000b06565b915050620000f7565b50886005819055508760048190555086600781905550856006819055508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250506040516200029e906200049f565b604051809103906000f080158015620002bb573d6000803e3d6000fd5b50600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a8a878a8c89896040516200031190620004ad565b620003239796959493929190620008d6565b604051809103906000f08015801562000340573d6000803e3d6000fd5b50600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050505050505062000c97565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c588062006cb583390190565b61496f806200790d83390190565b6000620004d2620004cc84620009ac565b62000983565b90508083825260208201905082856020860282011115620004f857620004f762000c15565b5b60005b858110156200052c5781620005118882620005fc565b845260208401935060208301925050600181019050620004fb565b5050509392505050565b60006200054d6200054784620009db565b62000983565b9050808382526020820190508285602086028201111562000573576200057262000c15565b5b60005b85811015620005a757816200058c8882620006ac565b84526020840193506020830192505060018101905062000576565b5050509392505050565b6000620005c8620005c28462000a0a565b62000983565b905082815260208101848484011115620005e757620005e662000c1a565b5b620005f484828562000a9a565b509392505050565b6000815190506200060d8162000c63565b92915050565b600082601f8301126200062b576200062a62000c10565b5b81516200063d848260208601620004bb565b91505092915050565b600082601f8301126200065e576200065d62000c10565b5b81516200067084826020860162000536565b91505092915050565b600082601f83011262000691576200069062000c10565b5b8151620006a3848260208601620005b1565b91505092915050565b600081519050620006bd8162000c7d565b92915050565b60008060008060008060008060008060006101608c8e031215620006ec57620006eb62000c24565b5b60008c015167ffffffffffffffff8111156200070d576200070c62000c1f565b5b6200071b8e828f0162000679565b9b505060208c015167ffffffffffffffff8111156200073f576200073e62000c1f565b5b6200074d8e828f0162000679565b9a50506040620007608e828f01620006ac565b9950506060620007738e828f01620006ac565b9850506080620007868e828f01620006ac565b97505060a0620007998e828f01620006ac565b96505060c0620007ac8e828f01620005fc565b95505060e0620007bf8e828f01620005fc565b945050610100620007d38e828f01620005fc565b9350506101208c015167ffffffffffffffff811115620007f857620007f762000c1f565b5b620008068e828f0162000613565b9250506101408c015167ffffffffffffffff8111156200082b576200082a62000c1f565b5b620008398e828f0162000646565b9150509295989b509295989b9093969950565b620008578162000a5c565b82525050565b60006200086a8262000a40565b62000876818562000a4b565b93506200088881856020860162000a9a565b620008938162000c29565b840191505092915050565b6000620008ad600f8362000a4b565b9150620008ba8262000c3a565b602082019050919050565b620008d08162000a90565b82525050565b600060e0820190508181036000830152620008f2818a6200085d565b905081810360208301526200090881896200085d565b9050620009196040830188620008c5565b620009286060830187620008c5565b620009376080830186620008c5565b6200094660a08301856200084c565b6200095560c08301846200084c565b98975050505050505050565b600060208201905081810360008301526200097c816200089e565b9050919050565b60006200098f620009a2565b90506200099d828262000ad0565b919050565b6000604051905090565b600067ffffffffffffffff821115620009ca57620009c962000be1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620009f957620009f862000be1565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a285762000a2762000be1565b5b62000a338262000c29565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600062000a698262000a70565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000aba57808201518184015260208101905062000a9d565b8381111562000aca576000848401525b50505050565b62000adb8262000c29565b810181811067ffffffffffffffff8211171562000afd5762000afc62000be1565b5b80604052505050565b600062000b138262000a90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000b495762000b4862000b54565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b62000c6e8162000a5c565b811462000c7a57600080fd5b50565b62000c888162000a90565b811462000c9457600080fd5b50565b60805160601c60a05160601c615ff262000cc3600039600061338f0152600061375a0152615ff26000f3fe6080604052600436106103c75760003560e01c8063715018a6116101f2578063c43f0c161161010d578063e9591537116100a0578063f2fde38b1161006f578063f2fde38b14610e70578063f37858ee14610e99578063faa2883014610ed6578063fb3cc6c214610f01576103e4565b8063e959153714610dbe578063e985e9c514610dda578063ebdfbce514610e17578063efd0cbf914610e54576103e4565b8063d111515d116100dc578063d111515d14610d26578063e5a6b10f14610d3d578063e7064f3514610d68578063e8a3d48514610d93576103e4565b8063c43f0c1614610c58578063c87b56dd14610c81578063ca0adb8314610cbe578063cbce2df914610cfb576103e4565b8063938e3d7b11610185578063acdb47a011610154578063acdb47a014610b8a578063b5ca58e514610bc7578063b88d4fde14610bf2578063c07296fa14610c1b576103e4565b8063938e3d7b14610ae257806395d89b4114610b0b5780639da3f8fd14610b36578063a22cb46514610b61576103e4565b80638da5cb5b116101c15780638da5cb5b14610a475780638f566abb14610a725780639182a9df14610a8e578063927fbfc814610aa5576103e4565b8063715018a6146109b357806374b79e33146109ca5780637cac2602146109f55780638a4db2b714610a1e576103e4565b80633ccfd60b116102e257806355c45fbe116102755780636373a6b1116102445780636373a6b1146108f75780636817c76c14610922578063702325dd1461094d57806370a0823114610976576103e4565b806355c45fbe1461083f57806355f804b3146108685780635687f2b8146108915780636352211e146108ba576103e4565b806344fead9e116102b157806344fead9e14610771578063487481911461079c57806349df728c146107d95780634f6ccce714610802576103e4565b80633ccfd60b146106d85780633ce2aa99146106ef5780633fffe2311461072c57806342842e0e14610748576103e4565b806318160ddd1161035a578063265484a911610329578063265484a91461060a57806327e235e3146106335780632f745c5914610670578063386b7691146106ad576103e4565b806318160ddd146105715780631bd6048f1461059c57806323b872dd146105b857806323de6651146105e1576103e4565b8063095ea7b311610396578063095ea7b3146104cb5780630b7a2925146104f4578063109695231461050b57806316f916f214610534576103e4565b8063011289e1146103e957806301ffc9a71461042657806306fdde0314610463578063081812fc1461048e576103e4565b366103e4576103e2600454346103dd9190615883565b610f2c565b005b600080fd5b3480156103f557600080fd5b50610410600480360381019061040b91906147e3565b610f3b565b60405161041d91906156fe565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190614a53565b610f53565b60405161045a9190615424565b60405180910390f35b34801561046f57600080fd5b5061047861109d565b604051610485919061545a565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190614b3f565b611149565b6040516104c29190615235565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed91906149e6565b6111fd565b005b34801561050057600080fd5b50610509611292565b005b34801561051757600080fd5b50610532600480360381019061052d9190614aad565b6113d3565b005b34801561054057600080fd5b5061055b60048036038101906105569190614b3f565b61149e565b60405161056891906156fe565b60405180910390f35b34801561057d57600080fd5b5061058661159a565b60405161059391906156fe565b60405180910390f35b6105b660048036038101906105b19190614b3f565b611641565b005b3480156105c457600080fd5b506105df60048036038101906105da91906148d0565b6118db565b005b3480156105ed57600080fd5b50610608600480360381019061060391906148d0565b611973565b005b34801561061657600080fd5b50610631600480360381019061062c9190614c9c565b6119d3565b005b34801561063f57600080fd5b5061065a600480360381019061065591906147e3565b611ae5565b60405161066791906156fe565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906149e6565b611afd565b6040516106a491906156fe565b60405180910390f35b3480156106b957600080fd5b506106c2611bb4565b6040516106cf91906156fe565b60405180910390f35b3480156106e457600080fd5b506106ed611bba565b005b3480156106fb57600080fd5b50610716600480360381019061071191906147e3565b611cfb565b6040516107239190615424565b60405180910390f35b61074660048036038101906107419190614c40565b611d1b565b005b34801561075457600080fd5b5061076f600480360381019061076a91906148d0565b611dda565b005b34801561077d57600080fd5b50610786611e72565b60405161079391906156fe565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614b3f565b611e78565b6040516107d09190615402565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb91906147e3565b612085565b005b34801561080e57600080fd5b5061082960048036038101906108249190614b3f565b61221a565b60405161083691906156fe565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061487d565b6122ce565b005b34801561087457600080fd5b5061088f600480360381019061088a9190614aad565b612338565b005b34801561089d57600080fd5b506108b860048036038101906108b391906148d0565b612494565b005b3480156108c657600080fd5b506108e160048036038101906108dc9190614b3f565b6124f4565b6040516108ee9190615235565b60405180910390f35b34801561090357600080fd5b5061090c6125a8565b604051610919919061545a565b60405180910390f35b34801561092e57600080fd5b50610937612636565b60405161094491906156fe565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190614c9c565b61263c565b005b34801561098257600080fd5b5061099d600480360381019061099891906147e3565b61280d565b6040516109aa91906156fe565b60405180910390f35b3480156109bf57600080fd5b506109c86128c1565b005b3480156109d657600080fd5b506109df612949565b6040516109ec9190615235565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190614a80565b612973565b005b348015610a2a57600080fd5b50610a456004803603810190610a409190614bd9565b612a8e565b005b348015610a5357600080fd5b50610a5c612e5b565b604051610a699190615235565b60405180910390f35b610a8c6004803603810190610a879190614b99565b612e84565b005b348015610a9a57600080fd5b50610aa3612e93565b005b348015610ab157600080fd5b50610acc6004803603810190610ac79190614b99565b612f93565b604051610ad991906156fe565b60405180910390f35b348015610aee57600080fd5b50610b096004803603810190610b049190614aad565b612fb8565b005b348015610b1757600080fd5b50610b2061304e565b604051610b2d919061545a565b60405180910390f35b348015610b4257600080fd5b50610b4b6130fa565b604051610b58919061543f565b60405180910390f35b348015610b6d57600080fd5b50610b886004803603810190610b8391906149a6565b61310d565b005b348015610b9657600080fd5b50610bb16004803603810190610bac9190614b3f565b6131a2565b604051610bbe91906156dc565b60405180910390f35b348015610bd357600080fd5b50610bdc61338d565b604051610be99190615235565b60405180910390f35b348015610bfe57600080fd5b50610c196004803603810190610c149190614923565b6133b1565b005b348015610c2757600080fd5b50610c426004803603810190610c3d9190614b3f565b61344c565b604051610c4f91906156fe565b60405180910390f35b348015610c6457600080fd5b50610c7f6004803603810190610c7a9190614b3f565b613464565b005b348015610c8d57600080fd5b50610ca86004803603810190610ca39190614b3f565b61358f565b604051610cb5919061545a565b60405180910390f35b348015610cca57600080fd5b50610ce56004803603810190610ce09190614b3f565b613648565b604051610cf29190615424565b60405180910390f35b348015610d0757600080fd5b50610d106136ac565b604051610d1d9190615424565b60405180910390f35b348015610d3257600080fd5b50610d3b6136bf565b005b348015610d4957600080fd5b50610d52613758565b604051610d5f9190615235565b60405180910390f35b348015610d7457600080fd5b50610d7d61377c565b604051610d8a9190615235565b60405180910390f35b348015610d9f57600080fd5b50610da86137a6565b604051610db5919061545a565b60405180910390f35b610dd86004803603810190610dd39190614c9c565b613838565b005b348015610de657600080fd5b50610e016004803603810190610dfc919061483d565b613a56565b604051610e0e9190615424565b60405180910390f35b348015610e2357600080fd5b50610e3e6004803603810190610e399190614b99565b613b0d565b604051610e4b91906156fe565b60405180910390f35b610e6e6004803603810190610e699190614b3f565b610f2c565b005b348015610e7c57600080fd5b50610e976004803603810190610e9291906147e3565b613b32565b005b348015610ea557600080fd5b50610ec06004803603810190610ebb9190614c9c565b613c2a565b604051610ecd9190615235565b60405180910390f35b348015610ee257600080fd5b50610eeb613c6c565b604051610ef89190615235565b60405180910390f35b348015610f0d57600080fd5b50610f16613c96565b604051610f239190615424565b60405180910390f35b610f3881600033613cad565b50565b60116020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061101e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061108657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611096575061109582613fd6565b5b9050919050565b6060600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b15801561110757600080fd5b505afa15801561111b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111449190614af6565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081812fc836040518263ffffffff1660e01b81526004016111a691906156fe565b60206040518083038186803b1580156111be57600080fd5b505afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190614810565b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1f21c673384846040518463ffffffff1660e01b815260040161125c9392919061534f565b600060405180830381600087803b15801561127657600080fd5b505af115801561128a573d6000803e3d6000fd5b505050505050565b61129a614040565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906156bc565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000828254611392919061582d565b92505081905550600f54600d5414156113d1576001600e60006101000a81548160ff021916908360028111156113cb576113ca615b27565b5b02179055505b565b6113db6140cb565b73ffffffffffffffffffffffffffffffffffffffff166113f9612e5b565b73ffffffffffffffffffffffffffffffffffffffff161461144f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114469061557c565b60405180910390fd5b600260009054906101000a900460ff161561146957600080fd5b806001908051906020019061147f929190614503565b506001600260006101000a81548160ff02191690831515021790555050565b6000806013600084815260200190815260200160002060006114bf856124f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061567c565b60405180910390fd5b601360008381526020019081526020016000206000611558846124f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561160457600080fd5b505afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190614b6c565b905090565b600061164c826124f4565b905060006013600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156116da57503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611710906155dc565b60405180910390fd5b346013600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a2906154fc565b60405180910390fd5b60006013600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061180b34826140d3565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e78e3cea8233856040518463ffffffff1660e01b815260040161186a9392919061534f565b600060405180830381600087803b15801561188457600080fd5b505af1158015611898573d6000803e3d6000fd5b505050507f3f3483d0995db4c081e0101ef6753bef457833c20605cd871de61dcb48085a9a8133346040516118cf9392919061534f565b60405180910390a15050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea338585856040518563ffffffff1660e01b815260040161193c9493929190615279565b600060405180830381600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b50505050505050565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff166119f3836124f4565b73ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a409061569c565b60405180910390fd5b60008111611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a839061565c565b60405180910390fd5b806013600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60126020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984846040518363ffffffff1660e01b8152600401611b5c929190615386565b60206040518083038186803b158015611b7457600080fd5b505afa158015611b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bac9190614b6c565b905092915050565b60055481565b611bc2614040565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff1682604051611c7190615220565b60006040518083038185875af1925050503d8060008114611cae576040519150601f19603f3d011682016040523d82523d6000602084013e611cb3565b606091505b5050905080611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee906154bc565b60405180910390fd5b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663461a4478836040518263ffffffff1660e01b8152600401611d78919061545a565b60206040518083038186803b158015611d9057600080fd5b505afa158015611da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc89190614810565b9050611dd5833383613cad565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d9fc4b61338585856040518563ffffffff1660e01b8152600401611e3b9493929190615279565b600060405180830381600087803b158015611e5557600080fd5b505af1158015611e69573d6000803e3d6000fd5b50505050505050565b60065481565b60606000601660008481526020019081526020016000205467ffffffffffffffff811115611ea957611ea8615bb4565b5b604051908082528060200260200182016040528015611ee257816020015b611ecf614589565b815260200190600190039081611ec75790505b50905060005b601660008581526020019081526020016000205481101561207b57600060156000868152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006040518060a001604052806040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525081526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016014600089815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018481526020016040518060400160405280600181526020017f5d0000000000000000000000000000000000000000000000000000000000000081525081525090508084848151811061205b5761205a615b85565b5b60200260200101819052505050808061207390615a80565b915050611ee8565b5080915050919050565b61208d6140cb565b73ffffffffffffffffffffffffffffffffffffffff166120ab612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f89061557c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121579190615235565b60206040518083038186803b15801561216f57600080fd5b505afa158015612183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a79190614b6c565b6040518363ffffffff1660e01b81526004016121c4929190615386565b602060405180830381600087803b1580156121de57600080fd5b505af11580156121f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122169190614a26565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f6ccce7836040518263ffffffff1660e01b815260040161227791906156fe565b60206040518083038186803b15801561228f57600080fd5b505afa1580156122a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c79190614b6c565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161232b9190615424565b60405180910390a3505050565b6123406140cb565b73ffffffffffffffffffffffffffffffffffffffff1661235e612e5b565b73ffffffffffffffffffffffffffffffffffffffff16146123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab9061557c565b60405180910390fd5b600b60149054906101000a900460ff1615612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb906155bc565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331b5b907826040518263ffffffff1660e01b815260040161245f919061545a565b600060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b5050505050565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161255191906156fe565b60206040518083038186803b15801561256957600080fd5b505afa15801561257d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a19190614810565b9050919050565b600180546125b590615a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546125e190615a1d565b801561262e5780601f106126035761010080835404028352916020019161262e565b820191906000526020600020905b81548152906001019060200180831161261157829003601f168201915b505050505081565b60045481565b60006014600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660156000858152602001908152602001600020600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015612711575060008114155b612750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612747906155fc565b60405180910390fd5b61275b833384614289565b60003373ffffffffffffffffffffffffffffffffffffffff168260405161278190615220565b60006040518083038185875af1925050503d80600081146127be576040519150601f19603f3d011682016040523d82523d6000602084013e6127c3565b606091505b5050905080612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe906154bc565b60405180910390fd5b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161286a9190615235565b60206040518083038186803b15801561288257600080fd5b505afa158015612896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ba9190614b6c565b9050919050565b6128c96140cb565b73ffffffffffffffffffffffffffffffffffffffff166128e7612e5b565b73ffffffffffffffffffffffffffffffffffffffff161461293d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129349061557c565b60405180910390fd5b612947600061443f565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61297b6140cb565b73ffffffffffffffffffffffffffffffffffffffff16612999612e5b565b73ffffffffffffffffffffffffffffffffffffffff16146129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e69061557c565b60405180910390fd5b60006002811115612a0357612a02615b27565b5b816002811115612a1657612a15615b27565b5b14158015612a58575060006002811115612a3357612a32615b27565b5b600e60009054906101000a900460ff166002811115612a5557612a54615b27565b5b14155b612a6157600080fd5b80600e60006101000a81548160ff02191690836002811115612a8657612a85615b27565b5b021790555050565b60006014600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015612b515750612b22856124f4565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612c1357612b61853384614289565b60003373ffffffffffffffffffffffffffffffffffffffff1682604051612b8790615220565b60006040518083038185875af1925050503d8060008114612bc4576040519150601f19603f3d011682016040523d82523d6000602084013e612bc9565b606091505b5050905080612c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c04906154bc565b60405180910390fd5b50612e54565b3373ffffffffffffffffffffffffffffffffffffffff16612c33866124f4565b73ffffffffffffffffffffffffffffffffffffffff16148015612c57575060008114155b8015612c6257508281145b8015612cdd575060156000868152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d139061561c565b60405180910390fd5b612d27858584614289565b612d3181336140d3565b60006013600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e78e3cea3386886040518463ffffffff1660e01b8152600401612de69392919061534f565b600060405180830381600087803b158015612e0057600080fd5b505af1158015612e14573d6000803e3d6000fd5b505050507f3f3483d0995db4c081e0101ef6753bef457833c20605cd871de61dcb48085a9a338583604051612e4b9392919061534f565b60405180910390a15b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612e8f823383613cad565b5050565b612e9b6140cb565b73ffffffffffffffffffffffffffffffffffffffff16612eb9612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614612f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f069061557c565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315495ffe6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f7957600080fd5b505af1158015612f8d573d6000803e3d6000fd5b50505050565b6013602052816000526040600020602052806000526040600020600091509150505481565b612fc06140cb565b73ffffffffffffffffffffffffffffffffffffffff16612fde612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614613034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302b9061557c565b60405180910390fd5b806003908051906020019061304a929190614503565b5050565b6060600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156130b857600080fd5b505afa1580156130cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906130f59190614af6565b905090565b600e60009054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663367605ca3384846040518463ffffffff1660e01b815260040161316c93929190615318565b600060405180830381600087803b15801561318657600080fd5b505af115801561319a573d6000803e3d6000fd5b505050505050565b6131aa614589565b6000806000805b60166000878152602001908152602001600020548110156132db57600060156000888152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050846014600089815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156132c7576014600088815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205494508093508192505b5080806132d390615a80565b9150506131b1565b506040518060a001604052806040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525081526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018281526020016040518060400160405280600181526020017f5d000000000000000000000000000000000000000000000000000000000000008152508152509350505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d8bf0c533868686866040518663ffffffff1660e01b81526004016134149594939291906152be565b600060405180830381600087803b15801561342e57600080fd5b505af1158015613442573d6000803e3d6000fd5b5050505050505050565b60166020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff16613484826124f4565b73ffffffffffffffffffffffffffffffffffffffff161480156134f7575060006013600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b613536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352d9061559c565b60405180910390fd5b60006013600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6060600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016135ec91906156fe565b60006040518083038186803b15801561360457600080fd5b505afa158015613618573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906136419190614af6565b9050919050565b600080601360008481526020019081526020016000206000613669856124f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b600b60149054906101000a900460ff1681565b6136c76140cb565b73ffffffffffffffffffffffffffffffffffffffff166136e5612e5b565b73ffffffffffffffffffffffffffffffffffffffff161461373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137329061557c565b60405180910390fd5b6001600b60146101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546137b590615a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546137e190615a1d565b801561382e5780601f106138035761010080835404028352916020019161382e565b820191906000526020600020905b81548152906001019060200180831161381157829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16613858836124f4565b73ffffffffffffffffffffffffffffffffffffffff1614156138af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a69061551c565b60405180910390fd5b60006014600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050813482613911919061582d565b14613951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139489061549c565b60405180910390fd5b60008114156139fc57336015600085815260200190815260200160002060006016600087815260200190815260200160002054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016016600085815260200190815260200160002060008282546139f4919061582d565b925050819055505b816014600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c584846040518363ffffffff1660e01b8152600401613ab5929190615250565b60206040518083038186803b158015613acd57600080fd5b505afa158015613ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b059190614a26565b905092915050565b6014602052816000526040600020602052806000526040600020600091509150505481565b613b3a6140cb565b73ffffffffffffffffffffffffffffffffffffffff16613b58612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614613bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ba59061557c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c15906154dc565b60405180910390fd5b613c278161443f565b50565b60156020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60149054906101000a900460ff16905090565b60016002811115613cc157613cc0615b27565b5b600e60009054906101000a900460ff166002811115613ce357613ce2615b27565b5b14613d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d1a9061553c565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633454c4d633858585346040518663ffffffff1660e01b8152600401613d869594939291906153af565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505060003490506000606482613dcc9190615883565b905060005b600f54811015613f08576000601160006010600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613e5b91906158b4565b905080601260006010600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613edf919061582d565b925050819055508084613ef2919061590e565b9350508080613f0090615a80565b915050613dd1565b5081601260006010600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f8b919061582d565b92505081905550600554613f9d61159a565b1415613fcf576002600e60006101000a81548160ff02191690836002811115613fc957613fc8615b27565b5b02179055505b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006011600061404e6140cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116140c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c09061547c565b60405180910390fd5b565b600033905090565b600060646007546064856140e79190615883565b6140f191906158b4565b6140fb9190615883565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161414590615220565b60006040518083038185875af1925050503d8060008114614182576040519150601f19603f3d011682016040523d82523d6000602084013e614187565b606091505b50509050806141cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141c29061555c565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1683866141f0919061590e565b6040516141fc90615220565b60006040518083038185875af1925050503d8060008114614239576040519150601f19603f3d011682016040523d82523d6000602084013e61423e565b606091505b5050905080614282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142799061563c565b60405180910390fd5b5050505050565b60006014600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060016016600086815260200190815260200160002054614301919061590e565b905060156000858152602001908152602001600020600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660156000868152602001908152602001600020600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060156000868152602001908152602001600020600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601660008681526020019081526020016000206000828254614432919061590e565b9250508190555050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805461450f90615a1d565b90600052602060002090601f0160209004810192826145315760008555614578565b82601f1061454a57805160ff1916838001178555614578565b82800160010185558215614578579182015b8281111561457757825182559160200191906001019061455c565b5b50905061458591906145ce565b5090565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b5b808211156145e75760008160009055506001016145cf565b5090565b60006145fe6145f98461573e565b615719565b90508281526020810184848401111561461a57614619615be8565b5b6146258482856159db565b509392505050565b600061464061463b8461576f565b615719565b90508281526020810184848401111561465c5761465b615be8565b5b6146678482856159db565b509392505050565b600061468261467d8461576f565b615719565b90508281526020810184848401111561469e5761469d615be8565b5b6146a98482856159ea565b509392505050565b6000813590506146c081615f50565b92915050565b6000815190506146d581615f50565b92915050565b6000813590506146ea81615f67565b92915050565b6000815190506146ff81615f67565b92915050565b60008135905061471481615f7e565b92915050565b600082601f83011261472f5761472e615be3565b5b813561473f8482602086016145eb565b91505092915050565b60008135905061475781615f95565b92915050565b600082601f83011261477257614771615be3565b5b813561478284826020860161462d565b91505092915050565b600082601f8301126147a05761479f615be3565b5b81516147b084826020860161466f565b91505092915050565b6000813590506147c881615fa5565b92915050565b6000815190506147dd81615fa5565b92915050565b6000602082840312156147f9576147f8615bf2565b5b6000614807848285016146b1565b91505092915050565b60006020828403121561482657614825615bf2565b5b6000614834848285016146c6565b91505092915050565b6000806040838503121561485457614853615bf2565b5b6000614862858286016146b1565b9250506020614873858286016146b1565b9150509250929050565b60008060006060848603121561489657614895615bf2565b5b60006148a4868287016146b1565b93505060206148b5868287016146b1565b92505060406148c6868287016146db565b9150509250925092565b6000806000606084860312156148e9576148e8615bf2565b5b60006148f7868287016146b1565b9350506020614908868287016146b1565b9250506040614919868287016147b9565b9150509250925092565b6000806000806080858703121561493d5761493c615bf2565b5b600061494b878288016146b1565b945050602061495c878288016146b1565b935050604061496d878288016147b9565b925050606085013567ffffffffffffffff81111561498e5761498d615bed565b5b61499a8782880161471a565b91505092959194509250565b600080604083850312156149bd576149bc615bf2565b5b60006149cb858286016146b1565b92505060206149dc858286016146db565b9150509250929050565b600080604083850312156149fd576149fc615bf2565b5b6000614a0b858286016146b1565b9250506020614a1c858286016147b9565b9150509250929050565b600060208284031215614a3c57614a3b615bf2565b5b6000614a4a848285016146f0565b91505092915050565b600060208284031215614a6957614a68615bf2565b5b6000614a7784828501614705565b91505092915050565b600060208284031215614a9657614a95615bf2565b5b6000614aa484828501614748565b91505092915050565b600060208284031215614ac357614ac2615bf2565b5b600082013567ffffffffffffffff811115614ae157614ae0615bed565b5b614aed8482850161475d565b91505092915050565b600060208284031215614b0c57614b0b615bf2565b5b600082015167ffffffffffffffff811115614b2a57614b29615bed565b5b614b368482850161478b565b91505092915050565b600060208284031215614b5557614b54615bf2565b5b6000614b63848285016147b9565b91505092915050565b600060208284031215614b8257614b81615bf2565b5b6000614b90848285016147ce565b91505092915050565b60008060408385031215614bb057614baf615bf2565b5b6000614bbe858286016147b9565b9250506020614bcf858286016146b1565b9150509250929050565b60008060008060808587031215614bf357614bf2615bf2565b5b6000614c01878288016147b9565b9450506020614c12878288016146b1565b9350506040614c23878288016147b9565b9250506060614c34878288016147b9565b91505092959194509250565b60008060408385031215614c5757614c56615bf2565b5b6000614c65858286016147b9565b925050602083013567ffffffffffffffff811115614c8657614c85615bed565b5b614c928582860161475d565b9150509250929050565b60008060408385031215614cb357614cb2615bf2565b5b6000614cc1858286016147b9565b9250506020614cd2858286016147b9565b9150509250929050565b6000614ce88383615108565b905092915050565b614cf981615942565b82525050565b614d0881615942565b82525050565b6000614d19826157b0565b614d2381856157de565b935083602082028501614d35856157a0565b8060005b85811015614d715784840389528151614d528582614cdc565b9450614d5d836157d1565b925060208a01995050600181019050614d39565b50829750879550505050505092915050565b614d8c81615954565b82525050565b6000614d9d826157bb565b614da781856157ef565b9350614db78185602086016159ea565b614dc081615bf7565b840191505092915050565b614dd4816159c9565b82525050565b6000614de5826157c6565b614def818561580b565b9350614dff8185602086016159ea565b614e0881615bf7565b840191505092915050565b6000614e1e826157c6565b614e28818561581c565b9350614e388185602086016159ea565b614e4181615bf7565b840191505092915050565b6000614e5960138361581c565b9150614e6482615c08565b602082019050919050565b6000614e7c60038361581c565b9150614e8782615c31565b602082019050919050565b6000614e9f60028361581c565b9150614eaa82615c5a565b602082019050919050565b6000614ec260268361581c565b9150614ecd82615c83565b604082019050919050565b6000614ee560028361581c565b9150614ef082615cd2565b602082019050919050565b6000614f0860028361581c565b9150614f1382615cfb565b602082019050919050565b6000614f2b60018361581c565b9150614f3682615d24565b602082019050919050565b6000614f4e60038361581c565b9150614f5982615d4d565b602082019050919050565b6000614f7160208361581c565b9150614f7c82615d76565b602082019050919050565b6000614f9460068361581c565b9150614f9f82615d9f565b602082019050919050565b6000614fb760028361581c565b9150614fc282615dc8565b602082019050919050565b6000614fda60058361581c565b9150614fe582615df1565b602082019050919050565b6000614ffd60078361581c565b915061500882615e1a565b602082019050919050565b6000615020600083615800565b915061502b82615e43565b600082019050919050565b600061504360108361581c565b915061504e82615e46565b602082019050919050565b600061506660038361581c565b915061507182615e6f565b602082019050919050565b600061508960028361581c565b915061509482615e98565b602082019050919050565b60006150ac60028361581c565b91506150b782615ec1565b602082019050919050565b60006150cf60038361581c565b91506150da82615eea565b602082019050919050565b60006150f2600e8361581c565b91506150fd82615f13565b602082019050919050565b600060a08301600083015184820360008601526151258282614dda565b915050602083015161513a6020860182614cf0565b50604083015161514d6040860182615202565b5060608301516151606060860182615202565b50608083015184820360808601526151788282614dda565b9150508091505092915050565b600060a08301600083015184820360008601526151a28282614dda565b91505060208301516151b76020860182614cf0565b5060408301516151ca6040860182615202565b5060608301516151dd6060860182615202565b50608083015184820360808601526151f58282614dda565b9150508091505092915050565b61520b816159bf565b82525050565b61521a816159bf565b82525050565b600061522b82615013565b9150819050919050565b600060208201905061524a6000830184614cff565b92915050565b60006040820190506152656000830185614cff565b6152726020830184614cff565b9392505050565b600060808201905061528e6000830187614cff565b61529b6020830186614cff565b6152a86040830185614cff565b6152b56060830184615211565b95945050505050565b600060a0820190506152d36000830188614cff565b6152e06020830187614cff565b6152ed6040830186614cff565b6152fa6060830185615211565b818103608083015261530c8184614d92565b90509695505050505050565b600060608201905061532d6000830186614cff565b61533a6020830185614cff565b6153476040830184614d83565b949350505050565b60006060820190506153646000830186614cff565b6153716020830185614cff565b61537e6040830184615211565b949350505050565b600060408201905061539b6000830185614cff565b6153a86020830184615211565b9392505050565b600060a0820190506153c46000830188614cff565b6153d16020830187615211565b6153de6040830186614cff565b6153eb6060830185614cff565b6153f86080830184615211565b9695505050505050565b6000602082019050818103600083015261541c8184614d0e565b905092915050565b60006020820190506154396000830184614d83565b92915050565b60006020820190506154546000830184614dcb565b92915050565b600060208201905081810360008301526154748184614e13565b905092915050565b6000602082019050818103600083015261549581614e4c565b9050919050565b600060208201905081810360008301526154b581614e6f565b9050919050565b600060208201905081810360008301526154d581614e92565b9050919050565b600060208201905081810360008301526154f581614eb5565b9050919050565b6000602082019050818103600083015261551581614ed8565b9050919050565b6000602082019050818103600083015261553581614efb565b9050919050565b6000602082019050818103600083015261555581614f1e565b9050919050565b6000602082019050818103600083015261557581614f41565b9050919050565b6000602082019050818103600083015261559581614f64565b9050919050565b600060208201905081810360008301526155b581614f87565b9050919050565b600060208201905081810360008301526155d581614faa565b9050919050565b600060208201905081810360008301526155f581614fcd565b9050919050565b6000602082019050818103600083015261561581614ff0565b9050919050565b6000602082019050818103600083015261563581615036565b9050919050565b6000602082019050818103600083015261565581615059565b9050919050565b600060208201905081810360008301526156758161507c565b9050919050565b600060208201905081810360008301526156958161509f565b9050919050565b600060208201905081810360008301526156b5816150c2565b9050919050565b600060208201905081810360008301526156d5816150e5565b9050919050565b600060208201905081810360008301526156f68184615185565b905092915050565b60006020820190506157136000830184615211565b92915050565b6000615723615734565b905061572f8282615a4f565b919050565b6000604051905090565b600067ffffffffffffffff82111561575957615758615bb4565b5b61576282615bf7565b9050602081019050919050565b600067ffffffffffffffff82111561578a57615789615bb4565b5b61579382615bf7565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615838826159bf565b9150615843836159bf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561587857615877615ac9565b5b828201905092915050565b600061588e826159bf565b9150615899836159bf565b9250826158a9576158a8615af8565b5b828204905092915050565b60006158bf826159bf565b91506158ca836159bf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561590357615902615ac9565b5b828202905092915050565b6000615919826159bf565b9150615924836159bf565b92508282101561593757615936615ac9565b5b828203905092915050565b600061594d8261599f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061599a82615f3c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006159d48261598c565b9050919050565b82818337600083830152505050565b60005b83811015615a085780820151818401526020810190506159ed565b83811115615a17576000848401525b50505050565b60006002820490506001821680615a3557607f821691505b60208210811415615a4957615a48615b56565b5b50919050565b615a5882615bf7565b810181811067ffffffffffffffff82111715615a7757615a76615bb4565b5b80604052505050565b6000615a8b826159bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615abe57615abd615ac9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6e6f74206120726f79616c747920706179656500000000000000000000000000600082015250565b7f6966610000000000000000000000000000000000000000000000000000000000600082015250565b7f7466000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7770000000000000000000000000000000000000000000000000000000000000600082015250565b7f696f000000000000000000000000000000000000000000000000000000000000600082015250565b7f7300000000000000000000000000000000000000000000000000000000000000600082015250565b7f7431660000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d626f3b6e6c0000000000000000000000000000000000000000000000000000600082015250565b7f6d66000000000000000000000000000000000000000000000000000000000000600082015250565b7f6e6c3b696f000000000000000000000000000000000000000000000000000000600082015250565b7f6e6f2f6f646e6500000000000000000000000000000000000000000000000000600082015250565b50565b7f6d626f2f6f646e652f7770312f77703200000000000000000000000000000000600082015250565b7f7432660000000000000000000000000000000000000000000000000000000000600082015250565b7f7a70000000000000000000000000000000000000000000000000000000000000600082015250565b7f6e6c000000000000000000000000000000000000000000000000000000000000600082015250565b7f6d626f0000000000000000000000000000000000000000000000000000000000600082015250565b7f616c726561647920616772656564000000000000000000000000000000000000600082015250565b60038110615f4d57615f4c615b27565b5b50565b615f5981615942565b8114615f6457600080fd5b50565b615f7081615954565b8114615f7b57600080fd5b50565b615f8781615960565b8114615f9257600080fd5b50565b60038110615fa257600080fd5b50565b615fae816159bf565b8114615fb957600080fd5b5056fea26469706673582212203f51ee73265d7bc9d726510ddb4e804da083cd15af81a4aaf5d65dbee46c23c264736f6c6343000807003360806040526e0c2e074ec69a0dfb2997ba6c7d2e1e6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005f57600080fd5b50610be98061006f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063461a447814610030575b600080fd5b61004a60048036038101906100459190610645565b610060565b60405161005791906107fd565b60405180910390f35b6000808260405160200161007491906107d1565b6040516020818303038152906040529050600081519050600781116100ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c590610833565b60405180910390fd5b602e60f81b826004836100e19190610906565b815181106100f2576100f1610a87565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614801561017a5750606560f81b8260038361013a9190610906565b8151811061014b5761014a610a87565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80156101d45750607460f81b826002836101949190610906565b815181106101a5576101a4610a87565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b801561022e5750606860f81b826001836101ee9190610906565b815181106101ff576101fe610a87565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61026d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026490610853565b60405180910390fd5b600060048261027c9190610906565b67ffffffffffffffff81111561029557610294610ab6565b5b6040519080825280601f01601f1916602001820160405280156102c75781602001600182028036833780820191505090505b50905060005b6004836102da9190610906565b811015610354578381815181106102f4576102f3610a87565b5b602001015160f81c60f81b82828151811061031257610311610a87565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061034c90610a05565b9150506102cd565b5060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf61039d846104a7565b6040518263ffffffff1660e01b81526004016103b99190610818565b60206040518083038186803b1580156103d157600080fd5b505afa1580156103e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104099190610618565b90508073ffffffffffffffffffffffffffffffffffffffff16633b3b57de610430846104a7565b6040518263ffffffff1660e01b815260040161044c9190610818565b60206040518083038186803b15801561046457600080fd5b505afa158015610478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049c91906105eb565b945050505050919050565b60008060001b9050806040516020016104bf906107e8565b604051602081830303815290604052805190602001206040516020016104e692919061078e565b604051602081830303815290604052805190602001208260405160200161050d91906107ba565b6040516020818303038152906040528051906020012060405160200161053492919061078e565b604051602081830303815290604052805190602001209050919050565b600061056461055f84610898565b610873565b9050828152602081018484840111156105805761057f610aea565b5b61058b848285610992565b509392505050565b6000815190506105a281610b85565b92915050565b6000815190506105b781610b9c565b92915050565b600082601f8301126105d2576105d1610ae5565b5b81356105e2848260208601610551565b91505092915050565b60006020828403121561060157610600610af4565b5b600061060f84828501610593565b91505092915050565b60006020828403121561062e5761062d610af4565b5b600061063c848285016105a8565b91505092915050565b60006020828403121561065b5761065a610af4565b5b600082013567ffffffffffffffff81111561067957610678610aef565b5b610685848285016105bd565b91505092915050565b6106978161093a565b82525050565b6106a68161094c565b82525050565b6106bd6106b88261094c565b610a4e565b82525050565b60006106ce826108c9565b6106d881856108df565b93506106e88185602086016109a1565b80840191505092915050565b60006106ff826108d4565b61070981856108fb565b93506107198185602086016109a1565b80840191505092915050565b60006107326016836108ea565b915061073d82610b0a565b602082019050919050565b60006107556003836108fb565b915061076082610b33565b600382019050919050565b6000610778601d836108ea565b915061078382610b5c565b602082019050919050565b600061079a82856106ac565b6020820191506107aa82846106ac565b6020820191508190509392505050565b60006107c682846106c3565b915081905092915050565b60006107dd82846106f4565b915081905092915050565b60006107f382610748565b9150819050919050565b6000602082019050610812600083018461068e565b92915050565b600060208201905061082d600083018461069d565b92915050565b6000602082019050818103600083015261084c81610725565b9050919050565b6000602082019050818103600083015261086c8161076b565b9050919050565b600061087d61088e565b905061088982826109d4565b919050565b6000604051905090565b600067ffffffffffffffff8211156108b3576108b2610ab6565b5b6108bc82610af9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061091182610988565b915061091c83610988565b92508282101561092f5761092e610a58565b5b828203905092915050565b600061094582610968565b9050919050565b6000819050919050565b60006109618261093a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156109bf5780820151818401526020810190506109a4565b838111156109ce576000848401525b50505050565b6109dd82610af9565b810181811067ffffffffffffffff821117156109fc576109fb610ab6565b5b80604052505050565b6000610a1082610988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610a4357610a42610a58565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696d706f737369626c6520454e53206164647265737300000000000000000000600082015250565b7f6574680000000000000000000000000000000000000000000000000000000000600082015250565b7f454e53206e616d65206d75737420656e64207769746820222e65746822000000600082015250565b610b8e8161093a565b8114610b9957600080fd5b50565b610ba581610956565b8114610bb057600080fd5b5056fea26469706673582212208bd148379fc184a094f88ce90e864da23e725edf41fce6e426e3abab6c1dcf4664736f6c6343000807003360e060405260006001556000600560006101000a81548160ff0219169083151502179055506000600d553480156200003657600080fd5b506040516200496f3803806200496f83398181016040528101906200005c9190620003ad565b6200007c620000706200018560201b60201c565b6200018d60201b60201c565b60008511620000c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000b990620004c5565b60405180910390fd5b8660029080519060200190620000da92919062000251565b508560039080519060200190620000f392919062000251565b50846080818152505083600a8190555082600b819055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050505050505062000717565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025f90620005cb565b90600052602060002090601f016020900481019282620002835760008555620002cf565b82601f106200029e57805160ff1916838001178555620002cf565b82800160010185558215620002cf579182015b82811115620002ce578251825591602001919060010190620002b1565b5b509050620002de9190620002e2565b5090565b5b80821115620002fd576000816000905550600101620002e3565b5090565b600062000318620003128462000510565b620004e7565b9050828152602081018484840111156200033757620003366200069a565b5b6200034484828562000595565b509392505050565b6000815190506200035d81620006e3565b92915050565b600082601f8301126200037b576200037a62000695565b5b81516200038d84826020860162000301565b91505092915050565b600081519050620003a781620006fd565b92915050565b600080600080600080600060e0888a031215620003cf57620003ce620006a4565b5b600088015167ffffffffffffffff811115620003f057620003ef6200069f565b5b620003fe8a828b0162000363565b975050602088015167ffffffffffffffff8111156200042257620004216200069f565b5b620004308a828b0162000363565b9650506040620004438a828b0162000396565b9550506060620004568a828b0162000396565b9450506080620004698a828b0162000396565b93505060a06200047c8a828b016200034c565b92505060c06200048f8a828b016200034c565b91505092959891949750929550565b6000620004ad60018362000546565b9150620004ba82620006ba565b602082019050919050565b60006020820190508181036000830152620004e0816200049e565b9050919050565b6000620004f362000506565b905062000501828262000601565b919050565b6000604051905090565b600067ffffffffffffffff8211156200052e576200052d62000666565b5b6200053982620006a9565b9050602081019050919050565b600082825260208201905092915050565b600062000564826200056b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620005b557808201518184015260208101905062000598565b83811115620005c5576000848401525b50505050565b60006002820490506001821680620005e457607f821691505b60208210811415620005fb57620005fa62000637565b5b50919050565b6200060c82620006a9565b810181811067ffffffffffffffff821117156200062e576200062d62000666565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b620006ee8162000557565b8114620006fa57600080fd5b50565b62000708816200058b565b81146200071457600080fd5b50565b60805160a05160601c60c05160601c61420662000769600039600061132b0152600081816113620152611431015260008181610865015281816112b50152818161251c015261254501526142066000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80636c0360eb116100de578063c87b56dd11610097578063e1f21c6711610071578063e1f21c671461045b578063e78e3cea14610477578063e985e9c514610493578063f2fde38b146104c35761018e565b8063c87b56dd146103f1578063d7224ba014610421578063d9fc4b611461043f5761018e565b80636c0360eb1461034157806370a082311461035f578063715018a61461038f5780638da5cb5b146103995780638e9e5475146103b757806395d89b41146103d35761018e565b80632d8bf0c51161014b5780633454c4d6116101255780633454c4d6146102a9578063367605ca146102c55780634f6ccce7146102e15780636352211e146103115761018e565b80632d8bf0c5146102415780632f745c591461025d57806331b5b9071461028d5761018e565b806306fdde0314610193578063081812fc146101b157806315495ffe146101e157806315dacbea146101eb57806318160ddd1461020757806321454adf14610225575b600080fd5b61019b6104df565b6040516101a891906137fc565b60405180910390f35b6101cb60048036038101906101c6919061336c565b610571565b6040516101d8919061370c565b60405180910390f35b6101e96105f6565b005b6102056004803603810190610200919061306a565b61068f565b005b61020f61071d565b60405161021c919061399e565b60405180910390f35b61023f600480360381019061023a91906130d1565b610727565b005b61025b600480360381019061025691906130d1565b610e71565b005b6102776004803603810190610272919061320e565b610f4c565b604051610284919061399e565b60405180910390f35b6102a760048036038101906102a29190613323565b61114a565b005b6102c360048036038101906102be919061324e565b6111e0565b005b6102df60048036038101906102da9190613168565b611504565b005b6102fb60048036038101906102f6919061336c565b6116f7565b604051610308919061399e565b60405180910390f35b61032b6004803603810190610326919061336c565b61174a565b604051610338919061370c565b60405180910390f35b610349611760565b60405161035691906137fc565b60405180910390f35b61037960048036038101906103749190612ffd565b6117f2565b604051610386919061399e565b60405180910390f35b6103976118db565b005b6103a1611963565b6040516103ae919061370c565b60405180910390f35b6103d160048036038101906103cc919061306a565b61198c565b005b6103db611a2a565b6040516103e891906137fc565b60405180910390f35b61040b6004803603810190610406919061336c565b611abc565b60405161041891906137fc565b60405180910390f35b610429611c0c565b604051610436919061399e565b60405180910390f35b6104596004803603810190610454919061306a565b611c12565b005b610475600480360381019061047091906131bb565b611cb0565b005b610491600480360381019061048c91906131bb565b611e38565b005b6104ad60048036038101906104a8919061302a565b611ed3565b6040516104ba91906137e1565b60405180910390f35b6104dd60048036038101906104d89190612ffd565b611f67565b005b6060600280546104ee90613d23565b80601f016020809104026020016040519081016040528092919081815260200182805461051a90613d23565b80156105675780601f1061053c57610100808354040283529160200191610567565b820191906000526020600020905b81548152906001019060200180831161054a57829003601f168201915b5050505050905090565b600061057c8261205f565b6105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b29061389e565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6105fe61206d565b73ffffffffffffffffffffffffffffffffffffffff1661061c611963565b73ffffffffffffffffffffffffffffffffffffffff1614610672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106699061391e565b60405180910390fd5b6001600560006101000a81548160ff021916908315150217905550565b61069761206d565b73ffffffffffffffffffffffffffffffffffffffff166106b5611963565b73ffffffffffffffffffffffffffffffffffffffff161461070b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107029061391e565b60405180910390fd5b61071784848484612075565b50505050565b6000600154905090565b61072f61206d565b73ffffffffffffffffffffffffffffffffffffffff1661074d611963565b73ffffffffffffffffffffffffffffffffffffffff16146107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a9061391e565b60405180910390fd5b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561081a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108119061381e565b60405180910390fd5b6108238161205f565b15610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a9061389e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156108c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bd9061397e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610908576109076000868386612242565b5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146109485761094785858386612242565b5b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151610a459190613a98565b6fffffffffffffffffffffffffffffffff168152602001858360200151610a6c9190613a98565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015610ddd57600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610cb7573373ffffffffffffffffffffffffffffffffffffffff166323de665160008a856040518463ffffffff1660e01b8152600401610c849392919061375e565b600060405180830381600087803b158015610c9e57600080fd5b505af1158015610cb2573d6000803e3d6000fd5b505050505b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610d5a573373ffffffffffffffffffffffffffffffffffffffff166323de66518989856040518463ffffffff1660e01b8152600401610d279392919061375e565b600060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b505050505b610d688960008a8589612248565b8015610d7d5750610d7c8989898589612248565b5b610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906138be565b60405180910390fd5b8180610dc790613d86565b9250508080610dd590613d86565b915050610c0a565b5080600181905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610e2757610e2660008885886123d9565b5b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610e6757610e66878785886123d9565b5b5050505050505050565b610e7961206d565b73ffffffffffffffffffffffffffffffffffffffff16610e97611963565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee49061391e565b60405180910390fd5b610ef985858585612075565b610f068585858585612248565b610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c906138be565b60405180910390fd5b5050505050565b6000610f57836117f2565b8210610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f9061393e565b60405180910390fd5b6000610fa261071d565b905060008060005b83811015611108576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461109c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110f457868414156110e5578195505050505050611144565b83806110f090613d86565b9450505b50808061110090613d86565b915050610faa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b9061387e565b60405180910390fd5b92915050565b61115261206d565b73ffffffffffffffffffffffffffffffffffffffff16611170611963565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd9061391e565b60405180910390fd5b80600490805190602001906111dc929190612dd7565b5050565b6111e861206d565b73ffffffffffffffffffffffffffffffffffffffff16611206611963565b73ffffffffffffffffffffffffffffffffffffffff161461125c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112539061391e565b60405180910390fd5b600b548461126861071d565b6112729190613ade565b11156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa9061397e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000846112de846123df565b6112e89190613ade565b1115611329576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611320906138fe565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16141561142d576113a5611963565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611428578084600a546113e69190613b65565b1115611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e9061389e565b60405180910390fd5b5b6114f1565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3333600a548961147e9190613b65565b6040518463ffffffff1660e01b815260040161149c9392919061375e565b602060405180830381600087803b1580156114b657600080fd5b505af11580156114ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ee91906132c9565b50505b6114fd8584848761198c565b5050505050565b61150c61206d565b73ffffffffffffffffffffffffffffffffffffffff1661152a611963565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115779061391e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e69061389e565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166355c45fbe8484846040518463ffffffff1660e01b81526004016116c093929190613727565b600060405180830381600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b50505050505050565b600061170161071d565b8210611742576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117399061383e565b60405180910390fd5b819050919050565b6000611755826124c8565b600001519050919050565b60606004805461176f90613d23565b80601f016020809104026020016040519081016040528092919081815260200182805461179b90613d23565b80156117e85780601f106117bd576101008083540402835291602001916117e8565b820191906000526020600020905b8154815290600101906020018083116117cb57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a9061381e565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118e361206d565b73ffffffffffffffffffffffffffffffffffffffff16611901611963565b73ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e9061391e565b60405180910390fd5b61196160006126cb565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61199461206d565b73ffffffffffffffffffffffffffffffffffffffff166119b2611963565b73ffffffffffffffffffffffffffffffffffffffff1614611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff9061391e565b60405180910390fd5b611a248484848460405180602001604052806000815250610727565b50505050565b606060038054611a3990613d23565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6590613d23565b8015611ab25780601f10611a8757610100808354040283529160200191611ab2565b820191906000526020600020905b815481529060010190602001808311611a9557829003601f168201915b5050505050905090565b6060611ac78261205f565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd906138be565b60405180910390fd5b600560009054906101000a900460ff1615611b7957600060048054611b2a90613d23565b905011611b465760405180602001604052806000815250611b72565b6004611b518361278f565b604051602001611b629291906136d2565b6040516020818303038152906040525b9050611c07565b60048054611b8690613d23565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb290613d23565b8015611bff5780601f10611bd457610100808354040283529160200191611bff565b820191906000526020600020905b815481529060010190602001808311611be257829003601f168201915b505050505090505b919050565b600d5481565b611c1a61206d565b73ffffffffffffffffffffffffffffffffffffffff16611c38611963565b73ffffffffffffffffffffffffffffffffffffffff1614611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c859061391e565b60405180910390fd5b611caa8484848460405180602001604052806000815250610e71565b50505050565b611cb861206d565b73ffffffffffffffffffffffffffffffffffffffff16611cd6611963565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d239061391e565b60405180910390fd5b6000611d378261174a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f906138de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611de85750611de78185611ed3565b5b611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e9061389e565b60405180910390fd5b611e328383836128f0565b50505050565b611e4061206d565b73ffffffffffffffffffffffffffffffffffffffff16611e5e611963565b73ffffffffffffffffffffffffffffffffffffffff1614611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab9061391e565b60405180910390fd5b6000611ebf826124c8565b9050611ecd848484846129b6565b50505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f6f61206d565b73ffffffffffffffffffffffffffffffffffffffff16611f8d611963565b73ffffffffffffffffffffffffffffffffffffffff1614611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda9061391e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a9061385e565b60405180910390fd5b61205c816126cb565b50565b600060015482109050919050565b600033905090565b6000612080826124c8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806120f557508573ffffffffffffffffffffffffffffffffffffffff166120dd84610571565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210a5750612109826000015187611ed3565b5b90508061214c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121439061389e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b5906138de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561222e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122259061381e565b60405180910390fd5b61223a858585856129b6565b505050505050565b50505050565b60006122698473ffffffffffffffffffffffffffffffffffffffff16612db4565b156123cb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786866040518563ffffffff1660e01b81526004016122ad9493929190613795565b602060405180830381600087803b1580156122c757600080fd5b505af19250505080156122f857506040513d601f19601f820116820180604052508101906122f591906132f6565b60015b61237b573d8060008114612328576040519150601f19603f3d011682016040523d82523d6000602084013e61232d565b606091505b50600081511415612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a906138be565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123d0565b600190505b95945050505050565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124479061381e565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6124d0612e5d565b6124d98261205f565b612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f9061395e565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000831061257c5760017f00000000000000000000000000000000000000000000000000000000000000008461256f9190613bf3565b6125799190613ade565b90505b60008390505b81811061268a576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612676578093505050506126c6565b50808061268290613cf9565b915050612582565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd906138de565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060008214156127d7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128eb565b600082905060005b600082146128095780806127f290613d86565b915050600a826128029190613b34565b91506127df565b60008167ffffffffffffffff81111561282557612824613ebc565b5b6040519080825280601f01601f1916602001820160405280156128575781602001600182028036833780820191505090505b5090505b600085146128e4576001826128709190613bf3565b9150600a8561287f9190613dcf565b603061288b9190613ade565b60f81b8183815181106128a1576128a0613e8d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128dd9190613b34565b945061285b565b8093505050505b919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16635687f2b88285856040518463ffffffff1660e01b815260040161297f9392919061375e565b600060405180830381600087803b15801561299957600080fd5b505af11580156129ad573d6000803e3d6000fd5b50505050505050565b6129c38484846001612242565b6129d360008383600001516128f0565b6001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a419190613bbf565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ae59190613a98565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600183612beb9190613ade565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d3157612c618161205f565b15612d30576040518060400160405280836000015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b3373ffffffffffffffffffffffffffffffffffffffff166323de66518686866040518463ffffffff1660e01b8152600401612d6e9392919061375e565b600060405180830381600087803b158015612d8857600080fd5b505af1158015612d9c573d6000803e3d6000fd5b50505050612dad85858560016123d9565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612de390613d23565b90600052602060002090601f016020900481019282612e055760008555612e4c565b82601f10612e1e57805160ff1916838001178555612e4c565b82800160010185558215612e4c579182015b82811115612e4b578251825591602001919060010190612e30565b5b509050612e599190612e97565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612eb0576000816000905550600101612e98565b5090565b6000612ec7612ec2846139de565b6139b9565b905082815260208101848484011115612ee357612ee2613ef0565b5b612eee848285613cb7565b509392505050565b6000612f09612f0484613a0f565b6139b9565b905082815260208101848484011115612f2557612f24613ef0565b5b612f30848285613cb7565b509392505050565b600081359050612f4781614174565b92915050565b600081359050612f5c8161418b565b92915050565b600081519050612f718161418b565b92915050565b600081519050612f86816141a2565b92915050565b600082601f830112612fa157612fa0613eeb565b5b8135612fb1848260208601612eb4565b91505092915050565b600082601f830112612fcf57612fce613eeb565b5b8135612fdf848260208601612ef6565b91505092915050565b600081359050612ff7816141b9565b92915050565b60006020828403121561301357613012613efa565b5b600061302184828501612f38565b91505092915050565b6000806040838503121561304157613040613efa565b5b600061304f85828601612f38565b925050602061306085828601612f38565b9150509250929050565b6000806000806080858703121561308457613083613efa565b5b600061309287828801612f38565b94505060206130a387828801612f38565b93505060406130b487828801612f38565b92505060606130c587828801612fe8565b91505092959194509250565b600080600080600060a086880312156130ed576130ec613efa565b5b60006130fb88828901612f38565b955050602061310c88828901612f38565b945050604061311d88828901612f38565b935050606061312e88828901612fe8565b925050608086013567ffffffffffffffff81111561314f5761314e613ef5565b5b61315b88828901612f8c565b9150509295509295909350565b60008060006060848603121561318157613180613efa565b5b600061318f86828701612f38565b93505060206131a086828701612f38565b92505060406131b186828701612f4d565b9150509250925092565b6000806000606084860312156131d4576131d3613efa565b5b60006131e286828701612f38565b93505060206131f386828701612f38565b925050604061320486828701612fe8565b9150509250925092565b6000806040838503121561322557613224613efa565b5b600061323385828601612f38565b925050602061324485828601612fe8565b9150509250929050565b600080600080600060a0868803121561326a57613269613efa565b5b600061327888828901612f38565b955050602061328988828901612fe8565b945050604061329a88828901612f38565b93505060606132ab88828901612f38565b92505060806132bc88828901612fe8565b9150509295509295909350565b6000602082840312156132df576132de613efa565b5b60006132ed84828501612f62565b91505092915050565b60006020828403121561330c5761330b613efa565b5b600061331a84828501612f77565b91505092915050565b60006020828403121561333957613338613efa565b5b600082013567ffffffffffffffff81111561335757613356613ef5565b5b61336384828501612fba565b91505092915050565b60006020828403121561338257613381613efa565b5b600061339084828501612fe8565b91505092915050565b6133a281613c27565b82525050565b6133b181613c39565b82525050565b60006133c282613a55565b6133cc8185613a6b565b93506133dc818560208601613cc6565b6133e581613eff565b840191505092915050565b60006133fb82613a60565b6134058185613a7c565b9350613415818560208601613cc6565b61341e81613eff565b840191505092915050565b600061343482613a60565b61343e8185613a8d565b935061344e818560208601613cc6565b80840191505092915050565b6000815461346781613d23565b6134718186613a8d565b9450600182166000811461348c576001811461349d576134d0565b60ff198316865281860193506134d0565b6134a685613a40565b60005b838110156134c8578154818901526001820191506020810190506134a9565b838801955050505b50505092915050565b60006134e6600183613a7c565b91506134f182613f10565b602082019050919050565b6000613509600183613a7c565b915061351482613f39565b602082019050919050565b600061352c602683613a7c565b915061353782613f62565b604082019050919050565b600061354f600183613a7c565b915061355a82613fb1565b602082019050919050565b6000613572600183613a7c565b915061357d82613fda565b602082019050919050565b6000613595600183613a7c565b91506135a082614003565b602082019050919050565b60006135b8600183613a7c565b91506135c38261402c565b602082019050919050565b60006135db600183613a7c565b91506135e682614055565b602082019050919050565b60006135fe600583613a8d565b91506136098261407e565b600582019050919050565b6000613621602083613a7c565b915061362c826140a7565b602082019050919050565b6000613644600183613a7c565b915061364f826140d0565b602082019050919050565b6000613667600183613a7c565b9150613672826140f9565b602082019050919050565b600061368a600183613a7c565b915061369582614122565b602082019050919050565b60006136ad600183613a8d565b91506136b88261414b565b600182019050919050565b6136cc81613cad565b82525050565b60006136de828561345a565b91506136e9826136a0565b91506136f58284613429565b9150613700826135f1565b91508190509392505050565b60006020820190506137216000830184613399565b92915050565b600060608201905061373c6000830186613399565b6137496020830185613399565b61375660408301846133a8565b949350505050565b60006060820190506137736000830186613399565b6137806020830185613399565b61378d60408301846136c3565b949350505050565b60006080820190506137aa6000830187613399565b6137b76020830186613399565b6137c460408301856136c3565b81810360608301526137d681846133b7565b905095945050505050565b60006020820190506137f660008301846133a8565b92915050565b6000602082019050818103600083015261381681846133f0565b905092915050565b60006020820190508181036000830152613837816134d9565b9050919050565b60006020820190508181036000830152613857816134fc565b9050919050565b600060208201905081810360008301526138778161351f565b9050919050565b6000602082019050818103600083015261389781613542565b9050919050565b600060208201905081810360008301526138b781613565565b9050919050565b600060208201905081810360008301526138d781613588565b9050919050565b600060208201905081810360008301526138f7816135ab565b9050919050565b60006020820190508181036000830152613917816135ce565b9050919050565b6000602082019050818103600083015261393781613614565b9050919050565b6000602082019050818103600083015261395781613637565b9050919050565b600060208201905081810360008301526139778161365a565b9050919050565b600060208201905081810360008301526139978161367d565b9050919050565b60006020820190506139b360008301846136c3565b92915050565b60006139c36139d4565b90506139cf8282613d55565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f9576139f8613ebc565b5b613a0282613eff565b9050602081019050919050565b600067ffffffffffffffff821115613a2a57613a29613ebc565b5b613a3382613eff565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613aa382613c71565b9150613aae83613c71565b9250826fffffffffffffffffffffffffffffffff03821115613ad357613ad2613e00565b5b828201905092915050565b6000613ae982613cad565b9150613af483613cad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b2957613b28613e00565b5b828201905092915050565b6000613b3f82613cad565b9150613b4a83613cad565b925082613b5a57613b59613e2f565b5b828204905092915050565b6000613b7082613cad565b9150613b7b83613cad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bb457613bb3613e00565b5b828202905092915050565b6000613bca82613c71565b9150613bd583613c71565b925082821015613be857613be7613e00565b5b828203905092915050565b6000613bfe82613cad565b9150613c0983613cad565b925082821015613c1c57613c1b613e00565b5b828203905092915050565b6000613c3282613c8d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ce4578082015181840152602081019050613cc9565b83811115613cf3576000848401525b50505050565b6000613d0482613cad565b91506000821415613d1857613d17613e00565b5b600182039050919050565b60006002820490506001821680613d3b57607f821691505b60208210811415613d4f57613d4e613e5e565b5b50919050565b613d5e82613eff565b810181811067ffffffffffffffff82111715613d7d57613d7c613ebc565b5b80604052505050565b6000613d9182613cad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dc457613dc3613e00565b5b600182019050919050565b6000613dda82613cad565b9150613de583613cad565b925082613df557613df4613e2f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f6c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b7f6d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61417d81613c27565b811461418857600080fd5b50565b61419481613c39565b811461419f57600080fd5b50565b6141ab81613c45565b81146141b657600080fd5b50565b6141c281613cad565b81146141cd57600080fd5b5056fea26469706673582212207c3bbfa2ed7fdb3e08c55ec86182fa2be99b22d443f88438ea775223ac9314a064736f6c63430008070033000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000001b3900000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000045000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002add825cdab3b0434c153f548183f50a8491ea4f00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000001a436f7069756d204973204f6e652048656c6c75766120447275670000000000000000000000000000000000000000000000000000000000000000000000000006434f5049554d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000066f3794178997a12779527b36a2f042e001625af00000000000000000000000049723bb74dcdad9bcdba97fa63686684ba5714d400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001e

Deployed Bytecode

0x6080604052600436106103c75760003560e01c8063715018a6116101f2578063c43f0c161161010d578063e9591537116100a0578063f2fde38b1161006f578063f2fde38b14610e70578063f37858ee14610e99578063faa2883014610ed6578063fb3cc6c214610f01576103e4565b8063e959153714610dbe578063e985e9c514610dda578063ebdfbce514610e17578063efd0cbf914610e54576103e4565b8063d111515d116100dc578063d111515d14610d26578063e5a6b10f14610d3d578063e7064f3514610d68578063e8a3d48514610d93576103e4565b8063c43f0c1614610c58578063c87b56dd14610c81578063ca0adb8314610cbe578063cbce2df914610cfb576103e4565b8063938e3d7b11610185578063acdb47a011610154578063acdb47a014610b8a578063b5ca58e514610bc7578063b88d4fde14610bf2578063c07296fa14610c1b576103e4565b8063938e3d7b14610ae257806395d89b4114610b0b5780639da3f8fd14610b36578063a22cb46514610b61576103e4565b80638da5cb5b116101c15780638da5cb5b14610a475780638f566abb14610a725780639182a9df14610a8e578063927fbfc814610aa5576103e4565b8063715018a6146109b357806374b79e33146109ca5780637cac2602146109f55780638a4db2b714610a1e576103e4565b80633ccfd60b116102e257806355c45fbe116102755780636373a6b1116102445780636373a6b1146108f75780636817c76c14610922578063702325dd1461094d57806370a0823114610976576103e4565b806355c45fbe1461083f57806355f804b3146108685780635687f2b8146108915780636352211e146108ba576103e4565b806344fead9e116102b157806344fead9e14610771578063487481911461079c57806349df728c146107d95780634f6ccce714610802576103e4565b80633ccfd60b146106d85780633ce2aa99146106ef5780633fffe2311461072c57806342842e0e14610748576103e4565b806318160ddd1161035a578063265484a911610329578063265484a91461060a57806327e235e3146106335780632f745c5914610670578063386b7691146106ad576103e4565b806318160ddd146105715780631bd6048f1461059c57806323b872dd146105b857806323de6651146105e1576103e4565b8063095ea7b311610396578063095ea7b3146104cb5780630b7a2925146104f4578063109695231461050b57806316f916f214610534576103e4565b8063011289e1146103e957806301ffc9a71461042657806306fdde0314610463578063081812fc1461048e576103e4565b366103e4576103e2600454346103dd9190615883565b610f2c565b005b600080fd5b3480156103f557600080fd5b50610410600480360381019061040b91906147e3565b610f3b565b60405161041d91906156fe565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190614a53565b610f53565b60405161045a9190615424565b60405180910390f35b34801561046f57600080fd5b5061047861109d565b604051610485919061545a565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190614b3f565b611149565b6040516104c29190615235565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed91906149e6565b6111fd565b005b34801561050057600080fd5b50610509611292565b005b34801561051757600080fd5b50610532600480360381019061052d9190614aad565b6113d3565b005b34801561054057600080fd5b5061055b60048036038101906105569190614b3f565b61149e565b60405161056891906156fe565b60405180910390f35b34801561057d57600080fd5b5061058661159a565b60405161059391906156fe565b60405180910390f35b6105b660048036038101906105b19190614b3f565b611641565b005b3480156105c457600080fd5b506105df60048036038101906105da91906148d0565b6118db565b005b3480156105ed57600080fd5b50610608600480360381019061060391906148d0565b611973565b005b34801561061657600080fd5b50610631600480360381019061062c9190614c9c565b6119d3565b005b34801561063f57600080fd5b5061065a600480360381019061065591906147e3565b611ae5565b60405161066791906156fe565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906149e6565b611afd565b6040516106a491906156fe565b60405180910390f35b3480156106b957600080fd5b506106c2611bb4565b6040516106cf91906156fe565b60405180910390f35b3480156106e457600080fd5b506106ed611bba565b005b3480156106fb57600080fd5b50610716600480360381019061071191906147e3565b611cfb565b6040516107239190615424565b60405180910390f35b61074660048036038101906107419190614c40565b611d1b565b005b34801561075457600080fd5b5061076f600480360381019061076a91906148d0565b611dda565b005b34801561077d57600080fd5b50610786611e72565b60405161079391906156fe565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614b3f565b611e78565b6040516107d09190615402565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb91906147e3565b612085565b005b34801561080e57600080fd5b5061082960048036038101906108249190614b3f565b61221a565b60405161083691906156fe565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061487d565b6122ce565b005b34801561087457600080fd5b5061088f600480360381019061088a9190614aad565b612338565b005b34801561089d57600080fd5b506108b860048036038101906108b391906148d0565b612494565b005b3480156108c657600080fd5b506108e160048036038101906108dc9190614b3f565b6124f4565b6040516108ee9190615235565b60405180910390f35b34801561090357600080fd5b5061090c6125a8565b604051610919919061545a565b60405180910390f35b34801561092e57600080fd5b50610937612636565b60405161094491906156fe565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190614c9c565b61263c565b005b34801561098257600080fd5b5061099d600480360381019061099891906147e3565b61280d565b6040516109aa91906156fe565b60405180910390f35b3480156109bf57600080fd5b506109c86128c1565b005b3480156109d657600080fd5b506109df612949565b6040516109ec9190615235565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190614a80565b612973565b005b348015610a2a57600080fd5b50610a456004803603810190610a409190614bd9565b612a8e565b005b348015610a5357600080fd5b50610a5c612e5b565b604051610a699190615235565b60405180910390f35b610a8c6004803603810190610a879190614b99565b612e84565b005b348015610a9a57600080fd5b50610aa3612e93565b005b348015610ab157600080fd5b50610acc6004803603810190610ac79190614b99565b612f93565b604051610ad991906156fe565b60405180910390f35b348015610aee57600080fd5b50610b096004803603810190610b049190614aad565b612fb8565b005b348015610b1757600080fd5b50610b2061304e565b604051610b2d919061545a565b60405180910390f35b348015610b4257600080fd5b50610b4b6130fa565b604051610b58919061543f565b60405180910390f35b348015610b6d57600080fd5b50610b886004803603810190610b8391906149a6565b61310d565b005b348015610b9657600080fd5b50610bb16004803603810190610bac9190614b3f565b6131a2565b604051610bbe91906156dc565b60405180910390f35b348015610bd357600080fd5b50610bdc61338d565b604051610be99190615235565b60405180910390f35b348015610bfe57600080fd5b50610c196004803603810190610c149190614923565b6133b1565b005b348015610c2757600080fd5b50610c426004803603810190610c3d9190614b3f565b61344c565b604051610c4f91906156fe565b60405180910390f35b348015610c6457600080fd5b50610c7f6004803603810190610c7a9190614b3f565b613464565b005b348015610c8d57600080fd5b50610ca86004803603810190610ca39190614b3f565b61358f565b604051610cb5919061545a565b60405180910390f35b348015610cca57600080fd5b50610ce56004803603810190610ce09190614b3f565b613648565b604051610cf29190615424565b60405180910390f35b348015610d0757600080fd5b50610d106136ac565b604051610d1d9190615424565b60405180910390f35b348015610d3257600080fd5b50610d3b6136bf565b005b348015610d4957600080fd5b50610d52613758565b604051610d5f9190615235565b60405180910390f35b348015610d7457600080fd5b50610d7d61377c565b604051610d8a9190615235565b60405180910390f35b348015610d9f57600080fd5b50610da86137a6565b604051610db5919061545a565b60405180910390f35b610dd86004803603810190610dd39190614c9c565b613838565b005b348015610de657600080fd5b50610e016004803603810190610dfc919061483d565b613a56565b604051610e0e9190615424565b60405180910390f35b348015610e2357600080fd5b50610e3e6004803603810190610e399190614b99565b613b0d565b604051610e4b91906156fe565b60405180910390f35b610e6e6004803603810190610e699190614b3f565b610f2c565b005b348015610e7c57600080fd5b50610e976004803603810190610e9291906147e3565b613b32565b005b348015610ea557600080fd5b50610ec06004803603810190610ebb9190614c9c565b613c2a565b604051610ecd9190615235565b60405180910390f35b348015610ee257600080fd5b50610eeb613c6c565b604051610ef89190615235565b60405180910390f35b348015610f0d57600080fd5b50610f16613c96565b604051610f239190615424565b60405180910390f35b610f3881600033613cad565b50565b60116020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061101e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061108657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611096575061109582613fd6565b5b9050919050565b6060600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b15801561110757600080fd5b505afa15801561111b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111449190614af6565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081812fc836040518263ffffffff1660e01b81526004016111a691906156fe565b60206040518083038186803b1580156111be57600080fd5b505afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190614810565b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1f21c673384846040518463ffffffff1660e01b815260040161125c9392919061534f565b600060405180830381600087803b15801561127657600080fd5b505af115801561128a573d6000803e3d6000fd5b505050505050565b61129a614040565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906156bc565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000828254611392919061582d565b92505081905550600f54600d5414156113d1576001600e60006101000a81548160ff021916908360028111156113cb576113ca615b27565b5b02179055505b565b6113db6140cb565b73ffffffffffffffffffffffffffffffffffffffff166113f9612e5b565b73ffffffffffffffffffffffffffffffffffffffff161461144f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114469061557c565b60405180910390fd5b600260009054906101000a900460ff161561146957600080fd5b806001908051906020019061147f929190614503565b506001600260006101000a81548160ff02191690831515021790555050565b6000806013600084815260200190815260200160002060006114bf856124f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061567c565b60405180910390fd5b601360008381526020019081526020016000206000611558846124f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561160457600080fd5b505afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190614b6c565b905090565b600061164c826124f4565b905060006013600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156116da57503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611710906155dc565b60405180910390fd5b346013600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a2906154fc565b60405180910390fd5b60006013600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061180b34826140d3565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e78e3cea8233856040518463ffffffff1660e01b815260040161186a9392919061534f565b600060405180830381600087803b15801561188457600080fd5b505af1158015611898573d6000803e3d6000fd5b505050507f3f3483d0995db4c081e0101ef6753bef457833c20605cd871de61dcb48085a9a8133346040516118cf9392919061534f565b60405180910390a15050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea338585856040518563ffffffff1660e01b815260040161193c9493929190615279565b600060405180830381600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b50505050505050565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff166119f3836124f4565b73ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a409061569c565b60405180910390fd5b60008111611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a839061565c565b60405180910390fd5b806013600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60126020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984846040518363ffffffff1660e01b8152600401611b5c929190615386565b60206040518083038186803b158015611b7457600080fd5b505afa158015611b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bac9190614b6c565b905092915050565b60055481565b611bc2614040565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff1682604051611c7190615220565b60006040518083038185875af1925050503d8060008114611cae576040519150601f19603f3d011682016040523d82523d6000602084013e611cb3565b606091505b5050905080611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee906154bc565b60405180910390fd5b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663461a4478836040518263ffffffff1660e01b8152600401611d78919061545a565b60206040518083038186803b158015611d9057600080fd5b505afa158015611da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc89190614810565b9050611dd5833383613cad565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d9fc4b61338585856040518563ffffffff1660e01b8152600401611e3b9493929190615279565b600060405180830381600087803b158015611e5557600080fd5b505af1158015611e69573d6000803e3d6000fd5b50505050505050565b60065481565b60606000601660008481526020019081526020016000205467ffffffffffffffff811115611ea957611ea8615bb4565b5b604051908082528060200260200182016040528015611ee257816020015b611ecf614589565b815260200190600190039081611ec75790505b50905060005b601660008581526020019081526020016000205481101561207b57600060156000868152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006040518060a001604052806040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525081526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016014600089815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018481526020016040518060400160405280600181526020017f5d0000000000000000000000000000000000000000000000000000000000000081525081525090508084848151811061205b5761205a615b85565b5b60200260200101819052505050808061207390615a80565b915050611ee8565b5080915050919050565b61208d6140cb565b73ffffffffffffffffffffffffffffffffffffffff166120ab612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f89061557c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121579190615235565b60206040518083038186803b15801561216f57600080fd5b505afa158015612183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a79190614b6c565b6040518363ffffffff1660e01b81526004016121c4929190615386565b602060405180830381600087803b1580156121de57600080fd5b505af11580156121f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122169190614a26565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f6ccce7836040518263ffffffff1660e01b815260040161227791906156fe565b60206040518083038186803b15801561228f57600080fd5b505afa1580156122a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c79190614b6c565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161232b9190615424565b60405180910390a3505050565b6123406140cb565b73ffffffffffffffffffffffffffffffffffffffff1661235e612e5b565b73ffffffffffffffffffffffffffffffffffffffff16146123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab9061557c565b60405180910390fd5b600b60149054906101000a900460ff1615612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb906155bc565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331b5b907826040518263ffffffff1660e01b815260040161245f919061545a565b600060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b5050505050565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161255191906156fe565b60206040518083038186803b15801561256957600080fd5b505afa15801561257d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a19190614810565b9050919050565b600180546125b590615a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546125e190615a1d565b801561262e5780601f106126035761010080835404028352916020019161262e565b820191906000526020600020905b81548152906001019060200180831161261157829003601f168201915b505050505081565b60045481565b60006014600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660156000858152602001908152602001600020600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015612711575060008114155b612750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612747906155fc565b60405180910390fd5b61275b833384614289565b60003373ffffffffffffffffffffffffffffffffffffffff168260405161278190615220565b60006040518083038185875af1925050503d80600081146127be576040519150601f19603f3d011682016040523d82523d6000602084013e6127c3565b606091505b5050905080612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe906154bc565b60405180910390fd5b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161286a9190615235565b60206040518083038186803b15801561288257600080fd5b505afa158015612896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ba9190614b6c565b9050919050565b6128c96140cb565b73ffffffffffffffffffffffffffffffffffffffff166128e7612e5b565b73ffffffffffffffffffffffffffffffffffffffff161461293d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129349061557c565b60405180910390fd5b612947600061443f565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61297b6140cb565b73ffffffffffffffffffffffffffffffffffffffff16612999612e5b565b73ffffffffffffffffffffffffffffffffffffffff16146129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e69061557c565b60405180910390fd5b60006002811115612a0357612a02615b27565b5b816002811115612a1657612a15615b27565b5b14158015612a58575060006002811115612a3357612a32615b27565b5b600e60009054906101000a900460ff166002811115612a5557612a54615b27565b5b14155b612a6157600080fd5b80600e60006101000a81548160ff02191690836002811115612a8657612a85615b27565b5b021790555050565b60006014600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015612b515750612b22856124f4565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612c1357612b61853384614289565b60003373ffffffffffffffffffffffffffffffffffffffff1682604051612b8790615220565b60006040518083038185875af1925050503d8060008114612bc4576040519150601f19603f3d011682016040523d82523d6000602084013e612bc9565b606091505b5050905080612c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c04906154bc565b60405180910390fd5b50612e54565b3373ffffffffffffffffffffffffffffffffffffffff16612c33866124f4565b73ffffffffffffffffffffffffffffffffffffffff16148015612c57575060008114155b8015612c6257508281145b8015612cdd575060156000868152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d139061561c565b60405180910390fd5b612d27858584614289565b612d3181336140d3565b60006013600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e78e3cea3386886040518463ffffffff1660e01b8152600401612de69392919061534f565b600060405180830381600087803b158015612e0057600080fd5b505af1158015612e14573d6000803e3d6000fd5b505050507f3f3483d0995db4c081e0101ef6753bef457833c20605cd871de61dcb48085a9a338583604051612e4b9392919061534f565b60405180910390a15b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612e8f823383613cad565b5050565b612e9b6140cb565b73ffffffffffffffffffffffffffffffffffffffff16612eb9612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614612f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f069061557c565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315495ffe6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f7957600080fd5b505af1158015612f8d573d6000803e3d6000fd5b50505050565b6013602052816000526040600020602052806000526040600020600091509150505481565b612fc06140cb565b73ffffffffffffffffffffffffffffffffffffffff16612fde612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614613034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302b9061557c565b60405180910390fd5b806003908051906020019061304a929190614503565b5050565b6060600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156130b857600080fd5b505afa1580156130cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906130f59190614af6565b905090565b600e60009054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663367605ca3384846040518463ffffffff1660e01b815260040161316c93929190615318565b600060405180830381600087803b15801561318657600080fd5b505af115801561319a573d6000803e3d6000fd5b505050505050565b6131aa614589565b6000806000805b60166000878152602001908152602001600020548110156132db57600060156000888152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050846014600089815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156132c7576014600088815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205494508093508192505b5080806132d390615a80565b9150506131b1565b506040518060a001604052806040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525081526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018281526020016040518060400160405280600181526020017f5d000000000000000000000000000000000000000000000000000000000000008152508152509350505050919050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d8bf0c533868686866040518663ffffffff1660e01b81526004016134149594939291906152be565b600060405180830381600087803b15801561342e57600080fd5b505af1158015613442573d6000803e3d6000fd5b5050505050505050565b60166020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff16613484826124f4565b73ffffffffffffffffffffffffffffffffffffffff161480156134f7575060006013600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b613536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352d9061559c565b60405180910390fd5b60006013600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6060600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016135ec91906156fe565b60006040518083038186803b15801561360457600080fd5b505afa158015613618573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906136419190614af6565b9050919050565b600080601360008481526020019081526020016000206000613669856124f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b600b60149054906101000a900460ff1681565b6136c76140cb565b73ffffffffffffffffffffffffffffffffffffffff166136e5612e5b565b73ffffffffffffffffffffffffffffffffffffffff161461373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137329061557c565b60405180910390fd5b6001600b60146101000a81548160ff021916908315150217905550565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546137b590615a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546137e190615a1d565b801561382e5780601f106138035761010080835404028352916020019161382e565b820191906000526020600020905b81548152906001019060200180831161381157829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16613858836124f4565b73ffffffffffffffffffffffffffffffffffffffff1614156138af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a69061551c565b60405180910390fd5b60006014600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050813482613911919061582d565b14613951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139489061549c565b60405180910390fd5b60008114156139fc57336015600085815260200190815260200160002060006016600087815260200190815260200160002054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016016600085815260200190815260200160002060008282546139f4919061582d565b925050819055505b816014600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c584846040518363ffffffff1660e01b8152600401613ab5929190615250565b60206040518083038186803b158015613acd57600080fd5b505afa158015613ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b059190614a26565b905092915050565b6014602052816000526040600020602052806000526040600020600091509150505481565b613b3a6140cb565b73ffffffffffffffffffffffffffffffffffffffff16613b58612e5b565b73ffffffffffffffffffffffffffffffffffffffff1614613bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ba59061557c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c15906154dc565b60405180910390fd5b613c278161443f565b50565b60156020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60149054906101000a900460ff16905090565b60016002811115613cc157613cc0615b27565b5b600e60009054906101000a900460ff166002811115613ce357613ce2615b27565b5b14613d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d1a9061553c565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633454c4d633858585346040518663ffffffff1660e01b8152600401613d869594939291906153af565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505060003490506000606482613dcc9190615883565b905060005b600f54811015613f08576000601160006010600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613e5b91906158b4565b905080601260006010600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613edf919061582d565b925050819055508084613ef2919061590e565b9350508080613f0090615a80565b915050613dd1565b5081601260006010600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f8b919061582d565b92505081905550600554613f9d61159a565b1415613fcf576002600e60006101000a81548160ff02191690836002811115613fc957613fc8615b27565b5b02179055505b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006011600061404e6140cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116140c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c09061547c565b60405180910390fd5b565b600033905090565b600060646007546064856140e79190615883565b6140f191906158b4565b6140fb9190615883565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161414590615220565b60006040518083038185875af1925050503d8060008114614182576040519150601f19603f3d011682016040523d82523d6000602084013e614187565b606091505b50509050806141cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141c29061555c565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1683866141f0919061590e565b6040516141fc90615220565b60006040518083038185875af1925050503d8060008114614239576040519150601f19603f3d011682016040523d82523d6000602084013e61423e565b606091505b5050905080614282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142799061563c565b60405180910390fd5b5050505050565b60006014600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060016016600086815260200190815260200160002054614301919061590e565b905060156000858152602001908152602001600020600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660156000868152602001908152602001600020600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060156000868152602001908152602001600020600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601660008681526020019081526020016000206000828254614432919061590e565b9250508190555050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805461450f90615a1d565b90600052602060002090601f0160209004810192826145315760008555614578565b82601f1061454a57805160ff1916838001178555614578565b82800160010185558215614578579182015b8281111561457757825182559160200191906001019061455c565b5b50905061458591906145ce565b5090565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b5b808211156145e75760008160009055506001016145cf565b5090565b60006145fe6145f98461573e565b615719565b90508281526020810184848401111561461a57614619615be8565b5b6146258482856159db565b509392505050565b600061464061463b8461576f565b615719565b90508281526020810184848401111561465c5761465b615be8565b5b6146678482856159db565b509392505050565b600061468261467d8461576f565b615719565b90508281526020810184848401111561469e5761469d615be8565b5b6146a98482856159ea565b509392505050565b6000813590506146c081615f50565b92915050565b6000815190506146d581615f50565b92915050565b6000813590506146ea81615f67565b92915050565b6000815190506146ff81615f67565b92915050565b60008135905061471481615f7e565b92915050565b600082601f83011261472f5761472e615be3565b5b813561473f8482602086016145eb565b91505092915050565b60008135905061475781615f95565b92915050565b600082601f83011261477257614771615be3565b5b813561478284826020860161462d565b91505092915050565b600082601f8301126147a05761479f615be3565b5b81516147b084826020860161466f565b91505092915050565b6000813590506147c881615fa5565b92915050565b6000815190506147dd81615fa5565b92915050565b6000602082840312156147f9576147f8615bf2565b5b6000614807848285016146b1565b91505092915050565b60006020828403121561482657614825615bf2565b5b6000614834848285016146c6565b91505092915050565b6000806040838503121561485457614853615bf2565b5b6000614862858286016146b1565b9250506020614873858286016146b1565b9150509250929050565b60008060006060848603121561489657614895615bf2565b5b60006148a4868287016146b1565b93505060206148b5868287016146b1565b92505060406148c6868287016146db565b9150509250925092565b6000806000606084860312156148e9576148e8615bf2565b5b60006148f7868287016146b1565b9350506020614908868287016146b1565b9250506040614919868287016147b9565b9150509250925092565b6000806000806080858703121561493d5761493c615bf2565b5b600061494b878288016146b1565b945050602061495c878288016146b1565b935050604061496d878288016147b9565b925050606085013567ffffffffffffffff81111561498e5761498d615bed565b5b61499a8782880161471a565b91505092959194509250565b600080604083850312156149bd576149bc615bf2565b5b60006149cb858286016146b1565b92505060206149dc858286016146db565b9150509250929050565b600080604083850312156149fd576149fc615bf2565b5b6000614a0b858286016146b1565b9250506020614a1c858286016147b9565b9150509250929050565b600060208284031215614a3c57614a3b615bf2565b5b6000614a4a848285016146f0565b91505092915050565b600060208284031215614a6957614a68615bf2565b5b6000614a7784828501614705565b91505092915050565b600060208284031215614a9657614a95615bf2565b5b6000614aa484828501614748565b91505092915050565b600060208284031215614ac357614ac2615bf2565b5b600082013567ffffffffffffffff811115614ae157614ae0615bed565b5b614aed8482850161475d565b91505092915050565b600060208284031215614b0c57614b0b615bf2565b5b600082015167ffffffffffffffff811115614b2a57614b29615bed565b5b614b368482850161478b565b91505092915050565b600060208284031215614b5557614b54615bf2565b5b6000614b63848285016147b9565b91505092915050565b600060208284031215614b8257614b81615bf2565b5b6000614b90848285016147ce565b91505092915050565b60008060408385031215614bb057614baf615bf2565b5b6000614bbe858286016147b9565b9250506020614bcf858286016146b1565b9150509250929050565b60008060008060808587031215614bf357614bf2615bf2565b5b6000614c01878288016147b9565b9450506020614c12878288016146b1565b9350506040614c23878288016147b9565b9250506060614c34878288016147b9565b91505092959194509250565b60008060408385031215614c5757614c56615bf2565b5b6000614c65858286016147b9565b925050602083013567ffffffffffffffff811115614c8657614c85615bed565b5b614c928582860161475d565b9150509250929050565b60008060408385031215614cb357614cb2615bf2565b5b6000614cc1858286016147b9565b9250506020614cd2858286016147b9565b9150509250929050565b6000614ce88383615108565b905092915050565b614cf981615942565b82525050565b614d0881615942565b82525050565b6000614d19826157b0565b614d2381856157de565b935083602082028501614d35856157a0565b8060005b85811015614d715784840389528151614d528582614cdc565b9450614d5d836157d1565b925060208a01995050600181019050614d39565b50829750879550505050505092915050565b614d8c81615954565b82525050565b6000614d9d826157bb565b614da781856157ef565b9350614db78185602086016159ea565b614dc081615bf7565b840191505092915050565b614dd4816159c9565b82525050565b6000614de5826157c6565b614def818561580b565b9350614dff8185602086016159ea565b614e0881615bf7565b840191505092915050565b6000614e1e826157c6565b614e28818561581c565b9350614e388185602086016159ea565b614e4181615bf7565b840191505092915050565b6000614e5960138361581c565b9150614e6482615c08565b602082019050919050565b6000614e7c60038361581c565b9150614e8782615c31565b602082019050919050565b6000614e9f60028361581c565b9150614eaa82615c5a565b602082019050919050565b6000614ec260268361581c565b9150614ecd82615c83565b604082019050919050565b6000614ee560028361581c565b9150614ef082615cd2565b602082019050919050565b6000614f0860028361581c565b9150614f1382615cfb565b602082019050919050565b6000614f2b60018361581c565b9150614f3682615d24565b602082019050919050565b6000614f4e60038361581c565b9150614f5982615d4d565b602082019050919050565b6000614f7160208361581c565b9150614f7c82615d76565b602082019050919050565b6000614f9460068361581c565b9150614f9f82615d9f565b602082019050919050565b6000614fb760028361581c565b9150614fc282615dc8565b602082019050919050565b6000614fda60058361581c565b9150614fe582615df1565b602082019050919050565b6000614ffd60078361581c565b915061500882615e1a565b602082019050919050565b6000615020600083615800565b915061502b82615e43565b600082019050919050565b600061504360108361581c565b915061504e82615e46565b602082019050919050565b600061506660038361581c565b915061507182615e6f565b602082019050919050565b600061508960028361581c565b915061509482615e98565b602082019050919050565b60006150ac60028361581c565b91506150b782615ec1565b602082019050919050565b60006150cf60038361581c565b91506150da82615eea565b602082019050919050565b60006150f2600e8361581c565b91506150fd82615f13565b602082019050919050565b600060a08301600083015184820360008601526151258282614dda565b915050602083015161513a6020860182614cf0565b50604083015161514d6040860182615202565b5060608301516151606060860182615202565b50608083015184820360808601526151788282614dda565b9150508091505092915050565b600060a08301600083015184820360008601526151a28282614dda565b91505060208301516151b76020860182614cf0565b5060408301516151ca6040860182615202565b5060608301516151dd6060860182615202565b50608083015184820360808601526151f58282614dda565b9150508091505092915050565b61520b816159bf565b82525050565b61521a816159bf565b82525050565b600061522b82615013565b9150819050919050565b600060208201905061524a6000830184614cff565b92915050565b60006040820190506152656000830185614cff565b6152726020830184614cff565b9392505050565b600060808201905061528e6000830187614cff565b61529b6020830186614cff565b6152a86040830185614cff565b6152b56060830184615211565b95945050505050565b600060a0820190506152d36000830188614cff565b6152e06020830187614cff565b6152ed6040830186614cff565b6152fa6060830185615211565b818103608083015261530c8184614d92565b90509695505050505050565b600060608201905061532d6000830186614cff565b61533a6020830185614cff565b6153476040830184614d83565b949350505050565b60006060820190506153646000830186614cff565b6153716020830185614cff565b61537e6040830184615211565b949350505050565b600060408201905061539b6000830185614cff565b6153a86020830184615211565b9392505050565b600060a0820190506153c46000830188614cff565b6153d16020830187615211565b6153de6040830186614cff565b6153eb6060830185614cff565b6153f86080830184615211565b9695505050505050565b6000602082019050818103600083015261541c8184614d0e565b905092915050565b60006020820190506154396000830184614d83565b92915050565b60006020820190506154546000830184614dcb565b92915050565b600060208201905081810360008301526154748184614e13565b905092915050565b6000602082019050818103600083015261549581614e4c565b9050919050565b600060208201905081810360008301526154b581614e6f565b9050919050565b600060208201905081810360008301526154d581614e92565b9050919050565b600060208201905081810360008301526154f581614eb5565b9050919050565b6000602082019050818103600083015261551581614ed8565b9050919050565b6000602082019050818103600083015261553581614efb565b9050919050565b6000602082019050818103600083015261555581614f1e565b9050919050565b6000602082019050818103600083015261557581614f41565b9050919050565b6000602082019050818103600083015261559581614f64565b9050919050565b600060208201905081810360008301526155b581614f87565b9050919050565b600060208201905081810360008301526155d581614faa565b9050919050565b600060208201905081810360008301526155f581614fcd565b9050919050565b6000602082019050818103600083015261561581614ff0565b9050919050565b6000602082019050818103600083015261563581615036565b9050919050565b6000602082019050818103600083015261565581615059565b9050919050565b600060208201905081810360008301526156758161507c565b9050919050565b600060208201905081810360008301526156958161509f565b9050919050565b600060208201905081810360008301526156b5816150c2565b9050919050565b600060208201905081810360008301526156d5816150e5565b9050919050565b600060208201905081810360008301526156f68184615185565b905092915050565b60006020820190506157136000830184615211565b92915050565b6000615723615734565b905061572f8282615a4f565b919050565b6000604051905090565b600067ffffffffffffffff82111561575957615758615bb4565b5b61576282615bf7565b9050602081019050919050565b600067ffffffffffffffff82111561578a57615789615bb4565b5b61579382615bf7565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615838826159bf565b9150615843836159bf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561587857615877615ac9565b5b828201905092915050565b600061588e826159bf565b9150615899836159bf565b9250826158a9576158a8615af8565b5b828204905092915050565b60006158bf826159bf565b91506158ca836159bf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561590357615902615ac9565b5b828202905092915050565b6000615919826159bf565b9150615924836159bf565b92508282101561593757615936615ac9565b5b828203905092915050565b600061594d8261599f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061599a82615f3c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006159d48261598c565b9050919050565b82818337600083830152505050565b60005b83811015615a085780820151818401526020810190506159ed565b83811115615a17576000848401525b50505050565b60006002820490506001821680615a3557607f821691505b60208210811415615a4957615a48615b56565b5b50919050565b615a5882615bf7565b810181811067ffffffffffffffff82111715615a7757615a76615bb4565b5b80604052505050565b6000615a8b826159bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615abe57615abd615ac9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6e6f74206120726f79616c747920706179656500000000000000000000000000600082015250565b7f6966610000000000000000000000000000000000000000000000000000000000600082015250565b7f7466000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7770000000000000000000000000000000000000000000000000000000000000600082015250565b7f696f000000000000000000000000000000000000000000000000000000000000600082015250565b7f7300000000000000000000000000000000000000000000000000000000000000600082015250565b7f7431660000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d626f3b6e6c0000000000000000000000000000000000000000000000000000600082015250565b7f6d66000000000000000000000000000000000000000000000000000000000000600082015250565b7f6e6c3b696f000000000000000000000000000000000000000000000000000000600082015250565b7f6e6f2f6f646e6500000000000000000000000000000000000000000000000000600082015250565b50565b7f6d626f2f6f646e652f7770312f77703200000000000000000000000000000000600082015250565b7f7432660000000000000000000000000000000000000000000000000000000000600082015250565b7f7a70000000000000000000000000000000000000000000000000000000000000600082015250565b7f6e6c000000000000000000000000000000000000000000000000000000000000600082015250565b7f6d626f0000000000000000000000000000000000000000000000000000000000600082015250565b7f616c726561647920616772656564000000000000000000000000000000000000600082015250565b60038110615f4d57615f4c615b27565b5b50565b615f5981615942565b8114615f6457600080fd5b50565b615f7081615954565b8114615f7b57600080fd5b50565b615f8781615960565b8114615f9257600080fd5b50565b60038110615fa257600080fd5b50565b615fae816159bf565b8114615fb957600080fd5b5056fea26469706673582212203f51ee73265d7bc9d726510ddb4e804da083cd15af81a4aaf5d65dbee46c23c264736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000001b3900000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000045000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002add825cdab3b0434c153f548183f50a8491ea4f00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000001a436f7069756d204973204f6e652048656c6c75766120447275670000000000000000000000000000000000000000000000000000000000000000000000000006434f5049554d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000066f3794178997a12779527b36a2f042e001625af00000000000000000000000049723bb74dcdad9bcdba97fa63686684ba5714d400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001e

-----Decoded View---------------
Arg [0] : _name (string): Copium Is One Helluva Drug
Arg [1] : _symbol (string): COPIUM
Arg [2] : _maxPossibleSupply (uint256): 6969
Arg [3] : _mintPrice (uint256): 20000000000000000
Arg [4] : _royaltyBasisPoints (uint256): 500
Arg [5] : _maxAllowedMints (uint256): 69
Arg [6] : _currency (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [7] : _wrappedNativeCoinAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [8] : _royaltyReceiverAddress (address): 0x2adD825CDAB3B0434C153f548183F50A8491ea4f
Arg [9] : payees (address[]): 0x66F3794178997a12779527B36a2F042e001625aF,0x49723bB74dcDAd9bcDbA97FA63686684ba5714D4
Arg [10] : percentages (uint256[]): 70,30

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001b39
Arg [3] : 00000000000000000000000000000000000000000000000000470de4df820000
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [6] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [7] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [8] : 0000000000000000000000002add825cdab3b0434c153f548183f50a8491ea4f
Arg [9] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [11] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [12] : 436f7069756d204973204f6e652048656c6c7576612044727567000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [14] : 434f5049554d0000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [16] : 00000000000000000000000066f3794178997a12779527b36a2f042e001625af
Arg [17] : 00000000000000000000000049723bb74dcdad9bcdba97fa63686684ba5714d4
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [20] : 000000000000000000000000000000000000000000000000000000000000001e


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.