ETH Price: $2,488.13 (-0.45%)

Token

Moonlings (MOON)
 

Overview

Max Total Supply

0 MOON

Holders

2,910

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
marvin-p.eth
Balance
1 MOON
0x47176dfbd61ca9461d6fecd574fe9fe98d68380d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Moonlings are a collection of 10,000 NFTs (Non-Fungible ERC-721 Tokens) living deep within Earth’s Moon on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Moonlings

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : Moonlings.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// ============ Imports ============

import {ERC721} from "./ERC721.sol"; // Solmate: ERC721
import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; // OZ: MerkleProof
import {PaymentSplitter} from "@openzeppelin/contracts/finance/PaymentSplitter.sol";

/// @title MerkleClaim721
/// @notice ERC721 claimable by members of a merkle tree
contract Moonlings is ERC721, PaymentSplitter {
    /// ============ Immutable storage ============

    uint256 public constant maxSupply = 10000;
    uint256 public constant price = 69000000000000000;

    /// ============ Mutable storage ============

    bytes32 public merkleRoot;
    bool public publicSaleIsOpen;
    bool public whitelistIsOpen;
    bool public isRevealed;
    address public owner;
    uint256 public currentSupply;
    string public baseURI = "ipfs://QmSNKJDGXjA8hj7LyD7F4C2R1wV7zTWkdpgLPwFmLLXSPx";

    /// @notice Mapping of addresses who have claimed tokens
    mapping(address => uint256) public hasClaimed;

    /// ============ Errors ============

    /// @notice Thrown if address has already claimed
    error AlreadyClaimed();
    /// @notice Thrown if address/amount are not part of Merkle tree
    error NotInMerkle();
    /// @notice Thrown if bad price
    error PaymentNotCorrect();
    error NotOwner();
    error MintExceedsMaxSupply();
    error TooManyMintsPerTransaction();
    error AllowlistSaleNotStarted();
    error PublicSaleNotStarted();

    /// ============ Constructor ============

    /// @notice Creates a new MerkleClaimERC721 contract
    constructor(
        string memory name,
        string memory symbol,
        address[] memory payees,
        uint256[] memory shares
    ) ERC721(name, symbol) PaymentSplitter(payees, shares) {
        owner = msg.sender;
    }

    /// ============ Events ============

    /// @notice Emitted after a successful token claim
    /// @param to recipient of claim
    /// @param amount of tokens claimed
    event Claim(address indexed to, uint256 amount);

    event Mint(address indexed to, uint256 amount);

    /// ============ Public Functions ============

    /// @notice Allows claiming tokens if address is part of merkle tree
    /// @param to address of claimee
    /// @param proofAmount of tokens owed to claimee in merkle tree
    /// @param mintAmount of tokens claimee wants to mint in this call
    /// @param proof merkle proof to prove address and amount are in tree
    function claim(
        address to,
        uint256 proofAmount,
        uint256 mintAmount,
        bytes32[] calldata proof
    ) external payable {
        if (!whitelistIsOpen) revert AllowlistSaleNotStarted();
        if (mintAmount > proofAmount) revert();
        // Verify merkle proof, or revert if not in tree
        bytes32 leaf = keccak256(abi.encodePacked(to, proofAmount));
        bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf);
        if (!isValidLeaf) revert NotInMerkle();
        unchecked {
            // Throw if address has already claimed tokens
            if (hasClaimed[to] + mintAmount > proofAmount) revert AlreadyClaimed();

            if (msg.value != price * mintAmount) revert PaymentNotCorrect();

            // Set address to claimed
            hasClaimed[to] += mintAmount;

            // Mint tokens to address
            for (uint256 i = 0; i < mintAmount; i++) {
                _mint(to, ++currentSupply);
            }
        }
        // Emit claim event
        emit Claim(to, mintAmount);
    }

    function publicMint(uint256 amount) external payable {
        if (!publicSaleIsOpen) revert PublicSaleNotStarted();
        if (amount > 5) revert TooManyMintsPerTransaction();
        unchecked {
            if (currentSupply + amount > maxSupply) revert MintExceedsMaxSupply();
            if (msg.value != price * amount) revert PaymentNotCorrect();
            for (uint256 i = 0; i < amount; i++) {
                _mint(msg.sender, ++currentSupply);
            }
        }
        emit Mint(msg.sender, amount);
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        if (isRevealed) {
            return string(abi.encodePacked(baseURI, uint2str(id)));
        } else {
            return baseURI;
        }
    }

    /// ============ Owner Functions ============

    function setOwner(address newOwner) external {
        if (msg.sender != owner) revert NotOwner();
        owner = newOwner;
    }

    function ownerMint(address to, uint256 amount) external {
        if (msg.sender != owner) revert NotOwner();

        unchecked {
            for (uint256 i = 0; i < amount; i++) {
                _mint(to, ++currentSupply);
            }
        }
    }

    function setRoot(bytes32 _merkleRoot) external {
        if (msg.sender != owner) revert NotOwner();
        merkleRoot = _merkleRoot;
    }

    function reveal(string calldata _baseURI) external {
        if (msg.sender != owner) revert NotOwner();
        baseURI = _baseURI;
        isRevealed = true;
    }

    function setBools(bool whitelist, bool publicSale) external {
        if (msg.sender != owner) revert NotOwner();
        whitelistIsOpen = whitelist;
        publicSaleIsOpen = publicSale;
    }

    /// ========= Internal Functions ========

    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

File 2 of 8 : PaymentSplitter.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/utils/SafeERC20.sol";
import "../utils/Address.sol";
import "../utils/Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

