ETH Price: $3,342.19 (+0.52%)

Token

Ether Royale (ER)
 

Overview

Max Total Supply

2,084 ER

Holders

383

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 ER
0x311a246119135b0ddb610fec9087b3338c856b07
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

**CURRENT VOLUME: 40 ETH - Recently Migrated From [Here](https://opensea.io/collection/etherroyalemigrated)** **Current Battle: **Beta Battle 4 - Day 2** Ether Royale is the first NFT battle royale. Holders spectate as their soldiers battle for prizes and glory. This collect...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EtherRoyale

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-22
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (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.1 (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.1 (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: contracts/ERC721A.sol



// Creator: Chiru Labs



pragma solidity ^0.8.4;










error ApprovalCallerNotOwnerNorApproved();

error ApprovalQueryForNonexistentToken();

error ApproveToCaller();

error ApprovalToCurrentOwner();

error BalanceQueryForZeroAddress();

error MintToZeroAddress();

error MintZeroQuantity();

error OwnerQueryForNonexistentToken();

error TransferCallerNotOwnerNorApproved();

error TransferFromIncorrectOwner();

error TransferToNonERC721ReceiverImplementer();

error TransferToZeroAddress();

error URIQueryForNonexistentToken();



/**

 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including

 * the Metadata extension. Built to optimize for lower gas during batch mints.

 *

 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).

 *

 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.

 *

 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).

 */

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;

    using Strings for uint256;



    // Compiler will pack this into a single 256bit word.

    struct TokenOwnership {

        // The address of the owner.

        address addr;

        // Keeps track of the start time of ownership with minimal overhead for tokenomics.

        uint64 startTimestamp;

        // Whether the token has been burned.

        bool burned;

    }



    // Compiler will pack this into a single 256bit word.

    struct AddressData {

        // Realistically, 2**64-1 is more than enough.

        uint64 balance;

        // Keeps track of mint count with minimal overhead for tokenomics.

        uint64 numberMinted;

        // Keeps track of burn count with minimal overhead for tokenomics.

        uint64 numberBurned;

        // For miscellaneous variable(s) pertaining to the address

        // (e.g. number of whitelist mint slots used).

        // If there are multiple variables, please pack them into a uint64.

        uint64 aux;

    }



    // The tokenId of the next token to be minted.

    uint256 internal _currentIndex;



    // The number of tokens burned.

    uint256 internal _burnCounter;



    // Token name

    string private _name;



    // Token symbol

    string private _symbol;



    // Mapping from token ID to ownership details

    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.

    mapping(uint256 => TokenOwnership) internal _ownerships;



    // Mapping owner address to address data

    mapping(address => AddressData) private _addressData;



    // Mapping from token ID to approved address

    mapping(uint256 => address) private _tokenApprovals;



    // Mapping from owner to operator approvals

    mapping(address => mapping(address => bool)) private _operatorApprovals;



    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

        _currentIndex = _startTokenId();

    }



    /**

     * To change the starting tokenId, please override this function.

     */

    function _startTokenId() internal view virtual returns (uint256) {

        return 0;

    }



    /**

     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.

     */

    function totalSupply() public view returns (uint256) {

        // Counter underflow is impossible as _burnCounter cannot be incremented

        // more than _currentIndex - _startTokenId() times

        unchecked {

            return _currentIndex - _burnCounter - _startTokenId();

        }

    }



    /**

     * Returns the total amount of tokens minted in the contract.

     */

    function _totalMinted() internal view returns (uint256) {

        // Counter underflow is impossible as _currentIndex does not decrement,

        // and it is initialized to _startTokenId()

        unchecked {

            return _currentIndex - _startTokenId();

        }

    }



    /**

     * @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 override returns (uint256) {

        if (owner == address(0)) revert BalanceQueryForZeroAddress();

        return uint256(_addressData[owner].balance);

    }



    /**

     * Returns the number of tokens minted by `owner`.

     */

    function _numberMinted(address owner) internal view returns (uint256) {

        return uint256(_addressData[owner].numberMinted);

    }



    /**

     * Returns the number of tokens burned by or on behalf of `owner`.

     */

    function _numberBurned(address owner) internal view returns (uint256) {

        return uint256(_addressData[owner].numberBurned);

    }



    /**

     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     */

    function _getAux(address owner) internal view returns (uint64) {

        return _addressData[owner].aux;

    }



    /**

     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     * If there are multiple variables, please pack them into a uint64.

     */

    function _setAux(address owner, uint64 aux) internal {

        _addressData[owner].aux = aux;

    }



    /**

     * Gas spent here starts off proportional to the maximum mint batch size.

     * It gradually moves to O(1) as tokens get transferred around in the collection over time.

     */

    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {

        uint256 curr = tokenId;



        unchecked {

            if (_startTokenId() <= curr && curr < _currentIndex) {

                TokenOwnership memory ownership = _ownerships[curr];

                if (!ownership.burned) {

                    if (ownership.addr != address(0)) {

                        return ownership;

                    }

                    // Invariant:

                    // There will always be an ownership that has an address and is not burned

                    // before an ownership that does not have an address and is not burned.

                    // Hence, curr will not underflow.

                    while (true) {

                        curr--;

                        ownership = _ownerships[curr];

                        if (ownership.addr != address(0)) {

                            return ownership;

                        }

                    }

                }

            }

        }

        revert OwnerQueryForNonexistentToken();

    }



    /**

     * @dev See {IERC721-ownerOf}.

     */

    function ownerOf(uint256 tokenId) public view override returns (address) {

        return _ownershipOf(tokenId).addr;

    }



    /**

     * @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) {

        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();



        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 override {

        address owner = ERC721A.ownerOf(tokenId);

        if (to == owner) revert ApprovalToCurrentOwner();



        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {

            revert ApprovalCallerNotOwnerNorApproved();

        }



        _approve(to, tokenId, owner);

    }



    /**

     * @dev See {IERC721-getApproved}.

     */

    function getApproved(uint256 tokenId) public view override returns (address) {

        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();



        return _tokenApprovals[tokenId];

    }



    /**

     * @dev See {IERC721-setApprovalForAll}.

     */

    function setApprovalForAll(address operator, bool approved) public virtual override {

        if (operator == _msgSender()) revert ApproveToCaller();



        _operatorApprovals[_msgSender()][operator] = approved;

        emit ApprovalForAll(_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 {

        _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 {

        _transfer(from, to, tokenId);

        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {

            revert TransferToNonERC721ReceiverImplementer();

        }

    }



    /**

     * @dev Returns whether `tokenId` exists.

     *

     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.

     *

     * Tokens start existing when they are minted (`_mint`),

     */

    function _exists(uint256 tokenId) internal view returns (bool) {

        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;

    }



    /**

     * @dev Equivalent to `_safeMint(to, quantity, '')`.

     */

    function _safeMint(address to, uint256 quantity) internal {

        _safeMint(to, quantity, '');

    }



    /**

     * @dev Safely mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - If `to` refers to a smart contract, it must implement 

     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _safeMint(

        address to,

        uint256 quantity,

        bytes memory _data

    ) internal {

        uint256 startTokenId = _currentIndex;

        if (to == address(0)) revert MintToZeroAddress();

        if (quantity == 0) revert MintZeroQuantity();



        _beforeTokenTransfers(address(0), to, startTokenId, quantity);



        // Overflows are incredibly unrealistic.

        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1

        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1

        unchecked {

            _addressData[to].balance += uint64(quantity);

            _addressData[to].numberMinted += uint64(quantity);



            _ownerships[startTokenId].addr = to;

            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);



            uint256 updatedIndex = startTokenId;

            uint256 end = updatedIndex + quantity;



            if (to.isContract()) {

                do {

                    emit Transfer(address(0), to, updatedIndex);

                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {

                        revert TransferToNonERC721ReceiverImplementer();

                    }

                } while (updatedIndex != end);

                // Reentrancy protection

                if (_currentIndex != startTokenId) revert();

            } else {

                do {

                    emit Transfer(address(0), to, updatedIndex++);

                } while (updatedIndex != end);

            }

            _currentIndex = updatedIndex;

        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);

    }



    /**

     * @dev Mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _mint(address to, uint256 quantity) internal {

        uint256 startTokenId = _currentIndex;

        if (to == address(0)) revert MintToZeroAddress();

        if (quantity == 0) revert MintZeroQuantity();



        _beforeTokenTransfers(address(0), to, startTokenId, quantity);



        // Overflows are incredibly unrealistic.

        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1

        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1

        unchecked {

            _addressData[to].balance += uint64(quantity);

            _addressData[to].numberMinted += uint64(quantity);



            _ownerships[startTokenId].addr = to;

            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);



            uint256 updatedIndex = startTokenId;

            uint256 end = updatedIndex + quantity;



            do {

                emit Transfer(address(0), to, updatedIndex++);

            } while (updatedIndex != end);



            _currentIndex = updatedIndex;

        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);

    }



    /**

     * @dev Transfers `tokenId` from `from` to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     *

     * Emits a {Transfer} event.

     */

    function _transfer(

        address from,

        address to,

        uint256 tokenId

    ) private {

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);



        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();



        bool isApprovedOrOwner = (_msgSender() == from ||

            isApprovedForAll(from, _msgSender()) ||

            getApproved(tokenId) == _msgSender());



        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();



        _beforeTokenTransfers(from, to, tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, from);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            _addressData[from].balance -= 1;

            _addressData[to].balance += 1;



            TokenOwnership storage currSlot = _ownerships[tokenId];

            currSlot.addr = to;

            currSlot.startTimestamp = uint64(block.timestamp);



            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            TokenOwnership storage nextSlot = _ownerships[nextTokenId];

            if (nextSlot.addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId != _currentIndex) {

                    nextSlot.addr = from;

                    nextSlot.startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



        emit Transfer(from, to, tokenId);

        _afterTokenTransfers(from, to, tokenId, 1);

    }



    /**

     * @dev Equivalent to `_burn(tokenId, false)`.

     */

    function _burn(uint256 tokenId) internal virtual {

        _burn(tokenId, false);

    }



    /**

     * @dev Destroys `tokenId`.

     * The approval is cleared when the token is burned.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     *

     * Emits a {Transfer} event.

     */

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);



        address from = prevOwnership.addr;



        if (approvalCheck) {

            bool isApprovedOrOwner = (_msgSender() == from ||

                isApprovedForAll(from, _msgSender()) ||

                getApproved(tokenId) == _msgSender());



            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        }



        _beforeTokenTransfers(from, address(0), tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, from);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            AddressData storage addressData = _addressData[from];

            addressData.balance -= 1;

            addressData.numberBurned += 1;



            // Keep track of who burned the token, and the timestamp of burning.

            TokenOwnership storage currSlot = _ownerships[tokenId];

            currSlot.addr = from;

            currSlot.startTimestamp = uint64(block.timestamp);

            currSlot.burned = true;



            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            TokenOwnership storage nextSlot = _ownerships[nextTokenId];

            if (nextSlot.addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId != _currentIndex) {

                    nextSlot.addr = from;

                    nextSlot.startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



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

        _afterTokenTransfers(from, address(0), tokenId, 1);



        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.

        unchecked {

            _burnCounter++;

        }

    }



    /**

     * @dev Approve `to` to operate on `tokenId`

     *

     * Emits a {Approval} event.

     */

    function _approve(

        address to,

        uint256 tokenId,

        address owner

    ) private {

        _tokenApprovals[tokenId] = to;

        emit Approval(owner, to, tokenId);

    }



    /**

     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) private returns (bool) {

        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {

            return retval == IERC721Receiver(to).onERC721Received.selector;

        } catch (bytes memory reason) {

            if (reason.length == 0) {

                revert TransferToNonERC721ReceiverImplementer();

            } else {

                assembly {

                    revert(add(32, reason), mload(reason))

                }

            }

        }

    }



    /**

     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.

     * And also called before burning one token.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, `tokenId` will be burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _beforeTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}



    /**

     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes

     * minting.

     * And also called after one token has been burned.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been

     * transferred to `to`.

     * - When `from` is zero, `tokenId` has been minted for `to`.

     * - When `to` is zero, `tokenId` has been burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _afterTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}

}
// File: contracts/EtherRoyale.sol

/*

ERC-721A Smart contract

@DonFlamingo - https://linktr.ee/donflamingo

*/




pragma solidity ^0.8.7;









contract EtherRoyale is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;



    string private baseURI;

    string private hideBaseURI;



    bool public paused = false;

    uint256 public maxSupply = 8888;

    uint256 public price = 0.069 ether;

    

    mapping (address => uint256) public saleMintCount;

    uint256 public saleWalletLimit = 10;

    bool public saleStarted = false;



    mapping (address => uint256) public presaleMintCount;

    uint256 public presaleWalletLimit = 3;

    bool public presaleStarted = false;

    bytes32 public presaleMerkleRoot = 0x07c923c6e312ca86ad6cec5d06fad1593b1c93764cfbd9dfe572112cecad9407;



    bool public revealed = true;



    event saleModeChanged();



    constructor(

        string memory _hideBaseURI,

        string memory _tokenUrl) ERC721A ("Ether Royale", "ER"){

        baseURI = _tokenUrl;

        hideBaseURI = _hideBaseURI;

    }



    modifier notPaused() {

        require(!paused, "Contract is paused");

        _;

    }

    

    modifier correctPayment(uint8 quantity) {

        require(quantity * price == msg.value);

        _;

    }



    modifier supplyLimit(uint8 quantity) {

        require(totalSupply() + quantity <= maxSupply, "No more tokens");

        _;

    }



    modifier presale(uint8 quantity) {

        require(presaleStarted, "Presale must be started");

        require(presaleMintCount[msg.sender] + quantity <= presaleWalletLimit, "Wallet limit reached");

        _;

    }



    modifier sale(uint8 quantity) {

        require(saleStarted, "Sale must be started");

        require(saleMintCount[msg.sender] + quantity <= saleWalletLimit, "wallet limit reached");

        _;

    }



    modifier isValidMerkleProof(bytes32[] calldata merkleProof) {

        require(

            MerkleProof.verify(

                merkleProof,

                presaleMerkleRoot,

                keccak256(abi.encodePacked(msg.sender))

            ),

            "Address does not exist in list"

        );

        _;

    }



    function saleMint(uint8 quantity) external payable notPaused nonReentrant correctPayment(quantity) supplyLimit(quantity) sale(quantity) {

        saleMintCount[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);

    }



    function presaleMint(uint8 quantity, bytes32[] calldata merkleProof) external payable notPaused nonReentrant correctPayment(quantity) supplyLimit(quantity) isValidMerkleProof(merkleProof) presale(quantity)  {

        presaleMintCount[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);

    }



    function ownerMint(uint8 quantity, address toAddress) external supplyLimit(quantity) onlyOwner {

        _safeMint(toAddress, quantity);

    } 



    function startPresale() external onlyOwner {

        presaleStarted = true;

        saleStarted = false;



        emit saleModeChanged();

    }



    function startSale() external onlyOwner {

        presaleStarted = false;

        saleStarted = true;



        emit saleModeChanged();

    }



    struct BH {

        address h;

        uint256 c;

    }



    BH public bh;



    function batchMigration(BH[] memory holders) external onlyOwner  {

        uint256 currentHolderIdx = 0;



        while (currentHolderIdx < holders.length) {

            _mint(holders[currentHolderIdx].h, holders[currentHolderIdx].c);

            currentHolderIdx++;

        }

    }



    function resetSale() external onlyOwner {

        presaleStarted = false;

        saleStarted = false;



        emit saleModeChanged();

    }



    function setPause(bool pause) external onlyOwner {

        paused = pause;

    }



    function updatePrice(uint256 _price) external onlyOwner {

        price = _price;

    }



    function setPresaleLimit(uint8 _presaleLimit) external onlyOwner {

        presaleWalletLimit = _presaleLimit;

    }



    function setSaleLimit(uint8 _saleLimit) external onlyOwner {

        saleWalletLimit = _saleLimit;

    }



    function setPresaleListMerkleRoot(bytes32 merkleRoot) external onlyOwner {

        presaleMerkleRoot = merkleRoot;

    }



    function setBaseURI(string memory _baseURI) external onlyOwner {

        baseURI = _baseURI;

    }



    function setMaxSupply(uint256 _supply) external onlyOwner {

        maxSupply = _supply;

    }



    function setHideBaseURI(string memory _hideBaseURI) external onlyOwner {

        hideBaseURI = _hideBaseURI;

    }



    function getOwnerBaseURI() external onlyOwner view returns (string memory) {

        return baseURI;

    }



    function withdraw() public onlyOwner {

        uint256 donflamingov = address(this).balance * 15 / 100;

        uint256 catnipv = address(this).balance * 15 / 100;

        uint256 tragv = address(this).balance * 31 / 100;



        (bool donflamingohs, ) = payable(0xdCd6B7449167220724084bfD61f9B205c7dfa5a1).call{value: donflamingov}("");

        require(donflamingohs);



        (bool catniphs, ) = payable(0x026bf664D2C84E4Da15B18d66e41Ab8180f2bda3).call{value: catnipv}("");

        require(catniphs);



        (bool trags, ) = payable(0xE1840cc1BC1C80c576fAeD0DE39fC2c92E6440Ca).call{value: tragv}("");

        require(trags);



        uint256 balance = address(this).balance;

        payable(0xbF95B5444C3F8d671183ec87984d04b32C842d89).transfer(balance);

    }



    function reveal(bool _revealed) public onlyOwner  {

        revealed = _revealed;

    }



    function _startTokenId() internal view override virtual returns (uint256) {

        return 1;

    }



    function getBaseURI() external view returns (string memory) {

        if (!revealed) {

            return hideBaseURI;

        }



        return baseURI;

    }



    function leftLimit() external view returns (uint256) {

        require(presaleStarted || saleStarted, "Sales wasn't started yet");



        if (presaleStarted) {

            return presaleWalletLimit - presaleMintCount[msg.sender];

        }

        if (saleStarted) {

            return saleWalletLimit - saleMintCount[msg.sender];

        }



        return 0;

    }



    function walletOfOwner(address _owner)

        public

        view

        returns (uint256[] memory)

    {

        uint256 ownerTokenCount = balanceOf(_owner);

        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);

        uint256 currentTokenId = 1;

        uint256 ownedTokenIndex = 0;



        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {

            address currentTokenOwner = ownerOf(currentTokenId);



            if (currentTokenOwner == _owner) {

                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;

            }



            currentTokenId++;

        }



        return ownedTokenIds;

    }



    function tokenURI(uint256 tokenId)

        public

        view

        virtual

        override

        returns (string memory)

    {

        require(_exists(tokenId), "Nonexistent token");



        if (!revealed) {

            return hideBaseURI;

        }



        return

            string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json"));

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_hideBaseURI","type":"string"},{"internalType":"string","name":"_tokenUrl","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"saleModeChanged","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"h","type":"address"},{"internalType":"uint256","name":"c","type":"uint256"}],"internalType":"struct EtherRoyale.BH[]","name":"holders","type":"tuple[]"}],"name":"batchMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bh","outputs":[{"internalType":"address","name":"h","type":"address"},{"internalType":"uint256","name":"c","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnerBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"leftLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint8","name":"quantity","type":"uint8"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint8","name":"quantity","type":"uint8"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hideBaseURI","type":"string"}],"name":"setHideBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_presaleLimit","type":"uint8"}],"name":"setPresaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setPresaleListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_saleLimit","type":"uint8"}],"name":"setSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506122b8600d5566f5232269808000600e55600a6010556000601160006101000a81548160ff02191690831515021790555060036013556000601460006101000a81548160ff0219169083151502179055507f07c923c6e312ca86ad6cec5d06fad1593b1c93764cfbd9dfe572112cecad940760001b6015556001601660006101000a81548160ff021916908315150217905550348015620000bf57600080fd5b5060405162005dab38038062005dab8339818101604052810190620000e5919062000402565b6040518060400160405280600c81526020017f457468657220526f79616c6500000000000000000000000000000000000000008152506040518060400160405280600281526020017f4552000000000000000000000000000000000000000000000000000000000000815250816002908051906020019062000169929190620002d4565b50806003908051906020019062000182929190620002d4565b5062000193620001fd60201b60201c565b6000819055505050620001bb620001af6200020660201b60201c565b6200020e60201b60201c565b600160098190555080600a9080519060200190620001db929190620002d4565b5081600b9080519060200190620001f4929190620002d4565b5050506200060b565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e2906200051c565b90600052602060002090601f01602090048101928262000306576000855562000352565b82601f106200032157805160ff191683800117855562000352565b8280016001018555821562000352579182015b828111156200035157825182559160200191906001019062000334565b5b50905062000361919062000365565b5090565b5b808211156200038057600081600090555060010162000366565b5090565b60006200039b6200039584620004b0565b62000487565b905082815260208101848484011115620003ba57620003b9620005eb565b5b620003c7848285620004e6565b509392505050565b600082601f830112620003e757620003e6620005e6565b5b8151620003f984826020860162000384565b91505092915050565b600080604083850312156200041c576200041b620005f5565b5b600083015167ffffffffffffffff8111156200043d576200043c620005f0565b5b6200044b85828601620003cf565b925050602083015167ffffffffffffffff8111156200046f576200046e620005f0565b5b6200047d85828601620003cf565b9150509250929050565b600062000493620004a6565b9050620004a1828262000552565b919050565b6000604051905090565b600067ffffffffffffffff821115620004ce57620004cd620005b7565b5b620004d982620005fa565b9050602081019050919050565b60005b8381101562000506578082015181840152602081019050620004e9565b8381111562000516576000848401525b50505050565b600060028204905060018216806200053557607f821691505b602082108114156200054c576200054b62000588565b5b50919050565b6200055d82620005fa565b810181811067ffffffffffffffff821117156200057f576200057e620005b7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615790806200061b6000396000f3fe6080604052600436106102c95760003560e01c8063790b3b2b11610175578063b66a0e5d116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610a85578063f218c01c14610ac2578063f2fde38b14610ade578063fd8607e514610b07576102c9565b8063c87b56dd146109f2578063d288823f14610a2f578063d5abeb0114610a5a576102c9565b8063b66a0e5d14610919578063b88d4fde14610930578063bedb86fb14610959578063bf79334614610982578063c0f6baa41461099e578063c1e1d954146109db576102c9565b8063940cd05b1161012e578063940cd05b1461081f57806395d89b4114610848578063a035b1fe14610873578063a22cb4651461089e578063a643ed30146108c7578063a74ea6ce146108f0576102c9565b8063790b3b2b146107235780637b99fab51461074e5780637e02d105146107775780638a16766d146107a05780638d6cc56d146107cb5780638da5cb5b146107f4576102c9565b80633ccfd60b116102345780635c975abb116101ed5780636f8b44b0116101c75780636f8b44b01461067b57806370a08231146106a4578063714c5398146106e1578063715018a61461070c576102c9565b80635c975abb146105ea5780636352211e146106155780636ea451e414610652576102c9565b80633ccfd60b146104ee57806342842e0e14610505578063438b63001461052e578063518302271461056b57806355f804b3146105965780635c474f9e146105bf576102c9565b8063095ea7b311610286578063095ea7b3146103f257806318160ddd1461041b5780631ee525d41461044657806322212e2b1461046f57806323b872dd1461049a578063364e1efd146104c3576102c9565b806301ffc9a7146102ce57806304549d6f1461030b57806304c98b2b1461033657806306fdde031461034d578063081812fc14610378578063094e4072146103b5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190614658565b610b33565b6040516103029190614d18565b60405180910390f35b34801561031757600080fd5b50610320610c15565b60405161032d9190614d18565b60405180910390f35b34801561034257600080fd5b5061034b610c28565b005b34801561035957600080fd5b50610362610d08565b60405161036f9190614d4e565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a91906146fb565b610d9a565b6040516103ac9190614c66565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906143f2565b610e16565b6040516103e99190614ef0565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190614575565b610e2e565b005b34801561042757600080fd5b50610430610f39565b60405161043d9190614ef0565b60405180910390f35b34801561045257600080fd5b5061046d600480360381019061046891906145b5565b610f50565b005b34801561047b57600080fd5b50610484611035565b6040516104919190614d33565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc919061445f565b61103b565b005b3480156104cf57600080fd5b506104d861104b565b6040516104e59190614ef0565b60405180910390f35b3480156104fa57600080fd5b5061050361118d565b005b34801561051157600080fd5b5061052c6004803603810190610527919061445f565b611467565b005b34801561053a57600080fd5b50610555600480360381019061055091906143f2565b611487565b6040516105629190614cf6565b60405180910390f35b34801561057757600080fd5b50610580611592565b60405161058d9190614d18565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906146b2565b6115a5565b005b3480156105cb57600080fd5b506105d461163b565b6040516105e19190614d18565b60405180910390f35b3480156105f657600080fd5b506105ff61164e565b60405161060c9190614d18565b60405180910390f35b34801561062157600080fd5b5061063c600480360381019061063791906146fb565b611661565b6040516106499190614c66565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190614728565b611677565b005b34801561068757600080fd5b506106a2600480360381019061069d91906146fb565b611700565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906143f2565b611786565b6040516106d89190614ef0565b60405180910390f35b3480156106ed57600080fd5b506106f6611856565b6040516107039190614d4e565b60405180910390f35b34801561071857600080fd5b5061072161198f565b005b34801561072f57600080fd5b50610738611a17565b6040516107459190614ef0565b60405180910390f35b34801561075a57600080fd5b5061077560048036038101906107709190614755565b611a1d565b005b34801561078357600080fd5b5061079e600480360381019061079991906146b2565b611b06565b005b3480156107ac57600080fd5b506107b5611b9c565b6040516107c29190614ef0565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed91906146fb565b611ba2565b005b34801561080057600080fd5b50610809611c28565b6040516108169190614c66565b60405180910390f35b34801561082b57600080fd5b50610846600480360381019061084191906145fe565b611c52565b005b34801561085457600080fd5b5061085d611ceb565b60405161086a9190614d4e565b60405180910390f35b34801561087f57600080fd5b50610888611d7d565b6040516108959190614ef0565b60405180910390f35b3480156108aa57600080fd5b506108c560048036038101906108c09190614535565b611d83565b005b3480156108d357600080fd5b506108ee60048036038101906108e9919061462b565b611efb565b005b3480156108fc57600080fd5b5061091760048036038101906109129190614728565b611f81565b005b34801561092557600080fd5b5061092e61200a565b005b34801561093c57600080fd5b50610957600480360381019061095291906144b2565b6120ea565b005b34801561096557600080fd5b50610980600480360381019061097b91906145fe565b612166565b005b61099c60048036038101906109979190614728565b6121ff565b005b3480156109aa57600080fd5b506109c560048036038101906109c091906143f2565b61246b565b6040516109d29190614ef0565b60405180910390f35b3480156109e757600080fd5b506109f0612483565b005b3480156109fe57600080fd5b50610a196004803603810190610a1491906146fb565b612563565b604051610a269190614d4e565b60405180910390f35b348015610a3b57600080fd5b50610a44612686565b604051610a519190614d4e565b60405180910390f35b348015610a6657600080fd5b50610a6f612794565b604051610a7c9190614ef0565b60405180910390f35b348015610a9157600080fd5b50610aac6004803603810190610aa7919061441f565b61279a565b604051610ab99190614d18565b60405180910390f35b610adc6004803603810190610ad79190614795565b61282e565b005b348015610aea57600080fd5b50610b056004803603810190610b0091906143f2565b612b53565b005b348015610b1357600080fd5b50610b1c612c4b565b604051610b2a929190614ccd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bfe57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0e5750610c0d82612c7d565b5b9050919050565b601460009054906101000a900460ff1681565b610c30612ce7565b73ffffffffffffffffffffffffffffffffffffffff16610c4e611c28565b73ffffffffffffffffffffffffffffffffffffffff1614610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614e50565b60405180910390fd5b6001601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606060028054610d179061523c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d439061523c565b8015610d905780601f10610d6557610100808354040283529160200191610d90565b820191906000526020600020905b815481529060010190602001808311610d7357829003601f168201915b5050505050905090565b6000610da582612cef565b610ddb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60126020528060005260406000206000915090505481565b6000610e3982611661565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ec0612ce7565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ef25750610ef081610eeb612ce7565b61279a565b155b15610f29576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f34838383612d3d565b505050565b6000610f43612def565b6001546000540303905090565b610f58612ce7565b73ffffffffffffffffffffffffffffffffffffffff16610f76611c28565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390614e50565b60405180910390fd5b60005b81518110156110315761101e828281518110610fee57610fed6153ca565b5b60200260200101516000015183838151811061100d5761100c6153ca565b5b602002602001015160200151612df8565b80806110299061529f565b915050610fcf565b5050565b60155481565b6110468383836130d5565b505050565b6000601460009054906101000a900460ff16806110745750601160009054906101000a900460ff165b6110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614df0565b60405180910390fd5b601460009054906101000a900460ff161561111c57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354611115919061513b565b905061118a565b601160009054906101000a900460ff161561118557600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460105461117e919061513b565b905061118a565b600090505b90565b611195612ce7565b73ffffffffffffffffffffffffffffffffffffffff166111b3611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090614e50565b60405180910390fd5b60006064600f4761121a91906150e1565b61122491906150b0565b905060006064600f4761123791906150e1565b61124191906150b0565b905060006064601f4761125491906150e1565b61125e91906150b0565b9050600073dcd6b7449167220724084bfd61f9b205c7dfa5a173ffffffffffffffffffffffffffffffffffffffff168460405161129a90614c51565b60006040518083038185875af1925050503d80600081146112d7576040519150601f19603f3d011682016040523d82523d6000602084013e6112dc565b606091505b50509050806112ea57600080fd5b600073026bf664d2c84e4da15b18d66e41ab8180f2bda373ffffffffffffffffffffffffffffffffffffffff168460405161132490614c51565b60006040518083038185875af1925050503d8060008114611361576040519150601f19603f3d011682016040523d82523d6000602084013e611366565b606091505b505090508061137457600080fd5b600073e1840cc1bc1c80c576faed0de39fc2c92e6440ca73ffffffffffffffffffffffffffffffffffffffff16846040516113ae90614c51565b60006040518083038185875af1925050503d80600081146113eb576040519150601f19603f3d011682016040523d82523d6000602084013e6113f0565b606091505b50509050806113fe57600080fd5b600047905073bf95b5444c3f8d671183ec87984d04b32c842d8973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561145d573d6000803e3d6000fd5b5050505050505050565b611482838383604051806020016040528060008152506120ea565b505050565b6060600061149483611786565b905060008167ffffffffffffffff8111156114b2576114b16153f9565b5b6040519080825280602002602001820160405280156114e05781602001602082028036833780820191505090505b50905060006001905060005b83811080156114fd5750600d548211155b1561158657600061150d83611661565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115725782848381518110611557576115566153ca565b5b602002602001018181525050818061156e9061529f565b9250505b828061157d9061529f565b935050506114ec565b82945050505050919050565b601660009054906101000a900460ff1681565b6115ad612ce7565b73ffffffffffffffffffffffffffffffffffffffff166115cb611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890614e50565b60405180910390fd5b80600a9080519060200190611637929190614055565b5050565b601160009054906101000a900460ff1681565b600c60009054906101000a900460ff1681565b600061166c8261358b565b600001519050919050565b61167f612ce7565b73ffffffffffffffffffffffffffffffffffffffff1661169d611c28565b73ffffffffffffffffffffffffffffffffffffffff16146116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90614e50565b60405180910390fd5b8060ff1660108190555050565b611708612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611726611c28565b73ffffffffffffffffffffffffffffffffffffffff161461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390614e50565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ee576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060601660009054906101000a900460ff166118fe57600b80546118799061523c565b80601f01602080910402602001604051908101604052809291908181526020018280546118a59061523c565b80156118f25780601f106118c7576101008083540402835291602001916118f2565b820191906000526020600020905b8154815290600101906020018083116118d557829003601f168201915b5050505050905061198c565b600a805461190b9061523c565b80601f01602080910402602001604051908101604052809291908181526020018280546119379061523c565b80156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b505050505090505b90565b611997612ce7565b73ffffffffffffffffffffffffffffffffffffffff166119b5611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290614e50565b60405180910390fd5b611a15600061381a565b565b60105481565b81600d548160ff16611a2d610f39565b611a37919061505a565b1115611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90614dd0565b60405180910390fd5b611a80612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611a9e611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90614e50565b60405180910390fd5b611b01828460ff166138e0565b505050565b611b0e612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611b2c611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614e50565b60405180910390fd5b80600b9080519060200190611b98929190614055565b5050565b60135481565b611baa612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611bc8611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1590614e50565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c5a612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611c78611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc590614e50565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b606060038054611cfa9061523c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d269061523c565b8015611d735780601f10611d4857610100808354040283529160200191611d73565b820191906000526020600020905b815481529060010190602001808311611d5657829003601f168201915b5050505050905090565b600e5481565b611d8b612ce7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611dfd612ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eaa612ce7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eef9190614d18565b60405180910390a35050565b611f03612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611f21611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90614e50565b60405180910390fd5b8060158190555050565b611f89612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611fa7611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614e50565b60405180910390fd5b8060ff1660138190555050565b612012612ce7565b73ffffffffffffffffffffffffffffffffffffffff16612030611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d90614e50565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b6120f58484846130d5565b6121148373ffffffffffffffffffffffffffffffffffffffff166138fe565b8015612129575061212784848484613921565b155b15612160576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61216e612ce7565b73ffffffffffffffffffffffffffffffffffffffff1661218c611c28565b73ffffffffffffffffffffffffffffffffffffffff16146121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d990614e50565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff161561224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690614eb0565b60405180910390fd5b60026009541415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90614ed0565b60405180910390fd5b60026009819055508034600e548260ff166122b091906150e1565b146122ba57600080fd5b81600d548160ff166122ca610f39565b6122d4919061505a565b1115612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c90614dd0565b60405180910390fd5b82601160009054906101000a900460ff16612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614e90565b60405180910390fd5b6010548160ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123b6919061505a565b11156123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90614d70565b60405180910390fd5b8360ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612449919061505a565b9250508190555061245d338560ff166138e0565b505050600160098190555050565b600f6020528060005260406000206000915090505481565b61248b612ce7565b73ffffffffffffffffffffffffffffffffffffffff166124a9611c28565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690614e50565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606061256e82612cef565b6125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a490614e30565b60405180910390fd5b601660009054906101000a900460ff1661265357600b80546125ce9061523c565b80601f01602080910402602001604051908101604052809291908181526020018280546125fa9061523c565b80156126475780601f1061261c57610100808354040283529160200191612647565b820191906000526020600020905b81548152906001019060200180831161262a57829003601f168201915b50505050509050612681565b600a61265e83613a81565b60405160200161266f929190614c17565b60405160208183030381529060405290505b919050565b6060612690612ce7565b73ffffffffffffffffffffffffffffffffffffffff166126ae611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb90614e50565b60405180910390fd5b600a80546127119061523c565b80601f016020809104026020016040519081016040528092919081815260200182805461273d9061523c565b801561278a5780601f1061275f5761010080835404028352916020019161278a565b820191906000526020600020905b81548152906001019060200180831161276d57829003601f168201915b5050505050905090565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff161561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614eb0565b60405180910390fd5b600260095414156128c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bb90614ed0565b60405180910390fd5b60026009819055508234600e548260ff166128df91906150e1565b146128e957600080fd5b83600d548160ff166128f9610f39565b612903919061505a565b1115612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b90614dd0565b60405180910390fd5b83836129ba828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506015543360405160200161299f9190614bfc565b60405160208183030381529060405280519060200120613be2565b6129f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f090614e10565b60405180910390fd5b86601460009054906101000a900460ff16612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4090614e70565b60405180910390fd5b6013548160ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a9a919061505a565b1115612adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad290614db0565b60405180910390fd5b8760ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2d919061505a565b92505081905550612b41338960ff166138e0565b50505050506001600981905550505050565b612b5b612ce7565b73ffffffffffffffffffffffffffffffffffffffff16612b79611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690614e50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614d90565b60405180910390fd5b612c488161381a565b50565b60178060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612cfa612def565b11158015612d09575060005482105b8015612d36575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e65576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612ea0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ead6000848385613bf9565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613050578160008190555050506130d06000848385613bff565b505050565b60006130e08261358b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461314b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661316c612ce7565b73ffffffffffffffffffffffffffffffffffffffff16148061319b575061319a85613195612ce7565b61279a565b5b806131e057506131a9612ce7565b73ffffffffffffffffffffffffffffffffffffffff166131c884610d9a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613219576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613280576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61328d8585856001613bf9565b61329960008487612d3d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561351957600054821461351857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135848585856001613bff565b5050505050565b6135936140db565b6000829050806135a1612def565b111580156135b0575060005481105b156137e3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516137e157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136c5578092505050613815565b5b6001156137e057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146137db578092505050613815565b6136c6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6138fa828260405180602001604052806000815250613c05565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613947612ce7565b8786866040518563ffffffff1660e01b81526004016139699493929190614c81565b602060405180830381600087803b15801561398357600080fd5b505af19250505080156139b457506040513d601f19601f820116820180604052508101906139b19190614685565b60015b613a2e573d80600081146139e4576040519150601f19603f3d011682016040523d82523d6000602084013e6139e9565b606091505b50600081511415613a26576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613bdd565b600082905060005b60008214613afb578080613ae49061529f565b915050600a82613af491906150b0565b9150613ad1565b60008167ffffffffffffffff811115613b1757613b166153f9565b5b6040519080825280601f01601f191660200182016040528015613b495781602001600182028036833780820191505090505b5090505b60008514613bd657600182613b62919061513b565b9150600a85613b71919061530c565b6030613b7d919061505a565b60f81b818381518110613b9357613b926153ca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613bcf91906150b0565b9450613b4d565b8093505050505b919050565b600082613bef8584613fc9565b1490509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613c72576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613cad576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cba6000858386613bf9565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050613e7b8673ffffffffffffffffffffffffffffffffffffffff166138fe565b15613f41575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ef06000878480600101955087613921565b613f26576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613e81578260005414613f3c57600080fd5b613fad565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613f42575b816000819055505050613fc36000858386613bff565b50505050565b60008082905060005b8451811015614033576000858281518110613ff057613fef6153ca565b5b602002602001015190508083116140125761400b838261403e565b925061401f565b61401c818461403e565b92505b50808061402b9061529f565b915050613fd2565b508091505092915050565b600082600052816020526040600020905092915050565b8280546140619061523c565b90600052602060002090601f01602090048101928261408357600085556140ca565b82601f1061409c57805160ff19168380011785556140ca565b828001600101855582156140ca579182015b828111156140c95782518255916020019190600101906140ae565b5b5090506140d7919061411e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561413757600081600090555060010161411f565b5090565b600061414e61414984614f30565b614f0b565b9050808382526020820190508285604086028201111561417157614170615437565b5b60005b858110156141a157816141878882614378565b845260208401935060408301925050600181019050614174565b5050509392505050565b60006141be6141b984614f5c565b614f0b565b9050828152602081018484840111156141da576141d961543c565b5b6141e58482856151fa565b509392505050565b60006142006141fb84614f8d565b614f0b565b90508281526020810184848401111561421c5761421b61543c565b5b6142278482856151fa565b509392505050565b60008135905061423e816156d0565b92915050565b60008083601f84011261425a5761425961542d565b5b8235905067ffffffffffffffff81111561427757614276615428565b5b60208301915083602082028301111561429357614292615437565b5b9250929050565b600082601f8301126142af576142ae61542d565b5b81356142bf84826020860161413b565b91505092915050565b6000813590506142d7816156e7565b92915050565b6000813590506142ec816156fe565b92915050565b60008135905061430181615715565b92915050565b60008151905061431681615715565b92915050565b600082601f8301126143315761433061542d565b5b81356143418482602086016141ab565b91505092915050565b600082601f83011261435f5761435e61542d565b5b813561436f8482602086016141ed565b91505092915050565b60006040828403121561438e5761438d615432565b5b6143986040614f0b565b905060006143a88482850161422f565b60008301525060206143bc848285016143c8565b60208301525092915050565b6000813590506143d78161572c565b92915050565b6000813590506143ec81615743565b92915050565b60006020828403121561440857614407615446565b5b60006144168482850161422f565b91505092915050565b6000806040838503121561443657614435615446565b5b60006144448582860161422f565b92505060206144558582860161422f565b9150509250929050565b60008060006060848603121561447857614477615446565b5b60006144868682870161422f565b93505060206144978682870161422f565b92505060406144a8868287016143c8565b9150509250925092565b600080600080608085870312156144cc576144cb615446565b5b60006144da8782880161422f565b94505060206144eb8782880161422f565b93505060406144fc878288016143c8565b925050606085013567ffffffffffffffff81111561451d5761451c615441565b5b6145298782880161431c565b91505092959194509250565b6000806040838503121561454c5761454b615446565b5b600061455a8582860161422f565b925050602061456b858286016142c8565b9150509250929050565b6000806040838503121561458c5761458b615446565b5b600061459a8582860161422f565b92505060206145ab858286016143c8565b9150509250929050565b6000602082840312156145cb576145ca615446565b5b600082013567ffffffffffffffff8111156145e9576145e8615441565b5b6145f58482850161429a565b91505092915050565b60006020828403121561461457614613615446565b5b6000614622848285016142c8565b91505092915050565b60006020828403121561464157614640615446565b5b600061464f848285016142dd565b91505092915050565b60006020828403121561466e5761466d615446565b5b600061467c848285016142f2565b91505092915050565b60006020828403121561469b5761469a615446565b5b60006146a984828501614307565b91505092915050565b6000602082840312156146c8576146c7615446565b5b600082013567ffffffffffffffff8111156146e6576146e5615441565b5b6146f28482850161434a565b91505092915050565b60006020828403121561471157614710615446565b5b600061471f848285016143c8565b91505092915050565b60006020828403121561473e5761473d615446565b5b600061474c848285016143dd565b91505092915050565b6000806040838503121561476c5761476b615446565b5b600061477a858286016143dd565b925050602061478b8582860161422f565b9150509250929050565b6000806000604084860312156147ae576147ad615446565b5b60006147bc868287016143dd565b935050602084013567ffffffffffffffff8111156147dd576147dc615441565b5b6147e986828701614244565b92509250509250925092565b60006148018383614bde565b60208301905092915050565b6148168161516f565b82525050565b61482d6148288261516f565b6152e8565b82525050565b600061483e82614fe3565b6148488185615011565b935061485383614fbe565b8060005b8381101561488457815161486b88826147f5565b975061487683615004565b925050600181019050614857565b5085935050505092915050565b61489a81615181565b82525050565b6148a98161518d565b82525050565b60006148ba82614fee565b6148c48185615022565b93506148d4818560208601615209565b6148dd8161544b565b840191505092915050565b60006148f382614ff9565b6148fd818561503e565b935061490d818560208601615209565b6149168161544b565b840191505092915050565b600061492c82614ff9565b614936818561504f565b9350614946818560208601615209565b80840191505092915050565b6000815461495f8161523c565b614969818661504f565b945060018216600081146149845760018114614995576149c8565b60ff198316865281860193506149c8565b61499e85614fce565b60005b838110156149c0578154818901526001820191506020810190506149a1565b838801955050505b50505092915050565b60006149de60148361503e565b91506149e982615469565b602082019050919050565b6000614a0160268361503e565b9150614a0c82615492565b604082019050919050565b6000614a2460148361503e565b9150614a2f826154e1565b602082019050919050565b6000614a47600e8361503e565b9150614a528261550a565b602082019050919050565b6000614a6a60188361503e565b9150614a7582615533565b602082019050919050565b6000614a8d601e8361503e565b9150614a988261555c565b602082019050919050565b6000614ab060118361503e565b9150614abb82615585565b602082019050919050565b6000614ad360058361504f565b9150614ade826155ae565b600582019050919050565b6000614af660208361503e565b9150614b01826155d7565b602082019050919050565b6000614b1960178361503e565b9150614b2482615600565b602082019050919050565b6000614b3c600083615033565b9150614b4782615629565b600082019050919050565b6000614b5f60148361503e565b9150614b6a8261562c565b602082019050919050565b6000614b8260128361503e565b9150614b8d82615655565b602082019050919050565b6000614ba5601f8361503e565b9150614bb08261567e565b602082019050919050565b6000614bc860018361504f565b9150614bd3826156a7565b600182019050919050565b614be7816151e3565b82525050565b614bf6816151e3565b82525050565b6000614c08828461481c565b60148201915081905092915050565b6000614c238285614952565b9150614c2e82614bbb565b9150614c3a8284614921565b9150614c4582614ac6565b91508190509392505050565b6000614c5c82614b2f565b9150819050919050565b6000602082019050614c7b600083018461480d565b92915050565b6000608082019050614c96600083018761480d565b614ca3602083018661480d565b614cb06040830185614bed565b8181036060830152614cc281846148af565b905095945050505050565b6000604082019050614ce2600083018561480d565b614cef6020830184614bed565b9392505050565b60006020820190508181036000830152614d108184614833565b905092915050565b6000602082019050614d2d6000830184614891565b92915050565b6000602082019050614d4860008301846148a0565b92915050565b60006020820190508181036000830152614d6881846148e8565b905092915050565b60006020820190508181036000830152614d89816149d1565b9050919050565b60006020820190508181036000830152614da9816149f4565b9050919050565b60006020820190508181036000830152614dc981614a17565b9050919050565b60006020820190508181036000830152614de981614a3a565b9050919050565b60006020820190508181036000830152614e0981614a5d565b9050919050565b60006020820190508181036000830152614e2981614a80565b9050919050565b60006020820190508181036000830152614e4981614aa3565b9050919050565b60006020820190508181036000830152614e6981614ae9565b9050919050565b60006020820190508181036000830152614e8981614b0c565b9050919050565b60006020820190508181036000830152614ea981614b52565b9050919050565b60006020820190508181036000830152614ec981614b75565b9050919050565b60006020820190508181036000830152614ee981614b98565b9050919050565b6000602082019050614f056000830184614bed565b92915050565b6000614f15614f26565b9050614f21828261526e565b919050565b6000604051905090565b600067ffffffffffffffff821115614f4b57614f4a6153f9565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f7757614f766153f9565b5b614f808261544b565b9050602081019050919050565b600067ffffffffffffffff821115614fa857614fa76153f9565b5b614fb18261544b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615065826151e3565b9150615070836151e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150a5576150a461533d565b5b828201905092915050565b60006150bb826151e3565b91506150c6836151e3565b9250826150d6576150d561536c565b5b828204905092915050565b60006150ec826151e3565b91506150f7836151e3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151305761512f61533d565b5b828202905092915050565b6000615146826151e3565b9150615151836151e3565b9250828210156151645761516361533d565b5b828203905092915050565b600061517a826151c3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561522757808201518184015260208101905061520c565b83811115615236576000848401525b50505050565b6000600282049050600182168061525457607f821691505b602082108114156152685761526761539b565b5b50919050565b6152778261544b565b810181811067ffffffffffffffff82111715615296576152956153f9565b5b80604052505050565b60006152aa826151e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152dd576152dc61533d565b5b600182019050919050565b60006152f3826152fa565b9050919050565b60006153058261545c565b9050919050565b6000615317826151e3565b9150615322836151e3565b9250826153325761533161536c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f77616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4e6f206d6f726520746f6b656e73000000000000000000000000000000000000600082015250565b7f53616c6573207761736e27742073746172746564207965740000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f50726573616c65206d7573742062652073746172746564000000000000000000600082015250565b50565b7f53616c65206d7573742062652073746172746564000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6156d98161516f565b81146156e457600080fd5b50565b6156f081615181565b81146156fb57600080fd5b50565b6157078161518d565b811461571257600080fd5b50565b61571e81615197565b811461572957600080fd5b50565b615735816151e3565b811461574057600080fd5b50565b61574c816151ed565b811461575757600080fd5b5056fea26469706673582212206cd6882485e9e2c573f5785199051cbb812888ebef051cf9791480afae3f999464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d53393663535941393344655358565931583676376661595a3144695056616d6b6d564c4845445a61774a436500000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d51654c795154445171516f36377563624c4a5a324d74324b7233697933636f5666394a62356a6857557a314d0000000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c8063790b3b2b11610175578063b66a0e5d116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610a85578063f218c01c14610ac2578063f2fde38b14610ade578063fd8607e514610b07576102c9565b8063c87b56dd146109f2578063d288823f14610a2f578063d5abeb0114610a5a576102c9565b8063b66a0e5d14610919578063b88d4fde14610930578063bedb86fb14610959578063bf79334614610982578063c0f6baa41461099e578063c1e1d954146109db576102c9565b8063940cd05b1161012e578063940cd05b1461081f57806395d89b4114610848578063a035b1fe14610873578063a22cb4651461089e578063a643ed30146108c7578063a74ea6ce146108f0576102c9565b8063790b3b2b146107235780637b99fab51461074e5780637e02d105146107775780638a16766d146107a05780638d6cc56d146107cb5780638da5cb5b146107f4576102c9565b80633ccfd60b116102345780635c975abb116101ed5780636f8b44b0116101c75780636f8b44b01461067b57806370a08231146106a4578063714c5398146106e1578063715018a61461070c576102c9565b80635c975abb146105ea5780636352211e146106155780636ea451e414610652576102c9565b80633ccfd60b146104ee57806342842e0e14610505578063438b63001461052e578063518302271461056b57806355f804b3146105965780635c474f9e146105bf576102c9565b8063095ea7b311610286578063095ea7b3146103f257806318160ddd1461041b5780631ee525d41461044657806322212e2b1461046f57806323b872dd1461049a578063364e1efd146104c3576102c9565b806301ffc9a7146102ce57806304549d6f1461030b57806304c98b2b1461033657806306fdde031461034d578063081812fc14610378578063094e4072146103b5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190614658565b610b33565b6040516103029190614d18565b60405180910390f35b34801561031757600080fd5b50610320610c15565b60405161032d9190614d18565b60405180910390f35b34801561034257600080fd5b5061034b610c28565b005b34801561035957600080fd5b50610362610d08565b60405161036f9190614d4e565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a91906146fb565b610d9a565b6040516103ac9190614c66565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906143f2565b610e16565b6040516103e99190614ef0565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190614575565b610e2e565b005b34801561042757600080fd5b50610430610f39565b60405161043d9190614ef0565b60405180910390f35b34801561045257600080fd5b5061046d600480360381019061046891906145b5565b610f50565b005b34801561047b57600080fd5b50610484611035565b6040516104919190614d33565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc919061445f565b61103b565b005b3480156104cf57600080fd5b506104d861104b565b6040516104e59190614ef0565b60405180910390f35b3480156104fa57600080fd5b5061050361118d565b005b34801561051157600080fd5b5061052c6004803603810190610527919061445f565b611467565b005b34801561053a57600080fd5b50610555600480360381019061055091906143f2565b611487565b6040516105629190614cf6565b60405180910390f35b34801561057757600080fd5b50610580611592565b60405161058d9190614d18565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906146b2565b6115a5565b005b3480156105cb57600080fd5b506105d461163b565b6040516105e19190614d18565b60405180910390f35b3480156105f657600080fd5b506105ff61164e565b60405161060c9190614d18565b60405180910390f35b34801561062157600080fd5b5061063c600480360381019061063791906146fb565b611661565b6040516106499190614c66565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190614728565b611677565b005b34801561068757600080fd5b506106a2600480360381019061069d91906146fb565b611700565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906143f2565b611786565b6040516106d89190614ef0565b60405180910390f35b3480156106ed57600080fd5b506106f6611856565b6040516107039190614d4e565b60405180910390f35b34801561071857600080fd5b5061072161198f565b005b34801561072f57600080fd5b50610738611a17565b6040516107459190614ef0565b60405180910390f35b34801561075a57600080fd5b5061077560048036038101906107709190614755565b611a1d565b005b34801561078357600080fd5b5061079e600480360381019061079991906146b2565b611b06565b005b3480156107ac57600080fd5b506107b5611b9c565b6040516107c29190614ef0565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed91906146fb565b611ba2565b005b34801561080057600080fd5b50610809611c28565b6040516108169190614c66565b60405180910390f35b34801561082b57600080fd5b50610846600480360381019061084191906145fe565b611c52565b005b34801561085457600080fd5b5061085d611ceb565b60405161086a9190614d4e565b60405180910390f35b34801561087f57600080fd5b50610888611d7d565b6040516108959190614ef0565b60405180910390f35b3480156108aa57600080fd5b506108c560048036038101906108c09190614535565b611d83565b005b3480156108d357600080fd5b506108ee60048036038101906108e9919061462b565b611efb565b005b3480156108fc57600080fd5b5061091760048036038101906109129190614728565b611f81565b005b34801561092557600080fd5b5061092e61200a565b005b34801561093c57600080fd5b50610957600480360381019061095291906144b2565b6120ea565b005b34801561096557600080fd5b50610980600480360381019061097b91906145fe565b612166565b005b61099c60048036038101906109979190614728565b6121ff565b005b3480156109aa57600080fd5b506109c560048036038101906109c091906143f2565b61246b565b6040516109d29190614ef0565b60405180910390f35b3480156109e757600080fd5b506109f0612483565b005b3480156109fe57600080fd5b50610a196004803603810190610a1491906146fb565b612563565b604051610a269190614d4e565b60405180910390f35b348015610a3b57600080fd5b50610a44612686565b604051610a519190614d4e565b60405180910390f35b348015610a6657600080fd5b50610a6f612794565b604051610a7c9190614ef0565b60405180910390f35b348015610a9157600080fd5b50610aac6004803603810190610aa7919061441f565b61279a565b604051610ab99190614d18565b60405180910390f35b610adc6004803603810190610ad79190614795565b61282e565b005b348015610aea57600080fd5b50610b056004803603810190610b0091906143f2565b612b53565b005b348015610b1357600080fd5b50610b1c612c4b565b604051610b2a929190614ccd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bfe57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0e5750610c0d82612c7d565b5b9050919050565b601460009054906101000a900460ff1681565b610c30612ce7565b73ffffffffffffffffffffffffffffffffffffffff16610c4e611c28565b73ffffffffffffffffffffffffffffffffffffffff1614610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614e50565b60405180910390fd5b6001601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606060028054610d179061523c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d439061523c565b8015610d905780601f10610d6557610100808354040283529160200191610d90565b820191906000526020600020905b815481529060010190602001808311610d7357829003601f168201915b5050505050905090565b6000610da582612cef565b610ddb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60126020528060005260406000206000915090505481565b6000610e3982611661565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ec0612ce7565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ef25750610ef081610eeb612ce7565b61279a565b155b15610f29576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f34838383612d3d565b505050565b6000610f43612def565b6001546000540303905090565b610f58612ce7565b73ffffffffffffffffffffffffffffffffffffffff16610f76611c28565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390614e50565b60405180910390fd5b60005b81518110156110315761101e828281518110610fee57610fed6153ca565b5b60200260200101516000015183838151811061100d5761100c6153ca565b5b602002602001015160200151612df8565b80806110299061529f565b915050610fcf565b5050565b60155481565b6110468383836130d5565b505050565b6000601460009054906101000a900460ff16806110745750601160009054906101000a900460ff165b6110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614df0565b60405180910390fd5b601460009054906101000a900460ff161561111c57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354611115919061513b565b905061118a565b601160009054906101000a900460ff161561118557600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460105461117e919061513b565b905061118a565b600090505b90565b611195612ce7565b73ffffffffffffffffffffffffffffffffffffffff166111b3611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090614e50565b60405180910390fd5b60006064600f4761121a91906150e1565b61122491906150b0565b905060006064600f4761123791906150e1565b61124191906150b0565b905060006064601f4761125491906150e1565b61125e91906150b0565b9050600073dcd6b7449167220724084bfd61f9b205c7dfa5a173ffffffffffffffffffffffffffffffffffffffff168460405161129a90614c51565b60006040518083038185875af1925050503d80600081146112d7576040519150601f19603f3d011682016040523d82523d6000602084013e6112dc565b606091505b50509050806112ea57600080fd5b600073026bf664d2c84e4da15b18d66e41ab8180f2bda373ffffffffffffffffffffffffffffffffffffffff168460405161132490614c51565b60006040518083038185875af1925050503d8060008114611361576040519150601f19603f3d011682016040523d82523d6000602084013e611366565b606091505b505090508061137457600080fd5b600073e1840cc1bc1c80c576faed0de39fc2c92e6440ca73ffffffffffffffffffffffffffffffffffffffff16846040516113ae90614c51565b60006040518083038185875af1925050503d80600081146113eb576040519150601f19603f3d011682016040523d82523d6000602084013e6113f0565b606091505b50509050806113fe57600080fd5b600047905073bf95b5444c3f8d671183ec87984d04b32c842d8973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561145d573d6000803e3d6000fd5b5050505050505050565b611482838383604051806020016040528060008152506120ea565b505050565b6060600061149483611786565b905060008167ffffffffffffffff8111156114b2576114b16153f9565b5b6040519080825280602002602001820160405280156114e05781602001602082028036833780820191505090505b50905060006001905060005b83811080156114fd5750600d548211155b1561158657600061150d83611661565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115725782848381518110611557576115566153ca565b5b602002602001018181525050818061156e9061529f565b9250505b828061157d9061529f565b935050506114ec565b82945050505050919050565b601660009054906101000a900460ff1681565b6115ad612ce7565b73ffffffffffffffffffffffffffffffffffffffff166115cb611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890614e50565b60405180910390fd5b80600a9080519060200190611637929190614055565b5050565b601160009054906101000a900460ff1681565b600c60009054906101000a900460ff1681565b600061166c8261358b565b600001519050919050565b61167f612ce7565b73ffffffffffffffffffffffffffffffffffffffff1661169d611c28565b73ffffffffffffffffffffffffffffffffffffffff16146116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90614e50565b60405180910390fd5b8060ff1660108190555050565b611708612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611726611c28565b73ffffffffffffffffffffffffffffffffffffffff161461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390614e50565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ee576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060601660009054906101000a900460ff166118fe57600b80546118799061523c565b80601f01602080910402602001604051908101604052809291908181526020018280546118a59061523c565b80156118f25780601f106118c7576101008083540402835291602001916118f2565b820191906000526020600020905b8154815290600101906020018083116118d557829003601f168201915b5050505050905061198c565b600a805461190b9061523c565b80601f01602080910402602001604051908101604052809291908181526020018280546119379061523c565b80156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b505050505090505b90565b611997612ce7565b73ffffffffffffffffffffffffffffffffffffffff166119b5611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290614e50565b60405180910390fd5b611a15600061381a565b565b60105481565b81600d548160ff16611a2d610f39565b611a37919061505a565b1115611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90614dd0565b60405180910390fd5b611a80612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611a9e611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90614e50565b60405180910390fd5b611b01828460ff166138e0565b505050565b611b0e612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611b2c611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614e50565b60405180910390fd5b80600b9080519060200190611b98929190614055565b5050565b60135481565b611baa612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611bc8611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1590614e50565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c5a612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611c78611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc590614e50565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b606060038054611cfa9061523c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d269061523c565b8015611d735780601f10611d4857610100808354040283529160200191611d73565b820191906000526020600020905b815481529060010190602001808311611d5657829003601f168201915b5050505050905090565b600e5481565b611d8b612ce7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611dfd612ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eaa612ce7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eef9190614d18565b60405180910390a35050565b611f03612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611f21611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90614e50565b60405180910390fd5b8060158190555050565b611f89612ce7565b73ffffffffffffffffffffffffffffffffffffffff16611fa7611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614e50565b60405180910390fd5b8060ff1660138190555050565b612012612ce7565b73ffffffffffffffffffffffffffffffffffffffff16612030611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d90614e50565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b6120f58484846130d5565b6121148373ffffffffffffffffffffffffffffffffffffffff166138fe565b8015612129575061212784848484613921565b155b15612160576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61216e612ce7565b73ffffffffffffffffffffffffffffffffffffffff1661218c611c28565b73ffffffffffffffffffffffffffffffffffffffff16146121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d990614e50565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff161561224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690614eb0565b60405180910390fd5b60026009541415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90614ed0565b60405180910390fd5b60026009819055508034600e548260ff166122b091906150e1565b146122ba57600080fd5b81600d548160ff166122ca610f39565b6122d4919061505a565b1115612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c90614dd0565b60405180910390fd5b82601160009054906101000a900460ff16612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614e90565b60405180910390fd5b6010548160ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123b6919061505a565b11156123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90614d70565b60405180910390fd5b8360ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612449919061505a565b9250508190555061245d338560ff166138e0565b505050600160098190555050565b600f6020528060005260406000206000915090505481565b61248b612ce7565b73ffffffffffffffffffffffffffffffffffffffff166124a9611c28565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690614e50565b60405180910390fd5b6000601460006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055507f3c05c19539e74cee588cdd346d1ce1d0e3f2b2f7c68e888ec5adb697442deaa660405160405180910390a1565b606061256e82612cef565b6125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a490614e30565b60405180910390fd5b601660009054906101000a900460ff1661265357600b80546125ce9061523c565b80601f01602080910402602001604051908101604052809291908181526020018280546125fa9061523c565b80156126475780601f1061261c57610100808354040283529160200191612647565b820191906000526020600020905b81548152906001019060200180831161262a57829003601f168201915b50505050509050612681565b600a61265e83613a81565b60405160200161266f929190614c17565b60405160208183030381529060405290505b919050565b6060612690612ce7565b73ffffffffffffffffffffffffffffffffffffffff166126ae611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb90614e50565b60405180910390fd5b600a80546127119061523c565b80601f016020809104026020016040519081016040528092919081815260200182805461273d9061523c565b801561278a5780601f1061275f5761010080835404028352916020019161278a565b820191906000526020600020905b81548152906001019060200180831161276d57829003601f168201915b5050505050905090565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff161561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614eb0565b60405180910390fd5b600260095414156128c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bb90614ed0565b60405180910390fd5b60026009819055508234600e548260ff166128df91906150e1565b146128e957600080fd5b83600d548160ff166128f9610f39565b612903919061505a565b1115612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b90614dd0565b60405180910390fd5b83836129ba828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506015543360405160200161299f9190614bfc565b60405160208183030381529060405280519060200120613be2565b6129f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f090614e10565b60405180910390fd5b86601460009054906101000a900460ff16612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4090614e70565b60405180910390fd5b6013548160ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a9a919061505a565b1115612adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad290614db0565b60405180910390fd5b8760ff16601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2d919061505a565b92505081905550612b41338960ff166138e0565b50505050506001600981905550505050565b612b5b612ce7565b73ffffffffffffffffffffffffffffffffffffffff16612b79611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690614e50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614d90565b60405180910390fd5b612c488161381a565b50565b60178060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612cfa612def565b11158015612d09575060005482105b8015612d36575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e65576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612ea0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ead6000848385613bf9565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613050578160008190555050506130d06000848385613bff565b505050565b60006130e08261358b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461314b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661316c612ce7565b73ffffffffffffffffffffffffffffffffffffffff16148061319b575061319a85613195612ce7565b61279a565b5b806131e057506131a9612ce7565b73ffffffffffffffffffffffffffffffffffffffff166131c884610d9a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613219576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613280576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61328d8585856001613bf9565b61329960008487612d3d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561351957600054821461351857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135848585856001613bff565b5050505050565b6135936140db565b6000829050806135a1612def565b111580156135b0575060005481105b156137e3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516137e157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136c5578092505050613815565b5b6001156137e057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146137db578092505050613815565b6136c6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6138fa828260405180602001604052806000815250613c05565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613947612ce7565b8786866040518563ffffffff1660e01b81526004016139699493929190614c81565b602060405180830381600087803b15801561398357600080fd5b505af19250505080156139b457506040513d601f19601f820116820180604052508101906139b19190614685565b60015b613a2e573d80600081146139e4576040519150601f19603f3d011682016040523d82523d6000602084013e6139e9565b606091505b50600081511415613a26576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613bdd565b600082905060005b60008214613afb578080613ae49061529f565b915050600a82613af491906150b0565b9150613ad1565b60008167ffffffffffffffff811115613b1757613b166153f9565b5b6040519080825280601f01601f191660200182016040528015613b495781602001600182028036833780820191505090505b5090505b60008514613bd657600182613b62919061513b565b9150600a85613b71919061530c565b6030613b7d919061505a565b60f81b818381518110613b9357613b926153ca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613bcf91906150b0565b9450613b4d565b8093505050505b919050565b600082613bef8584613fc9565b1490509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613c72576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613cad576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cba6000858386613bf9565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050613e7b8673ffffffffffffffffffffffffffffffffffffffff166138fe565b15613f41575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ef06000878480600101955087613921565b613f26576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613e81578260005414613f3c57600080fd5b613fad565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613f42575b816000819055505050613fc36000858386613bff565b50505050565b60008082905060005b8451811015614033576000858281518110613ff057613fef6153ca565b5b602002602001015190508083116140125761400b838261403e565b925061401f565b61401c818461403e565b92505b50808061402b9061529f565b915050613fd2565b508091505092915050565b600082600052816020526040600020905092915050565b8280546140619061523c565b90600052602060002090601f01602090048101928261408357600085556140ca565b82601f1061409c57805160ff19168380011785556140ca565b828001600101855582156140ca579182015b828111156140c95782518255916020019190600101906140ae565b5b5090506140d7919061411e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561413757600081600090555060010161411f565b5090565b600061414e61414984614f30565b614f0b565b9050808382526020820190508285604086028201111561417157614170615437565b5b60005b858110156141a157816141878882614378565b845260208401935060408301925050600181019050614174565b5050509392505050565b60006141be6141b984614f5c565b614f0b565b9050828152602081018484840111156141da576141d961543c565b5b6141e58482856151fa565b509392505050565b60006142006141fb84614f8d565b614f0b565b90508281526020810184848401111561421c5761421b61543c565b5b6142278482856151fa565b509392505050565b60008135905061423e816156d0565b92915050565b60008083601f84011261425a5761425961542d565b5b8235905067ffffffffffffffff81111561427757614276615428565b5b60208301915083602082028301111561429357614292615437565b5b9250929050565b600082601f8301126142af576142ae61542d565b5b81356142bf84826020860161413b565b91505092915050565b6000813590506142d7816156e7565b92915050565b6000813590506142ec816156fe565b92915050565b60008135905061430181615715565b92915050565b60008151905061431681615715565b92915050565b600082601f8301126143315761433061542d565b5b81356143418482602086016141ab565b91505092915050565b600082601f83011261435f5761435e61542d565b5b813561436f8482602086016141ed565b91505092915050565b60006040828403121561438e5761438d615432565b5b6143986040614f0b565b905060006143a88482850161422f565b60008301525060206143bc848285016143c8565b60208301525092915050565b6000813590506143d78161572c565b92915050565b6000813590506143ec81615743565b92915050565b60006020828403121561440857614407615446565b5b60006144168482850161422f565b91505092915050565b6000806040838503121561443657614435615446565b5b60006144448582860161422f565b92505060206144558582860161422f565b9150509250929050565b60008060006060848603121561447857614477615446565b5b60006144868682870161422f565b93505060206144978682870161422f565b92505060406144a8868287016143c8565b9150509250925092565b600080600080608085870312156144cc576144cb615446565b5b60006144da8782880161422f565b94505060206144eb8782880161422f565b93505060406144fc878288016143c8565b925050606085013567ffffffffffffffff81111561451d5761451c615441565b5b6145298782880161431c565b91505092959194509250565b6000806040838503121561454c5761454b615446565b5b600061455a8582860161422f565b925050602061456b858286016142c8565b9150509250929050565b6000806040838503121561458c5761458b615446565b5b600061459a8582860161422f565b92505060206145ab858286016143c8565b9150509250929050565b6000602082840312156145cb576145ca615446565b5b600082013567ffffffffffffffff8111156145e9576145e8615441565b5b6145f58482850161429a565b91505092915050565b60006020828403121561461457614613615446565b5b6000614622848285016142c8565b91505092915050565b60006020828403121561464157614640615446565b5b600061464f848285016142dd565b91505092915050565b60006020828403121561466e5761466d615446565b5b600061467c848285016142f2565b91505092915050565b60006020828403121561469b5761469a615446565b5b60006146a984828501614307565b91505092915050565b6000602082840312156146c8576146c7615446565b5b600082013567ffffffffffffffff8111156146e6576146e5615441565b5b6146f28482850161434a565b91505092915050565b60006020828403121561471157614710615446565b5b600061471f848285016143c8565b91505092915050565b60006020828403121561473e5761473d615446565b5b600061474c848285016143dd565b91505092915050565b6000806040838503121561476c5761476b615446565b5b600061477a858286016143dd565b925050602061478b8582860161422f565b9150509250929050565b6000806000604084860312156147ae576147ad615446565b5b60006147bc868287016143dd565b935050602084013567ffffffffffffffff8111156147dd576147dc615441565b5b6147e986828701614244565b92509250509250925092565b60006148018383614bde565b60208301905092915050565b6148168161516f565b82525050565b61482d6148288261516f565b6152e8565b82525050565b600061483e82614fe3565b6148488185615011565b935061485383614fbe565b8060005b8381101561488457815161486b88826147f5565b975061487683615004565b925050600181019050614857565b5085935050505092915050565b61489a81615181565b82525050565b6148a98161518d565b82525050565b60006148ba82614fee565b6148c48185615022565b93506148d4818560208601615209565b6148dd8161544b565b840191505092915050565b60006148f382614ff9565b6148fd818561503e565b935061490d818560208601615209565b6149168161544b565b840191505092915050565b600061492c82614ff9565b614936818561504f565b9350614946818560208601615209565b80840191505092915050565b6000815461495f8161523c565b614969818661504f565b945060018216600081146149845760018114614995576149c8565b60ff198316865281860193506149c8565b61499e85614fce565b60005b838110156149c0578154818901526001820191506020810190506149a1565b838801955050505b50505092915050565b60006149de60148361503e565b91506149e982615469565b602082019050919050565b6000614a0160268361503e565b9150614a0c82615492565b604082019050919050565b6000614a2460148361503e565b9150614a2f826154e1565b602082019050919050565b6000614a47600e8361503e565b9150614a528261550a565b602082019050919050565b6000614a6a60188361503e565b9150614a7582615533565b602082019050919050565b6000614a8d601e8361503e565b9150614a988261555c565b602082019050919050565b6000614ab060118361503e565b9150614abb82615585565b602082019050919050565b6000614ad360058361504f565b9150614ade826155ae565b600582019050919050565b6000614af660208361503e565b9150614b01826155d7565b602082019050919050565b6000614b1960178361503e565b9150614b2482615600565b602082019050919050565b6000614b3c600083615033565b9150614b4782615629565b600082019050919050565b6000614b5f60148361503e565b9150614b6a8261562c565b602082019050919050565b6000614b8260128361503e565b9150614b8d82615655565b602082019050919050565b6000614ba5601f8361503e565b9150614bb08261567e565b602082019050919050565b6000614bc860018361504f565b9150614bd3826156a7565b600182019050919050565b614be7816151e3565b82525050565b614bf6816151e3565b82525050565b6000614c08828461481c565b60148201915081905092915050565b6000614c238285614952565b9150614c2e82614bbb565b9150614c3a8284614921565b9150614c4582614ac6565b91508190509392505050565b6000614c5c82614b2f565b9150819050919050565b6000602082019050614c7b600083018461480d565b92915050565b6000608082019050614c96600083018761480d565b614ca3602083018661480d565b614cb06040830185614bed565b8181036060830152614cc281846148af565b905095945050505050565b6000604082019050614ce2600083018561480d565b614cef6020830184614bed565b9392505050565b60006020820190508181036000830152614d108184614833565b905092915050565b6000602082019050614d2d6000830184614891565b92915050565b6000602082019050614d4860008301846148a0565b92915050565b60006020820190508181036000830152614d6881846148e8565b905092915050565b60006020820190508181036000830152614d89816149d1565b9050919050565b60006020820190508181036000830152614da9816149f4565b9050919050565b60006020820190508181036000830152614dc981614a17565b9050919050565b60006020820190508181036000830152614de981614a3a565b9050919050565b60006020820190508181036000830152614e0981614a5d565b9050919050565b60006020820190508181036000830152614e2981614a80565b9050919050565b60006020820190508181036000830152614e4981614aa3565b9050919050565b60006020820190508181036000830152614e6981614ae9565b9050919050565b60006020820190508181036000830152614e8981614b0c565b9050919050565b60006020820190508181036000830152614ea981614b52565b9050919050565b60006020820190508181036000830152614ec981614b75565b9050919050565b60006020820190508181036000830152614ee981614b98565b9050919050565b6000602082019050614f056000830184614bed565b92915050565b6000614f15614f26565b9050614f21828261526e565b919050565b6000604051905090565b600067ffffffffffffffff821115614f4b57614f4a6153f9565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f7757614f766153f9565b5b614f808261544b565b9050602081019050919050565b600067ffffffffffffffff821115614fa857614fa76153f9565b5b614fb18261544b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615065826151e3565b9150615070836151e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150a5576150a461533d565b5b828201905092915050565b60006150bb826151e3565b91506150c6836151e3565b9250826150d6576150d561536c565b5b828204905092915050565b60006150ec826151e3565b91506150f7836151e3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151305761512f61533d565b5b828202905092915050565b6000615146826151e3565b9150615151836151e3565b9250828210156151645761516361533d565b5b828203905092915050565b600061517a826151c3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561522757808201518184015260208101905061520c565b83811115615236576000848401525b50505050565b6000600282049050600182168061525457607f821691505b602082108114156152685761526761539b565b5b50919050565b6152778261544b565b810181811067ffffffffffffffff82111715615296576152956153f9565b5b80604052505050565b60006152aa826151e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152dd576152dc61533d565b5b600182019050919050565b60006152f3826152fa565b9050919050565b60006153058261545c565b9050919050565b6000615317826151e3565b9150615322836151e3565b9250826153325761533161536c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f77616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206c696d69742072656163686564000000000000000000000000600082015250565b7f4e6f206d6f726520746f6b656e73000000000000000000000000000000000000600082015250565b7f53616c6573207761736e27742073746172746564207965740000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f50726573616c65206d7573742062652073746172746564000000000000000000600082015250565b50565b7f53616c65206d7573742062652073746172746564000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6156d98161516f565b81146156e457600080fd5b50565b6156f081615181565b81146156fb57600080fd5b50565b6157078161518d565b811461571257600080fd5b50565b61571e81615197565b811461572957600080fd5b50565b615735816151e3565b811461574057600080fd5b50565b61574c816151ed565b811461575757600080fd5b5056fea26469706673582212206cd6882485e9e2c573f5785199051cbb812888ebef051cf9791480afae3f999464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d53393663535941393344655358565931583676376661595a3144695056616d6b6d564c4845445a61774a436500000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d51654c795154445171516f36377563624c4a5a324d74324b7233697933636f5666394a62356a6857557a314d0000000000000000000000

