ETH Price: $3,299.61 (-0.51%)

Token

Machine Elves (ELF)
 

Overview

Max Total Supply

600 ELF

Holders

285

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ELF
0xb4FFc652b04756D2EC0055d7C04C234e10356D4D
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

MACHINE ELVES, 600 Genesis next-gen Avatars, by LeapN and Jups The Artist.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MachineElves

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-02
*/

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

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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/MachineElves.sol

pragma solidity 0.8.7;

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

struct SnapshotAddressMinted{
    bool Allowed;
    bool Claimed;
}

contract MachineElves is ERC721Enumerable, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public constant MAX_SUPPLY = 5555;
    uint256 public constant SALE_PRICE = 0.08 ether;
    uint256 public constant MAX_PER_PURCHASE = 10; // This is a per-address max.  No addresses can mint more than 10 in total (including deed holder claimed tokens and presale purchased tokens)
    uint256 public constant MAX_PER_PRESALE_PURCHASE = 5; // This is a per-address max.  No address can mint more than 5 during the presale (including deed holder claimed tokens)
    uint256 public constant RESERVE_QTY = 32; // 25 for the vault, 7 for giveaways
    
    bool public publicMintActive = false;
    bool public presaleMintActive = false;
    bool public foundersDeedClaimActive = false;
    bool public metadataLocked = false;
    
    // Payout addresses
    address private constant _ferb = 0x4DFA7FF4a33F2625495867a373caa4d165d37F37; // Founder
    address private constant _wickedDig = 0xc36596E05312410fC41337eC6c2914A4FCA8d6C1; // Creator
    address private constant _picoPyro = 0x86190c50d1dD3Eeb2Ab1dbb8E7195F2195AF321f; // Solidity dev
    address private constant _jups = 0xDB408786E162f7aF1e2B062b458939cE89E1c3dD; // Artist
    address private constant _machineElves = 0x31522146C57EaaeB278FbFfC97A94214b0f95404; // Community/Project
    address private constant _friendly = 0x689A19F57077F682A1D7cc19D9066F1a834721a2; // marketing
    address private constant _duo = 0x9Da3f811143ED2208085f460754b32788913a788; // marketing

    uint256 private constant _totalShares = 10000;

    string private _baseUri = "";
    
    address private _signerAddress = 0xd821bd8F420F842b0EfCc7488573A5C0Ffd5842A;

    bool private _adminsSet = false;
    uint256 private _qtyReserved = 0;

    address[7] private _shareholders = [_ferb, _wickedDig, _picoPyro, _jups, _machineElves, _friendly, _duo];
    address[2] private _admins;

    IHolderValidation private _foundersDeedInstance;

    mapping(address => uint256) private _shares;
    mapping(address => SnapshotAddressMinted) private _foundersDeedHolderSnapshot;
    mapping(string => bool) private _usedNonces;

    event Mint(address indexed recipient, uint256 indexed tokenId);

    constructor(string memory name, string memory symbol) ERC721(name, symbol) {
        require(bytes(name).length > 0 && bytes(symbol).length > 0,"Name and Symbol");

        _shares[_ferb] = 1400;
        _shares[_wickedDig] = 1200;
        _shares[_picoPyro] = 500;
        _shares[_jups] = 3300;
        _shares[_machineElves] = 2600;
        _shares[_friendly] = 500;
        _shares[_duo] = 500;
    }

    function foundersDeedClaim() external nonReentrant{
        require(foundersDeedClaimActive, "Founders Deed claiming not active");
        require(_foundersDeedHolderSnapshot[_msgSender()].Allowed, "Address not whitelisted");
        require(!_foundersDeedHolderSnapshot[_msgSender()].Claimed, "Already claimed");
        require(_foundersDeedInstance.balanceOf(_msgSender()) > 0, "Not a Founders Deed holder");

        internalMint(_msgSender(), 1);        
        _foundersDeedHolderSnapshot[_msgSender()].Claimed = true;
    }

    function mint(uint256 qty) external payable nonReentrant {
        require(publicMintActive, "Minting is not active");
        require(qty > 0, "Quantity cannot be zero");
        require(msg.value == (SALE_PRICE * qty), "Incorrect payment amount");
        require(balanceOf(_msgSender())+qty <= MAX_PER_PURCHASE, "Max of 10 mints per address");

        internalMint(_msgSender(), qty);
    }

    function presaleMint(bytes32 hash, bytes memory sig, string calldata nonce, uint256 qty) external payable nonReentrant {
        require(presaleMintActive, "Presale minting is not active");
        require(_usedNonces[nonce] == false, "Nonce has already been used");
        require(matchAddresSigner(hash, sig), "No direct minting");
        require(hashTransaction(_msgSender(), nonce) == hash, "Hash check failed");
        require(qty > 0, "Quantity cannot be zero");
        require(msg.value == (SALE_PRICE * qty), "Incorrect payment amount");
        require(balanceOf(_msgSender())+qty <= MAX_PER_PRESALE_PURCHASE, "Max of 5 presale mints per address");

        _usedNonces[nonce] = true;
        internalMint(_msgSender(), qty);
    }

    function distributeFromReserve(uint256 qty, address recipient) external nonReentrant onlyOwner {
        require((totalSupply() + qty + RESERVE_QTY) <= MAX_SUPPLY,"Exceeds total supply");
        require(_qtyReserved + qty <= RESERVE_QTY, "Exceed reserve quantity");

        for (uint256 i = 0; i < qty; i++) {
            _qtyReserved++;
            internalMint(recipient, 1);
        }
    }

    function internalMint(address recipient, uint256 qty) private {
        require(tx.origin == _msgSender(), "Only EOA");
        require((totalSupply() + qty + RESERVE_QTY) <= MAX_SUPPLY, "Exceeds total supply");
        require(qty <= MAX_PER_PURCHASE, "Exceeds per transaction limit");        
        
        for (uint256 i = 0; i < qty; i++) {
            uint256 tokenId = totalSupply() + 1;

            _safeMint(recipient, tokenId);
            emit Mint(recipient, tokenId);
        }
    }

    function hashTransaction(address sender, string calldata nonce) private view returns (bytes32) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(address(this), sender, nonce))
            )
        );
        return hash;
    }
    
    function matchAddresSigner(bytes32 hash, bytes memory signature) private view returns (bool) {
        return _signerAddress == hash.recover(signature);
    }

    /**
     * @dev Distrubtes the current balance held by the contract to all shareholders in the percentages defined
     * in the constructor. The remainder, if any, goes to the contract owner
     */
    function distributeFunds() external onlyOwner nonReentrant {
        require(address(this).balance > 0, "Insufficient balance");

        uint256 originalAmt = address(this).balance;
        uint256 balance = originalAmt;

        for (uint256 i = 0; i < _shareholders.length; i++) {
            address payee = _shareholders[i];
            uint256 payeeShares = _shares[payee];
            uint256 paymentAmount = (originalAmt * payeeShares) / _totalShares;

            balance -= paymentAmount;

            payable(payee).transfer(paymentAmount);
        }

        if(balance > 0) {
            payable(_msgSender()).transfer(balance);
        }
    }

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "Token does not exist");

        return string(abi.encodePacked(_baseUri, "/", tokenId.toString(), ".json"));
    }

    function tokensOfOwner(address owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(owner, index);
            }
            return result;
        }
    }
    
    function canClaim(address addr) external view returns (bool) {
        return _foundersDeedHolderSnapshot[addr].Allowed && !_foundersDeedHolderSnapshot[addr].Claimed;
    }

    function burn(uint256 tokenId) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Caller is not owner nor approved");
        _burn(tokenId);
    }

    function setSignerAddress(address addr) external onlyOwner {
        _signerAddress = addr;
    }

    function setBaseURI(string calldata baseURI) external onlyOwnerOrAdmin{
        require(!metadataLocked, "Metadata url is locked");
        require(bytes(baseURI).length > 0, "baseURI is required");

        _baseUri = baseURI;
    }

    function setAdmins(address[2] calldata adminAddresses) external onlyOwner {
        for (uint256 i = 0; i < adminAddresses.length; i++) {
            address admin = adminAddresses[i];

            require(admin != address(0), "Nope, that's not a good idea");
            _admins[i] = admin;
        }

        _adminsSet = true;
    }

    function addDeedholderAddresses(address[] calldata addresses) external onlyOwnerOrAdmin {
        for (uint256 i = 0; i < addresses.length; i++) {
            _foundersDeedHolderSnapshot[addresses[i]] = SnapshotAddressMinted(true, false);
        }
    }

    /**
     * @dev Creates a "limted functionality" instance of the contract for the specified address
     */
    function setFoundersDeedInstance(address instanceAddress) external onlyOwner {
        _foundersDeedInstance = IHolderValidation(instanceAddress);
    }

    function setPublicSaleActive(bool active) external onlyOwnerOrAdmin {
        if (active) {
            require(bytes(_baseUri).length > 0, "Metadata url has not been set");
        }
        publicMintActive = active;
    }
    
    function setPresaleActive(bool active) external onlyOwnerOrAdmin {
        if (active) {
            require(bytes(_baseUri).length > 0, "Metadata url has not been set");
        }
        presaleMintActive = active;
    }

    function setFoundersDeedClaimActive(bool active) external onlyOwnerOrAdmin{
        if (active) {
            require(bytes(_baseUri).length > 0, "Metadata url has not been set");
            require(address(_foundersDeedInstance) != address(0), "Founders Deed instance not set");
        }
        foundersDeedClaimActive = active;
    }

    function lockMetadataUrl() external onlyOwner {
        require(!(publicMintActive || presaleMintActive || foundersDeedClaimActive), "Cannot lock the metadata while the contract is active");
        metadataLocked = true;
    }

    /**
     * @dev Throws if called by any account other than the owner or one of the predefined admins.
     */
    modifier onlyOwnerOrAdmin() {
        require(
            _msgSender() == owner() ||
                (_adminsSet &&
                    (_msgSender() == _admins[0] || _msgSender() == _admins[1])),
            "Caller is not the owner or an admin"
        );
        _;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_PRESALE_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addDeedholderAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"distributeFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundersDeedClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundersDeedClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadataUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"adminAddresses","type":"address[2]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setFoundersDeedClaimActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"instanceAddress","type":"address"}],"name":"setFoundersDeedInstance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600c805463ffffffff1916905560a06040819052600060808190526200002891600d9162000375565b50600e80546001600160a81b03191673d821bd8f420f842b0efcc7488573a5c0ffd5842a1790556000600f556040805160e081018252734dfa7ff4a33f2625495867a373caa4d165d37f37815273c36596e05312410fc41337ec6c2914a4fca8d6c160208201527386190c50d1dd3eeb2ab1dbb8e7195f2195af321f9181019190915273db408786e162f7af1e2b062b458939ce89e1c3dd60608201527331522146c57eaaeb278fbffc97a94214b0f95404608082015273689a19f57077f682a1d7cc19d9066f1a834721a260a0820152739da3f811143ed2208085f460754b32788913a78860c08201526200012390601090600762000404565b503480156200013157600080fd5b50604051620041b5380380620041b583398101604081905262000154916200051d565b8151829082906200016d90600090602085019062000375565b5080516200018390600190602084019062000375565b505050620001a06200019a6200031f60201b60201c565b62000323565b6001600b55815115801590620001b7575060008151115b620001fa5760405162461bcd60e51b815260206004820152600f60248201526e13985b5948185b990814de5b589bdb608a1b604482015260640160405180910390fd5b5050601a6020526105787f3199c18cf85dc4184663b3d85b1965ed453942c8ceefdd651053c25324dbe0db556104b07f26f9735636b89ac205758068f85248b618757d2d2dccb10ba7dfe22563b55615556101f47e7bb981f5b2e0b788e31a92278e8033ee6b9b52deff6db5baf97c4b66ab578e819055610ce47fed523f05d80d8fcbbd43fad2242d2f15e0bd90a774404044860072241ae3704455610a287f5cfd20347b4b4f928478e7a7470029863399c192619f9e19de5552dd35b2f434557f067ccf057d80529cdfd422fcbf576c185da82efb9aeaf6707866a198f501a7f6819055739da3f811143ed2208085f460754b32788913a7886000527f9bda780af50e3b66c8be799a98f05863c1c92563691e6c8946d364e3d0be08d455620005da565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620003839062000587565b90600052602060002090601f016020900481019282620003a75760008555620003f2565b82601f10620003c257805160ff1916838001178555620003f2565b82800160010185558215620003f2579182015b82811115620003f2578251825591602001919060010190620003d5565b50620004009291506200044f565b5090565b8260078101928215620003f2579160200282015b82811115620003f257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000418565b5b8082111562000400576000815560010162000450565b600082601f8301126200047857600080fd5b81516001600160401b0380821115620004955762000495620005c4565b604051601f8301601f19908116603f01168101908282118183101715620004c057620004c0620005c4565b81604052838152602092508683858801011115620004dd57600080fd5b600091505b83821015620005015785820183015181830184015290820190620004e2565b83821115620005135760008385830101525b9695505050505050565b600080604083850312156200053157600080fd5b82516001600160401b03808211156200054957600080fd5b620005578683870162000466565b935060208501519150808211156200056e57600080fd5b506200057d8582860162000466565b9150509250929050565b600181811c908216806200059c57607f821691505b60208210811415620005be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613bcb80620005ea6000396000f3fe6080604052600436106102725760003560e01c80637c5471001161014f578063a3b7ca1c116100c1578063c87b56dd1161007a578063c87b56dd14610722578063e2e06fa314610742578063e985e9c514610762578063f2fde38b146107ab578063f3fdf375146107cb578063fa62a2dd146107e057600080fd5b8063a3b7ca1c14610680578063aa61a53014610693578063acb1a200146106a8578063b67c25a3146106c8578063b88d4fde146106e2578063bf3506c11461070257600080fd5b80638da5cb5b116101135780638da5cb5b146105da57806394bc7a94146105f857806395d89b41146106185780639a2dda941461062d578063a0712d681461064d578063a22cb4651461066057600080fd5b80637c5471001461053c5780637e32a724146105515780637f205a74146105715780638462151c1461058d5780638ae02137146105ba57600080fd5b806333ac49fd116101e85780634f6ccce7116101ac5780634f6ccce71461048657806355f804b3146104a65780636352211e146104c657806369d2ceb1146104e657806370a0823114610507578063715018a61461052757600080fd5b806333ac49fd146103fc5780633a6a4d2e146104115780633f8121a21461042657806342842e0e1461044657806342966c681461046657600080fd5b806309ec7ba91161023a57806309ec7ba9146103485780630a6f94fc1461036757806318160ddd1461038757806323b872dd146103a65780632f745c59146103c657806332cb6b0c146103e657600080fd5b806301ffc9a714610277578063046dc166146102ac57806306fdde03146102ce578063081812fc146102f0578063095ea7b314610328575b600080fd5b34801561028357600080fd5b506102976102923660046135bb565b6107f5565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102cc6102c7366004613344565b610820565b005b3480156102da57600080fd5b506102e3610875565b6040516102a3919061386d565b3480156102fc57600080fd5b5061031061030b366004613637565b610907565b6040516001600160a01b0390911681526020016102a3565b34801561033457600080fd5b506102cc610343366004613467565b61099c565b34801561035457600080fd5b50600c5461029790610100900460ff1681565b34801561037357600080fd5b506102cc610382366004613491565b610ab2565b34801561039357600080fd5b506008545b6040519081526020016102a3565b3480156103b257600080fd5b506102cc6103c1366004613399565b610bc4565b3480156103d257600080fd5b506103986103e1366004613467565b610bf6565b3480156103f257600080fd5b506103986115b381565b34801561040857600080fd5b50610398600581565b34801561041d57600080fd5b506102cc610c8c565b34801561043257600080fd5b506102cc610441366004613528565b610e14565b34801561045257600080fd5b506102cc610461366004613399565b610edb565b34801561047257600080fd5b506102cc610481366004613637565b610ef6565b34801561049257600080fd5b506103986104a1366004613637565b610f57565b3480156104b257600080fd5b506102cc6104c13660046135f5565b610fea565b3480156104d257600080fd5b506103106104e1366004613637565b611105565b3480156104f257600080fd5b50600c54610297906301000000900460ff1681565b34801561051357600080fd5b50610398610522366004613344565b61117c565b34801561053357600080fd5b506102cc611203565b34801561054857600080fd5b506102cc611239565b34801561055d57600080fd5b50600c546102979062010000900460ff1681565b34801561057d57600080fd5b5061039867011c37937e08000081565b34801561059957600080fd5b506105ad6105a8366004613344565b61130e565b6040516102a39190613829565b3480156105c657600080fd5b506102cc6105d5366004613528565b6113cd565b3480156105e657600080fd5b50600a546001600160a01b0316610310565b34801561060457600080fd5b506102cc610613366004613669565b6114ee565b34801561062457600080fd5b506102e361164d565b34801561063957600080fd5b506102cc610648366004613344565b61165c565b6102cc61065b366004613637565b6116a8565b34801561066c57600080fd5b506102cc61067b36600461343d565b611836565b6102cc61068e366004613543565b611845565b34801561069f57600080fd5b50610398600a81565b3480156106b457600080fd5b506102cc6106c33660046134b3565b611b2b565b3480156106d457600080fd5b50600c546102979060ff1681565b3480156106ee57600080fd5b506102cc6106fd3660046133d5565b611c44565b34801561070e57600080fd5b5061029761071d366004613344565b611c7c565b34801561072e57600080fd5b506102e361073d366004613637565b611cc4565b34801561074e57600080fd5b506102cc61075d366004613528565b611d54565b34801561076e57600080fd5b5061029761077d366004613366565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107b757600080fd5b506102cc6107c6366004613344565b611e14565b3480156107d757600080fd5b50610398602081565b3480156107ec57600080fd5b506102cc611eac565b60006001600160e01b0319821663780e9d6360e01b148061081a575061081a826120f3565b92915050565b600a546001600160a01b031633146108535760405162461bcd60e51b815260040161084a90613909565b60405180910390fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000805461088490613a97565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090613a97565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109805760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084a565b506000908152600460205260409020546001600160a01b031690565b60006109a782611105565b9050806001600160a01b0316836001600160a01b03161415610a155760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161084a565b336001600160a01b0382161480610a315750610a31813361077d565b610aa35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161084a565b610aad8383612143565b505050565b600a546001600160a01b03163314610adc5760405162461bcd60e51b815260040161084a90613909565b60005b6002811015610bad576000828260028110610afc57610afc613b53565b602002016020810190610b0f9190613344565b90506001600160a01b038116610b675760405162461bcd60e51b815260206004820152601c60248201527f4e6f70652c20746861742773206e6f74206120676f6f64206964656100000000604482015260640161084a565b8060178360028110610b7b57610b7b613b53565b0180546001600160a01b0319166001600160a01b03929092169190911790555080610ba581613acc565b915050610adf565b5050600e805460ff60a01b1916600160a01b179055565b610bcf335b826121b1565b610beb5760405162461bcd60e51b815260040161084a9061393e565b610aad8383836122a8565b6000610c018361117c565b8210610c635760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cb65760405162461bcd60e51b815260040161084a90613909565b6002600b541415610cd95760405162461bcd60e51b815260040161084a9061398f565b6002600b5547610d225760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161084a565b478060005b6007811015610dd557600060108260078110610d4557610d45613b53565b01546001600160a01b03166000818152601a6020526040812054919250612710610d6f8388613a35565b610d799190613a21565b9050610d858186613a54565b6040519095506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610dbe573d6000803e3d6000fd5b505050508080610dcd90613acc565b915050610d27565b508015610e0b57604051339082156108fc029083906000818181858888f19350505050158015610e09573d6000803e3d6000fd5b505b50506001600b55565b600a546001600160a01b0316331480610e715750600e54600160a01b900460ff168015610e7157506017546001600160a01b0316336001600160a01b03161480610e7157506018546001600160a01b0316336001600160a01b0316145b610e8d5760405162461bcd60e51b815260040161084a906139c6565b8015610ec1576000600d8054610ea290613a97565b905011610ec15760405162461bcd60e51b815260040161084a906138d2565b600c80549115156101000261ff0019909216919091179055565b610aad83838360405180602001604052806000815250611c44565b610eff33610bc9565b610f4b5760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604482015260640161084a565b610f5481612453565b50565b6000610f6260085490565b8210610fc55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084a565b60088281548110610fd857610fd8613b53565b90600052602060002001549050919050565b600a546001600160a01b03163314806110475750600e54600160a01b900460ff16801561104757506017546001600160a01b0316336001600160a01b0316148061104757506018546001600160a01b0316336001600160a01b0316145b6110635760405162461bcd60e51b815260040161084a906139c6565b600c546301000000900460ff16156110b65760405162461bcd60e51b815260206004820152601660248201527513595d1859185d18481d5c9b081a5cc81b1bd8dad95960521b604482015260640161084a565b806110f95760405162461bcd60e51b815260206004820152601360248201527218985cd9555492481a5cc81c995c5d5a5c9959606a1b604482015260640161084a565b610aad600d83836131b0565b6000818152600260205260408120546001600160a01b03168061081a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161084a565b60006001600160a01b0382166111e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161084a565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461122d5760405162461bcd60e51b815260040161084a90613909565b61123760006124fa565b565b600a546001600160a01b031633146112635760405162461bcd60e51b815260040161084a90613909565b600c5460ff168061127b5750600c54610100900460ff165b8061128e5750600c5462010000900460ff165b156112f95760405162461bcd60e51b815260206004820152603560248201527f43616e6e6f74206c6f636b20746865206d65746164617461207768696c652074604482015274686520636f6e74726163742069732061637469766560581b606482015260840161084a565b600c805463ff00000019166301000000179055565b6060600061131b8361117c565b90508061133c5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff81111561135757611357613b69565b604051908082528060200260200182016040528015611380578160200160208202803683370190505b50905060005b82811015611334576113988582610bf6565b8282815181106113aa576113aa613b53565b6020908102919091010152806113bf81613acc565b915050611386565b50919050565b600a546001600160a01b031633148061142a5750600e54600160a01b900460ff16801561142a57506017546001600160a01b0316336001600160a01b0316148061142a57506018546001600160a01b0316336001600160a01b0316145b6114465760405162461bcd60e51b815260040161084a906139c6565b80156114d2576000600d805461145b90613a97565b90501161147a5760405162461bcd60e51b815260040161084a906138d2565b6019546001600160a01b03166114d25760405162461bcd60e51b815260206004820152601e60248201527f466f756e64657273204465656420696e7374616e6365206e6f74207365740000604482015260640161084a565b600c8054911515620100000262ff000019909216919091179055565b6002600b5414156115115760405162461bcd60e51b815260040161084a9061398f565b6002600b55600a546001600160a01b031633146115405760405162461bcd60e51b815260040161084a90613909565b6115b360208361154f60085490565b6115599190613a09565b6115639190613a09565b11156115a85760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b604482015260640161084a565b602082600f546115b89190613a09565b11156116065760405162461bcd60e51b815260206004820152601760248201527f4578636565642072657365727665207175616e74697479000000000000000000604482015260640161084a565b60005b8281101561164357600f805490600061162183613acc565b919050555061163182600161254c565b8061163b81613acc565b915050611609565b50506001600b5550565b60606001805461088490613a97565b600a546001600160a01b031633146116865760405162461bcd60e51b815260040161084a90613909565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6002600b5414156116cb5760405162461bcd60e51b815260040161084a9061398f565b6002600b55600c5460ff1661171a5760405162461bcd60e51b81526020600482015260156024820152744d696e74696e67206973206e6f742061637469766560581b604482015260640161084a565b600081116117645760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b604482015260640161084a565b6117768167011c37937e080000613a35565b34146117bf5760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b604482015260640161084a565b600a816117cb3361117c565b6117d59190613a09565b11156118235760405162461bcd60e51b815260206004820152601b60248201527f4d6178206f66203130206d696e74732070657220616464726573730000000000604482015260640161084a565b61182e335b8261254c565b506001600b55565b6118413383836126b5565b5050565b6002600b5414156118685760405162461bcd60e51b815260040161084a9061398f565b6002600b55600c54610100900460ff166118c45760405162461bcd60e51b815260206004820152601d60248201527f50726573616c65206d696e74696e67206973206e6f7420616374697665000000604482015260640161084a565b601c83836040516118d6929190613711565b9081526040519081900360200190205460ff16156119365760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e63652068617320616c7265616479206265656e20757365640000000000604482015260640161084a565b6119408585612784565b6119805760405162461bcd60e51b81526020600482015260116024820152704e6f20646972656374206d696e74696e6760781b604482015260640161084a565b8461198c3385856127a8565b146119cd5760405162461bcd60e51b815260206004820152601160248201527012185cda0818da1958dac819985a5b1959607a1b604482015260640161084a565b60008111611a175760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b604482015260640161084a565b611a298167011c37937e080000613a35565b3414611a725760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b604482015260640161084a565b600581611a7e3361117c565b611a889190613a09565b1115611ae15760405162461bcd60e51b815260206004820152602260248201527f4d6178206f6620352070726573616c65206d696e747320706572206164647265604482015261737360f01b606482015260840161084a565b6001601c8484604051611af5929190613711565b908152604051908190036020019020805491151560ff19909216919091179055611b1f6118283390565b50506001600b55505050565b600a546001600160a01b0316331480611b885750600e54600160a01b900460ff168015611b8857506017546001600160a01b0316336001600160a01b03161480611b8857506018546001600160a01b0316336001600160a01b0316145b611ba45760405162461bcd60e51b815260040161084a906139c6565b60005b81811015610aad576040805180820190915260018152600060208201819052601b90858585818110611bdb57611bdb613b53565b9050602002016020810190611bf09190613344565b6001600160a01b0316815260208082019290925260400160002082518154939092015115156101000261ff00199215159290921661ffff199093169290921717905580611c3c81613acc565b915050611ba7565b611c4e33836121b1565b611c6a5760405162461bcd60e51b815260040161084a9061393e565b611c768484848461282c565b50505050565b6001600160a01b0381166000908152601b602052604081205460ff16801561081a5750506001600160a01b03166000908152601b6020526040902054610100900460ff161590565b6000818152600260205260409020546060906001600160a01b0316611d225760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161084a565b600d611d2d8361285f565b604051602001611d3e929190613721565b6040516020818303038152906040529050919050565b600a546001600160a01b0316331480611db15750600e54600160a01b900460ff168015611db157506017546001600160a01b0316336001600160a01b03161480611db157506018546001600160a01b0316336001600160a01b0316145b611dcd5760405162461bcd60e51b815260040161084a906139c6565b8015611e01576000600d8054611de290613a97565b905011611e015760405162461bcd60e51b815260040161084a906138d2565b600c805460ff1916911515919091179055565b600a546001600160a01b03163314611e3e5760405162461bcd60e51b815260040161084a90613909565b6001600160a01b038116611ea35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084a565b610f54816124fa565b6002600b541415611ecf5760405162461bcd60e51b815260040161084a9061398f565b6002600b55600c5462010000900460ff16611f365760405162461bcd60e51b815260206004820152602160248201527f466f756e64657273204465656420636c61696d696e67206e6f742061637469766044820152606560f81b606482015260840161084a565b336000908152601b602052604090205460ff16611f955760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f742077686974656c6973746564000000000000000000604482015260640161084a565b336000908152601b6020526040902054610100900460ff1615611fec5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161084a565b6019546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561204057600080fd5b505afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120789190613650565b116120c55760405162461bcd60e51b815260206004820152601a60248201527f4e6f74206120466f756e64657273204465656420686f6c646572000000000000604482015260640161084a565b6120d033600161254c565b336000908152601b60205260409020805461ff0019166101001790556001600b55565b60006001600160e01b031982166380ac58cd60e01b148061212457506001600160e01b03198216635b5e139f60e01b145b8061081a57506301ffc9a760e01b6001600160e01b031983161461081a565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061217882611105565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661222a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084a565b600061223583611105565b9050806001600160a01b0316846001600160a01b031614806122705750836001600160a01b031661226584610907565b6001600160a01b0316145b806122a057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122bb82611105565b6001600160a01b0316146123235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161084a565b6001600160a01b0382166123855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084a565b61239083838361295d565b61239b600082612143565b6001600160a01b03831660009081526003602052604081208054600192906123c4908490613a54565b90915550506001600160a01b03821660009081526003602052604081208054600192906123f2908490613a09565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061245e82611105565b905061246c8160008461295d565b612477600083612143565b6001600160a01b03811660009081526003602052604081208054600192906124a0908490613a54565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3233146125865760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b604482015260640161084a565b6115b360208261259560085490565b61259f9190613a09565b6125a99190613a09565b11156125ee5760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b604482015260640161084a565b600a81111561263f5760405162461bcd60e51b815260206004820152601d60248201527f4578636565647320706572207472616e73616374696f6e206c696d6974000000604482015260640161084a565b60005b81811015610aad57600061265560085490565b612660906001613a09565b905061266c8482612a15565b60405181906001600160a01b038616907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350806126ad81613acc565b915050612642565b816001600160a01b0316836001600160a01b031614156127175760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006127908383612a2f565b600e546001600160a01b039182169116149392505050565b600080308585856040516020016127c294939291906136d4565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051808303601f19018152919052805160209091012095945050505050565b6128378484846122a8565b61284384848484612a4b565b611c765760405162461bcd60e51b815260040161084a90613880565b6060816128835750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128ad578061289781613acc565b91506128a69050600a83613a21565b9150612887565b60008167ffffffffffffffff8111156128c8576128c8613b69565b6040519080825280601f01601f1916602001820160405280156128f2576020820181803683370190505b5090505b84156122a057612907600183613a54565b9150612914600a86613ae7565b61291f906030613a09565b60f81b81838151811061293457612934613b53565b60200101906001600160f81b031916908160001a905350612956600a86613a21565b94506128f6565b6001600160a01b0383166129b8576129b381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6129db565b816001600160a01b0316836001600160a01b0316146129db576129db8382612b58565b6001600160a01b0382166129f257610aad81612bf5565b826001600160a01b0316826001600160a01b031614610aad57610aad8282612ca4565b611841828260405180602001604052806000815250612ce8565b6000806000612a3e8585612d1b565b9150915061133481612d8b565b60006001600160a01b0384163b15612b4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a8f9033908990889088906004016137ec565b602060405180830381600087803b158015612aa957600080fd5b505af1925050508015612ad9575060408051601f3d908101601f19168201909252612ad6918101906135d8565b60015b612b33573d808015612b07576040519150601f19603f3d011682016040523d82523d6000602084013e612b0c565b606091505b508051612b2b5760405162461bcd60e51b815260040161084a90613880565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122a0565b506001949350505050565b60006001612b658461117c565b612b6f9190613a54565b600083815260076020526040902054909150808214612bc2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c0790600190613a54565b60008381526009602052604081205460088054939450909284908110612c2f57612c2f613b53565b906000526020600020015490508060088381548110612c5057612c50613b53565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c8857612c88613b3d565b6001900381819060005260206000200160009055905550505050565b6000612caf8361117c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b612cf28383612f46565b612cff6000848484612a4b565b610aad5760405162461bcd60e51b815260040161084a90613880565b600080825160411415612d525760208301516040840151606085015160001a612d4687828585613094565b94509450505050612d84565b825160401415612d7c5760208301516040840151612d71868383613181565b935093505050612d84565b506000905060025b9250929050565b6000816004811115612d9f57612d9f613b27565b1415612da85750565b6001816004811115612dbc57612dbc613b27565b1415612e0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161084a565b6002816004811115612e1e57612e1e613b27565b1415612e6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161084a565b6003816004811115612e8057612e80613b27565b1415612ed95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161084a565b6004816004811115612eed57612eed613b27565b1415610f545760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161084a565b6001600160a01b038216612f9c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084a565b6000818152600260205260409020546001600160a01b0316156130015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084a565b61300d6000838361295d565b6001600160a01b0382166000908152600360205260408120805460019290613036908490613a09565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156130cb5750600090506003613178565b8460ff16601b141580156130e357508460ff16601c14155b156130f45750600090506004613178565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613148573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661317157600060019250925050613178565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016131a287828885613094565b935093505050935093915050565b8280546131bc90613a97565b90600052602060002090601f0160209004810192826131de5760008555613224565b82601f106131f75782800160ff19823516178555613224565b82800160010185558215613224579182015b82811115613224578235825591602001919060010190613209565b50613230929150613234565b5090565b5b808211156132305760008155600101613235565b80356001600160a01b038116811461326057600080fd5b919050565b8035801515811461326057600080fd5b600082601f83011261328657600080fd5b813567ffffffffffffffff808211156132a1576132a1613b69565b604051601f8301601f19908116603f011681019082821181831017156132c9576132c9613b69565b816040528381528660208588010111156132e257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008083601f84011261331457600080fd5b50813567ffffffffffffffff81111561332c57600080fd5b602083019150836020828501011115612d8457600080fd5b60006020828403121561335657600080fd5b61335f82613249565b9392505050565b6000806040838503121561337957600080fd5b61338283613249565b915061339060208401613249565b90509250929050565b6000806000606084860312156133ae57600080fd5b6133b784613249565b92506133c560208501613249565b9150604084013590509250925092565b600080600080608085870312156133eb57600080fd5b6133f485613249565b935061340260208601613249565b925060408501359150606085013567ffffffffffffffff81111561342557600080fd5b61343187828801613275565b91505092959194509250565b6000806040838503121561345057600080fd5b61345983613249565b915061339060208401613265565b6000806040838503121561347a57600080fd5b61348383613249565b946020939093013593505050565b6000604082840312156134a357600080fd5b826040830111156113c757600080fd5b600080602083850312156134c657600080fd5b823567ffffffffffffffff808211156134de57600080fd5b818501915085601f8301126134f257600080fd5b81358181111561350157600080fd5b8660208260051b850101111561351657600080fd5b60209290920196919550909350505050565b60006020828403121561353a57600080fd5b61335f82613265565b60008060008060006080868803121561355b57600080fd5b85359450602086013567ffffffffffffffff8082111561357a57600080fd5b61358689838a01613275565b9550604088013591508082111561359c57600080fd5b506135a988828901613302565b96999598509660600135949350505050565b6000602082840312156135cd57600080fd5b813561335f81613b7f565b6000602082840312156135ea57600080fd5b815161335f81613b7f565b6000806020838503121561360857600080fd5b823567ffffffffffffffff81111561361f57600080fd5b61362b85828601613302565b90969095509350505050565b60006020828403121561364957600080fd5b5035919050565b60006020828403121561366257600080fd5b5051919050565b6000806040838503121561367c57600080fd5b8235915061339060208401613249565b600081518084526136a4816020860160208601613a6b565b601f01601f19169290920160200192915050565b600081516136ca818560208601613a6b565b9290920192915050565b60006bffffffffffffffffffffffff19808760601b168352808660601b166014840152508284602884013750600091016028019081529392505050565b8183823760009101908152919050565b600080845481600182811c91508083168061373d57607f831692505b602080841082141561375d57634e487b7160e01b86526022600452602486fd5b8180156137715760018114613782576137af565b60ff198616895284890196506137af565b60008b81526020902060005b868110156137a75781548b82015290850190830161378e565b505084890196505b5050505050506137e36137d26137cc83602f60f81b815260010190565b866136b8565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061381f9083018461368c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561386157835183529284019291840191600101613845565b50909695505050505050565b60208152600061335f602083018461368c565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601d908201527f4d657461646174612075726c20686173206e6f74206265656e20736574000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526023908201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460408201526236b4b760e91b606082015260800190565b60008219821115613a1c57613a1c613afb565b500190565b600082613a3057613a30613b11565b500490565b6000816000190483118215151615613a4f57613a4f613afb565b500290565b600082821015613a6657613a66613afb565b500390565b60005b83811015613a86578181015183820152602001613a6e565b83811115611c765750506000910152565b600181811c90821680613aab57607f821691505b602082108114156113c757634e487b7160e01b600052602260045260246000fd5b6000600019821415613ae057613ae0613afb565b5060010190565b600082613af657613af6613b11565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f5457600080fdfea2646970667358221220ca24719aaa01aa0f2ba3df210fd3fc9d3ad661c5ab063779360b83d57a769f9064736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d4d616368696e6520456c766573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003454c460000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637c5471001161014f578063a3b7ca1c116100c1578063c87b56dd1161007a578063c87b56dd14610722578063e2e06fa314610742578063e985e9c514610762578063f2fde38b146107ab578063f3fdf375146107cb578063fa62a2dd146107e057600080fd5b8063a3b7ca1c14610680578063aa61a53014610693578063acb1a200146106a8578063b67c25a3146106c8578063b88d4fde146106e2578063bf3506c11461070257600080fd5b80638da5cb5b116101135780638da5cb5b146105da57806394bc7a94146105f857806395d89b41146106185780639a2dda941461062d578063a0712d681461064d578063a22cb4651461066057600080fd5b80637c5471001461053c5780637e32a724146105515780637f205a74146105715780638462151c1461058d5780638ae02137146105ba57600080fd5b806333ac49fd116101e85780634f6ccce7116101ac5780634f6ccce71461048657806355f804b3146104a65780636352211e146104c657806369d2ceb1146104e657806370a0823114610507578063715018a61461052757600080fd5b806333ac49fd146103fc5780633a6a4d2e146104115780633f8121a21461042657806342842e0e1461044657806342966c681461046657600080fd5b806309ec7ba91161023a57806309ec7ba9146103485780630a6f94fc1461036757806318160ddd1461038757806323b872dd146103a65780632f745c59146103c657806332cb6b0c146103e657600080fd5b806301ffc9a714610277578063046dc166146102ac57806306fdde03146102ce578063081812fc146102f0578063095ea7b314610328575b600080fd5b34801561028357600080fd5b506102976102923660046135bb565b6107f5565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102cc6102c7366004613344565b610820565b005b3480156102da57600080fd5b506102e3610875565b6040516102a3919061386d565b3480156102fc57600080fd5b5061031061030b366004613637565b610907565b6040516001600160a01b0390911681526020016102a3565b34801561033457600080fd5b506102cc610343366004613467565b61099c565b34801561035457600080fd5b50600c5461029790610100900460ff1681565b34801561037357600080fd5b506102cc610382366004613491565b610ab2565b34801561039357600080fd5b506008545b6040519081526020016102a3565b3480156103b257600080fd5b506102cc6103c1366004613399565b610bc4565b3480156103d257600080fd5b506103986103e1366004613467565b610bf6565b3480156103f257600080fd5b506103986115b381565b34801561040857600080fd5b50610398600581565b34801561041d57600080fd5b506102cc610c8c565b34801561043257600080fd5b506102cc610441366004613528565b610e14565b34801561045257600080fd5b506102cc610461366004613399565b610edb565b34801561047257600080fd5b506102cc610481366004613637565b610ef6565b34801561049257600080fd5b506103986104a1366004613637565b610f57565b3480156104b257600080fd5b506102cc6104c13660046135f5565b610fea565b3480156104d257600080fd5b506103106104e1366004613637565b611105565b3480156104f257600080fd5b50600c54610297906301000000900460ff1681565b34801561051357600080fd5b50610398610522366004613344565b61117c565b34801561053357600080fd5b506102cc611203565b34801561054857600080fd5b506102cc611239565b34801561055d57600080fd5b50600c546102979062010000900460ff1681565b34801561057d57600080fd5b5061039867011c37937e08000081565b34801561059957600080fd5b506105ad6105a8366004613344565b61130e565b6040516102a39190613829565b3480156105c657600080fd5b506102cc6105d5366004613528565b6113cd565b3480156105e657600080fd5b50600a546001600160a01b0316610310565b34801561060457600080fd5b506102cc610613366004613669565b6114ee565b34801561062457600080fd5b506102e361164d565b34801561063957600080fd5b506102cc610648366004613344565b61165c565b6102cc61065b366004613637565b6116a8565b34801561066c57600080fd5b506102cc61067b36600461343d565b611836565b6102cc61068e366004613543565b611845565b34801561069f57600080fd5b50610398600a81565b3480156106b457600080fd5b506102cc6106c33660046134b3565b611b2b565b3480156106d457600080fd5b50600c546102979060ff1681565b3480156106ee57600080fd5b506102cc6106fd3660046133d5565b611c44565b34801561070e57600080fd5b5061029761071d366004613344565b611c7c565b34801561072e57600080fd5b506102e361073d366004613637565b611cc4565b34801561074e57600080fd5b506102cc61075d366004613528565b611d54565b34801561076e57600080fd5b5061029761077d366004613366565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107b757600080fd5b506102cc6107c6366004613344565b611e14565b3480156107d757600080fd5b50610398602081565b3480156107ec57600080fd5b506102cc611eac565b60006001600160e01b0319821663780e9d6360e01b148061081a575061081a826120f3565b92915050565b600a546001600160a01b031633146108535760405162461bcd60e51b815260040161084a90613909565b60405180910390fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000805461088490613a97565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090613a97565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109805760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084a565b506000908152600460205260409020546001600160a01b031690565b60006109a782611105565b9050806001600160a01b0316836001600160a01b03161415610a155760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161084a565b336001600160a01b0382161480610a315750610a31813361077d565b610aa35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161084a565b610aad8383612143565b505050565b600a546001600160a01b03163314610adc5760405162461bcd60e51b815260040161084a90613909565b60005b6002811015610bad576000828260028110610afc57610afc613b53565b602002016020810190610b0f9190613344565b90506001600160a01b038116610b675760405162461bcd60e51b815260206004820152601c60248201527f4e6f70652c20746861742773206e6f74206120676f6f64206964656100000000604482015260640161084a565b8060178360028110610b7b57610b7b613b53565b0180546001600160a01b0319166001600160a01b03929092169190911790555080610ba581613acc565b915050610adf565b5050600e805460ff60a01b1916600160a01b179055565b610bcf335b826121b1565b610beb5760405162461bcd60e51b815260040161084a9061393e565b610aad8383836122a8565b6000610c018361117c565b8210610c635760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cb65760405162461bcd60e51b815260040161084a90613909565b6002600b541415610cd95760405162461bcd60e51b815260040161084a9061398f565b6002600b5547610d225760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161084a565b478060005b6007811015610dd557600060108260078110610d4557610d45613b53565b01546001600160a01b03166000818152601a6020526040812054919250612710610d6f8388613a35565b610d799190613a21565b9050610d858186613a54565b6040519095506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610dbe573d6000803e3d6000fd5b505050508080610dcd90613acc565b915050610d27565b508015610e0b57604051339082156108fc029083906000818181858888f19350505050158015610e09573d6000803e3d6000fd5b505b50506001600b55565b600a546001600160a01b0316331480610e715750600e54600160a01b900460ff168015610e7157506017546001600160a01b0316336001600160a01b03161480610e7157506018546001600160a01b0316336001600160a01b0316145b610e8d5760405162461bcd60e51b815260040161084a906139c6565b8015610ec1576000600d8054610ea290613a97565b905011610ec15760405162461bcd60e51b815260040161084a906138d2565b600c80549115156101000261ff0019909216919091179055565b610aad83838360405180602001604052806000815250611c44565b610eff33610bc9565b610f4b5760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604482015260640161084a565b610f5481612453565b50565b6000610f6260085490565b8210610fc55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084a565b60088281548110610fd857610fd8613b53565b90600052602060002001549050919050565b600a546001600160a01b03163314806110475750600e54600160a01b900460ff16801561104757506017546001600160a01b0316336001600160a01b0316148061104757506018546001600160a01b0316336001600160a01b0316145b6110635760405162461bcd60e51b815260040161084a906139c6565b600c546301000000900460ff16156110b65760405162461bcd60e51b815260206004820152601660248201527513595d1859185d18481d5c9b081a5cc81b1bd8dad95960521b604482015260640161084a565b806110f95760405162461bcd60e51b815260206004820152601360248201527218985cd9555492481a5cc81c995c5d5a5c9959606a1b604482015260640161084a565b610aad600d83836131b0565b6000818152600260205260408120546001600160a01b03168061081a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161084a565b60006001600160a01b0382166111e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161084a565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461122d5760405162461bcd60e51b815260040161084a90613909565b61123760006124fa565b565b600a546001600160a01b031633146112635760405162461bcd60e51b815260040161084a90613909565b600c5460ff168061127b5750600c54610100900460ff165b8061128e5750600c5462010000900460ff165b156112f95760405162461bcd60e51b815260206004820152603560248201527f43616e6e6f74206c6f636b20746865206d65746164617461207768696c652074604482015274686520636f6e74726163742069732061637469766560581b606482015260840161084a565b600c805463ff00000019166301000000179055565b6060600061131b8361117c565b90508061133c5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff81111561135757611357613b69565b604051908082528060200260200182016040528015611380578160200160208202803683370190505b50905060005b82811015611334576113988582610bf6565b8282815181106113aa576113aa613b53565b6020908102919091010152806113bf81613acc565b915050611386565b50919050565b600a546001600160a01b031633148061142a5750600e54600160a01b900460ff16801561142a57506017546001600160a01b0316336001600160a01b0316148061142a57506018546001600160a01b0316336001600160a01b0316145b6114465760405162461bcd60e51b815260040161084a906139c6565b80156114d2576000600d805461145b90613a97565b90501161147a5760405162461bcd60e51b815260040161084a906138d2565b6019546001600160a01b03166114d25760405162461bcd60e51b815260206004820152601e60248201527f466f756e64657273204465656420696e7374616e6365206e6f74207365740000604482015260640161084a565b600c8054911515620100000262ff000019909216919091179055565b6002600b5414156115115760405162461bcd60e51b815260040161084a9061398f565b6002600b55600a546001600160a01b031633146115405760405162461bcd60e51b815260040161084a90613909565b6115b360208361154f60085490565b6115599190613a09565b6115639190613a09565b11156115a85760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b604482015260640161084a565b602082600f546115b89190613a09565b11156116065760405162461bcd60e51b815260206004820152601760248201527f4578636565642072657365727665207175616e74697479000000000000000000604482015260640161084a565b60005b8281101561164357600f805490600061162183613acc565b919050555061163182600161254c565b8061163b81613acc565b915050611609565b50506001600b5550565b60606001805461088490613a97565b600a546001600160a01b031633146116865760405162461bcd60e51b815260040161084a90613909565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6002600b5414156116cb5760405162461bcd60e51b815260040161084a9061398f565b6002600b55600c5460ff1661171a5760405162461bcd60e51b81526020600482015260156024820152744d696e74696e67206973206e6f742061637469766560581b604482015260640161084a565b600081116117645760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b604482015260640161084a565b6117768167011c37937e080000613a35565b34146117bf5760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b604482015260640161084a565b600a816117cb3361117c565b6117d59190613a09565b11156118235760405162461bcd60e51b815260206004820152601b60248201527f4d6178206f66203130206d696e74732070657220616464726573730000000000604482015260640161084a565b61182e335b8261254c565b506001600b55565b6118413383836126b5565b5050565b6002600b5414156118685760405162461bcd60e51b815260040161084a9061398f565b6002600b55600c54610100900460ff166118c45760405162461bcd60e51b815260206004820152601d60248201527f50726573616c65206d696e74696e67206973206e6f7420616374697665000000604482015260640161084a565b601c83836040516118d6929190613711565b9081526040519081900360200190205460ff16156119365760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e63652068617320616c7265616479206265656e20757365640000000000604482015260640161084a565b6119408585612784565b6119805760405162461bcd60e51b81526020600482015260116024820152704e6f20646972656374206d696e74696e6760781b604482015260640161084a565b8461198c3385856127a8565b146119cd5760405162461bcd60e51b815260206004820152601160248201527012185cda0818da1958dac819985a5b1959607a1b604482015260640161084a565b60008111611a175760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b604482015260640161084a565b611a298167011c37937e080000613a35565b3414611a725760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b604482015260640161084a565b600581611a7e3361117c565b611a889190613a09565b1115611ae15760405162461bcd60e51b815260206004820152602260248201527f4d6178206f6620352070726573616c65206d696e747320706572206164647265604482015261737360f01b606482015260840161084a565b6001601c8484604051611af5929190613711565b908152604051908190036020019020805491151560ff19909216919091179055611b1f6118283390565b50506001600b55505050565b600a546001600160a01b0316331480611b885750600e54600160a01b900460ff168015611b8857506017546001600160a01b0316336001600160a01b03161480611b8857506018546001600160a01b0316336001600160a01b0316145b611ba45760405162461bcd60e51b815260040161084a906139c6565b60005b81811015610aad576040805180820190915260018152600060208201819052601b90858585818110611bdb57611bdb613b53565b9050602002016020810190611bf09190613344565b6001600160a01b0316815260208082019290925260400160002082518154939092015115156101000261ff00199215159290921661ffff199093169290921717905580611c3c81613acc565b915050611ba7565b611c4e33836121b1565b611c6a5760405162461bcd60e51b815260040161084a9061393e565b611c768484848461282c565b50505050565b6001600160a01b0381166000908152601b602052604081205460ff16801561081a5750506001600160a01b03166000908152601b6020526040902054610100900460ff161590565b6000818152600260205260409020546060906001600160a01b0316611d225760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161084a565b600d611d2d8361285f565b604051602001611d3e929190613721565b6040516020818303038152906040529050919050565b600a546001600160a01b0316331480611db15750600e54600160a01b900460ff168015611db157506017546001600160a01b0316336001600160a01b03161480611db157506018546001600160a01b0316336001600160a01b0316145b611dcd5760405162461bcd60e51b815260040161084a906139c6565b8015611e01576000600d8054611de290613a97565b905011611e015760405162461bcd60e51b815260040161084a906138d2565b600c805460ff1916911515919091179055565b600a546001600160a01b03163314611e3e5760405162461bcd60e51b815260040161084a90613909565b6001600160a01b038116611ea35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084a565b610f54816124fa565b6002600b541415611ecf5760405162461bcd60e51b815260040161084a9061398f565b6002600b55600c5462010000900460ff16611f365760405162461bcd60e51b815260206004820152602160248201527f466f756e64657273204465656420636c61696d696e67206e6f742061637469766044820152606560f81b606482015260840161084a565b336000908152601b602052604090205460ff16611f955760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f742077686974656c6973746564000000000000000000604482015260640161084a565b336000908152601b6020526040902054610100900460ff1615611fec5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161084a565b6019546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561204057600080fd5b505afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120789190613650565b116120c55760405162461bcd60e51b815260206004820152601a60248201527f4e6f74206120466f756e64657273204465656420686f6c646572000000000000604482015260640161084a565b6120d033600161254c565b336000908152601b60205260409020805461ff0019166101001790556001600b55565b60006001600160e01b031982166380ac58cd60e01b148061212457506001600160e01b03198216635b5e139f60e01b145b8061081a57506301ffc9a760e01b6001600160e01b031983161461081a565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061217882611105565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661222a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084a565b600061223583611105565b9050806001600160a01b0316846001600160a01b031614806122705750836001600160a01b031661226584610907565b6001600160a01b0316145b806122a057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122bb82611105565b6001600160a01b0316146123235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161084a565b6001600160a01b0382166123855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084a565b61239083838361295d565b61239b600082612143565b6001600160a01b03831660009081526003602052604081208054600192906123c4908490613a54565b90915550506001600160a01b03821660009081526003602052604081208054600192906123f2908490613a09565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061245e82611105565b905061246c8160008461295d565b612477600083612143565b6001600160a01b03811660009081526003602052604081208054600192906124a0908490613a54565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3233146125865760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b604482015260640161084a565b6115b360208261259560085490565b61259f9190613a09565b6125a99190613a09565b11156125ee5760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b604482015260640161084a565b600a81111561263f5760405162461bcd60e51b815260206004820152601d60248201527f4578636565647320706572207472616e73616374696f6e206c696d6974000000604482015260640161084a565b60005b81811015610aad57600061265560085490565b612660906001613a09565b905061266c8482612a15565b60405181906001600160a01b038616907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350806126ad81613acc565b915050612642565b816001600160a01b0316836001600160a01b031614156127175760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006127908383612a2f565b600e546001600160a01b039182169116149392505050565b600080308585856040516020016127c294939291906136d4565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051808303601f19018152919052805160209091012095945050505050565b6128378484846122a8565b61284384848484612a4b565b611c765760405162461bcd60e51b815260040161084a90613880565b6060816128835750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128ad578061289781613acc565b91506128a69050600a83613a21565b9150612887565b60008167ffffffffffffffff8111156128c8576128c8613b69565b6040519080825280601f01601f1916602001820160405280156128f2576020820181803683370190505b5090505b84156122a057612907600183613a54565b9150612914600a86613ae7565b61291f906030613a09565b60f81b81838151811061293457612934613b53565b60200101906001600160f81b031916908160001a905350612956600a86613a21565b94506128f6565b6001600160a01b0383166129b8576129b381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6129db565b816001600160a01b0316836001600160a01b0316146129db576129db8382612b58565b6001600160a01b0382166129f257610aad81612bf5565b826001600160a01b0316826001600160a01b031614610aad57610aad8282612ca4565b611841828260405180602001604052806000815250612ce8565b6000806000612a3e8585612d1b565b9150915061133481612d8b565b60006001600160a01b0384163b15612b4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a8f9033908990889088906004016137ec565b602060405180830381600087803b158015612aa957600080fd5b505af1925050508015612ad9575060408051601f3d908101601f19168201909252612ad6918101906135d8565b60015b612b33573d808015612b07576040519150601f19603f3d011682016040523d82523d6000602084013e612b0c565b606091505b508051612b2b5760405162461bcd60e51b815260040161084a90613880565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122a0565b506001949350505050565b60006001612b658461117c565b612b6f9190613a54565b600083815260076020526040902054909150808214612bc2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c0790600190613a54565b60008381526009602052604081205460088054939450909284908110612c2f57612c2f613b53565b906000526020600020015490508060088381548110612c5057612c50613b53565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c8857612c88613b3d565b6001900381819060005260206000200160009055905550505050565b6000612caf8361117c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b612cf28383612f46565b612cff6000848484612a4b565b610aad5760405162461bcd60e51b815260040161084a90613880565b600080825160411415612d525760208301516040840151606085015160001a612d4687828585613094565b94509450505050612d84565b825160401415612d7c5760208301516040840151612d71868383613181565b935093505050612d84565b506000905060025b9250929050565b6000816004811115612d9f57612d9f613b27565b1415612da85750565b6001816004811115612dbc57612dbc613b27565b1415612e0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161084a565b6002816004811115612e1e57612e1e613b27565b1415612e6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161084a565b6003816004811115612e8057612e80613b27565b1415612ed95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161084a565b6004816004811115612eed57612eed613b27565b1415610f545760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161084a565b6001600160a01b038216612f9c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084a565b6000818152600260205260409020546001600160a01b0316156130015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084a565b61300d6000838361295d565b6001600160a01b0382166000908152600360205260408120805460019290613036908490613a09565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156130cb5750600090506003613178565b8460ff16601b141580156130e357508460ff16601c14155b156130f45750600090506004613178565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613148573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661317157600060019250925050613178565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016131a287828885613094565b935093505050935093915050565b8280546131bc90613a97565b90600052602060002090601f0160209004810192826131de5760008555613224565b82601f106131f75782800160ff19823516178555613224565b82800160010185558215613224579182015b82811115613224578235825591602001919060010190613209565b50613230929150613234565b5090565b5b808211156132305760008155600101613235565b80356001600160a01b038116811461326057600080fd5b919050565b8035801515811461326057600080fd5b600082601f83011261328657600080fd5b813567ffffffffffffffff808211156132a1576132a1613b69565b604051601f8301601f19908116603f011681019082821181831017156132c9576132c9613b69565b816040528381528660208588010111156132e257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008083601f84011261331457600080fd5b50813567ffffffffffffffff81111561332c57600080fd5b602083019150836020828501011115612d8457600080fd5b60006020828403121561335657600080fd5b61335f82613249565b9392505050565b6000806040838503121561337957600080fd5b61338283613249565b915061339060208401613249565b90509250929050565b6000806000606084860312156133ae57600080fd5b6133b784613249565b92506133c560208501613249565b9150604084013590509250925092565b600080600080608085870312156133eb57600080fd5b6133f485613249565b935061340260208601613249565b925060408501359150606085013567ffffffffffffffff81111561342557600080fd5b61343187828801613275565b91505092959194509250565b6000806040838503121561345057600080fd5b61345983613249565b915061339060208401613265565b6000806040838503121561347a57600080fd5b61348383613249565b946020939093013593505050565b6000604082840312156134a357600080fd5b826040830111156113c757600080fd5b600080602083850312156134c657600080fd5b823567ffffffffffffffff808211156134de57600080fd5b818501915085601f8301126134f257600080fd5b81358181111561350157600080fd5b8660208260051b850101111561351657600080fd5b60209290920196919550909350505050565b60006020828403121561353a57600080fd5b61335f82613265565b60008060008060006080868803121561355b57600080fd5b85359450602086013567ffffffffffffffff8082111561357a57600080fd5b61358689838a01613275565b9550604088013591508082111561359c57600080fd5b506135a988828901613302565b96999598509660600135949350505050565b6000602082840312156135cd57600080fd5b813561335f81613b7f565b6000602082840312156135ea57600080fd5b815161335f81613b7f565b6000806020838503121561360857600080fd5b823567ffffffffffffffff81111561361f57600080fd5b61362b85828601613302565b90969095509350505050565b60006020828403121561364957600080fd5b5035919050565b60006020828403121561366257600080fd5b5051919050565b6000806040838503121561367c57600080fd5b8235915061339060208401613249565b600081518084526136a4816020860160208601613a6b565b601f01601f19169290920160200192915050565b600081516136ca818560208601613a6b565b9290920192915050565b60006bffffffffffffffffffffffff19808760601b168352808660601b166014840152508284602884013750600091016028019081529392505050565b8183823760009101908152919050565b600080845481600182811c91508083168061373d57607f831692505b602080841082141561375d57634e487b7160e01b86526022600452602486fd5b8180156137715760018114613782576137af565b60ff198616895284890196506137af565b60008b81526020902060005b868110156137a75781548b82015290850190830161378e565b505084890196505b5050505050506137e36137d26137cc83602f60f81b815260010190565b866136b8565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061381f9083018461368c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561386157835183529284019291840191600101613845565b50909695505050505050565b60208152600061335f602083018461368c565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601d908201527f4d657461646174612075726c20686173206e6f74206265656e20736574000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526023908201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460408201526236b4b760e91b606082015260800190565b60008219821115613a1c57613a1c613afb565b500190565b600082613a3057613a30613b11565b500490565b6000816000190483118215151615613a4f57613a4f613afb565b500290565b600082821015613a6657613a66613afb565b500390565b60005b83811015613a86578181015183820152602001613a6e565b83811115611c765750506000910152565b600181811c90821680613aab57607f821691505b602082108114156113c757634e487b7160e01b600052602260045260246000fd5b6000600019821415613ae057613ae0613afb565b5060010190565b600082613af657613af6613b11565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f5457600080fdfea2646970667358221220ca24719aaa01aa0f2ba3df210fd3fc9d3ad661c5ab063779360b83d57a769f9064736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d4d616368696e6520456c766573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003454c460000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Machine Elves
