ETH Price: $3,258.58 (-0.30%)
Gas: 2 Gwei

Token

87Ronin (87RONIN)
 

Overview

Max Total Supply

444 87RONIN

Holders

139

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 87RONIN
0x33290D65B8cAc9586a14a5a621F7E49cc1e75d59
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Ronin87

Compiler Version
v0.8.13+commit.abaa5c0e

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

// File: @openzeppelin/contracts/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/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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



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



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



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/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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/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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
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 See {IERC721Enumerable-totalSupply}.
     * @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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        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 {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _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 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;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 (safe && 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 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);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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: erc721a/contracts/extensions/ERC721AOwnersExplicit.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;


error AllOwnershipsHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

abstract contract ERC721AOwnersExplicit is ERC721A {
    uint256 public nextOwnerToExplicitlySet;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        if (quantity == 0) revert QuantityMustBeNonZero();
        if (_currentIndex == _startTokenId()) revert NoTokensMintedYet();
        uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet;
        if (_nextOwnerToExplicitlySet == 0) {
            _nextOwnerToExplicitlySet = _startTokenId();
        }
        if (_nextOwnerToExplicitlySet >= _currentIndex) revert AllOwnershipsHaveBeenSet();

        // Index underflow is impossible.
        // Counter or index overflow is incredibly unrealistic.
        unchecked {
            uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1;

            // Set the end index to be the last token index
            if (endIndex + 1 > _currentIndex) {
                endIndex = _currentIndex - 1;
            }

            for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) {
                if (_ownerships[i].addr == address(0) && !_ownerships[i].burned) {
                    TokenOwnership memory ownership = ownershipOf(i);
                    _ownerships[i].addr = ownership.addr;
                    _ownerships[i].startTimestamp = ownership.startTimestamp;
                }
            }

            nextOwnerToExplicitlySet = endIndex + 1;
        }
    }
}

// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/87Ronin.sol


pragma solidity ^0.8.13;