-----Decoded View---------------
Arg [0] : _hideBaseURI (string): ipfs://QmS96cSYA93DeSXVY1X6v7faYZ1DiPVamkmVLHEDZawJCe
Arg [1] : _tokenUrl (string): ipfs://QmQeLyQTDQqQo67ucbLJZ2Mt2Kr3iy3coVf9Jb5jhWUz1M

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d5339366353594139334465535856593158367637666159
Arg [4] : 5a3144695056616d6b6d564c4845445a61774a43650000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d51654c795154445171516f36377563624c4a5a324d7432
Arg [7] : 4b7233697933636f5666394a62356a6857557a314d0000000000000000000000


Deployed Bytecode Sourcemap

55408:7782:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35380:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55962:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58357:158;;;;;;;;;;;;;:::i;:::-;;38663:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40260:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55855:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39795:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34585:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58795:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56005:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41177:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61595:400;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60359:813;;;;;;;;;;;;;:::i;:::-;;41440:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62007:761;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56119:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59875:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55811:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55583:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38457:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59615:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59991:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35769:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61406:177;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12906:103;;;;;;;;;;;;;:::i;:::-;;55767:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58196:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60103:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55916:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59376:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12255:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61184:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38846:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55658:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40554:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59737:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59481:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58527:155;;;;;;;;;;;;;:::i;:::-;;41718:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59278:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57618:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55709:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59110:156;;;;;;;;;;;;;:::i;:::-;;62780:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60235:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55618:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40932:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57870:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13164:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58770:12;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;35380:315;35482:4;35538:25;35523:40;;;:11;:40;;;;:107;;;;35597:33;35582:48;;;:11;:48;;;;35523:107;:162;;;;35649:36;35673:11;35649:23;:36::i;:::-;35523:162;35501:184;;35380:315;;;:::o;55962:34::-;;;;;;;;;;;;;:::o;58357:158::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58430:4:::1;58413:14;;:21;;;;;;;;;;;;;;;;;;58461:5;58447:11;;:19;;;;;;;;;;;;;;;;;;58488:17;;;;;;;;;;58357:158::o:0;38663:104::-;38717:13;38752:5;38745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38663:104;:::o;40260:212::-;40328:7;40355:16;40363:7;40355;:16::i;:::-;40350:64;;40380:34;;;;;;;;;;;;;;40350:64;40438:15;:24;40454:7;40438:24;;;;;;;;;;;;;;;;;;;;;40431:31;;40260:212;;;:::o;55855:52::-;;;;;;;;;;;;;;;;;:::o;39795:389::-;39870:13;39886:24;39902:7;39886:15;:24::i;:::-;39870:40;;39933:5;39927:11;;:2;:11;;;39923:48;;;39947:24;;;;;;;;;;;;;;39923:48;40008:5;39992:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;40018:37;40035:5;40042:12;:10;:12::i;:::-;40018:16;:37::i;:::-;40017:38;39992:63;39988:142;;;40081:35;;;;;;;;;;;;;;39988:142;40146:28;40155:2;40159:7;40168:5;40146:8;:28::i;:::-;39857:327;39795:389;;:::o;34585:315::-;34629:7;34862:15;:13;:15::i;:::-;34847:12;;34831:13;;:28;:46;34824:53;;34585:315;:::o;58795:303::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58873:24:::1;58918:171;58944:7;:14;58925:16;:33;58918:171;;;58977:63;58983:7;58991:16;58983:25;;;;;;;;:::i;:::-;;;;;;;;:27;;;59012:7;59020:16;59012:25;;;;;;;;:::i;:::-;;;;;;;;:27;;;58977:5;:63::i;:::-;59057:18;;;;;:::i;:::-;;;;58918:171;;;58860:238;58795:303:::0;:::o;56005:101::-;;;;:::o;41177:182::-;41321:28;41331:4;41337:2;41341:7;41321:9;:28::i;:::-;41177:182;;;:::o;61595:400::-;61639:7;61669:14;;;;;;;;;;;:29;;;;61687:11;;;;;;;;;;;61669:29;61661:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61748:14;;;;;;;;;;;61744:107;;;61809:16;:28;61826:10;61809:28;;;;;;;;;;;;;;;;61788:18;;:49;;;;:::i;:::-;61781:56;;;;61744:107;61867:11;;;;;;;;;;;61863:98;;;61922:13;:25;61936:10;61922:25;;;;;;;;;;;;;;;;61904:15;;:43;;;;:::i;:::-;61897:50;;;;61863:98;61984:1;61977:8;;61595:400;;:::o;60359:813::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60409:20:::1;60461:3;60456:2;60432:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;60409:55;;60477:15;60524:3;60519:2;60495:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;60477:50;;60540:13;60585:3;60580:2;60556:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;60540:48;;60606:18;60638:42;60630:56;;60694:12;60630:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60605:106;;;60732:13;60724:22;;;::::0;::::1;;60764:13;60791:42;60783:56;;60847:7;60783:76;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60763:96;;;60880:8;60872:17;;;::::0;::::1;;60907:10;60931:42;60923:56;;60987:5;60923:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60906:91;;;61018:5;61010:14;;;::::0;::::1;;61041:15;61059:21;61041:39;;61101:42;61093:60;;:69;61154:7;61093:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60396:776;;;;;;;60359:813::o:0;41440:197::-;41588:39;41605:4;41611:2;41615:7;41588:39;;;;;;;;;;;;:16;:39::i;:::-;41440:197;;;:::o;62007:761::-;62100:16;62138:23;62164:17;62174:6;62164:9;:17::i;:::-;62138:43;;62194:30;62241:15;62227:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62194:63;;62270:22;62295:1;62270:26;;62309:23;62353:369;62378:15;62360;:33;:64;;;;;62415:9;;62397:14;:27;;62360:64;62353:369;;;62443:25;62471:23;62479:14;62471:7;:23::i;:::-;62443:51;;62540:6;62519:27;;:17;:27;;;62515:157;;;62602:14;62569:13;62583:15;62569:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;62637:17;;;;;:::i;:::-;;;;62515:157;62692:16;;;;;:::i;:::-;;;;62426:296;62353:369;;;62745:13;62738:20;;;;;;62007:761;;;:::o;56119:27::-;;;;;;;;;;;;;:::o;59875:104::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59961:8:::1;59951:7;:18;;;;;;;;;;;;:::i;:::-;;59875:104:::0;:::o;55811:31::-;;;;;;;;;;;;;:::o;55583:26::-;;;;;;;;;;;;;:::o;38457:129::-;38521:7;38550:21;38563:7;38550:12;:21::i;:::-;:26;;;38543:33;;38457:129;;;:::o;59615:110::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59705:10:::1;59687:28;;:15;:28;;;;59615:110:::0;:::o;59991:100::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60074:7:::1;60062:9;:19;;;;59991:100:::0;:::o;35769:212::-;35833:7;35876:1;35859:19;;:5;:19;;;35855:60;;;35887:28;;;;;;;;;;;;;;35855:60;35943:12;:19;35956:5;35943:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;35935:36;;35928:43;;35769:212;;;:::o;61406:177::-;61451:13;61484:8;;;;;;;;;;;61479:64;;61518:11;61511:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61479:64;61566:7;61559:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61406:177;;:::o;12906:103::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12971:30:::1;12998:1;12971:18;:30::i;:::-;12906:103::o:0;55767:35::-;;;;:::o;58196:148::-;58271:8;56731:9;;56719:8;56703:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;56695:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12486:12:::1;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58304:30:::2;58314:9;58325:8;58304:30;;:9;:30::i;:::-;58196:148:::0;;;:::o;60103:120::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60201:12:::1;60187:11;:26;;;;;;;;;;;;:::i;:::-;;60103:120:::0;:::o;55916:37::-;;;;:::o;59376:93::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59453:6:::1;59445:5;:14;;;;59376:93:::0;:::o;12255:87::-;12301:7;12328:6;;;;;;;;;;;12321:13;;12255:87;:::o;61184:93::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61258:9:::1;61247:8;;:20;;;;;;;;;;;;;;;;;;61184:93:::0;:::o;38846:108::-;38902:13;38937:7;38930:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38846:108;:::o;55658:34::-;;;;:::o;40554:297::-;40667:12;:10;:12::i;:::-;40655:24;;:8;:24;;;40651:54;;;40688:17;;;;;;;;;;;;;;40651:54;40767:8;40722:18;:32;40741:12;:10;:12::i;:::-;40722:32;;;;;;;;;;;;;;;:42;40755:8;40722:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40822:8;40793:48;;40808:12;:10;:12::i;:::-;40793:48;;;40832:8;40793:48;;;;;;:::i;:::-;;;;;;;;40554:297;;:::o;59737:126::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59843:10:::1;59823:17;:30;;;;59737:126:::0;:::o;59481:122::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59580:13:::1;59559:34;;:18;:34;;;;59481:122:::0;:::o;58527:155::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58597:5:::1;58580:14;;:22;;;;;;;;;;;;;;;;;;58629:4;58615:11;;:18;;;;;;;;;;;;;;;;;;58655:17;;;;;;;;;;58527:155::o:0;41718:389::-;41897:28;41907:4;41913:2;41917:7;41897:9;:28::i;:::-;41942:15;:2;:13;;;:15::i;:::-;:76;;;;;41962:56;41993:4;41999:2;42003:7;42012:5;41962:30;:56::i;:::-;41961:57;41942:76;41938:160;;;42044:40;;;;;;;;;;;;;;41938:160;41718:389;;;;:::o;59278:86::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59349:5:::1;59340:6;;:14;;;;;;;;;;;;;;;;;;59278:86:::0;:::o;57618:240::-;56449:6;;;;;;;;;;;56448:7;56440:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1:::1;4799:7;;:19;;4791:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;;;;57707:8:::2;56599:9;56590:5;;56579:8;:16;;;;;;:::i;:::-;:29;56571:38;;;::::0;::::2;;57729:8:::3;56731:9;;56719:8;56703:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;56695:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57744:8:::4;57085:11;;;;;;;;;;;57077:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;57182:15;;57170:8;57142:36;;:13;:25;57156:10;57142:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:55;;57134:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;57796:8:::5;57767:37;;:13;:25;57781:10;57767:25;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;57817:31;57827:10;57839:8;57817:31;;:9;:31::i;:::-;56772:1:::4;56622::::3;4963::::2;4157::::1;5111:7;:22;;;;57618:240:::0;:::o;55709:49::-;;;;;;;;;;;;;;;;;:::o;59110:156::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59180:5:::1;59163:14;;:22;;;;;;;;;;;;;;;;;;59212:5;59198:11;;:19;;;;;;;;;;;;;;;;;;59239:17;;;;;;;;;;59110:156::o:0;62780:405::-;62908:13;62951:16;62959:7;62951;:16::i;:::-;62943:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63011:8;;;;;;;;;;;63006:64;;63045:11;63038:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63006:64;63132:7;63146:18;:7;:16;:18::i;:::-;63115:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63086:89;;62780:405;;;;:::o;60235:112::-;60295:13;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60330:7:::1;60323:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60235:112:::0;:::o;55618:31::-;;;;:::o;40932:168::-;41029:4;41055:18;:25;41074:5;41055:25;;;;;;;;;;;;;;;:35;41081:8;41055:35;;;;;;;;;;;;;;;;;;;;;;;;;41048:42;;40932:168;;;;:::o;57870:314::-;56449:6;;;;;;;;;;;56448:7;56440:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1:::1;4799:7;;:19;;4791:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;;;;57994:8:::2;56599:9;56590:5;;56579:8;:16;;;;;;:::i;:::-;:29;56571:38;;;::::0;::::2;;58016:8:::3;56731:9;;56719:8;56703:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;56695:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58045:11:::4;;57355:165;57394:11;;57355:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57426:17;;57491:10;57474:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57464:39;;;;;;57355:18;:165::i;:::-;57331:251;;;;;;;;;;;;:::i;:::-;;;;;;;;;58066:8:::5;56849:14;;;;;;;;;;;56841:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56955:18;;56943:8;56912:39;;:16;:28;56929:10;56912:28;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:61;;56904:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;58122:8:::6;58090:40;;:16;:28;58107:10;58090:28;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;58143:31;58153:10;58165:8;58143:31;;:9;:31::i;:::-;57595:1:::5;56772::::4;;56622::::3;4963::::2;4157::::1;5111:7;:22;;;;57870:314:::0;;;:::o;13164:201::-;12486:12;:10;:12::i;:::-;12475:23;;:7;:5;:7::i;:::-;:23;;;12467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13273:1:::1;13253:22;;:8;:22;;;;13245:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13329:28;13348:8;13329:18;:28::i;:::-;13164:201:::0;:::o;58770:12::-;;;;;;;;;;;;;;;;;;;;;;;:::o;25039:157::-;25124:4;25163:25;25148:40;;;:11;:40;;;;25141:47;;25039:157;;;:::o;10979:98::-;11032:7;11059:10;11052:17;;10979:98;:::o;42380:178::-;42437:4;42482:7;42463:15;:13;:15::i;:::-;:26;;:53;;;;;42503:13;;42493:7;:23;42463:53;:85;;;;;42521:11;:20;42533:7;42521:20;;;;;;;;;;;:27;;;;;;;;;;;;42520:28;42463:85;42456:92;;42380:178;;;:::o;52088:210::-;52240:2;52213:15;:24;52229:7;52213:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52280:7;52276:2;52260:28;;52269:5;52260:28;;;;;;;;;;;;52088:210;;;:::o;61289:105::-;61354:7;61383:1;61376:8;;61289:105;:::o;45276:1228::-;45343:20;45366:13;;45343:36;;45410:1;45396:16;;:2;:16;;;45392:48;;;45421:19;;;;;;;;;;;;;;45392:48;45469:1;45457:8;:13;45453:44;;;45479:18;;;;;;;;;;;;;;45453:44;45514:61;45544:1;45548:2;45552:12;45566:8;45514:21;:61::i;:::-;45899:8;45864:12;:16;45877:2;45864:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45965:8;45925:12;:16;45938:2;45925:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46028:2;45995:11;:25;46007:12;45995:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;46097:15;46047:11;:25;46059:12;46047:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;46134:20;46157:12;46134:35;;46186:11;46215:8;46200:12;:23;46186:37;;46244:116;46298:14;;;;;;46294:2;46273:40;;46290:1;46273:40;;;;;;;;;;;;46355:3;46339:12;:19;;46244:116;;46396:12;46380:13;:28;;;;45837:585;;46434:60;46463:1;46467:2;46471:12;46485:8;46434:20;:60::i;:::-;45330:1174;45276:1228;;:::o;46782:2226::-;46907:35;46945:21;46958:7;46945:12;:21::i;:::-;46907:59;;47009:4;46987:26;;:13;:18;;;:26;;;46983:67;;47022:28;;;;;;;;;;;;;;46983:67;47067:22;47109:4;47093:20;;:12;:10;:12::i;:::-;:20;;;:75;;;;47132:36;47149:4;47155:12;:10;:12::i;:::-;47132:16;:36::i;:::-;47093:75;:130;;;;47211:12;:10;:12::i;:::-;47187:36;;:20;47199:7;47187:11;:20::i;:::-;:36;;;47093:130;47067:157;;47246:17;47241:66;;47272:35;;;;;;;;;;;;;;47241:66;47338:1;47324:16;;:2;:16;;;47320:52;;;47349:23;;;;;;;;;;;;;;47320:52;47389:43;47411:4;47417:2;47421:7;47430:1;47389:21;:43::i;:::-;47503:35;47520:1;47524:7;47533:4;47503:8;:35::i;:::-;47876:1;47846:12;:18;47859:4;47846:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47922:1;47894:12;:16;47907:2;47894:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47944:31;47978:11;:20;47990:7;47978:20;;;;;;;;;;;47944:54;;48031:2;48015:8;:13;;;:18;;;;;;;;;;;;;;;;;;48083:15;48050:8;:23;;;:49;;;;;;;;;;;;;;;;;;48359:19;48391:1;48381:7;:11;48359:33;;48409:31;48443:11;:24;48455:11;48443:24;;;;;;;;;;;48409:58;;48513:1;48488:27;;:8;:13;;;;;;;;;;;;:27;;;48484:398;;;48704:13;;48689:11;:28;48685:180;;48760:4;48744:8;:13;;;:20;;;;;;;;;;;;;;;;;;48815:13;:28;;;48789:8;:23;;;:54;;;;;;;;;;;;;;;;;;48685:180;48484:398;47819:1076;;;48935:7;48931:2;48916:27;;48925:4;48916:27;;;;;;;;;;;;48956:42;48977:4;48983:2;48987:7;48996:1;48956:20;:42::i;:::-;46894:2114;;46782:2226;;;:::o;37226:1159::-;37288:21;;:::i;:::-;37324:12;37339:7;37324:22;;37413:4;37394:15;:13;:15::i;:::-;:23;;:47;;;;;37428:13;;37421:4;:20;37394:47;37390:922;;;37464:31;37498:11;:17;37510:4;37498:17;;;;;;;;;;;37464:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37541:9;:16;;;37536:759;;37614:1;37588:28;;:9;:14;;;:28;;;37584:105;;37654:9;37647:16;;;;;;37584:105;38001:273;38008:4;38001:273;;;38043:6;;;;;;;;38090:11;:17;38102:4;38090:17;;;;;;;;;;;38078:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38166:1;38140:28;;:9;:14;;;:28;;;38136:113;;38210:9;38203:16;;;;;;38136:113;38001:273;;;37536:759;37443:869;37390:922;38344:31;;;;;;;;;;;;;;37226:1159;;;;:::o;13525:191::-;13599:16;13618:6;;;;;;;;;;;13599:25;;13644:8;13635:6;;:17;;;;;;;;;;;;;;;;;;13699:8;13668:40;;13689:8;13668:40;;;;;;;;;;;;13588:128;13525:191;:::o;42652:108::-;42723:27;42733:2;42737:8;42723:27;;;;;;;;;;;;:9;:27::i;:::-;42652:108;;:::o;14956:326::-;15016:4;15273:1;15251:7;:19;;;:23;15244:30;;14956:326;;;:::o;52812:701::-;52985:4;53024:2;53008:36;;;53045:12;:10;:12::i;:::-;53059:4;53065:7;53074:5;53008:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53004:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53265:1;53248:6;:13;:18;53244:247;;;53296:40;;;;;;;;;;;;;;53244:247;53445:6;53439:13;53430:6;53426:2;53422:15;53415:38;53004:500;53139:45;;;53129:55;;;:6;:55;;;;53122:62;;;52812:701;;;;;;:::o;8541:723::-;8597:13;8827:1;8818:5;:10;8814:53;;;8845:10;;;;;;;;;;;;;;;;;;;;;8814:53;8877:12;8892:5;8877:20;;8908:14;8933:78;8948:1;8940:4;:9;8933:78;;8966:8;;;;;:::i;:::-;;;;8997:2;8989:10;;;;;:::i;:::-;;;8933:78;;;9021:19;9053:6;9043:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:39;;9071:154;9087:1;9078:5;:10;9071:154;;9115:1;9105:11;;;;;:::i;:::-;;;9182:2;9174:5;:10;;;;:::i;:::-;9161:2;:24;;;;:::i;:::-;9148:39;;9131:6;9138;9131:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9211:2;9202:11;;;;;:::i;:::-;;;9071:154;;;9249:6;9235:21;;;;;8541:723;;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;1065:40;;923:190;;;;;:::o;54195:169::-;;;;;:::o;55059:168::-;;;;;:::o;43160:1833::-;43293:20;43316:13;;43293:36;;43360:1;43346:16;;:2;:16;;;43342:48;;;43371:19;;;;;;;;;;;;;;43342:48;43419:1;43407:8;:13;43403:44;;;43429:18;;;;;;;;;;;;;;43403:44;43464:61;43494:1;43498:2;43502:12;43516:8;43464:21;:61::i;:::-;43849:8;43814:12;:16;43827:2;43814:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43915:8;43875:12;:16;43888:2;43875:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43978:2;43945:11;:25;43957:12;43945:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44047:15;43997:11;:25;44009:12;43997:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44084:20;44107:12;44084:35;;44136:11;44165:8;44150:12;:23;44136:37;;44198:15;:2;:13;;;:15::i;:::-;44194:659;;;44236:324;44294:12;44290:2;44269:38;;44286:1;44269:38;;;;;;;;;;;;44337:69;44376:1;44380:2;44384:14;;;;;;44400:5;44337:30;:69::i;:::-;44332:178;;44444:40;;;;;;;;;;;;;;44332:178;44555:3;44539:12;:19;;44236:324;;44645:12;44628:13;;:29;44624:43;;44659:8;;;44624:43;44194:659;;;44712:124;44770:14;;;;;;44766:2;44745:40;;44762:1;44745:40;;;;;;;;;;;;44831:3;44815:12;:19;;44712:124;;44194:659;44885:12;44869:13;:28;;;;43787:1124;;44923:60;44952:1;44956:2;44960:12;44974:8;44923:20;:60::i;:::-;43280:1713;43160:1833;;;:::o;1475:675::-;1558:7;1578:20;1601:4;1578:27;;1621:9;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;1867:42;1882:12;1896;1867:14;:42::i;:::-;1852:57;;1720:382;;;2044:42;2059:12;2073;2044:14;:42::i;:::-;2029:57;;1720:382;1659:454;1654:3;;;;;:::i;:::-;;;;1616:497;;;;2130:12;2123:19;;;1475:675;;;;:::o;2158:224::-;2226:13;2289:1;2283:4;2276:15;2318:1;2312:4;2305:15;2359:4;2353;2343:21;2334:30;;2158:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;38:782:1:-;154:5;179:101;195:84;272:6;195:84;:::i;:::-;179:101;:::i;:::-;170:110;;300:5;329:6;322:5;315:21;363:4;356:5;352:16;345:23;;389:6;439:3;431:4;423:6;419:17;414:3;410:27;407:36;404:143;;;458:79;;:::i;:::-;404:143;571:1;556:258;581:6;578:1;575:13;556:258;;;649:3;678:57;731:3;719:10;678:57;:::i;:::-;673:3;666:70;765:4;760:3;756:14;749:21;;799:4;794:3;790:14;783:21;;616:198;603:1;600;596:9;591:14;;556:258;;;560:14;160:660;;38:782;;;;;:::o;826:410::-;903:5;928:65;944:48;985:6;944:48;:::i;:::-;928:65;:::i;:::-;919:74;;1016:6;1009:5;1002:21;1054:4;1047:5;1043:16;1092:3;1083:6;1078:3;1074:16;1071:25;1068:112;;;1099:79;;:::i;:::-;1068:112;1189:41;1223:6;1218:3;1213;1189:41;:::i;:::-;909:327;826:410;;;;;:::o;1242:412::-;1320:5;1345:66;1361:49;1403:6;1361:49;:::i;:::-;1345:66;:::i;:::-;1336:75;;1434:6;1427:5;1420:21;1472:4;1465:5;1461:16;1510:3;1501:6;1496:3;1492:16;1489:25;1486:112;;;1517:79;;:::i;:::-;1486:112;1607:41;1641:6;1636:3;1631;1607:41;:::i;:::-;1326:328;1242:412;;;;;:::o;1660:139::-;1706:5;1744:6;1731:20;1722:29;;1760:33;1787:5;1760:33;:::i;:::-;1660:139;;;;:::o;1822:568::-;1895:8;1905:6;1955:3;1948:4;1940:6;1936:17;1932:27;1922:122;;1963:79;;:::i;:::-;1922:122;2076:6;2063:20;2053:30;;2106:18;2098:6;2095:30;2092:117;;;2128:79;;:::i;:::-;2092:117;2242:4;2234:6;2230:17;2218:29;;2296:3;2288:4;2280:6;2276:17;2266:8;2262:32;2259:41;2256:128;;;2303:79;;:::i;:::-;2256:128;1822:568;;;;;:::o;2427:410::-;2518:5;2567:3;2560:4;2552:6;2548:17;2544:27;2534:122;;2575:79;;:::i;:::-;2534:122;2692:6;2679:20;2717:114;2827:3;2819:6;2812:4;2804:6;2800:17;2717:114;:::i;:::-;2708:123;;2524:313;2427:410;;;;:::o;2843:133::-;2886:5;2924:6;2911:20;2902:29;;2940:30;2964:5;2940:30;:::i;:::-;2843:133;;;;:::o;2982:139::-;3028:5;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;2982:139;;;;:::o;3127:137::-;3172:5;3210:6;3197:20;3188:29;;3226:32;3252:5;3226:32;:::i;:::-;3127:137;;;;:::o;3270:141::-;3326:5;3357:6;3351:13;3342:22;;3373:32;3399:5;3373:32;:::i;:::-;3270:141;;;;:::o;3430:338::-;3485:5;3534:3;3527:4;3519:6;3515:17;3511:27;3501:122;;3542:79;;:::i;:::-;3501:122;3659:6;3646:20;3684:78;3758:3;3750:6;3743:4;3735:6;3731:17;3684:78;:::i;:::-;3675:87;;3491:277;3430:338;;;;:::o;3788:340::-;3844:5;3893:3;3886:4;3878:6;3874:17;3870:27;3860:122;;3901:79;;:::i;:::-;3860:122;4018:6;4005:20;4043:79;4118:3;4110:6;4103:4;4095:6;4091:17;4043:79;:::i;:::-;4034:88;;3850:278;3788:340;;;;:::o;4163:563::-;4232:5;4276:4;4264:9;4259:3;4255:19;4251:30;4248:117;;;4284:79;;:::i;:::-;4248:117;4383:21;4399:4;4383:21;:::i;:::-;4374:30;;4460:1;4500:49;4545:3;4536:6;4525:9;4521:22;4500:49;:::i;:::-;4493:4;4486:5;4482:16;4475:75;4414:147;4617:2;4658:49;4703:3;4694:6;4683:9;4679:22;4658:49;:::i;:::-;4651:4;4644:5;4640:16;4633:75;4571:148;4163:563;;;;:::o;4732:139::-;4778:5;4816:6;4803:20;4794:29;;4832:33;4859:5;4832:33;:::i;:::-;4732:139;;;;:::o;4877:135::-;4921:5;4959:6;4946:20;4937:29;;4975:31;5000:5;4975:31;:::i;:::-;4877:135;;;;:::o;5018:329::-;5077:6;5126:2;5114:9;5105:7;5101:23;5097:32;5094:119;;;5132:79;;:::i;:::-;5094:119;5252:1;5277:53;5322:7;5313:6;5302:9;5298:22;5277:53;:::i;:::-;5267:63;;5223:117;5018:329;;;;:::o;5353:474::-;5421:6;5429;5478:2;5466:9;5457:7;5453:23;5449:32;5446:119;;;5484:79;;:::i;:::-;5446:119;5604:1;5629:53;5674:7;5665:6;5654:9;5650:22;5629:53;:::i;:::-;5619:63;;5575:117;5731:2;5757:53;5802:7;5793:6;5782:9;5778:22;5757:53;:::i;:::-;5747:63;;5702:118;5353:474;;;;;:::o;5833:619::-;5910:6;5918;5926;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;6228:2;6254:53;6299:7;6290:6;6279:9;6275:22;6254:53;:::i;:::-;6244:63;;6199:118;6356:2;6382:53;6427:7;6418:6;6407:9;6403:22;6382:53;:::i;:::-;6372:63;;6327:118;5833:619;;;;;:::o;6458:943::-;6553:6;6561;6569;6577;6626:3;6614:9;6605:7;6601:23;6597:33;6594:120;;;6633:79;;:::i;:::-;6594:120;6753:1;6778:53;6823:7;6814:6;6803:9;6799:22;6778:53;:::i;:::-;6768:63;;6724:117;6880:2;6906:53;6951:7;6942:6;6931:9;6927:22;6906:53;:::i;:::-;6896:63;;6851:118;7008:2;7034:53;7079:7;7070:6;7059:9;7055:22;7034:53;:::i;:::-;7024:63;;6979:118;7164:2;7153:9;7149:18;7136:32;7195:18;7187:6;7184:30;7181:117;;;7217:79;;:::i;:::-;7181:117;7322:62;7376:7;7367:6;7356:9;7352:22;7322:62;:::i;:::-;7312:72;;7107:287;6458:943;;;;;;;:::o;7407:468::-;7472:6;7480;7529:2;7517:9;7508:7;7504:23;7500:32;7497:119;;;7535:79;;:::i;:::-;7497:119;7655:1;7680:53;7725:7;7716:6;7705:9;7701:22;7680:53;:::i;:::-;7670:63;;7626:117;7782:2;7808:50;7850:7;7841:6;7830:9;7826:22;7808:50;:::i;:::-;7798:60;;7753:115;7407:468;;;;;:::o;7881:474::-;7949:6;7957;8006:2;7994:9;7985:7;7981:23;7977:32;7974:119;;;8012:79;;:::i;:::-;7974:119;8132:1;8157:53;8202:7;8193:6;8182:9;8178:22;8157:53;:::i;:::-;8147:63;;8103:117;8259:2;8285:53;8330:7;8321:6;8310:9;8306:22;8285:53;:::i;:::-;8275:63;;8230:118;7881:474;;;;;:::o;8361:579::-;8465:6;8514:2;8502:9;8493:7;8489:23;8485:32;8482:119;;;8520:79;;:::i;:::-;8482:119;8668:1;8657:9;8653:17;8640:31;8698:18;8690:6;8687:30;8684:117;;;8720:79;;:::i;:::-;8684:117;8825:98;8915:7;8906:6;8895:9;8891:22;8825:98;:::i;:::-;8815:108;;8611:322;8361:579;;;;:::o;8946:323::-;9002:6;9051:2;9039:9;9030:7;9026:23;9022:32;9019:119;;;9057:79;;:::i;:::-;9019:119;9177:1;9202:50;9244:7;9235:6;9224:9;9220:22;9202:50;:::i;:::-;9192:60;;9148:114;8946:323;;;;:::o;9275:329::-;9334:6;9383:2;9371:9;9362:7;9358:23;9354:32;9351:119;;;9389:79;;:::i;:::-;9351:119;9509:1;9534:53;9579:7;9570:6;9559:9;9555:22;9534:53;:::i;:::-;9524:63;;9480:117;9275:329;;;;:::o;9610:327::-;9668:6;9717:2;9705:9;9696:7;9692:23;9688:32;9685:119;;;9723:79;;:::i;:::-;9685:119;9843:1;9868:52;9912:7;9903:6;9892:9;9888:22;9868:52;:::i;:::-;9858:62;;9814:116;9610:327;;;;:::o;9943:349::-;10012:6;10061:2;10049:9;10040:7;10036:23;10032:32;10029:119;;;10067:79;;:::i;:::-;10029:119;10187:1;10212:63;10267:7;10258:6;10247:9;10243:22;10212:63;:::i;:::-;10202:73;;10158:127;9943:349;;;;:::o;10298:509::-;10367:6;10416:2;10404:9;10395:7;10391:23;10387:32;10384:119;;;10422:79;;:::i;:::-;10384:119;10570:1;10559:9;10555:17;10542:31;10600:18;10592:6;10589:30;10586:117;;;10622:79;;:::i;:::-;10586:117;10727:63;10782:7;10773:6;10762:9;10758:22;10727:63;:::i;:::-;10717:73;;10513:287;10298:509;;;;:::o;10813:329::-;10872:6;10921:2;10909:9;10900:7;10896:23;10892:32;10889:119;;;10927:79;;:::i;:::-;10889:119;11047:1;11072:53;11117:7;11108:6;11097:9;11093:22;11072:53;:::i;:::-;11062:63;;11018:117;10813:329;;;;:::o;11148:325::-;11205:6;11254:2;11242:9;11233:7;11229:23;11225:32;11222:119;;;11260:79;;:::i;:::-;11222:119;11380:1;11405:51;11448:7;11439:6;11428:9;11424:22;11405:51;:::i;:::-;11395:61;;11351:115;11148:325;;;;:::o;11479:470::-;11545:6;11553;11602:2;11590:9;11581:7;11577:23;11573:32;11570:119;;;11608:79;;:::i;:::-;11570:119;11728:1;11753:51;11796:7;11787:6;11776:9;11772:22;11753:51;:::i;:::-;11743:61;;11699:115;11853:2;11879:53;11924:7;11915:6;11904:9;11900:22;11879:53;:::i;:::-;11869:63;;11824:118;11479:470;;;;;:::o;11955:700::-;12048:6;12056;12064;12113:2;12101:9;12092:7;12088:23;12084:32;12081:119;;;12119:79;;:::i;:::-;12081:119;12239:1;12264:51;12307:7;12298:6;12287:9;12283:22;12264:51;:::i;:::-;12254:61;;12210:115;12392:2;12381:9;12377:18;12364:32;12423:18;12415:6;12412:30;12409:117;;;12445:79;;:::i;:::-;12409:117;12558:80;12630:7;12621:6;12610:9;12606:22;12558:80;:::i;:::-;12540:98;;;;12335:313;11955:700;;;;;:::o;12661:179::-;12730:10;12751:46;12793:3;12785:6;12751:46;:::i;:::-;12829:4;12824:3;12820:14;12806:28;;12661:179;;;;:::o;12846:118::-;12933:24;12951:5;12933:24;:::i;:::-;12928:3;12921:37;12846:118;;:::o;12970:157::-;13075:45;13095:24;13113:5;13095:24;:::i;:::-;13075:45;:::i;:::-;13070:3;13063:58;12970:157;;:::o;13163:732::-;13282:3;13311:54;13359:5;13311:54;:::i;:::-;13381:86;13460:6;13455:3;13381:86;:::i;:::-;13374:93;;13491:56;13541:5;13491:56;:::i;:::-;13570:7;13601:1;13586:284;13611:6;13608:1;13605:13;13586:284;;;13687:6;13681:13;13714:63;13773:3;13758:13;13714:63;:::i;:::-;13707:70;;13800:60;13853:6;13800:60;:::i;:::-;13790:70;;13646:224;13633:1;13630;13626:9;13621:14;;13586:284;;;13590:14;13886:3;13879:10;;13287:608;;;13163:732;;;;:::o;13901:109::-;13982:21;13997:5;13982:21;:::i;:::-;13977:3;13970:34;13901:109;;:::o;14016:118::-;14103:24;14121:5;14103:24;:::i;:::-;14098:3;14091:37;14016:118;;:::o;14140:360::-;14226:3;14254:38;14286:5;14254:38;:::i;:::-;14308:70;14371:6;14366:3;14308:70;:::i;:::-;14301:77;;14387:52;14432:6;14427:3;14420:4;14413:5;14409:16;14387:52;:::i;:::-;14464:29;14486:6;14464:29;:::i;:::-;14459:3;14455:39;14448:46;;14230:270;14140:360;;;;:::o;14506:364::-;14594:3;14622:39;14655:5;14622:39;:::i;:::-;14677:71;14741:6;14736:3;14677:71;:::i;:::-;14670:78;;14757:52;14802:6;14797:3;14790:4;14783:5;14779:16;14757:52;:::i;:::-;14834:29;14856:6;14834:29;:::i;:::-;14829:3;14825:39;14818:46;;14598:272;14506:364;;;;:::o;14876:377::-;14982:3;15010:39;15043:5;15010:39;:::i;:::-;15065:89;15147:6;15142:3;15065:89;:::i;:::-;15058:96;;15163:52;15208:6;15203:3;15196:4;15189:5;15185:16;15163:52;:::i;:::-;15240:6;15235:3;15231:16;15224:23;;14986:267;14876:377;;;;:::o;15283:845::-;15386:3;15423:5;15417:12;15452:36;15478:9;15452:36;:::i;:::-;15504:89;15586:6;15581:3;15504:89;:::i;:::-;15497:96;;15624:1;15613:9;15609:17;15640:1;15635:137;;;;15786:1;15781:341;;;;15602:520;;15635:137;15719:4;15715:9;15704;15700:25;15695:3;15688:38;15755:6;15750:3;15746:16;15739:23;;15635:137;;15781:341;15848:38;15880:5;15848:38;:::i;:::-;15908:1;15922:154;15936:6;15933:1;15930:13;15922:154;;;16010:7;16004:14;16000:1;15995:3;15991:11;15984:35;16060:1;16051:7;16047:15;16036:26;;15958:4;15955:1;15951:12;15946:17;;15922:154;;;16105:6;16100:3;16096:16;16089:23;;15788:334;;15602:520;;15390:738;;15283:845;;;;:::o;16134:366::-;16276:3;16297:67;16361:2;16356:3;16297:67;:::i;:::-;16290:74;;16373:93;16462:3;16373:93;:::i;:::-;16491:2;16486:3;16482:12;16475:19;;16134:366;;;:::o;16506:::-;16648:3;16669:67;16733:2;16728:3;16669:67;:::i;:::-;16662:74;;16745:93;16834:3;16745:93;:::i;:::-;16863:2;16858:3;16854:12;16847:19;;16506:366;;;:::o;16878:::-;17020:3;17041:67;17105:2;17100:3;17041:67;:::i;:::-;17034:74;;17117:93;17206:3;17117:93;:::i;:::-;17235:2;17230:3;17226:12;17219:19;;16878:366;;;:::o;17250:::-;17392:3;17413:67;17477:2;17472:3;17413:67;:::i;:::-;17406:74;;17489:93;17578:3;17489:93;:::i;:::-;17607:2;17602:3;17598:12;17591:19;;17250:366;;;:::o;17622:::-;17764:3;17785:67;17849:2;17844:3;17785:67;:::i;:::-;17778:74;;17861:93;17950:3;17861:93;:::i;:::-;17979:2;17974:3;17970:12;17963:19;;17622:366;;;:::o;17994:::-;18136:3;18157:67;18221:2;18216:3;18157:67;:::i;:::-;18150:74;;18233:93;18322:3;18233:93;:::i;:::-;18351:2;18346:3;18342:12;18335:19;;17994:366;;;:::o;18366:::-;18508:3;18529:67;18593:2;18588:3;18529:67;:::i;:::-;18522:74;;18605:93;18694:3;18605:93;:::i;:::-;18723:2;18718:3;18714:12;18707:19;;18366:366;;;:::o;18738:400::-;18898:3;18919:84;19001:1;18996:3;18919:84;:::i;:::-;18912:91;;19012:93;19101:3;19012:93;:::i;:::-;19130:1;19125:3;19121:11;19114:18;;18738:400;;;:::o;19144:366::-;19286:3;19307:67;19371:2;19366:3;19307:67;:::i;:::-;19300:74;;19383:93;19472:3;19383:93;:::i;:::-;19501:2;19496:3;19492:12;19485:19;;19144:366;;;:::o;19516:::-;19658:3;19679:67;19743:2;19738:3;19679:67;:::i;:::-;19672:74;;19755:93;19844:3;19755:93;:::i;:::-;19873:2;19868:3;19864:12;19857:19;;19516:366;;;:::o;19888:398::-;20047:3;20068:83;20149:1;20144:3;20068:83;:::i;:::-;20061:90;;20160:93;20249:3;20160:93;:::i;:::-;20278:1;20273:3;20269:11;20262:18;;19888:398;;;:::o;20292:366::-;20434:3;20455:67;20519:2;20514:3;20455:67;:::i;:::-;20448:74;;20531:93;20620:3;20531:93;:::i;:::-;20649:2;20644:3;20640:12;20633:19;;20292:366;;;:::o;20664:::-;20806:3;20827:67;20891:2;20886:3;20827:67;:::i;:::-;20820:74;;20903:93;20992:3;20903:93;:::i;:::-;21021:2;21016:3;21012:12;21005:19;;20664:366;;;:::o;21036:::-;21178:3;21199:67;21263:2;21258:3;21199:67;:::i;:::-;21192:74;;21275:93;21364:3;21275:93;:::i;:::-;21393:2;21388:3;21384:12;21377:19;;21036:366;;;:::o;21408:400::-;21568:3;21589:84;21671:1;21666:3;21589:84;:::i;:::-;21582:91;;21682:93;21771:3;21682:93;:::i;:::-;21800:1;21795:3;21791:11;21784:18;;21408:400;;;:::o;21814:108::-;21891:24;21909:5;21891:24;:::i;:::-;21886:3;21879:37;21814:108;;:::o;21928:118::-;22015:24;22033:5;22015:24;:::i;:::-;22010:3;22003:37;21928:118;;:::o;22052:256::-;22164:3;22179:75;22250:3;22241:6;22179:75;:::i;:::-;22279:2;22274:3;22270:12;22263:19;;22299:3;22292:10;;22052:256;;;;:::o;22314:961::-;22693:3;22715:92;22803:3;22794:6;22715:92;:::i;:::-;22708:99;;22824:148;22968:3;22824:148;:::i;:::-;22817:155;;22989:95;23080:3;23071:6;22989:95;:::i;:::-;22982:102;;23101:148;23245:3;23101:148;:::i;:::-;23094:155;;23266:3;23259:10;;22314:961;;;;;:::o;23281:379::-;23465:3;23487:147;23630:3;23487:147;:::i;:::-;23480:154;;23651:3;23644:10;;23281:379;;;:::o;23666:222::-;23759:4;23797:2;23786:9;23782:18;23774:26;;23810:71;23878:1;23867:9;23863:17;23854:6;23810:71;:::i;:::-;23666:222;;;;:::o;23894:640::-;24089:4;24127:3;24116:9;24112:19;24104:27;;24141:71;24209:1;24198:9;24194:17;24185:6;24141:71;:::i;:::-;24222:72;24290:2;24279:9;24275:18;24266:6;24222:72;:::i;:::-;24304;24372:2;24361:9;24357:18;24348:6;24304:72;:::i;:::-;24423:9;24417:4;24413:20;24408:2;24397:9;24393:18;24386:48;24451:76;24522:4;24513:6;24451:76;:::i;:::-;24443:84;;23894:640;;;;;;;:::o;24540:332::-;24661:4;24699:2;24688:9;24684:18;24676:26;;24712:71;24780:1;24769:9;24765:17;24756:6;24712:71;:::i;:::-;24793:72;24861:2;24850:9;24846:18;24837:6;24793:72;:::i;:::-;24540:332;;;;;:::o;24878:373::-;25021:4;25059:2;25048:9;25044:18;25036:26;;25108:9;25102:4;25098:20;25094:1;25083:9;25079:17;25072:47;25136:108;25239:4;25230:6;25136:108;:::i;:::-;25128:116;;24878:373;;;;:::o;25257:210::-;25344:4;25382:2;25371:9;25367:18;25359:26;;25395:65;25457:1;25446:9;25442:17;25433:6;25395:65;:::i;:::-;25257:210;;;;:::o;25473:222::-;25566:4;25604:2;25593:9;25589:18;25581:26;;25617:71;25685:1;25674:9;25670:17;25661:6;25617:71;:::i;:::-;25473:222;;;;:::o;25701:313::-;25814:4;25852:2;25841:9;25837:18;25829:26;;25901:9;25895:4;25891:20;25887:1;25876:9;25872:17;25865:47;25929:78;26002:4;25993:6;25929:78;:::i;:::-;25921:86;;25701:313;;;;:::o;26020:419::-;26186:4;26224:2;26213:9;26209:18;26201:26;;26273:9;26267:4;26263:20;26259:1;26248:9;26244:17;26237:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26020:419;;;:::o;26445:::-;26611:4;26649:2;26638:9;26634:18;26626:26;;26698:9;26692:4;26688:20;26684:1;26673:9;26669:17;26662:47;26726:131;26852:4;26726:131;:::i;:::-;26718:139;;26445:419;;;:::o;26870:::-;27036:4;27074:2;27063:9;27059:18;27051:26;;27123:9;27117:4;27113:20;27109:1;27098:9;27094:17;27087:47;27151:131;27277:4;27151:131;:::i;:::-;27143:139;;26870:419;;;:::o;27295:::-;27461:4;27499:2;27488:9;27484:18;27476:26;;27548:9;27542:4;27538:20;27534:1;27523:9;27519:17;27512:47;27576:131;27702:4;27576:131;:::i;:::-;27568:139;;27295:419;;;:::o;27720:::-;27886:4;27924:2;27913:9;27909:18;27901:26;;27973:9;27967:4;27963:20;27959:1;27948:9;27944:17;27937:47;28001:131;28127:4;28001:131;:::i;:::-;27993:139;;27720:419;;;:::o;28145:::-;28311:4;28349:2;28338:9;28334:18;28326:26;;28398:9;28392:4;28388:20;28384:1;28373:9;28369:17;28362:47;28426:131;28552:4;28426:131;:::i;:::-;28418:139;;28145:419;;;:::o;28570:::-;28736:4;28774:2;28763:9;28759:18;28751:26;;28823:9;28817:4;28813:20;28809:1;28798:9;28794:17;28787:47;28851:131;28977:4;28851:131;:::i;:::-;28843:139;;28570:419;;;:::o;28995:::-;29161:4;29199:2;29188:9;29184:18;29176:26;;29248:9;29242:4;29238:20;29234:1;29223:9;29219:17;29212:47;29276:131;29402:4;29276:131;:::i;:::-;29268:139;;28995:419;;;:::o;29420:::-;29586:4;29624:2;29613:9;29609:18;29601:26;;29673:9;29667:4;29663:20;29659:1;29648:9;29644:17;29637:47;29701:131;29827:4;29701:131;:::i;:::-;29693:139;;29420:419;;;:::o;29845:::-;30011:4;30049:2;30038:9;30034:18;30026:26;;30098:9;30092:4;30088:20;30084:1;30073:9;30069:17;30062:47;30126:131;30252:4;30126:131;:::i;:::-;30118:139;;29845:419;;;:::o;30270:::-;30436:4;30474:2;30463:9;30459:18;30451:26;;30523:9;30517:4;30513:20;30509:1;30498:9;30494:17;30487:47;30551:131;30677:4;30551:131;:::i;:::-;30543:139;;30270:419;;;:::o;30695:::-;30861:4;30899:2;30888:9;30884:18;30876:26;;30948:9;30942:4;30938:20;30934:1;30923:9;30919:17;30912:47;30976:131;31102:4;30976:131;:::i;:::-;30968:139;;30695:419;;;:::o;31120:222::-;31213:4;31251:2;31240:9;31236:18;31228:26;;31264:71;31332:1;31321:9;31317:17;31308:6;31264:71;:::i;:::-;31120:222;;;;:::o;31348:129::-;31382:6;31409:20;;:::i;:::-;31399:30;;31438:33;31466:4;31458:6;31438:33;:::i;:::-;31348:129;;;:::o;31483:75::-;31516:6;31549:2;31543:9;31533:19;;31483:75;:::o;31564:331::-;31661:4;31751:18;31743:6;31740:30;31737:56;;;31773:18;;:::i;:::-;31737:56;31823:4;31815:6;31811:17;31803:25;;31883:4;31877;31873:15;31865:23;;31564:331;;;:::o;31901:307::-;31962:4;32052:18;32044:6;32041:30;32038:56;;;32074:18;;:::i;:::-;32038:56;32112:29;32134:6;32112:29;:::i;:::-;32104:37;;32196:4;32190;32186:15;32178:23;;31901:307;;;:::o;32214:308::-;32276:4;32366:18;32358:6;32355:30;32352:56;;;32388:18;;:::i;:::-;32352:56;32426:29;32448:6;32426:29;:::i;:::-;32418:37;;32510:4;32504;32500:15;32492:23;;32214:308;;;:::o;32528:132::-;32595:4;32618:3;32610:11;;32648:4;32643:3;32639:14;32631:22;;32528:132;;;:::o;32666:141::-;32715:4;32738:3;32730:11;;32761:3;32758:1;32751:14;32795:4;32792:1;32782:18;32774:26;;32666:141;;;:::o;32813:114::-;32880:6;32914:5;32908:12;32898:22;;32813:114;;;:::o;32933:98::-;32984:6;33018:5;33012:12;33002:22;;32933:98;;;:::o;33037:99::-;33089:6;33123:5;33117:12;33107:22;;33037:99;;;:::o;33142:113::-;33212:4;33244;33239:3;33235:14;33227:22;;33142:113;;;:::o;33261:184::-;33360:11;33394:6;33389:3;33382:19;33434:4;33429:3;33425:14;33410:29;;33261:184;;;;:::o;33451:168::-;33534:11;33568:6;33563:3;33556:19;33608:4;33603:3;33599:14;33584:29;;33451:168;;;;:::o;33625:147::-;33726:11;33763:3;33748:18;;33625:147;;;;:::o;33778:169::-;33862:11;33896:6;33891:3;33884:19;33936:4;33931:3;33927:14;33912:29;;33778:169;;;;:::o;33953:148::-;34055:11;34092:3;34077:18;;33953:148;;;;:::o;34107:305::-;34147:3;34166:20;34184:1;34166:20;:::i;:::-;34161:25;;34200:20;34218:1;34200:20;:::i;:::-;34195:25;;34354:1;34286:66;34282:74;34279:1;34276:81;34273:107;;;34360:18;;:::i;:::-;34273:107;34404:1;34401;34397:9;34390:16;;34107:305;;;;:::o;34418:185::-;34458:1;34475:20;34493:1;34475:20;:::i;:::-;34470:25;;34509:20;34527:1;34509:20;:::i;:::-;34504:25;;34548:1;34538:35;;34553:18;;:::i;:::-;34538:35;34595:1;34592;34588:9;34583:14;;34418:185;;;;:::o;34609:348::-;34649:7;34672:20;34690:1;34672:20;:::i;:::-;34667:25;;34706:20;34724:1;34706:20;:::i;:::-;34701:25;;34894:1;34826:66;34822:74;34819:1;34816:81;34811:1;34804:9;34797:17;34793:105;34790:131;;;34901:18;;:::i;:::-;34790:131;34949:1;34946;34942:9;34931:20;;34609:348;;;;:::o;34963:191::-;35003:4;35023:20;35041:1;35023:20;:::i;:::-;35018:25;;35057:20;35075:1;35057:20;:::i;:::-;35052:25;;35096:1;35093;35090:8;35087:34;;;35101:18;;:::i;:::-;35087:34;35146:1;35143;35139:9;35131:17;;34963:191;;;;:::o;35160:96::-;35197:7;35226:24;35244:5;35226:24;:::i;:::-;35215:35;;35160:96;;;:::o;35262:90::-;35296:7;35339:5;35332:13;35325:21;35314:32;;35262:90;;;:::o;35358:77::-;35395:7;35424:5;35413:16;;35358:77;;;:::o;35441:149::-;35477:7;35517:66;35510:5;35506:78;35495:89;;35441:149;;;:::o;35596:126::-;35633:7;35673:42;35666:5;35662:54;35651:65;;35596:126;;;:::o;35728:77::-;35765:7;35794:5;35783:16;;35728:77;;;:::o;35811:86::-;35846:7;35886:4;35879:5;35875:16;35864:27;;35811:86;;;:::o;35903:154::-;35987:6;35982:3;35977;35964:30;36049:1;36040:6;36035:3;36031:16;36024:27;35903:154;;;:::o;36063:307::-;36131:1;36141:113;36155:6;36152:1;36149:13;36141:113;;;36240:1;36235:3;36231:11;36225:18;36221:1;36216:3;36212:11;36205:39;36177:2;36174:1;36170:10;36165:15;;36141:113;;;36272:6;36269:1;36266:13;36263:101;;;36352:1;36343:6;36338:3;36334:16;36327:27;36263:101;36112:258;36063:307;;;:::o;36376:320::-;36420:6;36457:1;36451:4;36447:12;36437:22;;36504:1;36498:4;36494:12;36525:18;36515:81;;36581:4;36573:6;36569:17;36559:27;;36515:81;36643:2;36635:6;36632:14;36612:18;36609:38;36606:84;;;36662:18;;:::i;:::-;36606:84;36427:269;36376:320;;;:::o;36702:281::-;36785:27;36807:4;36785:27;:::i;:::-;36777:6;36773:40;36915:6;36903:10;36900:22;36879:18;36867:10;36864:34;36861:62;36858:88;;;36926:18;;:::i;:::-;36858:88;36966:10;36962:2;36955:22;36745:238;36702:281;;:::o;36989:233::-;37028:3;37051:24;37069:5;37051:24;:::i;:::-;37042:33;;37097:66;37090:5;37087:77;37084:103;;;37167:18;;:::i;:::-;37084:103;37214:1;37207:5;37203:13;37196:20;;36989:233;;;:::o;37228:100::-;37267:7;37296:26;37316:5;37296:26;:::i;:::-;37285:37;;37228:100;;;:::o;37334:94::-;37373:7;37402:20;37416:5;37402:20;:::i;:::-;37391:31;;37334:94;;;:::o;37434:176::-;37466:1;37483:20;37501:1;37483:20;:::i;:::-;37478:25;;37517:20;37535:1;37517:20;:::i;:::-;37512:25;;37556:1;37546:35;;37561:18;;:::i;:::-;37546:35;37602:1;37599;37595:9;37590:14;;37434:176;;;;:::o;37616:180::-;37664:77;37661:1;37654:88;37761:4;37758:1;37751:15;37785:4;37782:1;37775:15;37802:180;37850:77;37847:1;37840:88;37947:4;37944:1;37937:15;37971:4;37968:1;37961:15;37988:180;38036:77;38033:1;38026:88;38133:4;38130:1;38123:15;38157:4;38154:1;38147:15;38174:180;38222:77;38219:1;38212:88;38319:4;38316:1;38309:15;38343:4;38340:1;38333:15;38360:180;38408:77;38405:1;38398:88;38505:4;38502:1;38495:15;38529:4;38526:1;38519:15;38546:117;38655:1;38652;38645:12;38669:117;38778:1;38775;38768:12;38792:117;38901:1;38898;38891:12;39038:117;39147:1;39144;39137:12;39161:117;39270:1;39267;39260:12;39284:117;39393:1;39390;39383:12;39407:117;39516:1;39513;39506:12;39530:102;39571:6;39622:2;39618:7;39613:2;39606:5;39602:14;39598:28;39588:38;;39530:102;;;:::o;39638:94::-;39671:8;39719:5;39715:2;39711:14;39690:35;;39638:94;;;:::o;39738:170::-;39878:22;39874:1;39866:6;39862:14;39855:46;39738:170;:::o;39914:225::-;40054:34;40050:1;40042:6;40038:14;40031:58;40123:8;40118:2;40110:6;40106:15;40099:33;39914:225;:::o;40145:170::-;40285:22;40281:1;40273:6;40269:14;40262:46;40145:170;:::o;40321:164::-;40461:16;40457:1;40449:6;40445:14;40438:40;40321:164;:::o;40491:174::-;40631:26;40627:1;40619:6;40615:14;40608:50;40491:174;:::o;40671:180::-;40811:32;40807:1;40799:6;40795:14;40788:56;40671:180;:::o;40857:167::-;40997:19;40993:1;40985:6;40981:14;40974:43;40857:167;:::o;41030:155::-;41170:7;41166:1;41158:6;41154:14;41147:31;41030:155;:::o;41191:182::-;41331:34;41327:1;41319:6;41315:14;41308:58;41191:182;:::o;41379:173::-;41519:25;41515:1;41507:6;41503:14;41496:49;41379:173;:::o;41558:114::-;;:::o;41678:170::-;41818:22;41814:1;41806:6;41802:14;41795:46;41678:170;:::o;41854:168::-;41994:20;41990:1;41982:6;41978:14;41971:44;41854:168;:::o;42028:181::-;42168:33;42164:1;42156:6;42152:14;42145:57;42028:181;:::o;42215:151::-;42355:3;42351:1;42343:6;42339:14;42332:27;42215:151;:::o;42372:122::-;42445:24;42463:5;42445:24;:::i;:::-;42438:5;42435:35;42425:63;;42484:1;42481;42474:12;42425:63;42372:122;:::o;42500:116::-;42570:21;42585:5;42570:21;:::i;:::-;42563:5;42560:32;42550:60;;42606:1;42603;42596:12;42550:60;42500:116;:::o;42622:122::-;42695:24;42713:5;42695:24;:::i;:::-;42688:5;42685:35;42675:63;;42734:1;42731;42724:12;42675:63;42622:122;:::o;42750:120::-;42822:23;42839:5;42822:23;:::i;:::-;42815:5;42812:34;42802:62;;42860:1;42857;42850:12;42802:62;42750:120;:::o;42876:122::-;42949:24;42967:5;42949:24;:::i;:::-;42942:5;42939:35;42929:63;;42988:1;42985;42978:12;42929:63;42876:122;:::o;43004:118::-;43075:22;43091:5;43075:22;:::i;:::-;43068:5;43065:33;43055:61;;43112:1;43109;43102:12;43055:61;43004:118;:::o

Swarm Source

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