Arg [1] : symbol (string): ELF

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [3] : 4d616368696e6520456c76657300000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 454c460000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57076:10760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50589:224;;;;;;;;;;-1:-1:-1;50589:224:0;;;;;:::i;:::-;;:::i;:::-;;;11464:14:1;;11457:22;11439:41;;11427:2;11412:18;50589:224:0;;;;;;;;65117:99;;;;;;;;;;-1:-1:-1;65117:99:0;;;;;:::i;:::-;;:::i;:::-;;37010:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38569:221::-;;;;;;;;;;-1:-1:-1;38569:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10125:32:1;;;10107:51;;10095:2;10080:18;38569:221:0;9961:203:1;38092:411:0;;;;;;;;;;-1:-1:-1;38092:411:0;;;;;:::i;:::-;;:::i;57825:37::-;;;;;;;;;;-1:-1:-1;57825:37:0;;;;;;;;;;;65470:344;;;;;;;;;;-1:-1:-1;65470:344:0;;;;;:::i;:::-;;:::i;51229:113::-;;;;;;;;;;-1:-1:-1;51317:10:0;:17;51229:113;;;30660:25:1;;;30648:2;30633:18;51229:113:0;30514:177:1;39319:339:0;;;;;;;;;;-1:-1:-1;39319:339:0;;;;;:::i;:::-;;:::i;50897:256::-;;;;;;;;;;-1:-1:-1;50897:256:0;;;;;:::i;:::-;;:::i;57215:41::-;;;;;;;;;;;;57252:4;57215:41;;57512:52;;;;;;;;;;;;57563:1;57512:52;;63203:676;;;;;;;;;;;;;:::i;66606:227::-;;;;;;;;;;-1:-1:-1;66606:227:0;;;;;:::i;:::-;;:::i;39729:185::-;;;;;;;;;;-1:-1:-1;39729:185:0;;;;;:::i;:::-;;:::i;64941:168::-;;;;;;;;;;-1:-1:-1;64941:168:0;;;;;:::i;:::-;;:::i;51419:233::-;;;;;;;;;;-1:-1:-1;51419:233:0;;;;;:::i;:::-;;:::i;65224:238::-;;;;;;;;;;-1:-1:-1;65224:238:0;;;;;:::i;:::-;;:::i;36704:239::-;;;;;;;;;;-1:-1:-1;36704:239:0;;;;;:::i;:::-;;:::i;57919:34::-;;;;;;;;;;-1:-1:-1;57919:34:0;;;;;;;;;;;36434:208;;;;;;;;;;-1:-1:-1;36434:208:0;;;;;:::i;:::-;;:::i;26235:103::-;;;;;;;;;;;;;:::i;67193:230::-;;;;;;;;;;;;;:::i;57869:43::-;;;;;;;;;;-1:-1:-1;57869:43:0;;;;;;;;;;;57263:47;;;;;;;;;;;;57300:10;57263:47;;64248:499;;;;;;;;;;-1:-1:-1;64248:499:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66841:344::-;;;;;;;;;;-1:-1:-1;66841:344:0;;;;;:::i;:::-;;:::i;25584:87::-;;;;;;;;;;-1:-1:-1;25657:6:0;;-1:-1:-1;;;;;25657:6:0;25584:87;;61540:403;;;;;;;;;;-1:-1:-1;61540:403:0;;;;;:::i;:::-;;:::i;37179:104::-;;;;;;;;;;;;;:::i;66203:154::-;;;;;;;;;;-1:-1:-1;66203:154:0;;;;;:::i;:::-;;:::i;60368:401::-;;;;;;:::i;:::-;;:::i;38862:155::-;;;;;;;;;;-1:-1:-1;38862:155:0;;;;;:::i;:::-;;:::i;60777:755::-;;;;;;:::i;:::-;;:::i;57317:45::-;;;;;;;;;;;;57360:2;57317:45;;65822:258;;;;;;;;;;-1:-1:-1;65822:258:0;;;;;:::i;:::-;;:::i;57782:36::-;;;;;;;;;;-1:-1:-1;57782:36:0;;;;;;;;39985:328;;;;;;;;;;-1:-1:-1;39985:328:0;;;;;:::i;:::-;;:::i;64759:174::-;;;;;;;;;;-1:-1:-1;64759:174:0;;;;;:::i;:::-;;:::i;64004:236::-;;;;;;;;;;-1:-1:-1;64004:236:0;;;;;:::i;:::-;;:::i;66365:229::-;;;;;;;;;;-1:-1:-1;66365:229:0;;;;;:::i;:::-;;:::i;39088:164::-;;;;;;;;;;-1:-1:-1;39088:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;39209:25:0;;;39185:4;39209:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39088:164;26493:201;;;;;;;;;;-1:-1:-1;26493:201:0;;;;;:::i;:::-;;:::i;57692:40::-;;;;;;;;;;;;57730:2;57692:40;;59821:539;;;;;;;;;;;;;:::i;50589:224::-;50691:4;-1:-1:-1;;;;;;50715:50:0;;-1:-1:-1;;;50715:50:0;;:90;;;50769:36;50793:11;50769:23;:36::i;:::-;50708:97;50589:224;-1:-1:-1;;50589:224:0:o;65117:99::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;;;;;;;;;65187:14:::1;:21:::0;;-1:-1:-1;;;;;;65187:21:0::1;-1:-1:-1::0;;;;;65187:21:0;;;::::1;::::0;;;::::1;::::0;;65117:99::o;37010:100::-;37064:13;37097:5;37090:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37010:100;:::o;38569:221::-;38645:7;41912:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41912:16:0;38665:73;;;;-1:-1:-1;;;38665:73:0;;23863:2:1;38665:73:0;;;23845:21:1;23902:2;23882:18;;;23875:30;23941:34;23921:18;;;23914:62;-1:-1:-1;;;23992:18:1;;;23985:42;24044:19;;38665:73:0;23661:408:1;38665:73:0;-1:-1:-1;38758:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38758:24:0;;38569:221::o;38092:411::-;38173:13;38189:23;38204:7;38189:14;:23::i;:::-;38173:39;;38237:5;-1:-1:-1;;;;;38231:11:0;:2;-1:-1:-1;;;;;38231:11:0;;;38223:57;;;;-1:-1:-1;;;38223:57:0;;26865:2:1;38223:57:0;;;26847:21:1;26904:2;26884:18;;;26877:30;26943:34;26923:18;;;26916:62;-1:-1:-1;;;26994:18:1;;;26987:31;27035:19;;38223:57:0;26663:397:1;38223:57:0;24388:10;-1:-1:-1;;;;;38315:21:0;;;;:62;;-1:-1:-1;38340:37:0;38357:5;24388:10;39088:164;:::i;38340:37::-;38293:168;;;;-1:-1:-1;;;38293:168:0;;19704:2:1;38293:168:0;;;19686:21:1;19743:2;19723:18;;;19716:30;19782:34;19762:18;;;19755:62;19853:26;19833:18;;;19826:54;19897:19;;38293:168:0;19502:420:1;38293:168:0;38474:21;38483:2;38487:7;38474:8;:21::i;:::-;38162:341;38092:411;;:::o;65470:344::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;65560:9:::1;65555:222;65579:21;65575:1;:25;65555:222;;;65622:13;65638:14;65653:1;65638:17;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;65622:33:::0;-1:-1:-1;;;;;;65680:19:0;::::1;65672:60;;;::::0;-1:-1:-1;;;65672:60:0;;30359:2:1;65672:60:0::1;::::0;::::1;30341:21:1::0;30398:2;30378:18;;;30371:30;30437;30417:18;;;30410:58;30485:18;;65672:60:0::1;30157:352:1::0;65672:60:0::1;65760:5;65747:7;65755:1;65747:10;;;;;;;:::i;:::-;;:18:::0;;-1:-1:-1;;;;;;65747:18:0::1;-1:-1:-1::0;;;;;65747:18:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;65602:3:0;::::1;::::0;::::1;:::i;:::-;;;;65555:222;;;-1:-1:-1::0;;65789:10:0::1;:17:::0;;-1:-1:-1;;;;65789:17:0::1;-1:-1:-1::0;;;65789:17:0::1;::::0;;65470:344::o;39319:339::-;39514:41;24388:10;39533:12;39547:7;39514:18;:41::i;:::-;39506:103;;;;-1:-1:-1;;;39506:103:0;;;;;;;:::i;:::-;39622:28;39632:4;39638:2;39642:7;39622:9;:28::i;50897:256::-;50994:7;51030:23;51047:5;51030:16;:23::i;:::-;51022:5;:31;51014:87;;;;-1:-1:-1;;;51014:87:0;;13384:2:1;51014:87:0;;;13366:21:1;13423:2;13403:18;;;13396:30;13462:34;13442:18;;;13435:62;-1:-1:-1;;;13513:18:1;;;13506:41;13564:19;;51014:87:0;13182:407:1;51014:87:0;-1:-1:-1;;;;;;51119:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;50897:256::o;63203:676::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;22682:1:::1;23280:7;;:19;;23272:63;;;;-1:-1:-1::0;;;23272:63:0::1;;;;;;;:::i;:::-;22682:1;23413:7;:18:::0;63281:21:::2;63273:58;;;::::0;-1:-1:-1;;;63273:58:0;;16788:2:1;63273:58:0::2;::::0;::::2;16770:21:1::0;16827:2;16807:18;;;16800:30;-1:-1:-1;;;16846:18:1;;;16839:50;16906:18;;63273:58:0::2;16586:344:1::0;63273:58:0::2;63366:21;::::0;63344:19:::2;63440:338;63464:20;63460:1;:24;63440:338;;;63506:13;63522;63536:1;63522:16;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;63522:16:0::2;;63575:14:::0;;;:7:::2;:14;::::0;;;;;63522:16;;-1:-1:-1;58722:5:0::2;63629:25;63575:14:::0;63629:11;:25:::2;:::i;:::-;63628:42;;;;:::i;:::-;63604:66:::0;-1:-1:-1;63687:24:0::2;63604:66:::0;63687:24;::::2;:::i;:::-;63728:38;::::0;63687:24;;-1:-1:-1;;;;;;63728:23:0;::::2;::::0;:38;::::2;;;::::0;63752:13;;63728:38:::2;::::0;;;63752:13;63728:23;:38;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;63491:287;;;63486:3;;;;;:::i;:::-;;;;63440:338;;;-1:-1:-1::0;63793:11:0;;63790:82:::2;;63821:39;::::0;24388:10;;63821:39;::::2;;;::::0;63852:7;;63821:39:::2;::::0;;;63852:7;24388:10;63821:39;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;63790:82;-1:-1:-1::0;;22638:1:0::1;23592:7;:22:::0;63203:676::o;66606:227::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;67609:23;;:139;;-1:-1:-1;67654:10:0;;-1:-1:-1;;;67654:10:0;;;;:93;;;;-1:-1:-1;67706:7:0;:10;-1:-1:-1;;;;;67706:10:0;24388;-1:-1:-1;;;;;67690:26:0;;:56;;;-1:-1:-1;67736:10:0;;-1:-1:-1;;;;;67736:10:0;24388;-1:-1:-1;;;;;67720:26:0;;67690:56;67587:224;;;;-1:-1:-1;;;67587:224:0;;;;;;;:::i;:::-;66686:6:::1;66682:107;;;66742:1;66723:8;66717:22;;;;;:::i;:::-;;;:26;66709:68;;;;-1:-1:-1::0;;;66709:68:0::1;;;;;;;:::i;:::-;66799:17;:26:::0;;;::::1;;;;-1:-1:-1::0;;66799:26:0;;::::1;::::0;;;::::1;::::0;;66606:227::o;39729:185::-;39867:39;39884:4;39890:2;39894:7;39867:39;;;;;;;;;;;;:16;:39::i;64941:168::-;64998:41;24388:10;65017:12;24308:98;64998:41;64990:86;;;;-1:-1:-1;;;64990:86:0;;27689:2:1;64990:86:0;;;27671:21:1;;;27708:18;;;27701:30;27767:34;27747:18;;;27740:62;27819:18;;64990:86:0;27487:356:1;64990:86:0;65087:14;65093:7;65087:5;:14::i;:::-;64941:168;:::o;51419:233::-;51494:7;51530:30;51317:10;:17;;51229:113;51530:30;51522:5;:38;51514:95;;;;-1:-1:-1;;;51514:95:0;;28468:2:1;51514:95:0;;;28450:21:1;28507:2;28487:18;;;28480:30;28546:34;28526:18;;;28519:62;-1:-1:-1;;;28597:18:1;;;28590:42;28649:19;;51514:95:0;28266:408:1;51514:95:0;51627:10;51638:5;51627:17;;;;;;;;:::i;:::-;;;;;;;;;51620:24;;51419:233;;;:::o;65224:238::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;67609:23;;:139;;-1:-1:-1;67654:10:0;;-1:-1:-1;;;67654:10:0;;;;:93;;;;-1:-1:-1;67706:7:0;:10;-1:-1:-1;;;;;67706:10:0;24388;-1:-1:-1;;;;;67690:26:0;;:56;;;-1:-1:-1;67736:10:0;;-1:-1:-1;;;;;67736:10:0;24388;-1:-1:-1;;;;;67720:26:0;;67690:56;67587:224;;;;-1:-1:-1;;;67587:224:0;;;;;;;:::i;:::-;65314:14:::1;::::0;;;::::1;;;65313:15;65305:50;;;::::0;-1:-1:-1;;;65305:50:0;;12673:2:1;65305:50:0::1;::::0;::::1;12655:21:1::0;12712:2;12692:18;;;12685:30;-1:-1:-1;;;12731:18:1;;;12724:52;12793:18;;65305:50:0::1;12471:346:1::0;65305:50:0::1;65374:25:::0;65366:57:::1;;;::::0;-1:-1:-1;;;65366:57:0;;19356:2:1;65366:57:0::1;::::0;::::1;19338:21:1::0;19395:2;19375:18;;;19368:30;-1:-1:-1;;;19414:18:1;;;19407:49;19473:18;;65366:57:0::1;19154:343:1::0;65366:57:0::1;65436:18;:8;65447:7:::0;;65436:18:::1;:::i;36704:239::-:0;36776:7;36812:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36812:16:0;36847:19;36839:73;;;;-1:-1:-1;;;36839:73:0;;21250:2:1;36839:73:0;;;21232:21:1;21289:2;21269:18;;;21262:30;21328:34;21308:18;;;21301:62;-1:-1:-1;;;21379:18:1;;;21372:39;21428:19;;36839:73:0;21048:405:1;36434:208:0;36506:7;-1:-1:-1;;;;;36534:19:0;;36526:74;;;;-1:-1:-1;;;36526:74:0;;20839:2:1;36526:74:0;;;20821:21:1;20878:2;20858:18;;;20851:30;20917:34;20897:18;;;20890:62;-1:-1:-1;;;20968:18:1;;;20961:40;21018:19;;36526:74:0;20637:406:1;36526:74:0;-1:-1:-1;;;;;;36618:16:0;;;;;:9;:16;;;;;;;36434:208::o;26235:103::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;26300:30:::1;26327:1;26300:18;:30::i;:::-;26235:103::o:0;67193:230::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;67260:16:::1;::::0;::::1;;::::0;:37:::1;;-1:-1:-1::0;67280:17:0::1;::::0;::::1;::::0;::::1;;;67260:37;:64;;;-1:-1:-1::0;67301:23:0::1;::::0;;;::::1;;;67260:64;67258:67;67250:133;;;::::0;-1:-1:-1;;;67250:133:0;;27267:2:1;67250:133:0::1;::::0;::::1;27249:21:1::0;27306:2;27286:18;;;27279:30;27345:34;27325:18;;;27318:62;-1:-1:-1;;;27396:18:1;;;27389:51;27457:19;;67250:133:0::1;27065:417:1::0;67250:133:0::1;67394:14;:21:::0;;-1:-1:-1;;67394:21:0::1;::::0;::::1;::::0;;67193:230::o;64248:499::-;64309:16;64338:18;64359:16;64369:5;64359:9;:16::i;:::-;64338:37;-1:-1:-1;64390:15:0;64386:354;;64429:16;;;64443:1;64429:16;;;;;;;;;;;-1:-1:-1;64422:23:0;64248:499;-1:-1:-1;;;64248:499:0:o;64386:354::-;64478:23;64518:10;64504:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64504:25:0;;64478:51;;64544:13;64572:129;64596:10;64588:5;:18;64572:129;;;64652:33;64672:5;64679;64652:19;:33::i;:::-;64636:6;64643:5;64636:13;;;;;;;;:::i;:::-;;;;;;;;;;:49;64608:7;;;;:::i;:::-;;;;64572:129;;64386:354;64327:420;64248:499;;;:::o;66841:344::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;67609:23;;:139;;-1:-1:-1;67654:10:0;;-1:-1:-1;;;67654:10:0;;;;:93;;;;-1:-1:-1;67706:7:0;:10;-1:-1:-1;;;;;67706:10:0;24388;-1:-1:-1;;;;;67690:26:0;;:56;;;-1:-1:-1;67736:10:0;;-1:-1:-1;;;;;67736:10:0;24388;-1:-1:-1;;;;;67720:26:0;;67690:56;67587:224;;;;-1:-1:-1;;;67587:224:0;;;;;;;:::i;:::-;66930:6:::1;66926:209;;;66986:1;66967:8;66961:22;;;;;:::i;:::-;;;:26;66953:68;;;;-1:-1:-1::0;;;66953:68:0::1;;;;;;;:::i;:::-;67052:21;::::0;-1:-1:-1;;;;;67052:21:0::1;67036:87;;;::::0;-1:-1:-1;;;67036:87:0;;25033:2:1;67036:87:0::1;::::0;::::1;25015:21:1::0;25072:2;25052:18;;;25045:30;25111:32;25091:18;;;25084:60;25161:18;;67036:87:0::1;24831:354:1::0;67036:87:0::1;67145:23;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;67145:32:0;;::::1;::::0;;;::::1;::::0;;66841:344::o;61540:403::-;22682:1;23280:7;;:19;;23272:63;;;;-1:-1:-1;;;23272:63:0;;;;;;;:::i;:::-;22682:1;23413:7;:18;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23:::1;25796:68;;;;-1:-1:-1::0;;;25796:68:0::1;;;;;;;:::i;:::-;57252:4:::2;57730:2;61671:3;61655:13;51317:10:::0;:17;;51229:113;61655:13:::2;:19;;;;:::i;:::-;:33;;;;:::i;:::-;61654:49;;61646:81;;;::::0;-1:-1:-1;;;61646:81:0;;18242:2:1;61646:81:0::2;::::0;::::2;18224:21:1::0;18281:2;18261:18;;;18254:30;-1:-1:-1;;;18300:18:1;;;18293:50;18360:18;;61646:81:0::2;18040:344:1::0;61646:81:0::2;57730:2;61761:3;61746:12;;:18;;;;:::i;:::-;:33;;61738:69;;;::::0;-1:-1:-1;;;61738:69:0;;20487:2:1;61738:69:0::2;::::0;::::2;20469:21:1::0;20526:2;20506:18;;;20499:30;20565:25;20545:18;;;20538:53;20608:18;;61738:69:0::2;20285:347:1::0;61738:69:0::2;61825:9;61820:116;61844:3;61840:1;:7;61820:116;;;61869:12;:14:::0;;;:12:::2;:14;::::0;::::2;:::i;:::-;;;;;;61898:26;61911:9;61922:1;61898:12;:26::i;:::-;61849:3:::0;::::2;::::0;::::2;:::i;:::-;;;;61820:116;;;-1:-1:-1::0;;22638:1:0;23592:7;:22;-1:-1:-1;61540:403:0:o;37179:104::-;37235:13;37268:7;37261:14;;;;;:::i;66203:154::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;66291:21:::1;:58:::0;;-1:-1:-1;;;;;;66291:58:0::1;-1:-1:-1::0;;;;;66291:58:0;;;::::1;::::0;;;::::1;::::0;;66203:154::o;60368:401::-;22682:1;23280:7;;:19;;23272:63;;;;-1:-1:-1;;;23272:63:0;;;;;;;:::i;:::-;22682:1;23413:7;:18;60444:16:::1;::::0;::::1;;60436:50;;;::::0;-1:-1:-1;;;60436:50:0;;25753:2:1;60436:50:0::1;::::0;::::1;25735:21:1::0;25792:2;25772:18;;;25765:30;-1:-1:-1;;;25811:18:1;;;25804:51;25872:18;;60436:50:0::1;25551:345:1::0;60436:50:0::1;60511:1;60505:3;:7;60497:43;;;::::0;-1:-1:-1;;;60497:43:0;;19004:2:1;60497:43:0::1;::::0;::::1;18986:21:1::0;19043:2;19023:18;;;19016:30;-1:-1:-1;;;19062:18:1;;;19055:53;19125:18;;60497:43:0::1;18802:347:1::0;60497:43:0::1;60573:16;60586:3:::0;57300:10:::1;60573:16;:::i;:::-;60559:9;:31;60551:68;;;::::0;-1:-1:-1;;;60551:68:0;;17137:2:1;60551:68:0::1;::::0;::::1;17119:21:1::0;17176:2;17156:18;;;17149:30;-1:-1:-1;;;17195:18:1;;;17188:54;17259:18;;60551:68:0::1;16935:348:1::0;60551:68:0::1;57360:2;60662:3:::0;60638:23:::1;24388:10:::0;36434:208;:::i;60638:23::-:1;:27;;;;:::i;:::-;:47;;60630:87;;;::::0;-1:-1:-1;;;60630:87:0;;15673:2:1;60630:87:0::1;::::0;::::1;15655:21:1::0;15712:2;15692:18;;;15685:30;15751:29;15731:18;;;15724:57;15798:18;;60630:87:0::1;15471:351:1::0;60630:87:0::1;60730:31;24388:10:::0;60743:12:::1;60757:3;60730:12;:31::i;:::-;-1:-1:-1::0;22638:1:0;23592:7;:22;60368:401::o;38862:155::-;38957:52;24388:10;38990:8;39000;38957:18;:52::i;:::-;38862:155;;:::o;60777:755::-;22682:1;23280:7;;:19;;23272:63;;;;-1:-1:-1;;;23272:63:0;;;;;;;:::i;:::-;22682:1;23413:7;:18;60915:17:::1;::::0;::::1;::::0;::::1;;;60907:59;;;::::0;-1:-1:-1;;;60907:59:0;;30001:2:1;60907:59:0::1;::::0;::::1;29983:21:1::0;30040:2;30020:18;;;30013:30;30079:31;30059:18;;;30052:59;30128:18;;60907:59:0::1;29799:353:1::0;60907:59:0::1;60985:11;60997:5;;60985:18;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;:27;60977:67;;;::::0;-1:-1:-1;;;60977:67:0;;28881:2:1;60977:67:0::1;::::0;::::1;28863:21:1::0;28920:2;28900:18;;;28893:30;28959:29;28939:18;;;28932:57;29006:18;;60977:67:0::1;28679:351:1::0;60977:67:0::1;61063:28;61081:4;61087:3;61063:17;:28::i;:::-;61055:58;;;::::0;-1:-1:-1;;;61055:58:0;;22063:2:1;61055:58:0::1;::::0;::::1;22045:21:1::0;22102:2;22082:18;;;22075:30;-1:-1:-1;;;22121:18:1;;;22114:47;22178:18;;61055:58:0::1;21861:341:1::0;61055:58:0::1;61172:4:::0;61132:36:::1;24388:10:::0;61162:5:::1;;61132:15;:36::i;:::-;:44;61124:74;;;::::0;-1:-1:-1;;;61124:74:0;;23173:2:1;61124:74:0::1;::::0;::::1;23155:21:1::0;23212:2;23192:18;;;23185:30;-1:-1:-1;;;23231:18:1;;;23224:47;23288:18;;61124:74:0::1;22971:341:1::0;61124:74:0::1;61223:1;61217:3;:7;61209:43;;;::::0;-1:-1:-1;;;61209:43:0;;19004:2:1;61209:43:0::1;::::0;::::1;18986:21:1::0;19043:2;19023:18;;;19016:30;-1:-1:-1;;;19062:18:1;;;19055:53;19125:18;;61209:43:0::1;18802:347:1::0;61209:43:0::1;61285:16;61298:3:::0;57300:10:::1;61285:16;:::i;:::-;61271:9;:31;61263:68;;;::::0;-1:-1:-1;;;61263:68:0;;17137:2:1;61263:68:0::1;::::0;::::1;17119:21:1::0;17176:2;17156:18;;;17149:30;-1:-1:-1;;;17195:18:1;;;17188:54;17259:18;;61263:68:0::1;16935:348:1::0;61263:68:0::1;57563:1;61374:3:::0;61350:23:::1;24388:10:::0;36434:208;:::i;61350:23::-:1;:27;;;;:::i;:::-;:55;;61342:102;;;::::0;-1:-1:-1;;;61342:102:0;;21660:2:1;61342:102:0::1;::::0;::::1;21642:21:1::0;21699:2;21679:18;;;21672:30;21738:34;21718:18;;;21711:62;-1:-1:-1;;;21789:18:1;;;21782:32;21831:19;;61342:102:0::1;21458:398:1::0;61342:102:0::1;61478:4;61457:11;61469:5;;61457:18;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:25;;;::::1;;-1:-1:-1::0;;61457:25:0;;::::1;::::0;;;::::1;::::0;;61493:31:::1;61506:12;24388:10:::0;;24308:98;61493:31:::1;-1:-1:-1::0;;22638:1:0;23592:7;:22;-1:-1:-1;;;60777:755:0:o;65822:258::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;67609:23;;:139;;-1:-1:-1;67654:10:0;;-1:-1:-1;;;67654:10:0;;;;:93;;;;-1:-1:-1;67706:7:0;:10;-1:-1:-1;;;;;67706:10:0;24388;-1:-1:-1;;;;;67690:26:0;;:56;;;-1:-1:-1;67736:10:0;;-1:-1:-1;;;;;67736:10:0;24388;-1:-1:-1;;;;;67720:26:0;;67690:56;67587:224;;;;-1:-1:-1;;;67587:224:0;;;;;;;:::i;:::-;65926:9:::1;65921:152;65941:20:::0;;::::1;65921:152;;;66027:34;::::0;;;;::::1;::::0;;;66049:4:::1;66027:34:::0;;-1:-1:-1;66027:34:0::1;::::0;::::1;::::0;;;65983:27:::1;::::0;66011:9;;66021:1;66011:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65983:41:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;65983:41:0;:78;;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;65983:78:0;::::1;;::::0;;;;-1:-1:-1;;65983:78:0;;;;;;;::::1;::::0;;65963:3;::::1;::::0;::::1;:::i;:::-;;;;65921:152;;39985:328:::0;40160:41;24388:10;40193:7;40160:18;:41::i;:::-;40152:103;;;;-1:-1:-1;;;40152:103:0;;;;;;;:::i;:::-;40266:39;40280:4;40286:2;40290:7;40299:5;40266:13;:39::i;:::-;39985:328;;;;:::o;64759:174::-;-1:-1:-1;;;;;64838:33:0;;64814:4;64838:33;;;:27;:33;;;;;:41;;;:87;;;;-1:-1:-1;;;;;;;64884:33:0;;;;;:27;:33;;;;;:41;;;;;;64883:42;;64759:174::o;64004:236::-;41888:4;41912:16;;;:7;:16;;;;;;64069:13;;-1:-1:-1;;;;;41912:16:0;64095:49;;;;-1:-1:-1;;;64095:49:0;;17893:2:1;64095:49:0;;;17875:21:1;17932:2;17912:18;;;17905:30;-1:-1:-1;;;17951:18:1;;;17944:50;18011:18;;64095:49:0;17691:344:1;64095:49:0;64188:8;64203:18;:7;:16;:18::i;:::-;64171:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64157:75;;64004:236;;;:::o;66365:229::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;67609:23;;:139;;-1:-1:-1;67654:10:0;;-1:-1:-1;;;67654:10:0;;;;:93;;;;-1:-1:-1;67706:7:0;:10;-1:-1:-1;;;;;67706:10:0;24388;-1:-1:-1;;;;;67690:26:0;;:56;;;-1:-1:-1;67736:10:0;;-1:-1:-1;;;;;67736:10:0;24388;-1:-1:-1;;;;;67720:26:0;;67690:56;67587:224;;;;-1:-1:-1;;;67587:224:0;;;;;;;:::i;:::-;66448:6:::1;66444:107;;;66504:1;66485:8;66479:22;;;;;:::i;:::-;;;:26;66471:68;;;;-1:-1:-1::0;;;66471:68:0::1;;;;;;;:::i;:::-;66561:16;:25:::0;;-1:-1:-1;;66561:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66365:229::o;26493:201::-;25657:6;;-1:-1:-1;;;;;25657:6:0;24388:10;25804:23;25796:68;;;;-1:-1:-1;;;25796:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26582:22:0;::::1;26574:73;;;::::0;-1:-1:-1;;;26574:73:0;;14215:2:1;26574:73:0::1;::::0;::::1;14197:21:1::0;14254:2;14234:18;;;14227:30;14293:34;14273:18;;;14266:62;-1:-1:-1;;;14344:18:1;;;14337:36;14390:19;;26574:73:0::1;14013:402:1::0;26574:73:0::1;26658:28;26677:8;26658:18;:28::i;59821:539::-:0;22682:1;23280:7;;:19;;23272:63;;;;-1:-1:-1;;;23272:63:0;;;;;;;:::i;:::-;22682:1;23413:7;:18;59890:23:::1;::::0;;;::::1;;;59882:69;;;::::0;-1:-1:-1;;;59882:69:0;;24631:2:1;59882:69:0::1;::::0;::::1;24613:21:1::0;24670:2;24650:18;;;24643:30;24709:34;24689:18;;;24682:62;-1:-1:-1;;;24760:18:1;;;24753:31;24801:19;;59882:69:0::1;24429:397:1::0;59882:69:0::1;24388:10:::0;59970:41:::1;::::0;;;:27:::1;:41;::::0;;;;:49;::::1;;59962:85;;;::::0;-1:-1:-1;;;59962:85:0;;26513:2:1;59962:85:0::1;::::0;::::1;26495:21:1::0;26552:2;26532:18;;;26525:30;26591:25;26571:18;;;26564:53;26634:18;;59962:85:0::1;26311:347:1::0;59962:85:0::1;24388:10:::0;60067:41:::1;::::0;;;:27:::1;:41;::::0;;;;:49;::::1;::::0;::::1;;;60066:50;60058:78;;;::::0;-1:-1:-1;;;60058:78:0;;23519:2:1;60058:78:0::1;::::0;::::1;23501:21:1::0;23558:2;23538:18;;;23531:30;-1:-1:-1;;;23577:18:1;;;23570:45;23632:18;;60058:78:0::1;23317:339:1::0;60058:78:0::1;60155:21;::::0;60203:1:::1;::::0;-1:-1:-1;;;;;60155:21:0::1;:31;24388:10:::0;60155:45:::1;::::0;-1:-1:-1;;;;;;60155:45:0::1;::::0;;;;;;-1:-1:-1;;;;;10125:32:1;;;60155:45:0::1;::::0;::::1;10107:51:1::0;10080:18;;60155:45:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;60147:88;;;::::0;-1:-1:-1;;;60147:88:0;;24276:2:1;60147:88:0::1;::::0;::::1;24258:21:1::0;24315:2;24295:18;;;24288:30;24354:28;24334:18;;;24327:56;24400:18;;60147:88:0::1;24074:350:1::0;60147:88:0::1;60248:29;24388:10:::0;60275:1:::1;60248:12;:29::i;:::-;24388:10:::0;60296:41:::1;::::0;;;:27:::1;:41;::::0;;;;:56;;-1:-1:-1;;60296:56:0::1;;;::::0;;60348:4:::1;23592:7:::0;:22;59821:539::o;36065:305::-;36167:4;-1:-1:-1;;;;;;36204:40:0;;-1:-1:-1;;;36204:40:0;;:105;;-1:-1:-1;;;;;;;36261:48:0;;-1:-1:-1;;;36261:48:0;36204:105;:158;;;-1:-1:-1;;;;;;;;;;28943:40:0;;;36326:36;28834:157;45805:174;45880:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;45880:29:0;-1:-1:-1;;;;;45880:29:0;;;;;;;;:24;;45934:23;45880:24;45934:14;:23::i;:::-;-1:-1:-1;;;;;45925:46:0;;;;;;;;;;;45805:174;;:::o;42117:348::-;42210:4;41912:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41912:16:0;42227:73;;;;-1:-1:-1;;;42227:73:0;;18591:2:1;42227:73:0;;;18573:21:1;18630:2;18610:18;;;18603:30;18669:34;18649:18;;;18642:62;-1:-1:-1;;;18720:18:1;;;18713:42;18772:19;;42227:73:0;18389:408:1;42227:73:0;42311:13;42327:23;42342:7;42327:14;:23::i;:::-;42311:39;;42380:5;-1:-1:-1;;;;;42369:16:0;:7;-1:-1:-1;;;;;42369:16:0;;:51;;;;42413:7;-1:-1:-1;;;;;42389:31:0;:20;42401:7;42389:11;:20::i;:::-;-1:-1:-1;;;;;42389:31:0;;42369:51;:87;;;-1:-1:-1;;;;;;39209:25:0;;;39185:4;39209:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;42424:32;42361:96;42117:348;-1:-1:-1;;;;42117:348:0:o;45109:578::-;45268:4;-1:-1:-1;;;;;45241:31:0;:23;45256:7;45241:14;:23::i;:::-;-1:-1:-1;;;;;45241:31:0;;45233:85;;;;-1:-1:-1;;;45233:85:0;;26103:2:1;45233:85:0;;;26085:21:1;26142:2;26122:18;;;26115:30;26181:34;26161:18;;;26154:62;-1:-1:-1;;;26232:18:1;;;26225:39;26281:19;;45233:85:0;25901:405:1;45233:85:0;-1:-1:-1;;;;;45337:16:0;;45329:65;;;;-1:-1:-1;;;45329:65:0;;16029:2:1;45329:65:0;;;16011:21:1;16068:2;16048:18;;;16041:30;16107:34;16087:18;;;16080:62;-1:-1:-1;;;16158:18:1;;;16151:34;16202:19;;45329:65:0;15827:400:1;45329:65:0;45407:39;45428:4;45434:2;45438:7;45407:20;:39::i;:::-;45511:29;45528:1;45532:7;45511:8;:29::i;:::-;-1:-1:-1;;;;;45553:15:0;;;;;;:9;:15;;;;;:20;;45572:1;;45553:15;:20;;45572:1;;45553:20;:::i;:::-;;;;-1:-1:-1;;;;;;;45584:13:0;;;;;;:9;:13;;;;;:18;;45601:1;;45584:13;:18;;45601:1;;45584:18;:::i;:::-;;;;-1:-1:-1;;45613:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45613:21:0;-1:-1:-1;;;;;45613:21:0;;;;;;;;;45652:27;;45613:16;;45652:27;;;;;;;45109:578;;;:::o;44412:360::-;44472:13;44488:23;44503:7;44488:14;:23::i;:::-;44472:39;;44524:48;44545:5;44560:1;44564:7;44524:20;:48::i;:::-;44613:29;44630:1;44634:7;44613:8;:29::i;:::-;-1:-1:-1;;;;;44655:16:0;;;;;;:9;:16;;;;;:21;;44675:1;;44655:16;:21;;44675:1;;44655:21;:::i;:::-;;;;-1:-1:-1;;44694:16:0;;;;:7;:16;;;;;;44687:23;;-1:-1:-1;;;;;;44687:23:0;;;44728:36;44702:7;;44694:16;-1:-1:-1;;;;;44728:36:0;;;;;44694:16;;44728:36;44461:311;44412:360;:::o;26854:191::-;26947:6;;;-1:-1:-1;;;;;26964:17:0;;;-1:-1:-1;;;;;;26964:17:0;;;;;;;26997:40;;26947:6;;;26964:17;26947:6;;26997:40;;26928:16;;26997:40;26917:128;26854:191;:::o;61951:510::-;62032:9;24388:10;62032:25;62024:46;;;;-1:-1:-1;;;62024:46:0;;15337:2:1;62024:46:0;;;15319:21:1;15376:1;15356:18;;;15349:29;-1:-1:-1;;;15394:18:1;;;15387:38;15442:18;;62024:46:0;15135:331:1;62024:46:0;57252:4;57730:2;62106:3;62090:13;51317:10;:17;;51229:113;62090:13;:19;;;;:::i;:::-;:33;;;;:::i;:::-;62089:49;;62081:82;;;;-1:-1:-1;;;62081:82:0;;18242:2:1;62081:82:0;;;18224:21:1;18281:2;18261:18;;;18254:30;-1:-1:-1;;;18300:18:1;;;18293:50;18360:18;;62081:82:0;18040:344:1;62081:82:0;57360:2;62182:3;:23;;62174:65;;;;-1:-1:-1;;;62174:65:0;;14622:2:1;62174:65:0;;;14604:21:1;14661:2;14641:18;;;14634:30;14700:31;14680:18;;;14673:59;14749:18;;62174:65:0;14420:353:1;62174:65:0;62273:9;62268:186;62292:3;62288:1;:7;62268:186;;;62317:15;62335:13;51317:10;:17;;51229:113;62335:13;:17;;62351:1;62335:17;:::i;:::-;62317:35;;62369:29;62379:9;62390:7;62369:9;:29::i;:::-;62418:24;;62434:7;;-1:-1:-1;;;;;62418:24:0;;;;;;;;-1:-1:-1;62297:3:0;;;;:::i;:::-;;;;62268:186;;46121:315;46276:8;-1:-1:-1;;;;;46267:17:0;:5;-1:-1:-1;;;;;46267:17:0;;;46259:55;;;;-1:-1:-1;;;46259:55:0;;16434:2:1;46259:55:0;;;16416:21:1;16473:2;16453:18;;;16446:30;16512:27;16492:18;;;16485:55;16557:18;;46259:55:0;16232:349:1;46259:55:0;-1:-1:-1;;;;;46325:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;46325:46:0;;;;;;;;;;46387:41;;11439::1;;;46387::0;;11412:18:1;46387:41:0;;;;;;;46121:315;;;:::o;62827:160::-;62914:4;62956:23;:4;62969:9;62956:12;:23::i;:::-;62938:14;;-1:-1:-1;;;;;62938:41:0;;;:14;;:41;;62827:160;-1:-1:-1;;;62827:160:0:o;62469:346::-;62555:7;62575:12;62737:4;62744:6;62752:5;;62712:46;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;62712:46:0;;;;;;;;;;62702:57;;62712:46;62702:57;;;;9818:66:1;62614:160:0;;;9806:79:1;;;;9901:12;;;9894:28;9938:12;;62614:160:0;;;;;;-1:-1:-1;;62614:160:0;;;;;;62590:195;;62614:160;62590:195;;;;;62469:346;-1:-1:-1;;;;;62469:346:0:o;41195:315::-;41352:28;41362:4;41368:2;41372:7;41352:9;:28::i;:::-;41399:48;41422:4;41428:2;41432:7;41441:5;41399:22;:48::i;:::-;41391:111;;;;-1:-1:-1;;;41391:111:0;;;;;;;:::i;363:723::-;419:13;640:10;636:53;;-1:-1:-1;;667:10:0;;;;;;;;;;;;-1:-1:-1;;;667:10:0;;;;;363:723::o;636:53::-;714:5;699:12;755:78;762:9;;755:78;;788:8;;;;:::i;:::-;;-1:-1:-1;811:10:0;;-1:-1:-1;819:2:0;811:10;;:::i;:::-;;;755:78;;;843:19;875:6;865:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;865:17:0;;843:39;;893:154;900:10;;893:154;;927:11;937:1;927:11;;:::i;:::-;;-1:-1:-1;996:10:0;1004:2;996:5;:10;:::i;:::-;983:24;;:2;:24;:::i;:::-;970:39;;953:6;960;953:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;953:56:0;;;;;;;;-1:-1:-1;1024:11:0;1033:2;1024:11;;:::i;:::-;;;893:154;;52265:589;-1:-1:-1;;;;;52471:18:0;;52467:187;;52506:40;52538:7;53681:10;:17;;53654:24;;;;:15;:24;;;;;:44;;;53709:24;;;;;;;;;;;;53577:164;52506:40;52467:187;;;52576:2;-1:-1:-1;;;;;52568:10:0;:4;-1:-1:-1;;;;;52568:10:0;;52564:90;;52595:47;52628:4;52634:7;52595:32;:47::i;:::-;-1:-1:-1;;;;;52668:16:0;;52664:183;;52701:45;52738:7;52701:36;:45::i;52664:183::-;52774:4;-1:-1:-1;;;;;52768:10:0;:2;-1:-1:-1;;;;;52768:10:0;;52764:83;;52795:40;52823:2;52827:7;52795:27;:40::i;42807:110::-;42883:26;42893:2;42897:7;42883:26;;;;;;;;;;;;:9;:26::i;6524:231::-;6602:7;6623:17;6642:18;6664:27;6675:4;6681:9;6664:10;:27::i;:::-;6622:69;;;;6702:18;6714:5;6702:11;:18::i;47001:799::-;47156:4;-1:-1:-1;;;;;47177:13:0;;12831:20;12879:8;47173:620;;47213:72;;-1:-1:-1;;;47213:72:0;;-1:-1:-1;;;;;47213:36:0;;;;;:72;;24388:10;;47264:4;;47270:7;;47279:5;;47213:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47213:72:0;;;;;;;;-1:-1:-1;;47213:72:0;;;;;;;;;;;;:::i;:::-;;;47209:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47455:13:0;;47451:272;;47498:60;;-1:-1:-1;;;47498:60:0;;;;;;;:::i;47451:272::-;47673:6;47667:13;47658:6;47654:2;47650:15;47643:38;47209:529;-1:-1:-1;;;;;;47336:51:0;-1:-1:-1;;;47336:51:0;;-1:-1:-1;47329:58:0;;47173:620;-1:-1:-1;47777:4:0;47001:799;;;;;;:::o;54368:988::-;54634:22;54684:1;54659:22;54676:4;54659:16;:22::i;:::-;:26;;;;:::i;:::-;54696:18;54717:26;;;:17;:26;;;;;;54634:51;;-1:-1:-1;54850:28:0;;;54846:328;;-1:-1:-1;;;;;54917:18:0;;54895:19;54917:18;;;:12;:18;;;;;;;;:34;;;;;;;;;54968:30;;;;;;:44;;;55085:30;;:17;:30;;;;;:43;;;54846:328;-1:-1:-1;55270:26:0;;;;:17;:26;;;;;;;;55263:33;;;-1:-1:-1;;;;;55314:18:0;;;;;:12;:18;;;;;:34;;;;;;;55307:41;54368:988::o;55651:1079::-;55929:10;:17;55904:22;;55929:21;;55949:1;;55929:21;:::i;:::-;55961:18;55982:24;;;:15;:24;;;;;;56355:10;:26;;55904:46;;-1:-1:-1;55982:24:0;;55904:46;;56355:26;;;;;;:::i;:::-;;;;;;;;;56333:48;;56419:11;56394:10;56405;56394:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;56499:28;;;:15;:28;;;;;;;:41;;;56671:24;;;;;56664:31;56706:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;55722:1008;;;55651:1079;:::o;53155:221::-;53240:14;53257:20;53274:2;53257:16;:20::i;:::-;-1:-1:-1;;;;;53288:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;53333:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;53155:221:0:o;43144:321::-;43274:18;43280:2;43284:7;43274:5;:18::i;:::-;43325:54;43356:1;43360:2;43364:7;43373:5;43325:22;:54::i;:::-;43303:154;;;;-1:-1:-1;;;43303:154:0;;;;;;;:::i;4414:1308::-;4495:7;4504:12;4729:9;:16;4749:2;4729:22;4725:990;;;5025:4;5010:20;;5004:27;5075:4;5060:20;;5054:27;5133:4;5118:20;;5112:27;4768:9;5104:36;5176:25;5187:4;5104:36;5004:27;5054;5176:10;:25::i;:::-;5169:32;;;;;;;;;4725:990;5223:9;:16;5243:2;5223:22;5219:496;;;5498:4;5483:20;;5477:27;5549:4;5534:20;;5528:27;5591:23;5602:4;5477:27;5528;5591:10;:23::i;:::-;5584:30;;;;;;;;5219:496;-1:-1:-1;5663:1:0;;-1:-1:-1;5667:35:0;5219:496;4414:1308;;;;;:::o;2685:643::-;2763:20;2754:5;:29;;;;;;;;:::i;:::-;;2750:571;;;2685:643;:::o;2750:571::-;2861:29;2852:5;:38;;;;;;;;:::i;:::-;;2848:473;;;2907:34;;-1:-1:-1;;;2907:34:0;;12320:2:1;2907:34:0;;;12302:21:1;12359:2;12339:18;;;12332:30;12398:26;12378:18;;;12371:54;12442:18;;2907:34:0;12118:348:1;2848:473:0;2972:35;2963:5;:44;;;;;;;;:::i;:::-;;2959:362;;;3024:41;;-1:-1:-1;;;3024:41:0;;13024:2:1;3024:41:0;;;13006:21:1;13063:2;13043:18;;;13036:30;13102:33;13082:18;;;13075:61;13153:18;;3024:41:0;12822:355:1;2959:362:0;3096:30;3087:5;:39;;;;;;;;:::i;:::-;;3083:238;;;3143:44;;-1:-1:-1;;;3143:44:0;;17490:2:1;3143:44:0;;;17472:21:1;17529:2;17509:18;;;17502:30;17568:34;17548:18;;;17541:62;-1:-1:-1;;;17619:18:1;;;17612:32;17661:19;;3143:44:0;17288:398:1;3083:238:0;3218:30;3209:5;:39;;;;;;;;:::i;:::-;;3205:116;;;3265:44;;-1:-1:-1;;;3265:44:0;;22409:2:1;3265:44:0;;;22391:21:1;22448:2;22428:18;;;22421:30;22487:34;22467:18;;;22460:62;-1:-1:-1;;;22538:18:1;;;22531:32;22580:19;;3265:44:0;22207:398:1;43801:382:0;-1:-1:-1;;;;;43881:16:0;;43873:61;;;;-1:-1:-1;;;43873:61:0;;22812:2:1;43873:61:0;;;22794:21:1;;;22831:18;;;22824:30;22890:34;22870:18;;;22863:62;22942:18;;43873:61:0;22610:356:1;43873:61:0;41888:4;41912:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41912:16:0;:30;43945:58;;;;-1:-1:-1;;;43945:58:0;;14980:2:1;43945:58:0;;;14962:21:1;15019:2;14999:18;;;14992:30;15058;15038:18;;;15031:58;15106:18;;43945:58:0;14778:352:1;43945:58:0;44016:45;44045:1;44049:2;44053:7;44016:20;:45::i;:::-;-1:-1:-1;;;;;44074:13:0;;;;;;:9;:13;;;;;:18;;44091:1;;44074:13;:18;;44091:1;;44074:18;:::i;:::-;;;;-1:-1:-1;;44103:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44103:21:0;-1:-1:-1;;;;;44103:21:0;;;;;;;;44142:33;;44103:16;;;44142:33;;44103:16;;44142:33;43801:382;;:::o;8023:1632::-;8154:7;;9088:66;9075:79;;9071:163;;;-1:-1:-1;9187:1:0;;-1:-1:-1;9191:30:0;9171:51;;9071:163;9248:1;:7;;9253:2;9248:7;;:18;;;;;9259:1;:7;;9264:2;9259:7;;9248:18;9244:102;;;-1:-1:-1;9299:1:0;;-1:-1:-1;9303:30:0;9283:51;;9244:102;9460:24;;;9443:14;9460:24;;;;;;;;;11718:25:1;;;11791:4;11779:17;;11759:18;;;11752:45;;;;11813:18;;;11806:34;;;11856:18;;;11849:34;;;9460:24:0;;11690:19:1;;9460:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9460:24:0;;-1:-1:-1;;9460:24:0;;;-1:-1:-1;;;;;;;9499:20:0;;9495:103;;9552:1;9556:29;9536:50;;;;;;;9495:103;9618:6;-1:-1:-1;9626:20:0;;-1:-1:-1;8023:1632:0;;;;;;;;:::o;7018:391::-;7132:7;;-1:-1:-1;;;;;7233:75:0;;7335:3;7331:12;;;7345:2;7327:21;7376:25;7387:4;7327:21;7396:1;7233:75;7376:10;:25::i;:::-;7369:32;;;;;;7018:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:718;399:5;452:3;445:4;437:6;433:17;429:27;419:55;;470:1;467;460:12;419:55;506:6;493:20;532:18;569:2;565;562:10;559:36;;;575:18;;:::i;:::-;650:2;644:9;618:2;704:13;;-1:-1:-1;;700:22:1;;;724:2;696:31;692:40;680:53;;;748:18;;;768:22;;;745:46;742:72;;;794:18;;:::i;:::-;834:10;830:2;823:22;869:2;861:6;854:18;915:3;908:4;903:2;895:6;891:15;887:26;884:35;881:55;;;932:1;929;922:12;881:55;996:2;989:4;981:6;977:17;970:4;962:6;958:17;945:54;1043:1;1036:4;1031:2;1023:6;1019:15;1015:26;1008:37;1063:6;1054:15;;;;;;357:718;;;;:::o;1080:348::-;1132:8;1142:6;1196:3;1189:4;1181:6;1177:17;1173:27;1163:55;;1214:1;1211;1204:12;1163:55;-1:-1:-1;1237:20:1;;1280:18;1269:30;;1266:50;;;1312:1;1309;1302:12;1266:50;1349:4;1341:6;1337:17;1325:29;;1401:3;1394:4;1385:6;1377;1373:19;1369:30;1366:39;1363:59;;;1418:1;1415;1408:12;1433:186;1492:6;1545:2;1533:9;1524:7;1520:23;1516:32;1513:52;;;1561:1;1558;1551:12;1513:52;1584:29;1603:9;1584:29;:::i;:::-;1574:39;1433:186;-1:-1:-1;;;1433:186:1:o;1624:260::-;1692:6;1700;1753:2;1741:9;1732:7;1728:23;1724:32;1721:52;;;1769:1;1766;1759:12;1721:52;1792:29;1811:9;1792:29;:::i;:::-;1782:39;;1840:38;1874:2;1863:9;1859:18;1840:38;:::i;:::-;1830:48;;1624:260;;;;;:::o;1889:328::-;1966:6;1974;1982;2035:2;2023:9;2014:7;2010:23;2006:32;2003:52;;;2051:1;2048;2041:12;2003:52;2074:29;2093:9;2074:29;:::i;:::-;2064:39;;2122:38;2156:2;2145:9;2141:18;2122:38;:::i;:::-;2112:48;;2207:2;2196:9;2192:18;2179:32;2169:42;;1889:328;;;;;:::o;2222:537::-;2317:6;2325;2333;2341;2394:3;2382:9;2373:7;2369:23;2365:33;2362:53;;;2411:1;2408;2401:12;2362:53;2434:29;2453:9;2434:29;:::i;:::-;2424:39;;2482:38;2516:2;2505:9;2501:18;2482:38;:::i;:::-;2472:48;;2567:2;2556:9;2552:18;2539:32;2529:42;;2622:2;2611:9;2607:18;2594:32;2649:18;2641:6;2638:30;2635:50;;;2681:1;2678;2671:12;2635:50;2704:49;2745:7;2736:6;2725:9;2721:22;2704:49;:::i;:::-;2694:59;;;2222:537;;;;;;;:::o;2764:254::-;2829:6;2837;2890:2;2878:9;2869:7;2865:23;2861:32;2858:52;;;2906:1;2903;2896:12;2858:52;2929:29;2948:9;2929:29;:::i;:::-;2919:39;;2977:35;3008:2;2997:9;2993:18;2977:35;:::i;3023:254::-;3091:6;3099;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;3191:29;3210:9;3191:29;:::i;:::-;3181:39;3267:2;3252:18;;;;3239:32;;-1:-1:-1;;;3023:254:1:o;3282:251::-;3366:6;3419:2;3407:9;3398:7;3394:23;3390:32;3387:52;;;3435:1;3432;3425:12;3387:52;3474:7;3469:2;3458:9;3454:18;3451:31;3448:51;;;3495:1;3492;3485:12;3538:615;3624:6;3632;3685:2;3673:9;3664:7;3660:23;3656:32;3653:52;;;3701:1;3698;3691:12;3653:52;3741:9;3728:23;3770:18;3811:2;3803:6;3800:14;3797:34;;;3827:1;3824;3817:12;3797:34;3865:6;3854:9;3850:22;3840:32;;3910:7;3903:4;3899:2;3895:13;3891:27;3881:55;;3932:1;3929;3922:12;3881:55;3972:2;3959:16;3998:2;3990:6;3987:14;3984:34;;;4014:1;4011;4004:12;3984:34;4067:7;4062:2;4052:6;4049:1;4045:14;4041:2;4037:23;4033:32;4030:45;4027:65;;;4088:1;4085;4078:12;4027:65;4119:2;4111:11;;;;;4141:6;;-1:-1:-1;3538:615:1;;-1:-1:-1;;;;3538:615:1:o;4158:180::-;4214:6;4267:2;4255:9;4246:7;4242:23;4238:32;4235:52;;;4283:1;4280;4273:12;4235:52;4306:26;4322:9;4306:26;:::i;4343:767::-;4450:6;4458;4466;4474;4482;4535:3;4523:9;4514:7;4510:23;4506:33;4503:53;;;4552:1;4549;4542:12;4503:53;4588:9;4575:23;4565:33;;4649:2;4638:9;4634:18;4621:32;4672:18;4713:2;4705:6;4702:14;4699:34;;;4729:1;4726;4719:12;4699:34;4752:49;4793:7;4784:6;4773:9;4769:22;4752:49;:::i;:::-;4742:59;;4854:2;4843:9;4839:18;4826:32;4810:48;;4883:2;4873:8;4870:16;4867:36;;;4899:1;4896;4889:12;4867:36;;4938:61;4991:7;4980:8;4969:9;4965:24;4938:61;:::i;:::-;4343:767;;;;-1:-1:-1;5018:8:1;5100:2;5085:18;5072:32;;4343:767;-1:-1:-1;;;;4343:767:1:o;5115:245::-;5173:6;5226:2;5214:9;5205:7;5201:23;5197:32;5194:52;;;5242:1;5239;5232:12;5194:52;5281:9;5268:23;5300:30;5324:5;5300:30;:::i;5365:249::-;5434:6;5487:2;5475:9;5466:7;5462:23;5458:32;5455:52;;;5503:1;5500;5493:12;5455:52;5535:9;5529:16;5554:30;5578:5;5554:30;:::i;5619:411::-;5690:6;5698;5751:2;5739:9;5730:7;5726:23;5722:32;5719:52;;;5767:1;5764;5757:12;5719:52;5807:9;5794:23;5840:18;5832:6;5829:30;5826:50;;;5872:1;5869;5862:12;5826:50;5911:59;5962:7;5953:6;5942:9;5938:22;5911:59;:::i;:::-;5989:8;;5885:85;;-1:-1:-1;5619:411:1;-1:-1:-1;;;;5619:411:1:o;6035:180::-;6094:6;6147:2;6135:9;6126:7;6122:23;6118:32;6115:52;;;6163:1;6160;6153:12;6115:52;-1:-1:-1;6186:23:1;;6035:180;-1:-1:-1;6035:180:1:o;6220:184::-;6290:6;6343:2;6331:9;6322:7;6318:23;6314:32;6311:52;;;6359:1;6356;6349:12;6311:52;-1:-1:-1;6382:16:1;;6220:184;-1:-1:-1;6220:184:1:o;6409:254::-;6477:6;6485;6538:2;6526:9;6517:7;6513:23;6509:32;6506:52;;;6554:1;6551;6544:12;6506:52;6590:9;6577:23;6567:33;;6619:38;6653:2;6642:9;6638:18;6619:38;:::i;6668:257::-;6709:3;6747:5;6741:12;6774:6;6769:3;6762:19;6790:63;6846:6;6839:4;6834:3;6830:14;6823:4;6816:5;6812:16;6790:63;:::i;:::-;6907:2;6886:15;-1:-1:-1;;6882:29:1;6873:39;;;;6914:4;6869:50;;6668:257;-1:-1:-1;;6668:257:1:o;6930:185::-;6972:3;7010:5;7004:12;7025:52;7070:6;7065:3;7058:4;7051:5;7047:16;7025:52;:::i;:::-;7093:16;;;;;6930:185;-1:-1:-1;;6930:185:1:o;7357:498::-;7554:3;7586:26;7582:31;7655:2;7646:6;7642:2;7638:15;7634:24;7629:3;7622:37;7710:2;7701:6;7697:2;7693:15;7689:24;7684:2;7679:3;7675:12;7668:46;;7758:6;7750;7745:2;7740:3;7736:12;7723:42;-1:-1:-1;7829:1:1;7788:16;;7806:2;7784:25;7818:13;;;7784:25;7357:498;-1:-1:-1;;;7357:498:1:o;7860:273::-;8045:6;8037;8032:3;8019:33;8001:3;8071:16;;8096:13;;;8071:16;7860:273;-1:-1:-1;7860:273:1:o;8138:1433::-;8516:3;8545:1;8578:6;8572:13;8608:3;8630:1;8658:9;8654:2;8650:18;8640:28;;8718:2;8707:9;8703:18;8740;8730:61;;8784:4;8776:6;8772:17;8762:27;;8730:61;8810:2;8858;8850:6;8847:14;8827:18;8824:38;8821:165;;;-1:-1:-1;;;8885:33:1;;8941:4;8938:1;8931:15;8971:4;8892:3;8959:17;8821:165;9002:18;9029:104;;;;9147:1;9142:320;;;;8995:467;;9029:104;-1:-1:-1;;9062:24:1;;9050:37;;9107:16;;;;-1:-1:-1;9029:104:1;;9142:320;30769:1;30762:14;;;30806:4;30793:18;;9237:1;9251:165;9265:6;9262:1;9259:13;9251:165;;;9343:14;;9330:11;;;9323:35;9386:16;;;;9280:10;;9251:165;;;9255:3;;9445:6;9440:3;9436:16;9429:23;;8995:467;;;;;;;9478:87;9503:61;9529:34;9559:3;-1:-1:-1;;;7303:16:1;;7344:1;7335:11;;7238:114;9529:34;9521:6;9503:61;:::i;:::-;-1:-1:-1;;;7180:20:1;;7225:1;7216:11;;7120:113;9478:87;9471:94;8138:1433;-1:-1:-1;;;;;8138:1433:1:o;10169:488::-;-1:-1:-1;;;;;10438:15:1;;;10420:34;;10490:15;;10485:2;10470:18;;10463:43;10537:2;10522:18;;10515:34;;;10585:3;10580:2;10565:18;;10558:31;;;10363:4;;10606:45;;10631:19;;10623:6;10606:45;:::i;:::-;10598:53;10169:488;-1:-1:-1;;;;;;10169:488:1:o;10662:632::-;10833:2;10885:21;;;10955:13;;10858:18;;;10977:22;;;10804:4;;10833:2;11056:15;;;;11030:2;11015:18;;;10804:4;11099:169;11113:6;11110:1;11107:13;11099:169;;;11174:13;;11162:26;;11243:15;;;;11208:12;;;;11135:1;11128:9;11099:169;;;-1:-1:-1;11285:3:1;;10662:632;-1:-1:-1;;;;;;10662:632:1:o;11894:219::-;12043:2;12032:9;12025:21;12006:4;12063:44;12103:2;12092:9;12088:18;12080:6;12063:44;:::i;13594:414::-;13796:2;13778:21;;;13835:2;13815:18;;;13808:30;13874:34;13869:2;13854:18;;13847:62;-1:-1:-1;;;13940:2:1;13925:18;;13918:48;13998:3;13983:19;;13594:414::o;19927:353::-;20129:2;20111:21;;;20168:2;20148:18;;;20141:30;20207:31;20202:2;20187:18;;20180:59;20271:2;20256:18;;19927:353::o;25190:356::-;25392:2;25374:21;;;25411:18;;;25404:30;25470:34;25465:2;25450:18;;25443:62;25537:2;25522:18;;25190:356::o;27848:413::-;28050:2;28032:21;;;28089:2;28069:18;;;28062:30;28128:34;28123:2;28108:18;;28101:62;-1:-1:-1;;;28194:2:1;28179:18;;28172:47;28251:3;28236:19;;27848:413::o;29035:355::-;29237:2;29219:21;;;29276:2;29256:18;;;29249:30;29315:33;29310:2;29295:18;;29288:61;29381:2;29366:18;;29035:355::o;29395:399::-;29597:2;29579:21;;;29636:2;29616:18;;;29609:30;29675:34;29670:2;29655:18;;29648:62;-1:-1:-1;;;29741:2:1;29726:18;;29719:33;29784:3;29769:19;;29395:399::o;30822:128::-;30862:3;30893:1;30889:6;30886:1;30883:13;30880:39;;;30899:18;;:::i;:::-;-1:-1:-1;30935:9:1;;30822:128::o;30955:120::-;30995:1;31021;31011:35;;31026:18;;:::i;:::-;-1:-1:-1;31060:9:1;;30955:120::o;31080:168::-;31120:7;31186:1;31182;31178:6;31174:14;31171:1;31168:21;31163:1;31156:9;31149:17;31145:45;31142:71;;;31193:18;;:::i;:::-;-1:-1:-1;31233:9:1;;31080:168::o;31253:125::-;31293:4;31321:1;31318;31315:8;31312:34;;;31326:18;;:::i;:::-;-1:-1:-1;31363:9:1;;31253:125::o;31383:258::-;31455:1;31465:113;31479:6;31476:1;31473:13;31465:113;;;31555:11;;;31549:18;31536:11;;;31529:39;31501:2;31494:10;31465:113;;;31596:6;31593:1;31590:13;31587:48;;;-1:-1:-1;;31631:1:1;31613:16;;31606:27;31383:258::o;31646:380::-;31725:1;31721:12;;;;31768;;;31789:61;;31843:4;31835:6;31831:17;31821:27;;31789:61;31896:2;31888:6;31885:14;31865:18;31862:38;31859:161;;;31942:10;31937:3;31933:20;31930:1;31923:31;31977:4;31974:1;31967:15;32005:4;32002:1;31995:15;32031:135;32070:3;-1:-1:-1;;32091:17:1;;32088:43;;;32111:18;;:::i;:::-;-1:-1:-1;32158:1:1;32147:13;;32031:135::o;32171:112::-;32203:1;32229;32219:35;;32234:18;;:::i;:::-;-1:-1:-1;32268:9:1;;32171:112::o;32288:127::-;32349:10;32344:3;32340:20;32337:1;32330:31;32380:4;32377:1;32370:15;32404:4;32401:1;32394:15;32420:127;32481:10;32476:3;32472:20;32469:1;32462:31;32512:4;32509:1;32502:15;32536:4;32533:1;32526:15;32552:127;32613:10;32608:3;32604:20;32601:1;32594:31;32644:4;32641:1;32634:15;32668:4;32665:1;32658:15;32684:127;32745:10;32740:3;32736:20;32733:1;32726:31;32776:4;32773:1;32766:15;32800:4;32797:1;32790:15;32816:127;32877:10;32872:3;32868:20;32865:1;32858:31;32908:4;32905:1;32898:15;32932:4;32929:1;32922:15;32948:127;33009:10;33004:3;33000:20;32997:1;32990:31;33040:4;33037:1;33030:15;33064:4;33061:1;33054:15;33080:131;-1:-1:-1;;;;;;33154:32:1;;33144:43;;33134:71;;33201:1;33198;33191:12

Swarm Source

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