contract Ronin87 is Ownable, ERC721A, ReentrancyGuard {
  // ================ Public Properties ================ //

  enum WalletStatusType {
    PUBLIC,
    PRESALE,
    GOLD,
    SILVER,
    MARKETING,
    NOT_PUBLIC
  }

  uint256 public immutable maxPerAddressDuringMint;
  uint256 public immutable maxSupply;
  uint256 public immutable marketingSupply;
  uint256 public immutable publicSupply;

  uint256 public publicPrice;
  uint256 public presalePrice;

  bool public publicSaleActive = false;
  bool public presaleActive = false;
  bool public goldSaleActive = false;
  bool public silverSaleActive = false;

  mapping(address => bool) public presaleList;
  mapping(address => uint256) public marketingList;
  mapping(address => bool) public goldList;
  mapping(address => bool) public silverList;

  // ================ Private Properties ================ //

  string private _baseTokenURI;

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

  constructor(
    uint256 maxSupply_,
    uint256 marketingSupply_,
    uint256 maxPerAddressDuringMint_
  ) ERC721A("87Ronin", "87RONIN") {
    maxSupply = maxSupply_;
    marketingSupply = marketingSupply_;
    maxPerAddressDuringMint = maxPerAddressDuringMint_;
    publicSupply = maxSupply_ - marketingSupply_;
  }

  // ================ Mint Functions ================ //

  function publicMint(uint256 quantity) external payable {
    require(publicSaleActive, "public sale not active");
    require(totalSupply() + quantity <= publicSupply, "not enough remaining to support desired mint amount");
    require(numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many");
    uint256 totalCost = publicPrice * quantity;
    require(msg.value >= totalCost, "not enough eth");
    _safeMint(msg.sender, quantity);
  }

  function goldMint(uint256 quantity) external payable {
    require(goldSaleActive, "gold sale not active");
    require(totalSupply() + quantity <= publicSupply, "not enough remaining to support desired mint amount");
    require(goldList[msg.sender], "not eligible for gold mint");
    require(numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many");
    uint256 totalCost = presalePrice * quantity;
    require(msg.value >= totalCost, "not enough eth");
    _safeMint(msg.sender, quantity);
  }

  function silverMint(uint256 quantity) external payable {
    require(silverSaleActive, "silver sale not active");
    require(totalSupply() + quantity <= publicSupply, "not enough remaining to support desired mint amount");
    require(silverList[msg.sender], "not eligible for silver mint");
    require(numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many");
    uint256 totalCost = presalePrice * quantity;
    require(msg.value >= totalCost, "not enough eth");
    _safeMint(msg.sender, quantity);
  }

  function presaleMint(uint256 quantity) external payable {
    require(presaleActive, "presale not active");
    require(totalSupply() + quantity <= publicSupply, "not enough remaining to support desired mint amount");
    require(presaleList[msg.sender], "not eligible for silver mint");
    require(numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many");
    uint256 totalCost = presalePrice * quantity;
    require(msg.value >= totalCost, "not enough eth");
    _safeMint(msg.sender, quantity);
  }

  function marketingMint(uint256 quantity) external payable {
    require(goldSaleActive, "market sale not active");
    require(totalSupply() + quantity <= publicSupply, "not enough remaining to support desired mint amount");
    require(marketingList[msg.sender] > 0, "not eligible for marketing mint");
    require(numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many");


    uint256 totalCost = 0;

    if (quantity > marketingList[msg.sender]) {
      totalCost = presalePrice * (quantity - marketingList[msg.sender]);
    }

    require(msg.value >= totalCost, "not enough eth");
    _safeMint(msg.sender, quantity);

    if (quantity >= marketingList[msg.sender]) {
      marketingList[msg.sender] = 0;
    } else {
      marketingList[msg.sender] = marketingList[msg.sender] - quantity;
    }


  }

  // ================ Sale Functions ================ //

  function setPublicSaleActive(bool _publicSaleActive) external onlyOwner {
    publicSaleActive = _publicSaleActive;
  }

  function setPresaleActive(bool _presaleActive) external onlyOwner {
    presaleActive = _presaleActive;
  }

  function setSilverSaleActive(bool _silverSaleActive) external onlyOwner {
    silverSaleActive = _silverSaleActive;
  }

  function setGoldSaleActive(bool _goldSaleActive) external onlyOwner {
    goldSaleActive = _goldSaleActive;
  }

  // ================ Price Functions ================ //

  function setPublicPrice(uint256 _publicPrice) external onlyOwner {
    publicPrice = _publicPrice;
  }

  function setPresalePrice(uint256 _presalePrice) external onlyOwner {
    presalePrice = _presalePrice;
  }

  // ================ Lists Functions ================ //

  function getMarketingMints(address owner) external view returns (uint256) {
    return marketingList[owner];
  }

  function seedPresaleList(address[] memory addresses, bool valid) external onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      presaleList[addresses[i]] = valid;
    }
  }

  function seedMarketingMintList(address[] memory addresses, uint256 quantity) external onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      marketingList[addresses[i]] = quantity;
    }
  }

  function seedGoldList(address[] memory addresses, bool valid) external onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      goldList[addresses[i]] = valid;
    }
  }

  function seedSilverList(address[] memory addresses, bool valid) external onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      silverList[addresses[i]] = valid;
    }
  }

  // ================ Marketing Functions ================ //

  function devMint(uint256 quantity) external onlyOwner {
    _safeMint(msg.sender, quantity);
  }

  function giftMint(address to, uint256 amount) external onlyOwner {
    require(totalSupply() + amount <= maxSupply, "not enough supply");
    _safeMint(to, amount);
  }

  // ================ Utility Functions ================ //

  function getWalletStatus(address owner) external view returns (WalletStatusType) {

    if (publicSaleActive == true) {
      return WalletStatusType.PUBLIC;
    }

    if (marketingList[owner] > 0 && goldSaleActive == true) {
      return WalletStatusType.MARKETING;
    }

    if (goldList[owner] == true && goldSaleActive == true) {
      return WalletStatusType.GOLD;
    }

    if (silverList[owner] == true && silverSaleActive == true) {
      return WalletStatusType.SILVER;
    }

    if (presaleList[owner] == true && presaleActive == true) {
      return WalletStatusType.PRESALE;
    }

    return WalletStatusType.NOT_PUBLIC;
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function getTokenIds(address owner) external view returns (uint256[] memory) {
    unchecked {
      uint256[] memory a = new uint256[](balanceOf(owner));
      uint256 end = _currentIndex;
      uint256 tokenIdsIdx;
      address currOwnershipAddr;
      for (uint256 i; i < end; i++) {
        TokenOwnership memory ownership = _ownerships[i];
        if (ownership.burned) {
          continue;
        }
        if (ownership.addr != address(0)) {
          currOwnershipAddr = ownership.addr;
        }
        if (currOwnershipAddr == owner) {
          a[tokenIdsIdx++] = i;
        }
      }
      return a;
    }
  }

  // ================ URI Functions ================ //

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

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

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

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{ value: address(this).balance }("");
    require(success, "Transfer failed.");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"marketingSupply_","type":"uint256"},{"internalType":"uint256","name":"maxPerAddressDuringMint_","type":"uint256"}],"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":"MintedQueryForZeroAddress","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"},{"inputs":[],"name":"URIQueryForNonexistentToken","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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getMarketingMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getWalletStatus","outputs":[{"internalType":"enum Ronin87.WalletStatusType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"goldList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"goldMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"goldSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketingList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"marketingMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"marketingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"valid","type":"bool"}],"name":"seedGoldList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"seedMarketingMintList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"valid","type":"bool"}],"name":"seedPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"valid","type":"bool"}],"name":"seedSilverList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_goldSaleActive","type":"bool"}],"name":"setGoldSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_presaleActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presalePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSaleActive","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_silverSaleActive","type":"bool"}],"name":"setSilverSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"silverList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"silverMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"silverSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040526000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff0219169083151502179055506000600c60036101000a81548160ff0219169083151502179055503480156200007e57600080fd5b5060405162005fef38038062005fef8339818101604052810190620000a4919062000379565b6040518060400160405280600781526020017f3837526f6e696e000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f3837524f4e494e000000000000000000000000000000000000000000000000008152506200013062000124620001b860201b60201c565b620001c060201b60201c565b81600390805190602001906200014892919062000289565b5080600490805190602001906200016192919062000289565b50620001726200028460201b60201c565b600181905550505060016009819055508260a081815250508160c0818152505080608081815250508183620001a8919062000404565b60e08181525050505050620004a3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b82805462000297906200046e565b90600052602060002090601f016020900481019282620002bb576000855562000307565b82601f10620002d657805160ff191683800117855562000307565b8280016001018555821562000307579182015b8281111562000306578251825591602001919060010190620002e9565b5b5090506200031691906200031a565b5090565b5b80821115620003355760008160009055506001016200031b565b5090565b600080fd5b6000819050919050565b62000353816200033e565b81146200035f57600080fd5b50565b600081519050620003738162000348565b92915050565b60008060006060848603121562000395576200039462000339565b5b6000620003a58682870162000362565b9350506020620003b88682870162000362565b9250506040620003cb8682870162000362565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000411826200033e565b91506200041e836200033e565b925082821015620004345762000433620003d5565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048757607f821691505b6020821081036200049d576200049c6200043f565b5b50919050565b60805160a05160c05160e051615ac56200052a60003960008181610fff0152818161126f01528181611a7501528181611c46015281816129a8015261305c01526000611a990152600081816117120152612eaa015260008181611100015281816112e401528181611d3d015281816121d701528181612aa9015261315d0152615ac56000f3fe6080604052600436106103345760003560e01c8063715018a6116101ab578063c29057ae116100f7578063d3250c1a11610095578063e2e06fa31161006f578063e2e06fa314610c03578063e985e9c514610c2c578063eba7d7e714610c69578063f2fde38b14610c8557610334565b8063d3250c1a14610b72578063d5abeb0114610b9b578063dc33e68114610bc657610334565b8063c87b56dd116100d1578063c87b56dd14610a9f578063c9b298f114610adc578063d004b03614610af8578063d163b9d514610b3557610334565b8063c29057ae14610a0e578063c627525514610a4b578063c7f4981e14610a7457610334565b8063a22cb46511610164578063ac4460021161013e578063ac4460021461097a578063b88d4fde14610991578063bc8893b4146109ba578063c1d59e16146109e557610334565b8063a22cb465146108fd578063a89a7eba14610926578063a945bf801461094f57610334565b8063715018a6146107ff5780638067412e1461081657806382bb3308146108535780638bc35c2f1461087c5780638da5cb5b146108a757806395d89b41146108d257610334565b80633f8121a2116102855780635e84d7231161022357806363abbae0116101fd57806363abbae0146107525780636fecc01e1461077b57806370707d51146107a657806370a08231146107c257610334565b80635e84d723146106bf578063624bb58f146106ea5780636352211e1461071557610334565b80634738ff161161025f5780634738ff16146105f157806353135ca01461062e57806355f804b3146106595780635de593cd1461068257610334565b80633f8121a21461057657806342842e0e1461059f57806345bf9b15146105c857610334565b806312fb92e0116102f25780632db11544116102cc5780632db11544146104df57806332e3f4e9146104fb5780633549345e14610524578063375a069a1461054d57610334565b806312fb92e01461044e57806318160ddd1461048b57806323b872dd146104b657610334565b80620e7fa81461033957806301ffc9a71461036457806306fdde03146103a1578063081812fc146103cc578063095ea7b3146104095780630c5dd3a614610432575b600080fd5b34801561034557600080fd5b5061034e610cae565b60405161035b919061460e565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190614695565b610cb4565b60405161039891906146dd565b60405180910390f35b3480156103ad57600080fd5b506103b6610d96565b6040516103c39190614791565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee91906147df565b610e28565b604051610400919061484d565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190614894565b610ea4565b005b61044c600480360381019061044791906147df565b610fae565b005b34801561045a57600080fd5b50610475600480360381019061047091906148d4565b6111d7565b60405161048291906146dd565b60405180910390f35b34801561049757600080fd5b506104a06111f7565b6040516104ad919061460e565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190614901565b61120e565b005b6104f960048036038101906104f491906147df565b61121e565b005b34801561050757600080fd5b50610522600480360381019061051d9190614ac8565b6113bb565b005b34801561053057600080fd5b5061054b600480360381019061054691906147df565b6114cc565b005b34801561055957600080fd5b50610574600480360381019061056f91906147df565b611552565b005b34801561058257600080fd5b5061059d60048036038101906105989190614b24565b6115db565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190614901565b611674565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190614894565b611694565b005b3480156105fd57600080fd5b50610618600480360381019061061391906148d4565b611793565b604051610625919061460e565b60405180910390f35b34801561063a57600080fd5b506106436117ab565b60405161065091906146dd565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190614bac565b6117be565b005b34801561068e57600080fd5b506106a960048036038101906106a491906148d4565b611850565b6040516106b69190614c70565b60405180910390f35b3480156106cb57600080fd5b506106d4611a73565b6040516106e1919061460e565b60405180910390f35b3480156106f657600080fd5b506106ff611a97565b60405161070c919061460e565b60405180910390f35b34801561072157600080fd5b5061073c600480360381019061073791906147df565b611abb565b604051610749919061484d565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190614ac8565b611ad1565b005b34801561078757600080fd5b50610790611be2565b60405161079d91906146dd565b60405180910390f35b6107c060048036038101906107bb91906147df565b611bf5565b005b3480156107ce57600080fd5b506107e960048036038101906107e491906148d4565b611fc5565b6040516107f6919061460e565b60405180910390f35b34801561080b57600080fd5b50610814612094565b005b34801561082257600080fd5b5061083d600480360381019061083891906148d4565b61211c565b60405161084a91906146dd565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190614b24565b61213c565b005b34801561088857600080fd5b506108916121d5565b60405161089e919061460e565b60405180910390f35b3480156108b357600080fd5b506108bc6121f9565b6040516108c9919061484d565b60405180910390f35b3480156108de57600080fd5b506108e7612222565b6040516108f49190614791565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190614c8b565b6122b4565b005b34801561093257600080fd5b5061094d60048036038101906109489190614b24565b61242b565b005b34801561095b57600080fd5b506109646124c4565b604051610971919061460e565b60405180910390f35b34801561098657600080fd5b5061098f6124ca565b005b34801561099d57600080fd5b506109b860048036038101906109b39190614d80565b61264a565b005b3480156109c657600080fd5b506109cf6126c6565b6040516109dc91906146dd565b60405180910390f35b3480156109f157600080fd5b50610a0c6004803603810190610a079190614e03565b6126d9565b005b348015610a1a57600080fd5b50610a356004803603810190610a3091906148d4565b6127d7565b604051610a42919061460e565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906147df565b612820565b005b348015610a8057600080fd5b50610a896128a6565b604051610a9691906146dd565b60405180910390f35b348015610aab57600080fd5b50610ac66004803603810190610ac191906147df565b6128b9565b604051610ad39190614791565b60405180910390f35b610af66004803603810190610af191906147df565b612957565b005b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906148d4565b612b80565b604051610b2c9190614f1d565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b5791906148d4565b612d77565b604051610b6991906146dd565b60405180910390f35b348015610b7e57600080fd5b50610b996004803603810190610b949190614ac8565b612d97565b005b348015610ba757600080fd5b50610bb0612ea8565b604051610bbd919061460e565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be891906148d4565b612ecc565b604051610bfa919061460e565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190614b24565b612ede565b005b348015610c3857600080fd5b50610c536004803603810190610c4e9190614f3f565b612f77565b604051610c6091906146dd565b60405180910390f35b610c836004803603810190610c7e91906147df565b61300b565b005b348015610c9157600080fd5b50610cac6004803603810190610ca791906148d4565b613234565b005b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d7f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d8f5750610d8e8261332b565b5b9050919050565b606060038054610da590614fae565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd190614fae565b8015610e1e5780601f10610df357610100808354040283529160200191610e1e565b820191906000526020600020905b815481529060010190602001808311610e0157829003601f168201915b5050505050905090565b6000610e3382613395565b610e69576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eaf82611abb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f16576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f356133e3565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f675750610f6581610f606133e3565b612f77565b155b15610f9e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fa98383836133eb565b505050565b600c60039054906101000a900460ff16610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff49061502b565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816110276111f7565b611031919061507a565b1115611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990615142565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f5906151ae565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161112933612ecc565b611133919061507a565b1115611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b9061521a565b60405180910390fd5b600081600b54611184919061523a565b9050803410156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906152e0565b60405180910390fd5b6111d3338361349d565b5050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60006112016134bb565b6002546001540303905090565b6112198383836134c0565b505050565b600c60009054906101000a900460ff1661126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061534c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816112976111f7565b6112a1919061507a565b11156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990615142565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161130d33612ecc565b611317919061507a565b1115611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f9061521a565b60405180910390fd5b600081600a54611368919061523a565b9050803410156113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a4906152e0565b60405180910390fd5b6113b7338361349d565b5050565b6113c36133e3565b73ffffffffffffffffffffffffffffffffffffffff166113e16121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e906153b8565b60405180910390fd5b60005b82518110156114c757816010600085848151811061145b5761145a6153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114bf90615407565b91505061143a565b505050565b6114d46133e3565b73ffffffffffffffffffffffffffffffffffffffff166114f26121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f906153b8565b60405180910390fd5b80600b8190555050565b61155a6133e3565b73ffffffffffffffffffffffffffffffffffffffff166115786121f9565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906153b8565b60405180910390fd5b6115d8338261349d565b50565b6115e36133e3565b73ffffffffffffffffffffffffffffffffffffffff166116016121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e906153b8565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b61168f8383836040518060200160405280600081525061264a565b505050565b61169c6133e3565b73ffffffffffffffffffffffffffffffffffffffff166116ba6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611707906153b8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161173a6111f7565b611744919061507a565b1115611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c9061549b565b60405180910390fd5b61178f828261349d565b5050565b600e6020528060005260406000206000915090505481565b600c60019054906101000a900460ff1681565b6117c66133e3565b73ffffffffffffffffffffffffffffffffffffffff166117e46121f9565b73ffffffffffffffffffffffffffffffffffffffff161461183a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611831906153b8565b60405180910390fd5b81816011919061184b92919061450f565b505050565b600060011515600c60009054906101000a900460ff161515036118765760009050611a6e565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156118d8575060011515600c60029054906101000a900460ff161515145b156118e65760049050611a6e565b60011515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015611959575060011515600c60029054906101000a900460ff161515145b156119675760029050611a6e565b60011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151480156119da575060011515600c60039054906101000a900460ff161515145b156119e85760039050611a6e565b60011515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015611a5b575060011515600c60019054906101000a900460ff161515145b15611a695760019050611a6e565b600590505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611ac6826139af565b600001519050919050565b611ad96133e3565b73ffffffffffffffffffffffffffffffffffffffff16611af76121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b44906153b8565b60405180910390fd5b60005b8251811015611bdd5781600f6000858481518110611b7157611b706153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611bd590615407565b915050611b50565b505050565b600c60029054906101000a900460ff1681565b600c60029054906101000a900460ff16611c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3b90615507565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611c6e6111f7565b611c78919061507a565b1115611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090615142565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3290615573565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611d6633612ecc565b611d70919061507a565b1115611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da89061521a565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611e5557600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611e459190615593565b600b54611e52919061523a565b90505b80341015611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f906152e0565b60405180910390fd5b611ea2338361349d565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548210611f32576000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc1565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f7d9190615593565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361202c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61209c6133e3565b73ffffffffffffffffffffffffffffffffffffffff166120ba6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612107906153b8565b60405180910390fd5b61211a6000613c3e565b565b600f6020528060005260406000206000915054906101000a900460ff1681565b6121446133e3565b73ffffffffffffffffffffffffffffffffffffffff166121626121f9565b73ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906153b8565b60405180910390fd5b80600c60026101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461223190614fae565b80601f016020809104026020016040519081016040528092919081815260200182805461225d90614fae565b80156122aa5780601f1061227f576101008083540402835291602001916122aa565b820191906000526020600020905b81548152906001019060200180831161228d57829003601f168201915b5050505050905090565b6122bc6133e3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612320576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061232d6133e3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123da6133e3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161241f91906146dd565b60405180910390a35050565b6124336133e3565b73ffffffffffffffffffffffffffffffffffffffff166124516121f9565b73ffffffffffffffffffffffffffffffffffffffff16146124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e906153b8565b60405180910390fd5b80600c60036101000a81548160ff02191690831515021790555050565b600a5481565b6124d26133e3565b73ffffffffffffffffffffffffffffffffffffffff166124f06121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d906153b8565b60405180910390fd5b60026009540361258b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258290615613565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516125b990615664565b60006040518083038185875af1925050503d80600081146125f6576040519150601f19603f3d011682016040523d82523d6000602084013e6125fb565b606091505b505090508061263f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612636906156c5565b60405180910390fd5b506001600981905550565b6126558484846134c0565b6126748373ffffffffffffffffffffffffffffffffffffffff16613d02565b8015612689575061268784848484613d15565b155b156126c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c60009054906101000a900460ff1681565b6126e16133e3565b73ffffffffffffffffffffffffffffffffffffffff166126ff6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c906153b8565b60405180910390fd5b60005b82518110156127d25781600e6000858481518110612779576127786153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806127ca90615407565b915050612758565b505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6128286133e3565b73ffffffffffffffffffffffffffffffffffffffff166128466121f9565b73ffffffffffffffffffffffffffffffffffffffff161461289c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612893906153b8565b60405180910390fd5b80600a8190555050565b600c60039054906101000a900460ff1681565b60606128c482613395565b6128fa576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612904613e65565b90506000815103612924576040518060200160405280600081525061294f565b8061292e84613ef7565b60405160200161293f929190615721565b6040516020818303038152906040525b915050919050565b600c60019054906101000a900460ff166129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299d90615791565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816129d06111f7565b6129da919061507a565b1115612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1290615142565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e906151ae565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081612ad233612ecc565b612adc919061507a565b1115612b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b149061521a565b60405180910390fd5b600081600b54612b2d919061523a565b905080341015612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b69906152e0565b60405180910390fd5b612b7c338361349d565b5050565b60606000612b8d83611fc5565b67ffffffffffffffff811115612ba657612ba5614959565b5b604051908082528060200260200182016040528015612bd45781602001602082028036833780820191505090505b5090506000600154905060008060005b83811015612d6a576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115612cc15750612d5d565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d0157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d5b5781868580600101965081518110612d4e57612d4d6153d8565b5b6020026020010181815250505b505b8080600101915050612be4565b5083945050505050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b612d9f6133e3565b73ffffffffffffffffffffffffffffffffffffffff16612dbd6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906153b8565b60405180910390fd5b60005b8251811015612ea35781600d6000858481518110612e3757612e366153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612e9b90615407565b915050612e16565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612ed782614057565b9050919050565b612ee66133e3565b73ffffffffffffffffffffffffffffffffffffffff16612f046121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f51906153b8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60029054906101000a900460ff1661305a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613051906157fd565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816130846111f7565b61308e919061507a565b11156130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c690615142565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661315b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315290615869565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161318633612ecc565b613190919061507a565b11156131d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c89061521a565b60405180910390fd5b600081600b546131e1919061523a565b905080341015613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d906152e0565b60405180910390fd5b613230338361349d565b5050565b61323c6133e3565b73ffffffffffffffffffffffffffffffffffffffff1661325a6121f9565b73ffffffffffffffffffffffffffffffffffffffff16146132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a7906153b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361331f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613316906158fb565b60405180910390fd5b61332881613c3e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816133a06134bb565b111580156133af575060015482105b80156133dc575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6134b7828260405180602001604052806000815250614126565b5050565b600090565b60006134cb826139af565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166134f26133e3565b73ffffffffffffffffffffffffffffffffffffffff1614806135255750613524826000015161351f6133e3565b612f77565b5b8061356a57506135336133e3565b73ffffffffffffffffffffffffffffffffffffffff1661355284610e28565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806135a3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461360c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613672576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61367f8585856001614138565b61368f60008484600001516133eb565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361393f5760015481101561393e5782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139a8858585600161413e565b5050505050565b6139b7614595565b6000829050806139c56134bb565b111580156139d4575060015481105b15613c07576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613c0557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613ae9578092505050613c39565b5b600115613c0457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613bff578092505050613c39565b613aea565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d3b6133e3565b8786866040518563ffffffff1660e01b8152600401613d5d9493929190615970565b6020604051808303816000875af1925050508015613d9957506040513d601f19601f82011682018060405250810190613d9691906159d1565b60015b613e12573d8060008114613dc9576040519150601f19603f3d011682016040523d82523d6000602084013e613dce565b606091505b506000815103613e0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060118054613e7490614fae565b80601f0160208091040260200160405190810160405280929190818152602001828054613ea090614fae565b8015613eed5780601f10613ec257610100808354040283529160200191613eed565b820191906000526020600020905b815481529060010190602001808311613ed057829003601f168201915b5050505050905090565b606060008203613f3e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614052565b600082905060005b60008214613f70578080613f5990615407565b915050600a82613f699190615a2d565b9150613f46565b60008167ffffffffffffffff811115613f8c57613f8b614959565b5b6040519080825280601f01601f191660200182016040528015613fbe5781602001600182028036833780820191505090505b5090505b6000851461404b57600182613fd79190615593565b9150600a85613fe69190615a5e565b6030613ff2919061507a565b60f81b818381518110614008576140076153d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856140449190615a2d565b9450613fc2565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036140be576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6141338383836001614144565b505050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036141b1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036141eb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141f86000868387614138565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156143c257506143c18773ffffffffffffffffffffffffffffffffffffffff16613d02565b5b15614487575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46144376000888480600101955088613d15565b61446d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036143c857826001541461448257600080fd5b6144f2565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203614488575b816001819055505050614508600086838761413e565b5050505050565b82805461451b90614fae565b90600052602060002090601f01602090048101928261453d5760008555614584565b82601f1061455657803560ff1916838001178555614584565b82800160010185558215614584579182015b82811115614583578235825591602001919060010190614568565b5b50905061459191906145d8565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156145f15760008160009055506001016145d9565b5090565b6000819050919050565b614608816145f5565b82525050565b600060208201905061462360008301846145ff565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146728161463d565b811461467d57600080fd5b50565b60008135905061468f81614669565b92915050565b6000602082840312156146ab576146aa614633565b5b60006146b984828501614680565b91505092915050565b60008115159050919050565b6146d7816146c2565b82525050565b60006020820190506146f260008301846146ce565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614732578082015181840152602081019050614717565b83811115614741576000848401525b50505050565b6000601f19601f8301169050919050565b6000614763826146f8565b61476d8185614703565b935061477d818560208601614714565b61478681614747565b840191505092915050565b600060208201905081810360008301526147ab8184614758565b905092915050565b6147bc816145f5565b81146147c757600080fd5b50565b6000813590506147d9816147b3565b92915050565b6000602082840312156147f5576147f4614633565b5b6000614803848285016147ca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148378261480c565b9050919050565b6148478161482c565b82525050565b6000602082019050614862600083018461483e565b92915050565b6148718161482c565b811461487c57600080fd5b50565b60008135905061488e81614868565b92915050565b600080604083850312156148ab576148aa614633565b5b60006148b98582860161487f565b92505060206148ca858286016147ca565b9150509250929050565b6000602082840312156148ea576148e9614633565b5b60006148f88482850161487f565b91505092915050565b60008060006060848603121561491a57614919614633565b5b60006149288682870161487f565b93505060206149398682870161487f565b925050604061494a868287016147ca565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61499182614747565b810181811067ffffffffffffffff821117156149b0576149af614959565b5b80604052505050565b60006149c3614629565b90506149cf8282614988565b919050565b600067ffffffffffffffff8211156149ef576149ee614959565b5b602082029050602081019050919050565b600080fd5b6000614a18614a13846149d4565b6149b9565b90508083825260208201905060208402830185811115614a3b57614a3a614a00565b5b835b81811015614a645780614a50888261487f565b845260208401935050602081019050614a3d565b5050509392505050565b600082601f830112614a8357614a82614954565b5b8135614a93848260208601614a05565b91505092915050565b614aa5816146c2565b8114614ab057600080fd5b50565b600081359050614ac281614a9c565b92915050565b60008060408385031215614adf57614ade614633565b5b600083013567ffffffffffffffff811115614afd57614afc614638565b5b614b0985828601614a6e565b9250506020614b1a85828601614ab3565b9150509250929050565b600060208284031215614b3a57614b39614633565b5b6000614b4884828501614ab3565b91505092915050565b600080fd5b60008083601f840112614b6c57614b6b614954565b5b8235905067ffffffffffffffff811115614b8957614b88614b51565b5b602083019150836001820283011115614ba557614ba4614a00565b5b9250929050565b60008060208385031215614bc357614bc2614633565b5b600083013567ffffffffffffffff811115614be157614be0614638565b5b614bed85828601614b56565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110614c3957614c38614bf9565b5b50565b6000819050614c4a82614c28565b919050565b6000614c5a82614c3c565b9050919050565b614c6a81614c4f565b82525050565b6000602082019050614c856000830184614c61565b92915050565b60008060408385031215614ca257614ca1614633565b5b6000614cb08582860161487f565b9250506020614cc185828601614ab3565b9150509250929050565b600080fd5b600067ffffffffffffffff821115614ceb57614cea614959565b5b614cf482614747565b9050602081019050919050565b82818337600083830152505050565b6000614d23614d1e84614cd0565b6149b9565b905082815260208101848484011115614d3f57614d3e614ccb565b5b614d4a848285614d01565b509392505050565b600082601f830112614d6757614d66614954565b5b8135614d77848260208601614d10565b91505092915050565b60008060008060808587031215614d9a57614d99614633565b5b6000614da88782880161487f565b9450506020614db98782880161487f565b9350506040614dca878288016147ca565b925050606085013567ffffffffffffffff811115614deb57614dea614638565b5b614df787828801614d52565b91505092959194509250565b60008060408385031215614e1a57614e19614633565b5b600083013567ffffffffffffffff811115614e3857614e37614638565b5b614e4485828601614a6e565b9250506020614e55858286016147ca565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e94816145f5565b82525050565b6000614ea68383614e8b565b60208301905092915050565b6000602082019050919050565b6000614eca82614e5f565b614ed48185614e6a565b9350614edf83614e7b565b8060005b83811015614f10578151614ef78882614e9a565b9750614f0283614eb2565b925050600181019050614ee3565b5085935050505092915050565b60006020820190508181036000830152614f378184614ebf565b905092915050565b60008060408385031215614f5657614f55614633565b5b6000614f648582860161487f565b9250506020614f758582860161487f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614fc657607f821691505b602082108103614fd957614fd8614f7f565b5b50919050565b7f73696c7665722073616c65206e6f742061637469766500000000000000000000600082015250565b6000615015601683614703565b915061502082614fdf565b602082019050919050565b6000602082019050818103600083015261504481615008565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615085826145f5565b9150615090836145f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150c5576150c461504b565b5b828201905092915050565b7f6e6f7420656e6f7567682072656d61696e696e6720746f20737570706f72742060008201527f64657369726564206d696e7420616d6f756e7400000000000000000000000000602082015250565b600061512c603383614703565b9150615137826150d0565b604082019050919050565b6000602082019050818103600083015261515b8161511f565b9050919050565b7f6e6f7420656c696769626c6520666f722073696c766572206d696e7400000000600082015250565b6000615198601c83614703565b91506151a382615162565b602082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000615204601683614703565b915061520f826151ce565b602082019050919050565b60006020820190508181036000830152615233816151f7565b9050919050565b6000615245826145f5565b9150615250836145f5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152895761528861504b565b5b828202905092915050565b7f6e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b60006152ca600e83614703565b91506152d582615294565b602082019050919050565b600060208201905081810360008301526152f9816152bd565b9050919050565b7f7075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b6000615336601683614703565b915061534182615300565b602082019050919050565b6000602082019050818103600083015261536581615329565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153a2602083614703565b91506153ad8261536c565b602082019050919050565b600060208201905081810360008301526153d181615395565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615412826145f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036154445761544361504b565b5b600182019050919050565b7f6e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b6000615485601183614703565b91506154908261544f565b602082019050919050565b600060208201905081810360008301526154b481615478565b9050919050565b7f6d61726b65742073616c65206e6f742061637469766500000000000000000000600082015250565b60006154f1601683614703565b91506154fc826154bb565b602082019050919050565b60006020820190508181036000830152615520816154e4565b9050919050565b7f6e6f7420656c696769626c6520666f72206d61726b6574696e67206d696e7400600082015250565b600061555d601f83614703565b915061556882615527565b602082019050919050565b6000602082019050818103600083015261558c81615550565b9050919050565b600061559e826145f5565b91506155a9836145f5565b9250828210156155bc576155bb61504b565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006155fd601f83614703565b9150615608826155c7565b602082019050919050565b6000602082019050818103600083015261562c816155f0565b9050919050565b600081905092915050565b50565b600061564e600083615633565b91506156598261563e565b600082019050919050565b600061566f82615641565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006156af601083614703565b91506156ba82615679565b602082019050919050565b600060208201905081810360008301526156de816156a2565b9050919050565b600081905092915050565b60006156fb826146f8565b61570581856156e5565b9350615715818560208601614714565b80840191505092915050565b600061572d82856156f0565b915061573982846156f0565b91508190509392505050565b7f70726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b600061577b601283614703565b915061578682615745565b602082019050919050565b600060208201905081810360008301526157aa8161576e565b9050919050565b7f676f6c642073616c65206e6f7420616374697665000000000000000000000000600082015250565b60006157e7601483614703565b91506157f2826157b1565b602082019050919050565b60006020820190508181036000830152615816816157da565b9050919050565b7f6e6f7420656c696769626c6520666f7220676f6c64206d696e74000000000000600082015250565b6000615853601a83614703565b915061585e8261581d565b602082019050919050565b6000602082019050818103600083015261588281615846565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006158e5602683614703565b91506158f082615889565b604082019050919050565b60006020820190508181036000830152615914816158d8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159428261591b565b61594c8185615926565b935061595c818560208601614714565b61596581614747565b840191505092915050565b6000608082019050615985600083018761483e565b615992602083018661483e565b61599f60408301856145ff565b81810360608301526159b18184615937565b905095945050505050565b6000815190506159cb81614669565b92915050565b6000602082840312156159e7576159e6614633565b5b60006159f5848285016159bc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a38826145f5565b9150615a43836145f5565b925082615a5357615a526159fe565b5b828204905092915050565b6000615a69826145f5565b9150615a74836145f5565b925082615a8457615a836159fe565b5b82820690509291505056fea2646970667358221220aaa0603c59778c80b2a7838d29418268ba89201d3d6fb5283b0d3828ccb0930064736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000125c00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x6080604052600436106103345760003560e01c8063715018a6116101ab578063c29057ae116100f7578063d3250c1a11610095578063e2e06fa31161006f578063e2e06fa314610c03578063e985e9c514610c2c578063eba7d7e714610c69578063f2fde38b14610c8557610334565b8063d3250c1a14610b72578063d5abeb0114610b9b578063dc33e68114610bc657610334565b8063c87b56dd116100d1578063c87b56dd14610a9f578063c9b298f114610adc578063d004b03614610af8578063d163b9d514610b3557610334565b8063c29057ae14610a0e578063c627525514610a4b578063c7f4981e14610a7457610334565b8063a22cb46511610164578063ac4460021161013e578063ac4460021461097a578063b88d4fde14610991578063bc8893b4146109ba578063c1d59e16146109e557610334565b8063a22cb465146108fd578063a89a7eba14610926578063a945bf801461094f57610334565b8063715018a6146107ff5780638067412e1461081657806382bb3308146108535780638bc35c2f1461087c5780638da5cb5b146108a757806395d89b41146108d257610334565b80633f8121a2116102855780635e84d7231161022357806363abbae0116101fd57806363abbae0146107525780636fecc01e1461077b57806370707d51146107a657806370a08231146107c257610334565b80635e84d723146106bf578063624bb58f146106ea5780636352211e1461071557610334565b80634738ff161161025f5780634738ff16146105f157806353135ca01461062e57806355f804b3146106595780635de593cd1461068257610334565b80633f8121a21461057657806342842e0e1461059f57806345bf9b15146105c857610334565b806312fb92e0116102f25780632db11544116102cc5780632db11544146104df57806332e3f4e9146104fb5780633549345e14610524578063375a069a1461054d57610334565b806312fb92e01461044e57806318160ddd1461048b57806323b872dd146104b657610334565b80620e7fa81461033957806301ffc9a71461036457806306fdde03146103a1578063081812fc146103cc578063095ea7b3146104095780630c5dd3a614610432575b600080fd5b34801561034557600080fd5b5061034e610cae565b60405161035b919061460e565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190614695565b610cb4565b60405161039891906146dd565b60405180910390f35b3480156103ad57600080fd5b506103b6610d96565b6040516103c39190614791565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee91906147df565b610e28565b604051610400919061484d565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190614894565b610ea4565b005b61044c600480360381019061044791906147df565b610fae565b005b34801561045a57600080fd5b50610475600480360381019061047091906148d4565b6111d7565b60405161048291906146dd565b60405180910390f35b34801561049757600080fd5b506104a06111f7565b6040516104ad919061460e565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190614901565b61120e565b005b6104f960048036038101906104f491906147df565b61121e565b005b34801561050757600080fd5b50610522600480360381019061051d9190614ac8565b6113bb565b005b34801561053057600080fd5b5061054b600480360381019061054691906147df565b6114cc565b005b34801561055957600080fd5b50610574600480360381019061056f91906147df565b611552565b005b34801561058257600080fd5b5061059d60048036038101906105989190614b24565b6115db565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190614901565b611674565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190614894565b611694565b005b3480156105fd57600080fd5b50610618600480360381019061061391906148d4565b611793565b604051610625919061460e565b60405180910390f35b34801561063a57600080fd5b506106436117ab565b60405161065091906146dd565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190614bac565b6117be565b005b34801561068e57600080fd5b506106a960048036038101906106a491906148d4565b611850565b6040516106b69190614c70565b60405180910390f35b3480156106cb57600080fd5b506106d4611a73565b6040516106e1919061460e565b60405180910390f35b3480156106f657600080fd5b506106ff611a97565b60405161070c919061460e565b60405180910390f35b34801561072157600080fd5b5061073c600480360381019061073791906147df565b611abb565b604051610749919061484d565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190614ac8565b611ad1565b005b34801561078757600080fd5b50610790611be2565b60405161079d91906146dd565b60405180910390f35b6107c060048036038101906107bb91906147df565b611bf5565b005b3480156107ce57600080fd5b506107e960048036038101906107e491906148d4565b611fc5565b6040516107f6919061460e565b60405180910390f35b34801561080b57600080fd5b50610814612094565b005b34801561082257600080fd5b5061083d600480360381019061083891906148d4565b61211c565b60405161084a91906146dd565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190614b24565b61213c565b005b34801561088857600080fd5b506108916121d5565b60405161089e919061460e565b60405180910390f35b3480156108b357600080fd5b506108bc6121f9565b6040516108c9919061484d565b60405180910390f35b3480156108de57600080fd5b506108e7612222565b6040516108f49190614791565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190614c8b565b6122b4565b005b34801561093257600080fd5b5061094d60048036038101906109489190614b24565b61242b565b005b34801561095b57600080fd5b506109646124c4565b604051610971919061460e565b60405180910390f35b34801561098657600080fd5b5061098f6124ca565b005b34801561099d57600080fd5b506109b860048036038101906109b39190614d80565b61264a565b005b3480156109c657600080fd5b506109cf6126c6565b6040516109dc91906146dd565b60405180910390f35b3480156109f157600080fd5b50610a0c6004803603810190610a079190614e03565b6126d9565b005b348015610a1a57600080fd5b50610a356004803603810190610a3091906148d4565b6127d7565b604051610a42919061460e565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906147df565b612820565b005b348015610a8057600080fd5b50610a896128a6565b604051610a9691906146dd565b60405180910390f35b348015610aab57600080fd5b50610ac66004803603810190610ac191906147df565b6128b9565b604051610ad39190614791565b60405180910390f35b610af66004803603810190610af191906147df565b612957565b005b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906148d4565b612b80565b604051610b2c9190614f1d565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b5791906148d4565b612d77565b604051610b6991906146dd565b60405180910390f35b348015610b7e57600080fd5b50610b996004803603810190610b949190614ac8565b612d97565b005b348015610ba757600080fd5b50610bb0612ea8565b604051610bbd919061460e565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be891906148d4565b612ecc565b604051610bfa919061460e565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190614b24565b612ede565b005b348015610c3857600080fd5b50610c536004803603810190610c4e9190614f3f565b612f77565b604051610c6091906146dd565b60405180910390f35b610c836004803603810190610c7e91906147df565b61300b565b005b348015610c9157600080fd5b50610cac6004803603810190610ca791906148d4565b613234565b005b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d7f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d8f5750610d8e8261332b565b5b9050919050565b606060038054610da590614fae565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd190614fae565b8015610e1e5780601f10610df357610100808354040283529160200191610e1e565b820191906000526020600020905b815481529060010190602001808311610e0157829003601f168201915b5050505050905090565b6000610e3382613395565b610e69576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eaf82611abb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f16576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f356133e3565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f675750610f6581610f606133e3565b612f77565b155b15610f9e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fa98383836133eb565b505050565b600c60039054906101000a900460ff16610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff49061502b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000011f8816110276111f7565b611031919061507a565b1115611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990615142565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f5906151ae565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000038161112933612ecc565b611133919061507a565b1115611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b9061521a565b60405180910390fd5b600081600b54611184919061523a565b9050803410156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906152e0565b60405180910390fd5b6111d3338361349d565b5050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60006112016134bb565b6002546001540303905090565b6112198383836134c0565b505050565b600c60009054906101000a900460ff1661126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061534c565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000011f8816112976111f7565b6112a1919061507a565b11156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990615142565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000038161130d33612ecc565b611317919061507a565b1115611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f9061521a565b60405180910390fd5b600081600a54611368919061523a565b9050803410156113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a4906152e0565b60405180910390fd5b6113b7338361349d565b5050565b6113c36133e3565b73ffffffffffffffffffffffffffffffffffffffff166113e16121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e906153b8565b60405180910390fd5b60005b82518110156114c757816010600085848151811061145b5761145a6153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114bf90615407565b91505061143a565b505050565b6114d46133e3565b73ffffffffffffffffffffffffffffffffffffffff166114f26121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f906153b8565b60405180910390fd5b80600b8190555050565b61155a6133e3565b73ffffffffffffffffffffffffffffffffffffffff166115786121f9565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906153b8565b60405180910390fd5b6115d8338261349d565b50565b6115e36133e3565b73ffffffffffffffffffffffffffffffffffffffff166116016121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e906153b8565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b61168f8383836040518060200160405280600081525061264a565b505050565b61169c6133e3565b73ffffffffffffffffffffffffffffffffffffffff166116ba6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611707906153b8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000125c8161173a6111f7565b611744919061507a565b1115611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c9061549b565b60405180910390fd5b61178f828261349d565b5050565b600e6020528060005260406000206000915090505481565b600c60019054906101000a900460ff1681565b6117c66133e3565b73ffffffffffffffffffffffffffffffffffffffff166117e46121f9565b73ffffffffffffffffffffffffffffffffffffffff161461183a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611831906153b8565b60405180910390fd5b81816011919061184b92919061450f565b505050565b600060011515600c60009054906101000a900460ff161515036118765760009050611a6e565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156118d8575060011515600c60029054906101000a900460ff161515145b156118e65760049050611a6e565b60011515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015611959575060011515600c60029054906101000a900460ff161515145b156119675760029050611a6e565b60011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151480156119da575060011515600c60039054906101000a900460ff161515145b156119e85760039050611a6e565b60011515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015611a5b575060011515600c60019054906101000a900460ff161515145b15611a695760019050611a6e565b600590505b919050565b7f00000000000000000000000000000000000000000000000000000000000011f881565b7f000000000000000000000000000000000000000000000000000000000000006481565b6000611ac6826139af565b600001519050919050565b611ad96133e3565b73ffffffffffffffffffffffffffffffffffffffff16611af76121f9565b73ffffffffffffffffffffffffffffffffffffffff1614611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b44906153b8565b60405180910390fd5b60005b8251811015611bdd5781600f6000858481518110611b7157611b706153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611bd590615407565b915050611b50565b505050565b600c60029054906101000a900460ff1681565b600c60029054906101000a900460ff16611c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3b90615507565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000011f881611c6e6111f7565b611c78919061507a565b1115611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090615142565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3290615573565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000381611d6633612ecc565b611d70919061507a565b1115611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da89061521a565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611e5557600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611e459190615593565b600b54611e52919061523a565b90505b80341015611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f906152e0565b60405180910390fd5b611ea2338361349d565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548210611f32576000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc1565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f7d9190615593565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361202c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61209c6133e3565b73ffffffffffffffffffffffffffffffffffffffff166120ba6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612107906153b8565b60405180910390fd5b61211a6000613c3e565b565b600f6020528060005260406000206000915054906101000a900460ff1681565b6121446133e3565b73ffffffffffffffffffffffffffffffffffffffff166121626121f9565b73ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906153b8565b60405180910390fd5b80600c60026101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000381565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461223190614fae565b80601f016020809104026020016040519081016040528092919081815260200182805461225d90614fae565b80156122aa5780601f1061227f576101008083540402835291602001916122aa565b820191906000526020600020905b81548152906001019060200180831161228d57829003601f168201915b5050505050905090565b6122bc6133e3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612320576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061232d6133e3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123da6133e3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161241f91906146dd565b60405180910390a35050565b6124336133e3565b73ffffffffffffffffffffffffffffffffffffffff166124516121f9565b73ffffffffffffffffffffffffffffffffffffffff16146124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e906153b8565b60405180910390fd5b80600c60036101000a81548160ff02191690831515021790555050565b600a5481565b6124d26133e3565b73ffffffffffffffffffffffffffffffffffffffff166124f06121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d906153b8565b60405180910390fd5b60026009540361258b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258290615613565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516125b990615664565b60006040518083038185875af1925050503d80600081146125f6576040519150601f19603f3d011682016040523d82523d6000602084013e6125fb565b606091505b505090508061263f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612636906156c5565b60405180910390fd5b506001600981905550565b6126558484846134c0565b6126748373ffffffffffffffffffffffffffffffffffffffff16613d02565b8015612689575061268784848484613d15565b155b156126c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c60009054906101000a900460ff1681565b6126e16133e3565b73ffffffffffffffffffffffffffffffffffffffff166126ff6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c906153b8565b60405180910390fd5b60005b82518110156127d25781600e6000858481518110612779576127786153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806127ca90615407565b915050612758565b505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6128286133e3565b73ffffffffffffffffffffffffffffffffffffffff166128466121f9565b73ffffffffffffffffffffffffffffffffffffffff161461289c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612893906153b8565b60405180910390fd5b80600a8190555050565b600c60039054906101000a900460ff1681565b60606128c482613395565b6128fa576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612904613e65565b90506000815103612924576040518060200160405280600081525061294f565b8061292e84613ef7565b60405160200161293f929190615721565b6040516020818303038152906040525b915050919050565b600c60019054906101000a900460ff166129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299d90615791565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000011f8816129d06111f7565b6129da919061507a565b1115612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1290615142565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e906151ae565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000381612ad233612ecc565b612adc919061507a565b1115612b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b149061521a565b60405180910390fd5b600081600b54612b2d919061523a565b905080341015612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b69906152e0565b60405180910390fd5b612b7c338361349d565b5050565b60606000612b8d83611fc5565b67ffffffffffffffff811115612ba657612ba5614959565b5b604051908082528060200260200182016040528015612bd45781602001602082028036833780820191505090505b5090506000600154905060008060005b83811015612d6a576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115612cc15750612d5d565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d0157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d5b5781868580600101965081518110612d4e57612d4d6153d8565b5b6020026020010181815250505b505b8080600101915050612be4565b5083945050505050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b612d9f6133e3565b73ffffffffffffffffffffffffffffffffffffffff16612dbd6121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906153b8565b60405180910390fd5b60005b8251811015612ea35781600d6000858481518110612e3757612e366153d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612e9b90615407565b915050612e16565b505050565b7f000000000000000000000000000000000000000000000000000000000000125c81565b6000612ed782614057565b9050919050565b612ee66133e3565b73ffffffffffffffffffffffffffffffffffffffff16612f046121f9565b73ffffffffffffffffffffffffffffffffffffffff1614612f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f51906153b8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60029054906101000a900460ff1661305a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613051906157fd565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000011f8816130846111f7565b61308e919061507a565b11156130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c690615142565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661315b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315290615869565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000038161318633612ecc565b613190919061507a565b11156131d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c89061521a565b60405180910390fd5b600081600b546131e1919061523a565b905080341015613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d906152e0565b60405180910390fd5b613230338361349d565b5050565b61323c6133e3565b73ffffffffffffffffffffffffffffffffffffffff1661325a6121f9565b73ffffffffffffffffffffffffffffffffffffffff16146132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a7906153b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361331f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613316906158fb565b60405180910390fd5b61332881613c3e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816133a06134bb565b111580156133af575060015482105b80156133dc575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6134b7828260405180602001604052806000815250614126565b5050565b600090565b60006134cb826139af565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166134f26133e3565b73ffffffffffffffffffffffffffffffffffffffff1614806135255750613524826000015161351f6133e3565b612f77565b5b8061356a57506135336133e3565b73ffffffffffffffffffffffffffffffffffffffff1661355284610e28565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806135a3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461360c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613672576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61367f8585856001614138565b61368f60008484600001516133eb565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361393f5760015481101561393e5782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139a8858585600161413e565b5050505050565b6139b7614595565b6000829050806139c56134bb565b111580156139d4575060015481105b15613c07576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613c0557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613ae9578092505050613c39565b5b600115613c0457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613bff578092505050613c39565b613aea565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d3b6133e3565b8786866040518563ffffffff1660e01b8152600401613d5d9493929190615970565b6020604051808303816000875af1925050508015613d9957506040513d601f19601f82011682018060405250810190613d9691906159d1565b60015b613e12573d8060008114613dc9576040519150601f19603f3d011682016040523d82523d6000602084013e613dce565b606091505b506000815103613e0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060118054613e7490614fae565b80601f0160208091040260200160405190810160405280929190818152602001828054613ea090614fae565b8015613eed5780601f10613ec257610100808354040283529160200191613eed565b820191906000526020600020905b815481529060010190602001808311613ed057829003601f168201915b5050505050905090565b606060008203613f3e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614052565b600082905060005b60008214613f70578080613f5990615407565b915050600a82613f699190615a2d565b9150613f46565b60008167ffffffffffffffff811115613f8c57613f8b614959565b5b6040519080825280601f01601f191660200182016040528015613fbe5781602001600182028036833780820191505090505b5090505b6000851461404b57600182613fd79190615593565b9150600a85613fe69190615a5e565b6030613ff2919061507a565b60f81b818381518110614008576140076153d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856140449190615a2d565b9450613fc2565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036140be576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6141338383836001614144565b505050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036141b1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036141eb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141f86000868387614138565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156143c257506143c18773ffffffffffffffffffffffffffffffffffffffff16613d02565b5b15614487575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46144376000888480600101955088613d15565b61446d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036143c857826001541461448257600080fd5b6144f2565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203614488575b816001819055505050614508600086838761413e565b5050505050565b82805461451b90614fae565b90600052602060002090601f01602090048101928261453d5760008555614584565b82601f1061455657803560ff1916838001178555614584565b82800160010185558215614584579182015b82811115614583578235825591602001919060010190614568565b5b50905061459191906145d8565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156145f15760008160009055506001016145d9565b5090565b6000819050919050565b614608816145f5565b82525050565b600060208201905061462360008301846145ff565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146728161463d565b811461467d57600080fd5b50565b60008135905061468f81614669565b92915050565b6000602082840312156146ab576146aa614633565b5b60006146b984828501614680565b91505092915050565b60008115159050919050565b6146d7816146c2565b82525050565b60006020820190506146f260008301846146ce565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614732578082015181840152602081019050614717565b83811115614741576000848401525b50505050565b6000601f19601f8301169050919050565b6000614763826146f8565b61476d8185614703565b935061477d818560208601614714565b61478681614747565b840191505092915050565b600060208201905081810360008301526147ab8184614758565b905092915050565b6147bc816145f5565b81146147c757600080fd5b50565b6000813590506147d9816147b3565b92915050565b6000602082840312156147f5576147f4614633565b5b6000614803848285016147ca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148378261480c565b9050919050565b6148478161482c565b82525050565b6000602082019050614862600083018461483e565b92915050565b6148718161482c565b811461487c57600080fd5b50565b60008135905061488e81614868565b92915050565b600080604083850312156148ab576148aa614633565b5b60006148b98582860161487f565b92505060206148ca858286016147ca565b9150509250929050565b6000602082840312156148ea576148e9614633565b5b60006148f88482850161487f565b91505092915050565b60008060006060848603121561491a57614919614633565b5b60006149288682870161487f565b93505060206149398682870161487f565b925050604061494a868287016147ca565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61499182614747565b810181811067ffffffffffffffff821117156149b0576149af614959565b5b80604052505050565b60006149c3614629565b90506149cf8282614988565b919050565b600067ffffffffffffffff8211156149ef576149ee614959565b5b602082029050602081019050919050565b600080fd5b6000614a18614a13846149d4565b6149b9565b90508083825260208201905060208402830185811115614a3b57614a3a614a00565b5b835b81811015614a645780614a50888261487f565b845260208401935050602081019050614a3d565b5050509392505050565b600082601f830112614a8357614a82614954565b5b8135614a93848260208601614a05565b91505092915050565b614aa5816146c2565b8114614ab057600080fd5b50565b600081359050614ac281614a9c565b92915050565b60008060408385031215614adf57614ade614633565b5b600083013567ffffffffffffffff811115614afd57614afc614638565b5b614b0985828601614a6e565b9250506020614b1a85828601614ab3565b9150509250929050565b600060208284031215614b3a57614b39614633565b5b6000614b4884828501614ab3565b91505092915050565b600080fd5b60008083601f840112614b6c57614b6b614954565b5b8235905067ffffffffffffffff811115614b8957614b88614b51565b5b602083019150836001820283011115614ba557614ba4614a00565b5b9250929050565b60008060208385031215614bc357614bc2614633565b5b600083013567ffffffffffffffff811115614be157614be0614638565b5b614bed85828601614b56565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110614c3957614c38614bf9565b5b50565b6000819050614c4a82614c28565b919050565b6000614c5a82614c3c565b9050919050565b614c6a81614c4f565b82525050565b6000602082019050614c856000830184614c61565b92915050565b60008060408385031215614ca257614ca1614633565b5b6000614cb08582860161487f565b9250506020614cc185828601614ab3565b9150509250929050565b600080fd5b600067ffffffffffffffff821115614ceb57614cea614959565b5b614cf482614747565b9050602081019050919050565b82818337600083830152505050565b6000614d23614d1e84614cd0565b6149b9565b905082815260208101848484011115614d3f57614d3e614ccb565b5b614d4a848285614d01565b509392505050565b600082601f830112614d6757614d66614954565b5b8135614d77848260208601614d10565b91505092915050565b60008060008060808587031215614d9a57614d99614633565b5b6000614da88782880161487f565b9450506020614db98782880161487f565b9350506040614dca878288016147ca565b925050606085013567ffffffffffffffff811115614deb57614dea614638565b5b614df787828801614d52565b91505092959194509250565b60008060408385031215614e1a57614e19614633565b5b600083013567ffffffffffffffff811115614e3857614e37614638565b5b614e4485828601614a6e565b9250506020614e55858286016147ca565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e94816145f5565b82525050565b6000614ea68383614e8b565b60208301905092915050565b6000602082019050919050565b6000614eca82614e5f565b614ed48185614e6a565b9350614edf83614e7b565b8060005b83811015614f10578151614ef78882614e9a565b9750614f0283614eb2565b925050600181019050614ee3565b5085935050505092915050565b60006020820190508181036000830152614f378184614ebf565b905092915050565b60008060408385031215614f5657614f55614633565b5b6000614f648582860161487f565b9250506020614f758582860161487f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614fc657607f821691505b602082108103614fd957614fd8614f7f565b5b50919050565b7f73696c7665722073616c65206e6f742061637469766500000000000000000000600082015250565b6000615015601683614703565b915061502082614fdf565b602082019050919050565b6000602082019050818103600083015261504481615008565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615085826145f5565b9150615090836145f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150c5576150c461504b565b5b828201905092915050565b7f6e6f7420656e6f7567682072656d61696e696e6720746f20737570706f72742060008201527f64657369726564206d696e7420616d6f756e7400000000000000000000000000602082015250565b600061512c603383614703565b9150615137826150d0565b604082019050919050565b6000602082019050818103600083015261515b8161511f565b9050919050565b7f6e6f7420656c696769626c6520666f722073696c766572206d696e7400000000600082015250565b6000615198601c83614703565b91506151a382615162565b602082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000615204601683614703565b915061520f826151ce565b602082019050919050565b60006020820190508181036000830152615233816151f7565b9050919050565b6000615245826145f5565b9150615250836145f5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152895761528861504b565b5b828202905092915050565b7f6e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b60006152ca600e83614703565b91506152d582615294565b602082019050919050565b600060208201905081810360008301526152f9816152bd565b9050919050565b7f7075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b6000615336601683614703565b915061534182615300565b602082019050919050565b6000602082019050818103600083015261536581615329565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153a2602083614703565b91506153ad8261536c565b602082019050919050565b600060208201905081810360008301526153d181615395565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615412826145f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036154445761544361504b565b5b600182019050919050565b7f6e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b6000615485601183614703565b91506154908261544f565b602082019050919050565b600060208201905081810360008301526154b481615478565b9050919050565b7f6d61726b65742073616c65206e6f742061637469766500000000000000000000600082015250565b60006154f1601683614703565b91506154fc826154bb565b602082019050919050565b60006020820190508181036000830152615520816154e4565b9050919050565b7f6e6f7420656c696769626c6520666f72206d61726b6574696e67206d696e7400600082015250565b600061555d601f83614703565b915061556882615527565b602082019050919050565b6000602082019050818103600083015261558c81615550565b9050919050565b600061559e826145f5565b91506155a9836145f5565b9250828210156155bc576155bb61504b565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006155fd601f83614703565b9150615608826155c7565b602082019050919050565b6000602082019050818103600083015261562c816155f0565b9050919050565b600081905092915050565b50565b600061564e600083615633565b91506156598261563e565b600082019050919050565b600061566f82615641565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006156af601083614703565b91506156ba82615679565b602082019050919050565b600060208201905081810360008301526156de816156a2565b9050919050565b600081905092915050565b60006156fb826146f8565b61570581856156e5565b9350615715818560208601614714565b80840191505092915050565b600061572d82856156f0565b915061573982846156f0565b91508190509392505050565b7f70726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b600061577b601283614703565b915061578682615745565b602082019050919050565b600060208201905081810360008301526157aa8161576e565b9050919050565b7f676f6c642073616c65206e6f7420616374697665000000000000000000000000600082015250565b60006157e7601483614703565b91506157f2826157b1565b602082019050919050565b60006020820190508181036000830152615816816157da565b9050919050565b7f6e6f7420656c696769626c6520666f7220676f6c64206d696e74000000000000600082015250565b6000615853601a83614703565b915061585e8261581d565b602082019050919050565b6000602082019050818103600083015261588281615846565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006158e5602683614703565b91506158f082615889565b604082019050919050565b60006020820190508181036000830152615914816158d8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159428261591b565b61594c8185615926565b935061595c818560208601614714565b61596581614747565b840191505092915050565b6000608082019050615985600083018761483e565b615992602083018661483e565b61599f60408301856145ff565b81810360608301526159b18184615937565b905095945050505050565b6000815190506159cb81614669565b92915050565b6000602082840312156159e7576159e6614633565b5b60006159f5848285016159bc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a38826145f5565b9150615a43836145f5565b925082615a5357615a526159fe565b5b828204905092915050565b6000615a69826145f5565b9150615a74836145f5565b925082615a8457615a836159fe565b5b82820690509291505056fea2646970667358221220aaa0603c59778c80b2a7838d29418268ba89201d3d6fb5283b0d3828ccb0930064736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000125c00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : maxSupply_ (uint256): 4700