File 3 of 8 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 4 of 8 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

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

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 8 : 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 6 of 8 : 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 7 of 8 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowlistSaleNotStarted","type":"error"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"MintExceedsMaxSupply","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PaymentNotCorrect","type":"error"},{"inputs":[],"name":"PublicSaleNotStarted","type":"error"},{"inputs":[],"name":"TooManyMintsPerTransaction","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"proofAmount","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"bool","name":"whitelist","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"}],"name":"setBools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","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":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060600160405280603581526020016200533f60359139601090805190602001906200003592919062000426565b503480156200004357600080fd5b5060405162005374380380620053748339818101604052810190620000699190620006de565b8181858581600090805190602001906200008592919062000426565b5080600190805190602001906200009e92919062000426565b5050508051825114620000e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000df9062000900565b60405180910390fd5b60008251116200012f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001269062000944565b60405180910390fd5b60005b82518110156200019e576200018883828151811062000156576200015562000c3f565b5b602002602001015183838151811062000174576200017362000c3f565b5b6020026020010151620001ec60201b60201c565b8080620001959062000b93565b91505062000132565b50505033600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000e3a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200025f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025690620008de565b60405180910390fd5b60008111620002a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029c9062000966565b60405180910390fd5b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200032a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003219062000922565b60405180910390fd5b600a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600654620003e1919062000a56565b6006819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200041a929190620008b1565b60405180910390a15050565b828054620004349062000b27565b90600052602060002090601f016020900481019282620004585760008555620004a4565b82601f106200047357805160ff1916838001178555620004a4565b82800160010185558215620004a4579182015b82811115620004a357825182559160200191906001019062000486565b5b509050620004b39190620004b7565b5090565b5b80821115620004d2576000816000905550600101620004b8565b5090565b6000620004ed620004e784620009b1565b62000988565b9050808382526020820190508285602086028201111562000513576200051262000ca2565b5b60005b858110156200054757816200052c888262000617565b84526020840193506020830192505060018101905062000516565b5050509392505050565b6000620005686200056284620009e0565b62000988565b905080838252602082019050828560208602820111156200058e576200058d62000ca2565b5b60005b85811015620005c25781620005a78882620006c7565b84526020840193506020830192505060018101905062000591565b5050509392505050565b6000620005e3620005dd8462000a0f565b62000988565b90508281526020810184848401111562000602576200060162000ca7565b5b6200060f84828562000af1565b509392505050565b600081519050620006288162000e06565b92915050565b600082601f83011262000646576200064562000c9d565b5b815162000658848260208601620004d6565b91505092915050565b600082601f83011262000679576200067862000c9d565b5b81516200068b84826020860162000551565b91505092915050565b600082601f830112620006ac57620006ab62000c9d565b5b8151620006be848260208601620005cc565b91505092915050565b600081519050620006d88162000e20565b92915050565b60008060008060808587031215620006fb57620006fa62000cb1565b5b600085015167ffffffffffffffff8111156200071c576200071b62000cac565b5b6200072a8782880162000694565b945050602085015167ffffffffffffffff8111156200074e576200074d62000cac565b5b6200075c8782880162000694565b935050604085015167ffffffffffffffff81111562000780576200077f62000cac565b5b6200078e878288016200062e565b925050606085015167ffffffffffffffff811115620007b257620007b162000cac565b5b620007c08782880162000661565b91505092959194509250565b620007d78162000ab3565b82525050565b6000620007ec602c8362000a45565b9150620007f98262000cc7565b604082019050919050565b60006200081360328362000a45565b9150620008208262000d16565b604082019050919050565b60006200083a602b8362000a45565b9150620008478262000d65565b604082019050919050565b600062000861601a8362000a45565b91506200086e8262000db4565b602082019050919050565b600062000888601d8362000a45565b9150620008958262000ddd565b602082019050919050565b620008ab8162000ae7565b82525050565b6000604082019050620008c86000830185620007cc565b620008d76020830184620008a0565b9392505050565b60006020820190508181036000830152620008f981620007dd565b9050919050565b600060208201905081810360008301526200091b8162000804565b9050919050565b600060208201905081810360008301526200093d816200082b565b9050919050565b600060208201905081810360008301526200095f8162000852565b9050919050565b60006020820190508181036000830152620009818162000879565b9050919050565b600062000994620009a7565b9050620009a2828262000b5d565b919050565b6000604051905090565b600067ffffffffffffffff821115620009cf57620009ce62000c6e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620009fe57620009fd62000c6e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a2d5762000a2c62000c6e565b5b62000a388262000cb6565b9050602081019050919050565b600082825260208201905092915050565b600062000a638262000ae7565b915062000a708362000ae7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000aa85762000aa762000be1565b5b828201905092915050565b600062000ac08262000ac7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b1157808201518184015260208101905062000af4565b8381111562000b21576000848401525b50505050565b6000600282049050600182168062000b4057607f821691505b6020821081141562000b575762000b5662000c10565b5b50919050565b62000b688262000cb6565b810181811067ffffffffffffffff8211171562000b8a5762000b8962000c6e565b5b80604052505050565b600062000ba08262000ae7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000bd65762000bd562000be1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000e118162000ab3565b811462000e1d57600080fd5b50565b62000e2b8162000ae7565b811462000e3757600080fd5b50565b6144f58062000e4a6000396000f3fe6080604052600436106102345760003560e01c806370a082311161012e578063b88d4fde116100ab578063d79779b21161006f578063d79779b2146108b6578063da7eacb9146108f3578063dab5f3401461091e578063e33b7de314610947578063e985e9c5146109725761027b565b8063b88d4fde146107bd578063b8e4e175146107e6578063c87b56dd14610811578063ce7c2ac21461084e578063d5abeb011461088b5761027b565b806395d89b41116100f257806395d89b41146106d85780639852595c14610703578063a035b1fe14610740578063a22cb4651461076b578063a7bba541146107945761027b565b806370a08231146105cb57806373b2e80e14610608578063771282f6146106455780638b83209b146106705780638da5cb5b146106ad5761027b565b80632eb4a7ab116101bc57806348b750441161018057806348b75044146104e65780634c2612471461050f57806354214f69146105385780636352211e146105635780636c0360eb146105a05761027b565b80632eb4a7ab146104015780633a98ef391461042c578063406072a91461045757806342842e0e14610494578063484b973c146104bd5761027b565b806313af40351161020357806313af40351461034e578063172bd6de14610377578063191655871461039357806323b872dd146103bc5780632db11544146103e55761027b565b806301ffc9a71461028057806306fdde03146102bd578063081812fc146102e8578063095ea7b3146103255761027b565b3661027b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102626109af565b34604051610271929190613a28565b60405180910390a1005b600080fd5b34801561028c57600080fd5b506102a760048036038101906102a291906133ae565b6109b7565b6040516102b49190613a51565b60405180910390f35b3480156102c957600080fd5b506102d2610a49565b6040516102df9190613a87565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906134c2565b610ad7565b60405161031c919061394e565b60405180910390f35b34801561033157600080fd5b5061034c6004803603810190610347919061324c565b610b0a565b005b34801561035a57600080fd5b506103756004803603810190610370919061309c565b610cf3565b005b610391600480360381019061038c919061328c565b610dbe565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906130c9565b611059565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613136565b611204565b005b6103ff60048036038101906103fa91906134c2565b611604565b005b34801561040d57600080fd5b50610416611789565b6040516104239190613a6c565b60405180910390f35b34801561043857600080fd5b5061044161178f565b60405161044e9190613c29565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613435565b611799565b60405161048b9190613c29565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613136565b611820565b005b3480156104c957600080fd5b506104e460048036038101906104df919061324c565b611967565b005b3480156104f257600080fd5b5061050d60048036038101906105089190613435565b611a23565b005b34801561051b57600080fd5b5061053660048036038101906105319190613475565b611ceb565b005b34801561054457600080fd5b5061054d611da3565b60405161055a9190613a51565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906134c2565b611db6565b604051610597919061394e565b60405180910390f35b3480156105ac57600080fd5b506105b5611de9565b6040516105c29190613a87565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed919061309c565b611e77565b6040516105ff9190613c29565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061309c565b611e8f565b60405161063c9190613c29565b60405180910390f35b34801561065157600080fd5b5061065a611ea7565b6040516106679190613c29565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906134c2565b611ead565b6040516106a4919061394e565b60405180910390f35b3480156106b957600080fd5b506106c2611ef5565b6040516106cf919061394e565b60405180910390f35b3480156106e457600080fd5b506106ed611f1b565b6040516106fa9190613a87565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061309c565b611fa9565b6040516107379190613c29565b60405180910390f35b34801561074c57600080fd5b50610755611ff2565b6040516107629190613c29565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d919061320c565b611ffd565b005b3480156107a057600080fd5b506107bb60048036038101906107b69190613341565b6120fa565b005b3480156107c957600080fd5b506107e460048036038101906107df9190613189565b6121b9565b005b3480156107f257600080fd5b506107fb612303565b6040516108089190613a51565b60405180910390f35b34801561081d57600080fd5b50610838600480360381019061083391906134c2565b612316565b6040516108459190613a87565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061309c565b6123f2565b6040516108829190613c29565b60405180910390f35b34801561089757600080fd5b506108a061243b565b6040516108ad9190613c29565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613408565b612441565b6040516108ea9190613c29565b60405180910390f35b3480156108ff57600080fd5b5061090861248a565b6040516109159190613a51565b60405180910390f35b34801561092a57600080fd5b5061094560048036038101906109409190613381565b61249d565b005b34801561095357600080fd5b5061095c61252e565b6040516109699190613c29565b60405180910390f35b34801561097e57600080fd5b50610999600480360381019061099491906130f6565b612538565b6040516109a69190613a51565b60405180910390f35b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610a5690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290613f70565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c025750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613be9565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff16610e04576040517f55a5151f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83831115610e1157600080fd5b60008585604051602001610e269291906138d2565b6040516020818303038152906040528051906020012090506000610e8e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612567565b905080610ec7576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8585601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115610f42576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8466f5232269808000023414610f84576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060005b8581101561100157610ff488600f6000815460010191905081905561257e565b8080600101915050610fd4565b508673ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4866040516110489190613c29565b60405180910390a250505050505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613aa9565b60405180910390fd5b60006110e561252e565b476110f09190613cfd565b90506000611107838361110286611fa9565b612791565b9050600081141561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613b29565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119c9190613cfd565b9250508190555080600760008282546111b59190613cfd565b925050819055506111c683826127ff565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111f7929190613969565b60405180910390a1505050565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90613c09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90613b49565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113ad57506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061143e5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490613be9565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600e60009054906101000a900460ff1661164a576040517fac4d09c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005811115611685576040517f345ac22a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271081600f540111156116c5576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8066f5232269808000023414611707576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156117375761172a33600f6000815460010191905081905561257e565b808060010191505061170a565b503373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161177e9190613c29565b60405180910390a250565b600d5481565b6000600654905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61182b838383611204565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611923575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016118b0939291906139de565b602060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195990613b69565b60405180910390fd5b505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611a1e57611a1183600f6000815460010191905081905561257e565b80806001019150506119f1565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90613aa9565b60405180910390fd5b6000611ab083612441565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ae9919061394e565b60206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906134ef565b611b439190613cfd565b90506000611b5b8383611b568787611799565b612791565b90506000811415611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613b29565b60405180910390fd5b80600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2d9190613cfd565b9250508190555080600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c839190613cfd565b92505081905550611c958484836128f3565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611cdd929190613a28565b60405180910390a250505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160109190611d83929190612e0b565b506001600e60026101000a81548160ff0219169083151502179055505050565b600e60029054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60108054611df690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2290613f70565b8015611e6f5780601f10611e4457610100808354040283529160200191611e6f565b820191906000526020600020905b815481529060010190602001808311611e5257829003601f168201915b505050505081565b60026020528060005260406000206000915090505481565b60116020528060005260406000206000915090505481565b600f5481565b6000600a8281548110611ec357611ec26140d7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054611f2890613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5490613f70565b8015611fa15780601f10611f7657610100808354040283529160200191611fa1565b820191906000526020600020905b815481529060010190602001808311611f8457829003601f168201915b505050505081565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b66f523226980800081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120ee9190613a51565b60405180910390a35050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612181576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff0219169083151502179055505050565b6121c4848484611204565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806122be575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b815260040161224b9493929190613992565b602060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229d91906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b6122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f490613b69565b60405180910390fd5b50505050565b600e60009054906101000a900460ff1681565b6060600e60029054906101000a900460ff161561235f57601061233883612979565b604051602001612349929190613915565b60405160208183030381529060405290506123ed565b6010805461236c90613f70565b80601f016020809104026020016040519081016040528092919081815260200182805461239890613f70565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b505050505090505b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61271081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60019054906101000a900460ff1681565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612524576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8190555050565b6000600754905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000826125748584612b02565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590613b49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790613bc9565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600654600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856127e29190613dbb565b6127ec9190613d8a565b6127f69190613e15565b90509392505050565b80471015612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990613ae9565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161286890613939565b60006040518083038185875af1925050503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b50509050806128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590613ac9565b60405180910390fd5b505050565b6129748363a9059cbb60e01b8484604051602401612912929190613a28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b77565b505050565b606060008214156129c1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612afd565b600082905060005b600082146129f35780806129dc90613fd3565b915050600a826129ec9190613d8a565b91506129c9565b60008167ffffffffffffffff811115612a0f57612a0e614106565b5b6040519080825280601f01601f191660200182016040528015612a415781602001600182028036833780820191505090505b50905060008290505b60008614612af557600181612a5f9190613e15565b90506000600a8088612a719190613d8a565b612a7b9190613dbb565b87612a869190613e15565b6030612a929190613d53565b905060008160f81b905080848481518110612ab057612aaf6140d7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612aec9190613d8a565b97505050612a4a565b819450505050505b919050565b60008082905060005b8451811015612b6c576000858281518110612b2957612b286140d7565b5b60200260200101519050808311612b4b57612b448382612c3e565b9250612b58565b612b558184612c3e565b92505b508080612b6490613fd3565b915050612b0b565b508091505092915050565b6000612bd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c559092919063ffffffff16565b9050600081511115612c395780806020019051810190612bf99190613314565b612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90613ba9565b60405180910390fd5b5b505050565b600082600052816020526040600020905092915050565b6060612c648484600085612c6d565b90509392505050565b606082471015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990613b09565b60405180910390fd5b612cbb85612d81565b612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf190613b89565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d2391906138fe565b60006040518083038185875af1925050503d8060008114612d60576040519150601f19603f3d011682016040523d82523d6000602084013e612d65565b606091505b5091509150612d75828286612da4565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612db457829050612e04565b600083511115612dc75782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9190613a87565b60405180910390fd5b9392505050565b828054612e1790613f70565b90600052602060002090601f016020900481019282612e395760008555612e80565b82601f10612e5257803560ff1916838001178555612e80565b82800160010185558215612e80579182015b82811115612e7f578235825591602001919060010190612e64565b5b509050612e8d9190612e91565b5090565b5b80821115612eaa576000816000905550600101612e92565b5090565b6000612ec1612ebc84613c69565b613c44565b905082815260208101848484011115612edd57612edc614144565b5b612ee8848285613f2e565b509392505050565b600081359050612eff8161441e565b92915050565b600081359050612f1481614435565b92915050565b60008083601f840112612f3057612f2f61413a565b5b8235905067ffffffffffffffff811115612f4d57612f4c614135565b5b602083019150836020820283011115612f6957612f6861413f565b5b9250929050565b600081359050612f7f8161444c565b92915050565b600081519050612f948161444c565b92915050565b600081359050612fa981614463565b92915050565b600081359050612fbe8161447a565b92915050565b600081519050612fd38161447a565b92915050565b600082601f830112612fee57612fed61413a565b5b8135612ffe848260208601612eae565b91505092915050565b60008135905061301681614491565b92915050565b60008083601f8401126130325761303161413a565b5b8235905067ffffffffffffffff81111561304f5761304e614135565b5b60208301915083600182028301111561306b5761306a61413f565b5b9250929050565b600081359050613081816144a8565b92915050565b600081519050613096816144a8565b92915050565b6000602082840312156130b2576130b161414e565b5b60006130c084828501612ef0565b91505092915050565b6000602082840312156130df576130de61414e565b5b60006130ed84828501612f05565b91505092915050565b6000806040838503121561310d5761310c61414e565b5b600061311b85828601612ef0565b925050602061312c85828601612ef0565b9150509250929050565b60008060006060848603121561314f5761314e61414e565b5b600061315d86828701612ef0565b935050602061316e86828701612ef0565b925050604061317f86828701613072565b9150509250925092565b600080600080608085870312156131a3576131a261414e565b5b60006131b187828801612ef0565b94505060206131c287828801612ef0565b93505060406131d387828801613072565b925050606085013567ffffffffffffffff8111156131f4576131f3614149565b5b61320087828801612fd9565b91505092959194509250565b600080604083850312156132235761322261414e565b5b600061323185828601612ef0565b925050602061324285828601612f70565b9150509250929050565b600080604083850312156132635761326261414e565b5b600061327185828601612ef0565b925050602061328285828601613072565b9150509250929050565b6000806000806000608086880312156132a8576132a761414e565b5b60006132b688828901612ef0565b95505060206132c788828901613072565b94505060406132d888828901613072565b935050606086013567ffffffffffffffff8111156132f9576132f8614149565b5b61330588828901612f1a565b92509250509295509295909350565b60006020828403121561332a5761332961414e565b5b600061333884828501612f85565b91505092915050565b600080604083850312156133585761335761414e565b5b600061336685828601612f70565b925050602061337785828601612f70565b9150509250929050565b6000602082840312156133975761339661414e565b5b60006133a584828501612f9a565b91505092915050565b6000602082840312156133c4576133c361414e565b5b60006133d284828501612faf565b91505092915050565b6000602082840312156133f1576133f061414e565b5b60006133ff84828501612fc4565b91505092915050565b60006020828403121561341e5761341d61414e565b5b600061342c84828501613007565b91505092915050565b6000806040838503121561344c5761344b61414e565b5b600061345a85828601613007565b925050602061346b85828601612ef0565b9150509250929050565b6000806020838503121561348c5761348b61414e565b5b600083013567ffffffffffffffff8111156134aa576134a9614149565b5b6134b68582860161301c565b92509250509250929050565b6000602082840312156134d8576134d761414e565b5b60006134e684828501613072565b91505092915050565b6000602082840312156135055761350461414e565b5b600061351384828501613087565b91505092915050565b61352581613ef8565b82525050565b61353481613e49565b82525050565b61354b61354682613e49565b61401c565b82525050565b61355a81613e6d565b82525050565b61356981613e79565b82525050565b600061357a82613caf565b6135848185613cc5565b9350613594818560208601613f3d565b61359d81614153565b840191505092915050565b60006135b382613caf565b6135bd8185613cd6565b93506135cd818560208601613f3d565b80840191505092915050565b60006135e482613cba565b6135ee8185613ce1565b93506135fe818560208601613f3d565b61360781614153565b840191505092915050565b600061361d82613cba565b6136278185613cf2565b9350613637818560208601613f3d565b80840191505092915050565b6000815461365081613f70565b61365a8186613cf2565b945060018216600081146136755760018114613686576136b9565b60ff198316865281860193506136b9565b61368f85613c9a565b60005b838110156136b157815481890152600182019150602081019050613692565b838801955050505b50505092915050565b60006136cf602683613ce1565b91506136da82614171565b604082019050919050565b60006136f2603a83613ce1565b91506136fd826141c0565b604082019050919050565b6000613715601d83613ce1565b91506137208261420f565b602082019050919050565b6000613738602683613ce1565b915061374382614238565b604082019050919050565b600061375b602b83613ce1565b915061376682614287565b604082019050919050565b600061377e601183613ce1565b9150613789826142d6565b602082019050919050565b60006137a1601083613ce1565b91506137ac826142ff565b602082019050919050565b60006137c4600083613cc5565b91506137cf82614328565b600082019050919050565b60006137e7600083613cd6565b91506137f282614328565b600082019050919050565b600061380a601d83613ce1565b91506138158261432b565b602082019050919050565b600061382d602a83613ce1565b915061383882614354565b604082019050919050565b6000613850600e83613ce1565b915061385b826143a3565b602082019050919050565b6000613873600e83613ce1565b915061387e826143cc565b602082019050919050565b6000613896600a83613ce1565b91506138a1826143f5565b602082019050919050565b6138b581613ee1565b82525050565b6138cc6138c782613ee1565b614040565b82525050565b60006138de828561353a565b6014820191506138ee82846138bb565b6020820191508190509392505050565b600061390a82846135a8565b915081905092915050565b60006139218285613643565b915061392d8284613612565b91508190509392505050565b6000613944826137da565b9150819050919050565b6000602082019050613963600083018461352b565b92915050565b600060408201905061397e600083018561351c565b61398b60208301846138ac565b9392505050565b60006080820190506139a7600083018761352b565b6139b4602083018661352b565b6139c160408301856138ac565b81810360608301526139d3818461356f565b905095945050505050565b60006080820190506139f3600083018661352b565b613a00602083018561352b565b613a0d60408301846138ac565b8181036060830152613a1e816137b7565b9050949350505050565b6000604082019050613a3d600083018561352b565b613a4a60208301846138ac565b9392505050565b6000602082019050613a666000830184613551565b92915050565b6000602082019050613a816000830184613560565b92915050565b60006020820190508181036000830152613aa181846135d9565b905092915050565b60006020820190508181036000830152613ac2816136c2565b9050919050565b60006020820190508181036000830152613ae2816136e5565b9050919050565b60006020820190508181036000830152613b0281613708565b9050919050565b60006020820190508181036000830152613b228161372b565b9050919050565b60006020820190508181036000830152613b428161374e565b9050919050565b60006020820190508181036000830152613b6281613771565b9050919050565b60006020820190508181036000830152613b8281613794565b9050919050565b60006020820190508181036000830152613ba2816137fd565b9050919050565b60006020820190508181036000830152613bc281613820565b9050919050565b60006020820190508181036000830152613be281613843565b9050919050565b60006020820190508181036000830152613c0281613866565b9050919050565b60006020820190508181036000830152613c2281613889565b9050919050565b6000602082019050613c3e60008301846138ac565b92915050565b6000613c4e613c5f565b9050613c5a8282613fa2565b919050565b6000604051905090565b600067ffffffffffffffff821115613c8457613c83614106565b5b613c8d82614153565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0882613ee1565b9150613d1383613ee1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4857613d4761404a565b5b828201905092915050565b6000613d5e82613eeb565b9150613d6983613eeb565b92508260ff03821115613d7f57613d7e61404a565b5b828201905092915050565b6000613d9582613ee1565b9150613da083613ee1565b925082613db057613daf614079565b5b828204905092915050565b6000613dc682613ee1565b9150613dd183613ee1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0a57613e0961404a565b5b828202905092915050565b6000613e2082613ee1565b9150613e2b83613ee1565b925082821015613e3e57613e3d61404a565b5b828203905092915050565b6000613e5482613ec1565b9050919050565b6000613e6682613ec1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613eba82613e49565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613f0382613f0a565b9050919050565b6000613f1582613f1c565b9050919050565b6000613f2782613ec1565b9050919050565b82818337600083830152505050565b60005b83811015613f5b578082015181840152602081019050613f40565b83811115613f6a576000848401525b50505050565b60006002820490506001821680613f8857607f821691505b60208210811415613f9c57613f9b6140a8565b5b50919050565b613fab82614153565b810181811067ffffffffffffffff82111715613fca57613fc9614106565b5b80604052505050565b6000613fde82613ee1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140115761401061404a565b5b600182019050919050565b60006140278261402e565b9050919050565b600061403982614164565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b61442781613e49565b811461443257600080fd5b50565b61443e81613e5b565b811461444957600080fd5b50565b61445581613e6d565b811461446057600080fd5b50565b61446c81613e79565b811461447757600080fd5b50565b61448381613e83565b811461448e57600080fd5b50565b61449a81613eaf565b81146144a557600080fd5b50565b6144b181613ee1565b81146144bc57600080fd5b5056fea26469706673582212205337b9cf935a64b56d3ce7689b07e45830db83db88a3c54d6dc9869fd0e04e5564736f6c63430008070033697066733a2f2f516d534e4b4a4447586a4138686a374c7944374634433252317756377a54576b6470674c5077466d4c4c58535078000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000094d6f6f6e6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4f4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000069dc1e5b2b5ae220d91f80ea500192ca4234d554000000000000000000000000e8096f98e90daaebfd4822ed391b6806b377436c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x6080604052600436106102345760003560e01c806370a082311161012e578063b88d4fde116100ab578063d79779b21161006f578063d79779b2146108b6578063da7eacb9146108f3578063dab5f3401461091e578063e33b7de314610947578063e985e9c5146109725761027b565b8063b88d4fde146107bd578063b8e4e175146107e6578063c87b56dd14610811578063ce7c2ac21461084e578063d5abeb011461088b5761027b565b806395d89b41116100f257806395d89b41146106d85780639852595c14610703578063a035b1fe14610740578063a22cb4651461076b578063a7bba541146107945761027b565b806370a08231146105cb57806373b2e80e14610608578063771282f6146106455780638b83209b146106705780638da5cb5b146106ad5761027b565b80632eb4a7ab116101bc57806348b750441161018057806348b75044146104e65780634c2612471461050f57806354214f69146105385780636352211e146105635780636c0360eb146105a05761027b565b80632eb4a7ab146104015780633a98ef391461042c578063406072a91461045757806342842e0e14610494578063484b973c146104bd5761027b565b806313af40351161020357806313af40351461034e578063172bd6de14610377578063191655871461039357806323b872dd146103bc5780632db11544146103e55761027b565b806301ffc9a71461028057806306fdde03146102bd578063081812fc146102e8578063095ea7b3146103255761027b565b3661027b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102626109af565b34604051610271929190613a28565b60405180910390a1005b600080fd5b34801561028c57600080fd5b506102a760048036038101906102a291906133ae565b6109b7565b6040516102b49190613a51565b60405180910390f35b3480156102c957600080fd5b506102d2610a49565b6040516102df9190613a87565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906134c2565b610ad7565b60405161031c919061394e565b60405180910390f35b34801561033157600080fd5b5061034c6004803603810190610347919061324c565b610b0a565b005b34801561035a57600080fd5b506103756004803603810190610370919061309c565b610cf3565b005b610391600480360381019061038c919061328c565b610dbe565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906130c9565b611059565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613136565b611204565b005b6103ff60048036038101906103fa91906134c2565b611604565b005b34801561040d57600080fd5b50610416611789565b6040516104239190613a6c565b60405180910390f35b34801561043857600080fd5b5061044161178f565b60405161044e9190613c29565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613435565b611799565b60405161048b9190613c29565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613136565b611820565b005b3480156104c957600080fd5b506104e460048036038101906104df919061324c565b611967565b005b3480156104f257600080fd5b5061050d60048036038101906105089190613435565b611a23565b005b34801561051b57600080fd5b5061053660048036038101906105319190613475565b611ceb565b005b34801561054457600080fd5b5061054d611da3565b60405161055a9190613a51565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906134c2565b611db6565b604051610597919061394e565b60405180910390f35b3480156105ac57600080fd5b506105b5611de9565b6040516105c29190613a87565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed919061309c565b611e77565b6040516105ff9190613c29565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061309c565b611e8f565b60405161063c9190613c29565b60405180910390f35b34801561065157600080fd5b5061065a611ea7565b6040516106679190613c29565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906134c2565b611ead565b6040516106a4919061394e565b60405180910390f35b3480156106b957600080fd5b506106c2611ef5565b6040516106cf919061394e565b60405180910390f35b3480156106e457600080fd5b506106ed611f1b565b6040516106fa9190613a87565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061309c565b611fa9565b6040516107379190613c29565b60405180910390f35b34801561074c57600080fd5b50610755611ff2565b6040516107629190613c29565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d919061320c565b611ffd565b005b3480156107a057600080fd5b506107bb60048036038101906107b69190613341565b6120fa565b005b3480156107c957600080fd5b506107e460048036038101906107df9190613189565b6121b9565b005b3480156107f257600080fd5b506107fb612303565b6040516108089190613a51565b60405180910390f35b34801561081d57600080fd5b50610838600480360381019061083391906134c2565b612316565b6040516108459190613a87565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061309c565b6123f2565b6040516108829190613c29565b60405180910390f35b34801561089757600080fd5b506108a061243b565b6040516108ad9190613c29565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613408565b612441565b6040516108ea9190613c29565b60405180910390f35b3480156108ff57600080fd5b5061090861248a565b6040516109159190613a51565b60405180910390f35b34801561092a57600080fd5b5061094560048036038101906109409190613381565b61249d565b005b34801561095357600080fd5b5061095c61252e565b6040516109699190613c29565b60405180910390f35b34801561097e57600080fd5b50610999600480360381019061099491906130f6565b612538565b6040516109a69190613a51565b60405180910390f35b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610a5690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290613f70565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c025750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613be9565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff16610e04576040517f55a5151f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83831115610e1157600080fd5b60008585604051602001610e269291906138d2565b6040516020818303038152906040528051906020012090506000610e8e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612567565b905080610ec7576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8585601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115610f42576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8466f5232269808000023414610f84576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060005b8581101561100157610ff488600f6000815460010191905081905561257e565b8080600101915050610fd4565b508673ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4866040516110489190613c29565b60405180910390a250505050505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613aa9565b60405180910390fd5b60006110e561252e565b476110f09190613cfd565b90506000611107838361110286611fa9565b612791565b9050600081141561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613b29565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119c9190613cfd565b9250508190555080600760008282546111b59190613cfd565b925050819055506111c683826127ff565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111f7929190613969565b60405180910390a1505050565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90613c09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90613b49565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113ad57506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061143e5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490613be9565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600e60009054906101000a900460ff1661164a576040517fac4d09c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005811115611685576040517f345ac22a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271081600f540111156116c5576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8066f5232269808000023414611707576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156117375761172a33600f6000815460010191905081905561257e565b808060010191505061170a565b503373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161177e9190613c29565b60405180910390a250565b600d5481565b6000600654905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61182b838383611204565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611923575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016118b0939291906139de565b602060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195990613b69565b60405180910390fd5b505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611a1e57611a1183600f6000815460010191905081905561257e565b80806001019150506119f1565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90613aa9565b60405180910390fd5b6000611ab083612441565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ae9919061394e565b60206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906134ef565b611b439190613cfd565b90506000611b5b8383611b568787611799565b612791565b90506000811415611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613b29565b60405180910390fd5b80600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2d9190613cfd565b9250508190555080600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c839190613cfd565b92505081905550611c958484836128f3565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611cdd929190613a28565b60405180910390a250505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160109190611d83929190612e0b565b506001600e60026101000a81548160ff0219169083151502179055505050565b600e60029054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60108054611df690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2290613f70565b8015611e6f5780601f10611e4457610100808354040283529160200191611e6f565b820191906000526020600020905b815481529060010190602001808311611e5257829003601f168201915b505050505081565b60026020528060005260406000206000915090505481565b60116020528060005260406000206000915090505481565b600f5481565b6000600a8281548110611ec357611ec26140d7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054611f2890613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5490613f70565b8015611fa15780601f10611f7657610100808354040283529160200191611fa1565b820191906000526020600020905b815481529060010190602001808311611f8457829003601f168201915b505050505081565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b66f523226980800081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120ee9190613a51565b60405180910390a35050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612181576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff0219169083151502179055505050565b6121c4848484611204565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806122be575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b815260040161224b9493929190613992565b602060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229d91906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b6122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f490613b69565b60405180910390fd5b50505050565b600e60009054906101000a900460ff1681565b6060600e60029054906101000a900460ff161561235f57601061233883612979565b604051602001612349929190613915565b60405160208183030381529060405290506123ed565b6010805461236c90613f70565b80601f016020809104026020016040519081016040528092919081815260200182805461239890613f70565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b505050505090505b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61271081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60019054906101000a900460ff1681565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612524576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8190555050565b6000600754905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000826125748584612b02565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590613b49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790613bc9565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600654600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856127e29190613dbb565b6127ec9190613d8a565b6127f69190613e15565b90509392505050565b80471015612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990613ae9565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161286890613939565b60006040518083038185875af1925050503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b50509050806128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590613ac9565b60405180910390fd5b505050565b6129748363a9059cbb60e01b8484604051602401612912929190613a28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b77565b505050565b606060008214156129c1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612afd565b600082905060005b600082146129f35780806129dc90613fd3565b915050600a826129ec9190613d8a565b91506129c9565b60008167ffffffffffffffff811115612a0f57612a0e614106565b5b6040519080825280601f01601f191660200182016040528015612a415781602001600182028036833780820191505090505b50905060008290505b60008614612af557600181612a5f9190613e15565b90506000600a8088612a719190613d8a565b612a7b9190613dbb565b87612a869190613e15565b6030612a929190613d53565b905060008160f81b905080848481518110612ab057612aaf6140d7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612aec9190613d8a565b97505050612a4a565b819450505050505b919050565b60008082905060005b8451811015612b6c576000858281518110612b2957612b286140d7565b5b60200260200101519050808311612b4b57612b448382612c3e565b9250612b58565b612b558184612c3e565b92505b508080612b6490613fd3565b915050612b0b565b508091505092915050565b6000612bd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c559092919063ffffffff16565b9050600081511115612c395780806020019051810190612bf99190613314565b612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90613ba9565b60405180910390fd5b5b505050565b600082600052816020526040600020905092915050565b6060612c648484600085612c6d565b90509392505050565b606082471015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990613b09565b60405180910390fd5b612cbb85612d81565b612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf190613b89565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d2391906138fe565b60006040518083038185875af1925050503d8060008114612d60576040519150601f19603f3d011682016040523d82523d6000602084013e612d65565b606091505b5091509150612d75828286612da4565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612db457829050612e04565b600083511115612dc75782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9190613a87565b60405180910390fd5b9392505050565b828054612e1790613f70565b90600052602060002090601f016020900481019282612e395760008555612e80565b82601f10612e5257803560ff1916838001178555612e80565b82800160010185558215612e80579182015b82811115612e7f578235825591602001919060010190612e64565b5b509050612e8d9190612e91565b5090565b5b80821115612eaa576000816000905550600101612e92565b5090565b6000612ec1612ebc84613c69565b613c44565b905082815260208101848484011115612edd57612edc614144565b5b612ee8848285613f2e565b509392505050565b600081359050612eff8161441e565b92915050565b600081359050612f1481614435565b92915050565b60008083601f840112612f3057612f2f61413a565b5b8235905067ffffffffffffffff811115612f4d57612f4c614135565b5b602083019150836020820283011115612f6957612f6861413f565b5b9250929050565b600081359050612f7f8161444c565b92915050565b600081519050612f948161444c565b92915050565b600081359050612fa981614463565b92915050565b600081359050612fbe8161447a565b92915050565b600081519050612fd38161447a565b92915050565b600082601f830112612fee57612fed61413a565b5b8135612ffe848260208601612eae565b91505092915050565b60008135905061301681614491565b92915050565b60008083601f8401126130325761303161413a565b5b8235905067ffffffffffffffff81111561304f5761304e614135565b5b60208301915083600182028301111561306b5761306a61413f565b5b9250929050565b600081359050613081816144a8565b92915050565b600081519050613096816144a8565b92915050565b6000602082840312156130b2576130b161414e565b5b60006130c084828501612ef0565b91505092915050565b6000602082840312156130df576130de61414e565b5b60006130ed84828501612f05565b91505092915050565b6000806040838503121561310d5761310c61414e565b5b600061311b85828601612ef0565b925050602061312c85828601612ef0565b9150509250929050565b60008060006060848603121561314f5761314e61414e565b5b600061315d86828701612ef0565b935050602061316e86828701612ef0565b925050604061317f86828701613072565b9150509250925092565b600080600080608085870312156131a3576131a261414e565b5b60006131b187828801612ef0565b94505060206131c287828801612ef0565b93505060406131d387828801613072565b925050606085013567ffffffffffffffff8111156131f4576131f3614149565b5b61320087828801612fd9565b91505092959194509250565b600080604083850312156132235761322261414e565b5b600061323185828601612ef0565b925050602061324285828601612f70565b9150509250929050565b600080604083850312156132635761326261414e565b5b600061327185828601612ef0565b925050602061328285828601613072565b9150509250929050565b6000806000806000608086880312156132a8576132a761414e565b5b60006132b688828901612ef0565b95505060206132c788828901613072565b94505060406132d888828901613072565b935050606086013567ffffffffffffffff8111156132f9576132f8614149565b5b61330588828901612f1a565b92509250509295509295909350565b60006020828403121561332a5761332961414e565b5b600061333884828501612f85565b91505092915050565b600080604083850312156133585761335761414e565b5b600061336685828601612f70565b925050602061337785828601612f70565b9150509250929050565b6000602082840312156133975761339661414e565b5b60006133a584828501612f9a565b91505092915050565b6000602082840312156133c4576133c361414e565b5b60006133d284828501612faf565b91505092915050565b6000602082840312156133f1576133f061414e565b5b60006133ff84828501612fc4565b91505092915050565b60006020828403121561341e5761341d61414e565b5b600061342c84828501613007565b91505092915050565b6000806040838503121561344c5761344b61414e565b5b600061345a85828601613007565b925050602061346b85828601612ef0565b9150509250929050565b6000806020838503121561348c5761348b61414e565b5b600083013567ffffffffffffffff8111156134aa576134a9614149565b5b6134b68582860161301c565b92509250509250929050565b6000602082840312156134d8576134d761414e565b5b60006134e684828501613072565b91505092915050565b6000602082840312156135055761350461414e565b5b600061351384828501613087565b91505092915050565b61352581613ef8565b82525050565b61353481613e49565b82525050565b61354b61354682613e49565b61401c565b82525050565b61355a81613e6d565b82525050565b61356981613e79565b82525050565b600061357a82613caf565b6135848185613cc5565b9350613594818560208601613f3d565b61359d81614153565b840191505092915050565b60006135b382613caf565b6135bd8185613cd6565b93506135cd818560208601613f3d565b80840191505092915050565b60006135e482613cba565b6135ee8185613ce1565b93506135fe818560208601613f3d565b61360781614153565b840191505092915050565b600061361d82613cba565b6136278185613cf2565b9350613637818560208601613f3d565b80840191505092915050565b6000815461365081613f70565b61365a8186613cf2565b945060018216600081146136755760018114613686576136b9565b60ff198316865281860193506136b9565b61368f85613c9a565b60005b838110156136b157815481890152600182019150602081019050613692565b838801955050505b50505092915050565b60006136cf602683613ce1565b91506136da82614171565b604082019050919050565b60006136f2603a83613ce1565b91506136fd826141c0565b604082019050919050565b6000613715601d83613ce1565b91506137208261420f565b602082019050919050565b6000613738602683613ce1565b915061374382614238565b604082019050919050565b600061375b602b83613ce1565b915061376682614287565b604082019050919050565b600061377e601183613ce1565b9150613789826142d6565b602082019050919050565b60006137a1601083613ce1565b91506137ac826142ff565b602082019050919050565b60006137c4600083613cc5565b91506137cf82614328565b600082019050919050565b60006137e7600083613cd6565b91506137f282614328565b600082019050919050565b600061380a601d83613ce1565b91506138158261432b565b602082019050919050565b600061382d602a83613ce1565b915061383882614354565b604082019050919050565b6000613850600e83613ce1565b915061385b826143a3565b602082019050919050565b6000613873600e83613ce1565b915061387e826143cc565b602082019050919050565b6000613896600a83613ce1565b91506138a1826143f5565b602082019050919050565b6138b581613ee1565b82525050565b6138cc6138c782613ee1565b614040565b82525050565b60006138de828561353a565b6014820191506138ee82846138bb565b6020820191508190509392505050565b600061390a82846135a8565b915081905092915050565b60006139218285613643565b915061392d8284613612565b91508190509392505050565b6000613944826137da565b9150819050919050565b6000602082019050613963600083018461352b565b92915050565b600060408201905061397e600083018561351c565b61398b60208301846138ac565b9392505050565b60006080820190506139a7600083018761352b565b6139b4602083018661352b565b6139c160408301856138ac565b81810360608301526139d3818461356f565b905095945050505050565b60006080820190506139f3600083018661352b565b613a00602083018561352b565b613a0d60408301846138ac565b8181036060830152613a1e816137b7565b9050949350505050565b6000604082019050613a3d600083018561352b565b613a4a60208301846138ac565b9392505050565b6000602082019050613a666000830184613551565b92915050565b6000602082019050613a816000830184613560565b92915050565b60006020820190508181036000830152613aa181846135d9565b905092915050565b60006020820190508181036000830152613ac2816136c2565b9050919050565b60006020820190508181036000830152613ae2816136e5565b9050919050565b60006020820190508181036000830152613b0281613708565b9050919050565b60006020820190508181036000830152613b228161372b565b9050919050565b60006020820190508181036000830152613b428161374e565b9050919050565b60006020820190508181036000830152613b6281613771565b9050919050565b60006020820190508181036000830152613b8281613794565b9050919050565b60006020820190508181036000830152613ba2816137fd565b9050919050565b60006020820190508181036000830152613bc281613820565b9050919050565b60006020820190508181036000830152613be281613843565b9050919050565b60006020820190508181036000830152613c0281613866565b9050919050565b60006020820190508181036000830152613c2281613889565b9050919050565b6000602082019050613c3e60008301846138ac565b92915050565b6000613c4e613c5f565b9050613c5a8282613fa2565b919050565b6000604051905090565b600067ffffffffffffffff821115613c8457613c83614106565b5b613c8d82614153565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0882613ee1565b9150613d1383613ee1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4857613d4761404a565b5b828201905092915050565b6000613d5e82613eeb565b9150613d6983613eeb565b92508260ff03821115613d7f57613d7e61404a565b5b828201905092915050565b6000613d9582613ee1565b9150613da083613ee1565b925082613db057613daf614079565b5b828204905092915050565b6000613dc682613ee1565b9150613dd183613ee1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0a57613e0961404a565b5b828202905092915050565b6000613e2082613ee1565b9150613e2b83613ee1565b925082821015613e3e57613e3d61404a565b5b828203905092915050565b6000613e5482613ec1565b9050919050565b6000613e6682613ec1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613eba82613e49565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613f0382613f0a565b9050919050565b6000613f1582613f1c565b9050919050565b6000613f2782613ec1565b9050919050565b82818337600083830152505050565b60005b83811015613f5b578082015181840152602081019050613f40565b83811115613f6a576000848401525b50505050565b60006002820490506001821680613f8857607f821691505b60208210811415613f9c57613f9b6140a8565b5b50919050565b613fab82614153565b810181811067ffffffffffffffff82111715613fca57613fc9614106565b5b80604052505050565b6000613fde82613ee1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140115761401061404a565b5b600182019050919050565b60006140278261402e565b9050919050565b600061403982614164565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b61442781613e49565b811461443257600080fd5b50565b61443e81613e5b565b811461444957600080fd5b50565b61445581613e6d565b811461446057600080fd5b50565b61446c81613e79565b811461447757600080fd5b50565b61448381613e83565b811461448e57600080fd5b50565b61449a81613eaf565b81146144a557600080fd5b50565b6144b181613ee1565b81146144bc57600080fd5b5056fea26469706673582212205337b9cf935a64b56d3ce7689b07e45830db83db88a3c54d6dc9869fd0e04e5564736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000094d6f6f6e6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4f4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000069dc1e5b2b5ae220d91f80ea500192ca4234d554000000000000000000000000e8096f98e90daaebfd4822ed391b6806b377436c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : name (string): Moonlings
Arg [1] : symbol (string): MOON
Arg [2] : payees (address[]): 0x69dC1e5b2b5AE220D91f80ea500192cA4234D554,0xE8096F98e90daAEBFd4822ED391b6806b377436C
Arg [3] : shares (uint256[]): 1,3

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4d6f6f6e6c696e67730000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4d4f4f4e00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 00000000000000000000000069dc1e5b2b5ae220d91f80ea500192ca4234d554
Arg [10] : 000000000000000000000000e8096f98e90daaebfd4822ed391b6806b377436c
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000003


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.