Arg [1] : marketingSupply_ (uint256): 100
Arg [2] : maxPerAddressDuringMint_ (uint256): 3

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000125c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003


Deployed Bytecode Sourcemap

49135:8576:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49586:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27553:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30938:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32441:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32004:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51551:548;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49781:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26802:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33298:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50524:477;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55145:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54242:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55407:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53710:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33539:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55511:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49829:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49661:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57358:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55751:664;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49511:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49466:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30747:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54952:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49699:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52654:863;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27922:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48434:94;;;;;;;;;;;;;:::i;:::-;;49882:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53952:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49374:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47783:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31107:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32717:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53825:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49555:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57525:183;;;;;;;;;;;;;:::i;:::-;;33795:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49620:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54736:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54417:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54132:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49738:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31282:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52105:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56534:645;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49927:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54537:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49427:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56421:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53583:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33067:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51007:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48683:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49586:27;;;;:::o;27553:305::-;27655:4;27707:25;27692:40;;;:11;:40;;;;:105;;;;27764:33;27749:48;;;:11;:48;;;;27692:105;:158;;;;27814:36;27838:11;27814:23;:36::i;:::-;27692:158;27672:178;;27553:305;;;:::o;30938:100::-;30992:13;31025:5;31018:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30938:100;:::o;32441:204::-;32509:7;32534:16;32542:7;32534;:16::i;:::-;32529:64;;32559:34;;;;;;;;;;;;;;32529:64;32613:15;:24;32629:7;32613:24;;;;;;;;;;;;;;;;;;;;;32606:31;;32441:204;;;:::o;32004:371::-;32077:13;32093:24;32109:7;32093:15;:24::i;:::-;32077:40;;32138:5;32132:11;;:2;:11;;;32128:48;;32152:24;;;;;;;;;;;;;;32128:48;32209:5;32193:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;32219:37;32236:5;32243:12;:10;:12::i;:::-;32219:16;:37::i;:::-;32218:38;32193:63;32189:138;;;32280:35;;;;;;;;;;;;;;32189:138;32339:28;32348:2;32352:7;32361:5;32339:8;:28::i;:::-;32066:309;32004:371;;:::o;51551:548::-;51621:16;;;;;;;;;;;51613:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51707:12;51695:8;51679:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;51671:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;51790:10;:22;51801:10;51790:22;;;;;;;;;;;;;;;;;;;;;;;;;51782:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51899:23;51887:8;51860:24;51873:10;51860:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;51852:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51956:17;51991:8;51976:12;;:23;;;;:::i;:::-;51956:43;;52027:9;52014;:22;;52006:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52062:31;52072:10;52084:8;52062:9;:31::i;:::-;51606:493;51551:548;:::o;49781:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;26802:303::-;26846:7;27071:15;:13;:15::i;:::-;27056:12;;27040:13;;:28;:46;27033:53;;26802:303;:::o;33298:170::-;33432:28;33442:4;33448:2;33452:7;33432:9;:28::i;:::-;33298:170;;;:::o;50524:477::-;50594:16;;;;;;;;;;;50586:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50680:12;50668:8;50652:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;50644:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;50802:23;50790:8;50763:24;50776:10;50763:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;50755:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50859:17;50893:8;50879:11;;:22;;;;:::i;:::-;50859:42;;50929:9;50916;:22;;50908:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50964:31;50974:10;50986:8;50964:9;:31::i;:::-;50579:422;50524:477;:::o;55145:191::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55240:9:::1;55235:96;55259:9;:16;55255:1;:20;55235:96;;;55318:5;55291:10;:24;55302:9;55312:1;55302:12;;;;;;;;:::i;:::-;;;;;;;;55291:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;55277:3;;;;;:::i;:::-;;;;55235:96;;;;55145:191:::0;;:::o;54242:108::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54331:13:::1;54316:12;:28;;;;54242:108:::0;:::o;55407:98::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55468:31:::1;55478:10;55490:8;55468:9;:31::i;:::-;55407:98:::0;:::o;53710:109::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53799:14:::1;53783:13;;:30;;;;;;;;;;;;;;;;;;53710:109:::0;:::o;33539:185::-;33677:39;33694:4;33700:2;33704:7;33677:39;;;;;;;;;;;;:16;:39::i;:::-;33539:185;;;:::o;55511:171::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55617:9:::1;55607:6;55591:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;55583:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55655:21;55665:2;55669:6;55655:9;:21::i;:::-;55511:171:::0;;:::o;49829:48::-;;;;;;;;;;;;;;;;;:::o;49661:33::-;;;;;;;;;;;;;:::o;57358:100::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57445:7:::1;;57429:13;:23;;;;;;;:::i;:::-;;57358:100:::0;;:::o;55751:664::-;55814:16;55865:4;55845:24;;:16;;;;;;;;;;;:24;;;55841:77;;55887:23;55880:30;;;;55841:77;55953:1;55930:13;:20;55944:5;55930:20;;;;;;;;;;;;;;;;:24;:50;;;;;55976:4;55958:22;;:14;;;;;;;;;;;:22;;;55930:50;55926:106;;;55998:26;55991:33;;;;55926:106;56063:4;56044:23;;:8;:15;56053:5;56044:15;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;:49;;;;;56089:4;56071:22;;:14;;;;;;;;;;;:22;;;56044:49;56040:100;;;56111:21;56104:28;;;;56040:100;56173:4;56152:25;;:10;:17;56163:5;56152:17;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;:53;;;;;56201:4;56181:24;;:16;;;;;;;;;;;:24;;;56152:53;56148:106;;;56223:23;56216:30;;;;56148:106;56288:4;56266:26;;:11;:18;56278:5;56266:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;:51;;;;;56313:4;56296:21;;:13;;;;;;;;;;;:21;;;56266:51;56262:105;;;56335:24;56328:31;;;;56262:105;56382:27;56375:34;;55751:664;;;;:::o;49511:37::-;;;:::o;49466:40::-;;;:::o;30747:124::-;30811:7;30838:20;30850:7;30838:11;:20::i;:::-;:25;;;30831:32;;30747:124;;;:::o;54952:187::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55045:9:::1;55040:94;55064:9;:16;55060:1;:20;55040:94;;;55121:5;55096:8;:22;55105:9;55115:1;55105:12;;;;;;;;:::i;:::-;;;;;;;;55096:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;55082:3;;;;;:::i;:::-;;;;55040:94;;;;54952:187:::0;;:::o;49699:34::-;;;;;;;;;;;;;:::o;52654:863::-;52727:14;;;;;;;;;;;52719:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52811:12;52799:8;52783:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;52775:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;52922:1;52894:13;:25;52908:10;52894:25;;;;;;;;;;;;;;;;:29;52886:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53013:23;53001:8;52974:24;52987:10;52974:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;52966:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53074:17;53119:13;:25;53133:10;53119:25;;;;;;;;;;;;;;;;53108:8;:36;53104:124;;;53194:13;:25;53208:10;53194:25;;;;;;;;;;;;;;;;53183:8;:36;;;;:::i;:::-;53167:12;;:53;;;;:::i;:::-;53155:65;;53104:124;53257:9;53244;:22;;53236:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;53292:31;53302:10;53314:8;53292:9;:31::i;:::-;53348:13;:25;53362:10;53348:25;;;;;;;;;;;;;;;;53336:8;:37;53332:176;;53412:1;53384:13;:25;53398:10;53384:25;;;;;;;;;;;;;;;:29;;;;53332:176;;;53492:8;53464:13;:25;53478:10;53464:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;53436:13;:25;53450:10;53436:25;;;;;;;;;;;;;;;:64;;;;53332:176;52712:805;52654:863;:::o;27922:206::-;27986:7;28027:1;28010:19;;:5;:19;;;28006:60;;28038:28;;;;;;;;;;;;;;28006:60;28092:12;:19;28105:5;28092:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28084:36;;28077:43;;27922:206;;;:::o;48434:94::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48499:21:::1;48517:1;48499:9;:21::i;:::-;48434:94::o:0;49882:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;53952:113::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54044:15:::1;54027:14;;:32;;;;;;;;;;;;;;;;;;53952:113:::0;:::o;49374:48::-;;;:::o;47783:87::-;47829:7;47856:6;;;;;;;;;;;47849:13;;47783:87;:::o;31107:104::-;31163:13;31196:7;31189:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31107:104;:::o;32717:279::-;32820:12;:10;:12::i;:::-;32808:24;;:8;:24;;;32804:54;;32841:17;;;;;;;;;;;;;;32804:54;32916:8;32871:18;:32;32890:12;:10;:12::i;:::-;32871:32;;;;;;;;;;;;;;;:42;32904:8;32871:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32969:8;32940:48;;32955:12;:10;:12::i;:::-;32940:48;;;32979:8;32940:48;;;;;;:::i;:::-;;;;;;;;32717:279;;:::o;53825:121::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53923:17:::1;53904:16;;:36;;;;;;;;;;;;;;;;;;53825:121:::0;:::o;49555:26::-;;;;:::o;57525:183::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21277:1:::1;21875:7;;:19:::0;21867:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21277:1;22008:7;:18;;;;57590:12:::2;57608:10;:15;;57632:21;57608:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57589:70;;;57674:7;57666:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57582:126;21233:1:::1;22187:7;:22;;;;57525:183::o:0;33795:369::-;33962:28;33972:4;33978:2;33982:7;33962:9;:28::i;:::-;34005:15;:2;:13;;;:15::i;:::-;:76;;;;;34025:56;34056:4;34062:2;34066:7;34075:5;34025:30;:56::i;:::-;34024:57;34005:76;34001:156;;;34105:40;;;;;;;;;;;;;;34001:156;33795:369;;;;:::o;49620:36::-;;;;;;;;;;;;;:::o;54736:210::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54844:9:::1;54839:102;54863:9;:16;54859:1;:20;54839:102;;;54925:8;54895:13;:27;54909:9;54919:1;54909:12;;;;;;;;:::i;:::-;;;;;;;;54895:27;;;;;;;;;;;;;;;:38;;;;54881:3;;;;;:::i;:::-;;;;54839:102;;;;54736:210:::0;;:::o;54417:114::-;54482:7;54505:13;:20;54519:5;54505:20;;;;;;;;;;;;;;;;54498:27;;54417:114;;;:::o;54132:104::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54218:12:::1;54204:11;:26;;;;54132:104:::0;:::o;49738:36::-;;;;;;;;;;;;;:::o;31282:318::-;31355:13;31386:16;31394:7;31386;:16::i;:::-;31381:59;;31411:29;;;;;;;;;;;;;;31381:59;31453:21;31477:10;:8;:10::i;:::-;31453:34;;31530:1;31511:7;31505:21;:26;:87;;;;;;;;;;;;;;;;;31558:7;31567:18;:7;:16;:18::i;:::-;31541:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31505:87;31498:94;;;31282:318;;;:::o;52105:543::-;52176:13;;;;;;;;;;;52168:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52255:12;52243:8;52227:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;52219:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;52338:11;:23;52350:10;52338:23;;;;;;;;;;;;;;;;;;;;;;;;;52330:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;52448:23;52436:8;52409:24;52422:10;52409:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;52401:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;52505:17;52540:8;52525:12;;:23;;;;:::i;:::-;52505:43;;52576:9;52563;:22;;52555:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52611:31;52621:10;52633:8;52611:9;:31::i;:::-;52161:487;52105:543;:::o;56534:645::-;56593:16;56637:18;56672:16;56682:5;56672:9;:16::i;:::-;56658:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56637:52;;56698:11;56712:13;;56698:27;;56734:19;56762:25;56801:9;56796:354;56816:3;56812:1;:7;56796:354;;;56837:31;56871:11;:14;56883:1;56871:14;;;;;;;;;;;56837:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56900:9;:16;;;56896:55;;;56931:8;;;56896:55;56991:1;56965:28;;:9;:14;;;:28;;;56961:93;;57028:9;:14;;;57008:34;;56961:93;57089:5;57068:26;;:17;:26;;;57064:77;;57128:1;57109;57111:13;;;;;;57109:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;57064:77;56826:324;56796:354;56821:3;;;;;;;56796:354;;;;57165:1;57158:8;;;;;;56534:645;;;:::o;49927:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;54537:193::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54633:9:::1;54628:97;54652:9;:16;54648:1;:20;54628:97;;;54712:5;54684:11;:25;54696:9;54706:1;54696:12;;;;;;;;:::i;:::-;;;;;;;;54684:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;54670:3;;;;;:::i;:::-;;;;54628:97;;;;54537:193:::0;;:::o;49427:34::-;;;:::o;56421:107::-;56479:7;56502:20;56516:5;56502:13;:20::i;:::-;56495:27;;56421:107;;;:::o;53583:121::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53681:17:::1;53662:16;;:36;;;;;;;;;;;;;;;;;;53583:121:::0;:::o;33067:164::-;33164:4;33188:18;:25;33207:5;33188:25;;;;;;;;;;;;;;;:35;33214:8;33188:35;;;;;;;;;;;;;;;;;;;;;;;;;33181:42;;33067:164;;;;:::o;51007:538::-;51075:14;;;;;;;;;;;51067:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51157:12;51145:8;51129:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;51121:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;51240:8;:20;51249:10;51240:20;;;;;;;;;;;;;;;;;;;;;;;;;51232:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51345:23;51333:8;51306:24;51319:10;51306:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;51298:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51402:17;51437:8;51422:12;;:23;;;;:::i;:::-;51402:43;;51473:9;51460;:22;;51452:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51508:31;51518:10;51530:8;51508:9;:31::i;:::-;51060:485;51007:538;:::o;48683:192::-;48014:12;:10;:12::i;:::-;48003:23;;:7;:5;:7::i;:::-;:23;;;47995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48792:1:::1;48772:22;;:8;:22;;::::0;48764:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48848:19;48858:8;48848:9;:19::i;:::-;48683:192:::0;:::o;12776:157::-;12861:4;12900:25;12885:40;;;:11;:40;;;;12878:47;;12776:157;;;:::o;34419:187::-;34476:4;34519:7;34500:15;:13;:15::i;:::-;:26;;:53;;;;;34540:13;;34530:7;:23;34500:53;:98;;;;;34571:11;:20;34583:7;34571:20;;;;;;;;;;;:27;;;;;;;;;;;;34570:28;34500:98;34493:105;;34419:187;;;:::o;22849:98::-;22902:7;22929:10;22922:17;;22849:98;:::o;42030:196::-;42172:2;42145:15;:24;42161:7;42145:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42210:7;42206:2;42190:28;;42199:5;42190:28;;;;;;;;;;;;42030:196;;;:::o;34614:104::-;34683:27;34693:2;34697:8;34683:27;;;;;;;;;;;;:9;:27::i;:::-;34614:104;;:::o;26526:92::-;26582:7;26526:92;:::o;37532:2112::-;37647:35;37685:20;37697:7;37685:11;:20::i;:::-;37647:58;;37718:22;37760:13;:18;;;37744:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;37795:50;37812:13;:18;;;37832:12;:10;:12::i;:::-;37795:16;:50::i;:::-;37744:101;:154;;;;37886:12;:10;:12::i;:::-;37862:36;;:20;37874:7;37862:11;:20::i;:::-;:36;;;37744:154;37718:181;;37917:17;37912:66;;37943:35;;;;;;;;;;;;;;37912:66;38015:4;37993:26;;:13;:18;;;:26;;;37989:67;;38028:28;;;;;;;;;;;;;;37989:67;38085:1;38071:16;;:2;:16;;;38067:52;;38096:23;;;;;;;;;;;;;;38067:52;38132:43;38154:4;38160:2;38164:7;38173:1;38132:21;:43::i;:::-;38240:49;38257:1;38261:7;38270:13;:18;;;38240:8;:49::i;:::-;38615:1;38585:12;:18;38598:4;38585:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38659:1;38631:12;:16;38644:2;38631:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38705:2;38677:11;:20;38689:7;38677:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;38767:15;38722:11;:20;38734:7;38722:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;39035:19;39067:1;39057:7;:11;39035:33;;39128:1;39087:43;;:11;:24;39099:11;39087:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;39083:445;;39312:13;;39298:11;:27;39294:219;;;39382:13;:18;;;39350:11;:24;39362:11;39350:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;39465:13;:28;;;39423:11;:24;39435:11;39423:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;39294:219;39083:445;38560:979;39575:7;39571:2;39556:27;;39565:4;39556:27;;;;;;;;;;;;39594:42;39615:4;39621:2;39625:7;39634:1;39594:20;:42::i;:::-;37636:2008;;37532:2112;;;:::o;29577:1108::-;29638:21;;:::i;:::-;29672:12;29687:7;29672:22;;29755:4;29736:15;:13;:15::i;:::-;:23;;:47;;;;;29770:13;;29763:4;:20;29736:47;29732:886;;;29804:31;29838:11;:17;29850:4;29838:17;;;;;;;;;;;29804:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29879:9;:16;;;29874:729;;29950:1;29924:28;;:9;:14;;;:28;;;29920:101;;29988:9;29981:16;;;;;;29920:101;30323:261;30330:4;30323:261;;;30363:6;;;;;;;;30408:11;:17;30420:4;30408:17;;;;;;;;;;;30396:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30482:1;30456:28;;:9;:14;;;:28;;;30452:109;;30524:9;30517:16;;;;;;30452:109;30323:261;;;29874:729;29785:833;29732:886;30646:31;;;;;;;;;;;;;;29577:1108;;;;:::o;48883:173::-;48939:16;48958:6;;;;;;;;;;;48939:25;;48984:8;48975:6;;:17;;;;;;;;;;;;;;;;;;49039:8;49008:40;;49029:8;49008:40;;;;;;;;;;;;48928:128;48883:173;:::o;2836:387::-;2896:4;3104:12;3171:7;3159:20;3151:28;;3214:1;3207:4;:8;3200:15;;;2836:387;;;:::o;42718:667::-;42881:4;42918:2;42902:36;;;42939:12;:10;:12::i;:::-;42953:4;42959:7;42968:5;42902:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42898:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43153:1;43136:6;:13;:18;43132:235;;43182:40;;;;;;;;;;;;;;43132:235;43325:6;43319:13;43310:6;43306:2;43302:15;43295:38;42898:480;43031:45;;;43021:55;;;:6;:55;;;;43014:62;;;42718:667;;;;;;:::o;57244:108::-;57304:13;57333;57326:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57244:108;:::o;311:723::-;367:13;597:1;588:5;:10;584:53;;615:10;;;;;;;;;;;;;;;;;;;;;584:53;647:12;662:5;647:20;;678:14;703:78;718:1;710:4;:9;703:78;;736:8;;;;;:::i;:::-;;;;767:2;759:10;;;;;:::i;:::-;;;703:78;;;791:19;823:6;813:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:39;;841:154;857:1;848:5;:10;841:154;;885:1;875:11;;;;;:::i;:::-;;;952:2;944:5;:10;;;;:::i;:::-;931:2;:24;;;;:::i;:::-;918:39;;901:6;908;901:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;841:154;;;1019:6;1005:21;;;;;311:723;;;;:::o;28210:207::-;28271:7;28312:1;28295:19;;:5;:19;;;28291:59;;28323:27;;;;;;;;;;;;;;28291:59;28376:12;:19;28389:5;28376:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28368:41;;28361:48;;28210:207;;;:::o;35081:163::-;35204:32;35210:2;35214:8;35224:5;35231:4;35204:5;:32::i;:::-;35081:163;;;:::o;44033:159::-;;;;;:::o;44851:158::-;;;;;:::o;35503:1775::-;35642:20;35665:13;;35642:36;;35707:1;35693:16;;:2;:16;;;35689:48;;35718:19;;;;;;;;;;;;;;35689:48;35764:1;35752:8;:13;35748:44;;35774:18;;;;;;;;;;;;;;35748:44;35805:61;35835:1;35839:2;35843:12;35857:8;35805:21;:61::i;:::-;36178:8;36143:12;:16;36156:2;36143:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36242:8;36202:12;:16;36215:2;36202:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36301:2;36268:11;:25;36280:12;36268:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36368:15;36318:11;:25;36330:12;36318:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36401:20;36424:12;36401:35;;36451:11;36480:8;36465:12;:23;36451:37;;36509:4;:23;;;;;36517:15;:2;:13;;;:15::i;:::-;36509:23;36505:641;;;36553:314;36609:12;36605:2;36584:38;;36601:1;36584:38;;;;;;;;;;;;36650:69;36689:1;36693:2;36697:14;;;;;;36713:5;36650:30;:69::i;:::-;36645:174;;36755:40;;;;;;;;;;;;;;36645:174;36862:3;36846:12;:19;36553:314;;36948:12;36931:13;;:29;36927:43;;36962:8;;;36927:43;36505:641;;;37011:120;37067:14;;;;;;37063:2;37042:40;;37059:1;37042:40;;;;;;;;;;;;37126:3;37110:12;:19;37011:120;;36505:641;37176:12;37160:13;:28;;;;36118:1082;;37210:60;37239:1;37243:2;37247:12;37261:8;37210:20;:60::i;:::-;35631:1647;35503:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:116::-;8617:21;8632:5;8617:21;:::i;:::-;8610:5;8607:32;8597:60;;8653:1;8650;8643:12;8597:60;8547:116;:::o;8669:133::-;8712:5;8750:6;8737:20;8728:29;;8766:30;8790:5;8766:30;:::i;:::-;8669:133;;;;:::o;8808:678::-;8898:6;8906;8955:2;8943:9;8934:7;8930:23;8926:32;8923:119;;;8961:79;;:::i;:::-;8923:119;9109:1;9098:9;9094:17;9081:31;9139:18;9131:6;9128:30;9125:117;;;9161:79;;:::i;:::-;9125:117;9266:78;9336:7;9327:6;9316:9;9312:22;9266:78;:::i;:::-;9256:88;;9052:302;9393:2;9419:50;9461:7;9452:6;9441:9;9437:22;9419:50;:::i;:::-;9409:60;;9364:115;8808:678;;;;;:::o;9492:323::-;9548:6;9597:2;9585:9;9576:7;9572:23;9568:32;9565:119;;;9603:79;;:::i;:::-;9565:119;9723:1;9748:50;9790:7;9781:6;9770:9;9766:22;9748:50;:::i;:::-;9738:60;;9694:114;9492:323;;;;:::o;9821:117::-;9930:1;9927;9920:12;9958:553;10016:8;10026:6;10076:3;10069:4;10061:6;10057:17;10053:27;10043:122;;10084:79;;:::i;:::-;10043:122;10197:6;10184:20;10174:30;;10227:18;10219:6;10216:30;10213:117;;;10249:79;;:::i;:::-;10213:117;10363:4;10355:6;10351:17;10339:29;;10417:3;10409:4;10401:6;10397:17;10387:8;10383:32;10380:41;10377:128;;;10424:79;;:::i;:::-;10377:128;9958:553;;;;;:::o;10517:529::-;10588:6;10596;10645:2;10633:9;10624:7;10620:23;10616:32;10613:119;;;10651:79;;:::i;:::-;10613:119;10799:1;10788:9;10784:17;10771:31;10829:18;10821:6;10818:30;10815:117;;;10851:79;;:::i;:::-;10815:117;10964:65;11021:7;11012:6;11001:9;10997:22;10964:65;:::i;:::-;10946:83;;;;10742:297;10517:529;;;;;:::o;11052:180::-;11100:77;11097:1;11090:88;11197:4;11194:1;11187:15;11221:4;11218:1;11211:15;11238:126;11332:1;11325:5;11322:12;11312:46;;11338:18;;:::i;:::-;11312:46;11238:126;:::o;11370:153::-;11428:7;11457:5;11446:16;;11463:54;11511:5;11463:54;:::i;:::-;11370:153;;;:::o;11529:::-;11598:9;11631:45;11670:5;11631:45;:::i;:::-;11618:58;;11529:153;;;:::o;11688:169::-;11794:56;11844:5;11794:56;:::i;:::-;11789:3;11782:69;11688:169;;:::o;11863:260::-;11975:4;12013:2;12002:9;11998:18;11990:26;;12026:90;12113:1;12102:9;12098:17;12089:6;12026:90;:::i;:::-;11863:260;;;;:::o;12129:468::-;12194:6;12202;12251:2;12239:9;12230:7;12226:23;12222:32;12219:119;;;12257:79;;:::i;:::-;12219:119;12377:1;12402:53;12447:7;12438:6;12427:9;12423:22;12402:53;:::i;:::-;12392:63;;12348:117;12504:2;12530:50;12572:7;12563:6;12552:9;12548:22;12530:50;:::i;:::-;12520:60;;12475:115;12129:468;;;;;:::o;12603:117::-;12712:1;12709;12702:12;12726:307;12787:4;12877:18;12869:6;12866:30;12863:56;;;12899:18;;:::i;:::-;12863:56;12937:29;12959:6;12937:29;:::i;:::-;12929:37;;13021:4;13015;13011:15;13003:23;;12726:307;;;:::o;13039:154::-;13123:6;13118:3;13113;13100:30;13185:1;13176:6;13171:3;13167:16;13160:27;13039:154;;;:::o;13199:410::-;13276:5;13301:65;13317:48;13358:6;13317:48;:::i;:::-;13301:65;:::i;:::-;13292:74;;13389:6;13382:5;13375:21;13427:4;13420:5;13416:16;13465:3;13456:6;13451:3;13447:16;13444:25;13441:112;;;13472:79;;:::i;:::-;13441:112;13562:41;13596:6;13591:3;13586;13562:41;:::i;:::-;13282:327;13199:410;;;;;:::o;13628:338::-;13683:5;13732:3;13725:4;13717:6;13713:17;13709:27;13699:122;;13740:79;;:::i;:::-;13699:122;13857:6;13844:20;13882:78;13956:3;13948:6;13941:4;13933:6;13929:17;13882:78;:::i;:::-;13873:87;;13689:277;13628:338;;;;:::o;13972:943::-;14067:6;14075;14083;14091;14140:3;14128:9;14119:7;14115:23;14111:33;14108:120;;;14147:79;;:::i;:::-;14108:120;14267:1;14292:53;14337:7;14328:6;14317:9;14313:22;14292:53;:::i;:::-;14282:63;;14238:117;14394:2;14420:53;14465:7;14456:6;14445:9;14441:22;14420:53;:::i;:::-;14410:63;;14365:118;14522:2;14548:53;14593:7;14584:6;14573:9;14569:22;14548:53;:::i;:::-;14538:63;;14493:118;14678:2;14667:9;14663:18;14650:32;14709:18;14701:6;14698:30;14695:117;;;14731:79;;:::i;:::-;14695:117;14836:62;14890:7;14881:6;14870:9;14866:22;14836:62;:::i;:::-;14826:72;;14621:287;13972:943;;;;;;;:::o;14921:684::-;15014:6;15022;15071:2;15059:9;15050:7;15046:23;15042:32;15039:119;;;15077:79;;:::i;:::-;15039:119;15225:1;15214:9;15210:17;15197:31;15255:18;15247:6;15244:30;15241:117;;;15277:79;;:::i;:::-;15241:117;15382:78;15452:7;15443:6;15432:9;15428:22;15382:78;:::i;:::-;15372:88;;15168:302;15509:2;15535:53;15580:7;15571:6;15560:9;15556:22;15535:53;:::i;:::-;15525:63;;15480:118;14921:684;;;;;:::o;15611:114::-;15678:6;15712:5;15706:12;15696:22;;15611:114;;;:::o;15731:184::-;15830:11;15864:6;15859:3;15852:19;15904:4;15899:3;15895:14;15880:29;;15731:184;;;;:::o;15921:132::-;15988:4;16011:3;16003:11;;16041:4;16036:3;16032:14;16024:22;;15921:132;;;:::o;16059:108::-;16136:24;16154:5;16136:24;:::i;:::-;16131:3;16124:37;16059:108;;:::o;16173:179::-;16242:10;16263:46;16305:3;16297:6;16263:46;:::i;:::-;16341:4;16336:3;16332:14;16318:28;;16173:179;;;;:::o;16358:113::-;16428:4;16460;16455:3;16451:14;16443:22;;16358:113;;;:::o;16507:732::-;16626:3;16655:54;16703:5;16655:54;:::i;:::-;16725:86;16804:6;16799:3;16725:86;:::i;:::-;16718:93;;16835:56;16885:5;16835:56;:::i;:::-;16914:7;16945:1;16930:284;16955:6;16952:1;16949:13;16930:284;;;17031:6;17025:13;17058:63;17117:3;17102:13;17058:63;:::i;:::-;17051:70;;17144:60;17197:6;17144:60;:::i;:::-;17134:70;;16990:224;16977:1;16974;16970:9;16965:14;;16930:284;;;16934:14;17230:3;17223:10;;16631:608;;;16507:732;;;;:::o;17245:373::-;17388:4;17426:2;17415:9;17411:18;17403:26;;17475:9;17469:4;17465:20;17461:1;17450:9;17446:17;17439:47;17503:108;17606:4;17597:6;17503:108;:::i;:::-;17495:116;;17245:373;;;;:::o;17624:474::-;17692:6;17700;17749:2;17737:9;17728:7;17724:23;17720:32;17717:119;;;17755:79;;:::i;:::-;17717:119;17875:1;17900:53;17945:7;17936:6;17925:9;17921:22;17900:53;:::i;:::-;17890:63;;17846:117;18002:2;18028:53;18073:7;18064:6;18053:9;18049:22;18028:53;:::i;:::-;18018:63;;17973:118;17624:474;;;;;:::o;18104:180::-;18152:77;18149:1;18142:88;18249:4;18246:1;18239:15;18273:4;18270:1;18263:15;18290:320;18334:6;18371:1;18365:4;18361:12;18351:22;;18418:1;18412:4;18408:12;18439:18;18429:81;;18495:4;18487:6;18483:17;18473:27;;18429:81;18557:2;18549:6;18546:14;18526:18;18523:38;18520:84;;18576:18;;:::i;:::-;18520:84;18341:269;18290:320;;;:::o;18616:172::-;18756:24;18752:1;18744:6;18740:14;18733:48;18616:172;:::o;18794:366::-;18936:3;18957:67;19021:2;19016:3;18957:67;:::i;:::-;18950:74;;19033:93;19122:3;19033:93;:::i;:::-;19151:2;19146:3;19142:12;19135:19;;18794:366;;;:::o;19166:419::-;19332:4;19370:2;19359:9;19355:18;19347:26;;19419:9;19413:4;19409:20;19405:1;19394:9;19390:17;19383:47;19447:131;19573:4;19447:131;:::i;:::-;19439:139;;19166:419;;;:::o;19591:180::-;19639:77;19636:1;19629:88;19736:4;19733:1;19726:15;19760:4;19757:1;19750:15;19777:305;19817:3;19836:20;19854:1;19836:20;:::i;:::-;19831:25;;19870:20;19888:1;19870:20;:::i;:::-;19865:25;;20024:1;19956:66;19952:74;19949:1;19946:81;19943:107;;;20030:18;;:::i;:::-;19943:107;20074:1;20071;20067:9;20060:16;;19777:305;;;;:::o;20088:238::-;20228:34;20224:1;20216:6;20212:14;20205:58;20297:21;20292:2;20284:6;20280:15;20273:46;20088:238;:::o;20332:366::-;20474:3;20495:67;20559:2;20554:3;20495:67;:::i;:::-;20488:74;;20571:93;20660:3;20571:93;:::i;:::-;20689:2;20684:3;20680:12;20673:19;;20332:366;;;:::o;20704:419::-;20870:4;20908:2;20897:9;20893:18;20885:26;;20957:9;20951:4;20947:20;20943:1;20932:9;20928:17;20921:47;20985:131;21111:4;20985:131;:::i;:::-;20977:139;;20704:419;;;:::o;21129:178::-;21269:30;21265:1;21257:6;21253:14;21246:54;21129:178;:::o;21313:366::-;21455:3;21476:67;21540:2;21535:3;21476:67;:::i;:::-;21469:74;;21552:93;21641:3;21552:93;:::i;:::-;21670:2;21665:3;21661:12;21654:19;;21313:366;;;:::o;21685:419::-;21851:4;21889:2;21878:9;21874:18;21866:26;;21938:9;21932:4;21928:20;21924:1;21913:9;21909:17;21902:47;21966:131;22092:4;21966:131;:::i;:::-;21958:139;;21685:419;;;:::o;22110:172::-;22250:24;22246:1;22238:6;22234:14;22227:48;22110:172;:::o;22288:366::-;22430:3;22451:67;22515:2;22510:3;22451:67;:::i;:::-;22444:74;;22527:93;22616:3;22527:93;:::i;:::-;22645:2;22640:3;22636:12;22629:19;;22288:366;;;:::o;22660:419::-;22826:4;22864:2;22853:9;22849:18;22841:26;;22913:9;22907:4;22903:20;22899:1;22888:9;22884:17;22877:47;22941:131;23067:4;22941:131;:::i;:::-;22933:139;;22660:419;;;:::o;23085:348::-;23125:7;23148:20;23166:1;23148:20;:::i;:::-;23143:25;;23182:20;23200:1;23182:20;:::i;:::-;23177:25;;23370:1;23302:66;23298:74;23295:1;23292:81;23287:1;23280:9;23273:17;23269:105;23266:131;;;23377:18;;:::i;:::-;23266:131;23425:1;23422;23418:9;23407:20;;23085:348;;;;:::o;23439:164::-;23579:16;23575:1;23567:6;23563:14;23556:40;23439:164;:::o;23609:366::-;23751:3;23772:67;23836:2;23831:3;23772:67;:::i;:::-;23765:74;;23848:93;23937:3;23848:93;:::i;:::-;23966:2;23961:3;23957:12;23950:19;;23609:366;;;:::o;23981:419::-;24147:4;24185:2;24174:9;24170:18;24162:26;;24234:9;24228:4;24224:20;24220:1;24209:9;24205:17;24198:47;24262:131;24388:4;24262:131;:::i;:::-;24254:139;;23981:419;;;:::o;24406:172::-;24546:24;24542:1;24534:6;24530:14;24523:48;24406:172;:::o;24584:366::-;24726:3;24747:67;24811:2;24806:3;24747:67;:::i;:::-;24740:74;;24823:93;24912:3;24823:93;:::i;:::-;24941:2;24936:3;24932:12;24925:19;;24584:366;;;:::o;24956:419::-;25122:4;25160:2;25149:9;25145:18;25137:26;;25209:9;25203:4;25199:20;25195:1;25184:9;25180:17;25173:47;25237:131;25363:4;25237:131;:::i;:::-;25229:139;;24956:419;;;:::o;25381:182::-;25521:34;25517:1;25509:6;25505:14;25498:58;25381:182;:::o;25569:366::-;25711:3;25732:67;25796:2;25791:3;25732:67;:::i;:::-;25725:74;;25808:93;25897:3;25808:93;:::i;:::-;25926:2;25921:3;25917:12;25910:19;;25569:366;;;:::o;25941:419::-;26107:4;26145:2;26134:9;26130:18;26122:26;;26194:9;26188:4;26184:20;26180:1;26169:9;26165:17;26158:47;26222:131;26348:4;26222:131;:::i;:::-;26214:139;;25941:419;;;:::o;26366:180::-;26414:77;26411:1;26404:88;26511:4;26508:1;26501:15;26535:4;26532:1;26525:15;26552:233;26591:3;26614:24;26632:5;26614:24;:::i;:::-;26605:33;;26660:66;26653:5;26650:77;26647:103;;26730:18;;:::i;:::-;26647:103;26777:1;26770:5;26766:13;26759:20;;26552:233;;;:::o;26791:167::-;26931:19;26927:1;26919:6;26915:14;26908:43;26791:167;:::o;26964:366::-;27106:3;27127:67;27191:2;27186:3;27127:67;:::i;:::-;27120:74;;27203:93;27292:3;27203:93;:::i;:::-;27321:2;27316:3;27312:12;27305:19;;26964:366;;;:::o;27336:419::-;27502:4;27540:2;27529:9;27525:18;27517:26;;27589:9;27583:4;27579:20;27575:1;27564:9;27560:17;27553:47;27617:131;27743:4;27617:131;:::i;:::-;27609:139;;27336:419;;;:::o;27761:172::-;27901:24;27897:1;27889:6;27885:14;27878:48;27761:172;:::o;27939:366::-;28081:3;28102:67;28166:2;28161:3;28102:67;:::i;:::-;28095:74;;28178:93;28267:3;28178:93;:::i;:::-;28296:2;28291:3;28287:12;28280:19;;27939:366;;;:::o;28311:419::-;28477:4;28515:2;28504:9;28500:18;28492:26;;28564:9;28558:4;28554:20;28550:1;28539:9;28535:17;28528:47;28592:131;28718:4;28592:131;:::i;:::-;28584:139;;28311:419;;;:::o;28736:181::-;28876:33;28872:1;28864:6;28860:14;28853:57;28736:181;:::o;28923:366::-;29065:3;29086:67;29150:2;29145:3;29086:67;:::i;:::-;29079:74;;29162:93;29251:3;29162:93;:::i;:::-;29280:2;29275:3;29271:12;29264:19;;28923:366;;;:::o;29295:419::-;29461:4;29499:2;29488:9;29484:18;29476:26;;29548:9;29542:4;29538:20;29534:1;29523:9;29519:17;29512:47;29576:131;29702:4;29576:131;:::i;:::-;29568:139;;29295:419;;;:::o;29720:191::-;29760:4;29780:20;29798:1;29780:20;:::i;:::-;29775:25;;29814:20;29832:1;29814:20;:::i;:::-;29809:25;;29853:1;29850;29847:8;29844:34;;;29858:18;;:::i;:::-;29844:34;29903:1;29900;29896:9;29888:17;;29720:191;;;;:::o;29917:181::-;30057:33;30053:1;30045:6;30041:14;30034:57;29917:181;:::o;30104:366::-;30246:3;30267:67;30331:2;30326:3;30267:67;:::i;:::-;30260:74;;30343:93;30432:3;30343:93;:::i;:::-;30461:2;30456:3;30452:12;30445:19;;30104:366;;;:::o;30476:419::-;30642:4;30680:2;30669:9;30665:18;30657:26;;30729:9;30723:4;30719:20;30715:1;30704:9;30700:17;30693:47;30757:131;30883:4;30757:131;:::i;:::-;30749:139;;30476:419;;;:::o;30901:147::-;31002:11;31039:3;31024:18;;30901:147;;;;:::o;31054:114::-;;:::o;31174:398::-;31333:3;31354:83;31435:1;31430:3;31354:83;:::i;:::-;31347:90;;31446:93;31535:3;31446:93;:::i;:::-;31564:1;31559:3;31555:11;31548:18;;31174:398;;;:::o;31578:379::-;31762:3;31784:147;31927:3;31784:147;:::i;:::-;31777:154;;31948:3;31941:10;;31578:379;;;:::o;31963:166::-;32103:18;32099:1;32091:6;32087:14;32080:42;31963:166;:::o;32135:366::-;32277:3;32298:67;32362:2;32357:3;32298:67;:::i;:::-;32291:74;;32374:93;32463:3;32374:93;:::i;:::-;32492:2;32487:3;32483:12;32476:19;;32135:366;;;:::o;32507:419::-;32673:4;32711:2;32700:9;32696:18;32688:26;;32760:9;32754:4;32750:20;32746:1;32735:9;32731:17;32724:47;32788:131;32914:4;32788:131;:::i;:::-;32780:139;;32507:419;;;:::o;32932:148::-;33034:11;33071:3;33056:18;;32932:148;;;;:::o;33086:377::-;33192:3;33220:39;33253:5;33220:39;:::i;:::-;33275:89;33357:6;33352:3;33275:89;:::i;:::-;33268:96;;33373:52;33418:6;33413:3;33406:4;33399:5;33395:16;33373:52;:::i;:::-;33450:6;33445:3;33441:16;33434:23;;33196:267;33086:377;;;;:::o;33469:435::-;33649:3;33671:95;33762:3;33753:6;33671:95;:::i;:::-;33664:102;;33783:95;33874:3;33865:6;33783:95;:::i;:::-;33776:102;;33895:3;33888:10;;33469:435;;;;;:::o;33910:168::-;34050:20;34046:1;34038:6;34034:14;34027:44;33910:168;:::o;34084:366::-;34226:3;34247:67;34311:2;34306:3;34247:67;:::i;:::-;34240:74;;34323:93;34412:3;34323:93;:::i;:::-;34441:2;34436:3;34432:12;34425:19;;34084:366;;;:::o;34456:419::-;34622:4;34660:2;34649:9;34645:18;34637:26;;34709:9;34703:4;34699:20;34695:1;34684:9;34680:17;34673:47;34737:131;34863:4;34737:131;:::i;:::-;34729:139;;34456:419;;;:::o;34881:170::-;35021:22;35017:1;35009:6;35005:14;34998:46;34881:170;:::o;35057:366::-;35199:3;35220:67;35284:2;35279:3;35220:67;:::i;:::-;35213:74;;35296:93;35385:3;35296:93;:::i;:::-;35414:2;35409:3;35405:12;35398:19;;35057:366;;;:::o;35429:419::-;35595:4;35633:2;35622:9;35618:18;35610:26;;35682:9;35676:4;35672:20;35668:1;35657:9;35653:17;35646:47;35710:131;35836:4;35710:131;:::i;:::-;35702:139;;35429:419;;;:::o;35854:176::-;35994:28;35990:1;35982:6;35978:14;35971:52;35854:176;:::o;36036:366::-;36178:3;36199:67;36263:2;36258:3;36199:67;:::i;:::-;36192:74;;36275:93;36364:3;36275:93;:::i;:::-;36393:2;36388:3;36384:12;36377:19;;36036:366;;;:::o;36408:419::-;36574:4;36612:2;36601:9;36597:18;36589:26;;36661:9;36655:4;36651:20;36647:1;36636:9;36632:17;36625:47;36689:131;36815:4;36689:131;:::i;:::-;36681:139;;36408:419;;;:::o;36833:225::-;36973:34;36969:1;36961:6;36957:14;36950:58;37042:8;37037:2;37029:6;37025:15;37018:33;36833:225;:::o;37064:366::-;37206:3;37227:67;37291:2;37286:3;37227:67;:::i;:::-;37220:74;;37303:93;37392:3;37303:93;:::i;:::-;37421:2;37416:3;37412:12;37405:19;;37064:366;;;:::o;37436:419::-;37602:4;37640:2;37629:9;37625:18;37617:26;;37689:9;37683:4;37679:20;37675:1;37664:9;37660:17;37653:47;37717:131;37843:4;37717:131;:::i;:::-;37709:139;;37436:419;;;:::o;37861:98::-;37912:6;37946:5;37940:12;37930:22;;37861:98;;;:::o;37965:168::-;38048:11;38082:6;38077:3;38070:19;38122:4;38117:3;38113:14;38098:29;;37965:168;;;;:::o;38139:360::-;38225:3;38253:38;38285:5;38253:38;:::i;:::-;38307:70;38370:6;38365:3;38307:70;:::i;:::-;38300:77;;38386:52;38431:6;38426:3;38419:4;38412:5;38408:16;38386:52;:::i;:::-;38463:29;38485:6;38463:29;:::i;:::-;38458:3;38454:39;38447:46;;38229:270;38139:360;;;;:::o;38505:640::-;38700:4;38738:3;38727:9;38723:19;38715:27;;38752:71;38820:1;38809:9;38805:17;38796:6;38752:71;:::i;:::-;38833:72;38901:2;38890:9;38886:18;38877:6;38833:72;:::i;:::-;38915;38983:2;38972:9;38968:18;38959:6;38915:72;:::i;:::-;39034:9;39028:4;39024:20;39019:2;39008:9;39004:18;38997:48;39062:76;39133:4;39124:6;39062:76;:::i;:::-;39054:84;;38505:640;;;;;;;:::o;39151:141::-;39207:5;39238:6;39232:13;39223:22;;39254:32;39280:5;39254:32;:::i;:::-;39151:141;;;;:::o;39298:349::-;39367:6;39416:2;39404:9;39395:7;39391:23;39387:32;39384:119;;;39422:79;;:::i;:::-;39384:119;39542:1;39567:63;39622:7;39613:6;39602:9;39598:22;39567:63;:::i;:::-;39557:73;;39513:127;39298:349;;;;:::o;39653:180::-;39701:77;39698:1;39691:88;39798:4;39795:1;39788:15;39822:4;39819:1;39812:15;39839:185;39879:1;39896:20;39914:1;39896:20;:::i;:::-;39891:25;;39930:20;39948:1;39930:20;:::i;:::-;39925:25;;39969:1;39959:35;;39974:18;;:::i;:::-;39959:35;40016:1;40013;40009:9;40004:14;;39839:185;;;;:::o;40030:176::-;40062:1;40079:20;40097:1;40079:20;:::i;:::-;40074:25;;40113:20;40131:1;40113:20;:::i;:::-;40108:25;;40152:1;40142:35;;40157:18;;:::i;:::-;40142:35;40198:1;40195;40191:9;40186:14;;40030:176;;;;:::o

Swarm Source

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