ETH Price: $3,291.43 (-10.46%)

Token

Shelterfrens Collection (SFNV1)
 

Overview

Max Total Supply

1,473 SFNV1

Holders

356

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
eelonmusk.eth
Balance
1 SFNV1
0x6c4f0dc727086079d053f07a5e19d866d0a176d6
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:
SFNV1MintContract

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-18
*/

// Sources flattened with hardhat v2.9.1 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File erc721a/contracts/[email protected]


// Creator: Chiru Labs

pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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


// File @openzeppelin/contracts/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File contracts/SmartContract.sol


pragma solidity ^0.8.4;



contract SFNV1MintContract is ERC721A, Ownable {

    using Strings for uint256;

    string public baseURI;
    string public uriExtension = '.json';
    string public hiddenURI;

    //***************************************************************************************************
    //Pricing
    //***************************************************************************************************
    uint256 public pricePartner = 0.02 ether; //set NFT price
    uint256 public pricePresale = 0.02 ether; //set NFT price
    uint256 public pricePublic = 0.02 ether; //set NFT price

    //***************************************************************************************************
    //Supply and Reserve
    //***************************************************************************************************
    uint256 public maxSupply = 5000; // set max supply according to your need
    uint256 public reserve = 10; // management tokens

    //***************************************************************************************************
    //Max per Wallets
    //***************************************************************************************************
    uint256 public maxPartnerMint = 3; //set how many NFTs can be minted per wallet for partner
    uint256 public maxPreSaleMint = 2; //set how many NFTs can be minted per wallet in pre sale
    uint256 public maxPublicSaleMint = 9999; //set how many NFTs can be minted per wallet in public sale

    //***************************************************************************************************
    //Sale Controls and Allow List
    //***************************************************************************************************
    bool public isPartnerSaleActive = false;
    bool public isPreSaleActive = false;
    bool public isPublicSaleActive = false;
    bool public isRevealed = false;
    bytes32 public merkleRootPartner;
    bytes32 public merkleRootPresale;

    //***************************************************************************************************
    //Owner Withdraw Address
    //***************************************************************************************************
    address public immutable ownerWithdrawAddress;

    //***************************************************************************************************
    //Developer Settings
    //***************************************************************************************************
    address public immutable devAddress;
    uint256 public immutable devShare;

    //***************************************************************************************************
    //Constructor
    //***************************************************************************************************
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _initHiddenURI
    ) ERC721A(_name, _symbol) {
        baseURI = _initBaseURI;
        hiddenURI = _initHiddenURI;
        devAddress = 0xB9cD42c60d23C5475D4B23325eD96a157B738A93; //Dev
        devShare = 10; //Dev Fee
        ownerWithdrawAddress = 0xa50D6F46c2D969F8c8C635975F6c824c1eC75EB8;//Owner
    }

    //***************************************************************************************************
    // Use #1..
    //***************************************************************************************************
    function _startTokenId() internal view virtual override returns (uint256) { return 1; }
    //***************************************************************************************************
    //Mint tokens for management (pulls a reserve amount)
    //***************************************************************************************************
    function mintReserve() external onlyOwner {
        uint256 supply = totalSupply();
        require(supply + reserve <= maxSupply,  'This transaction would exceed max supply.');

        _safeMint(msg.sender, reserve);
    }

    //***************************************************************************************************
    //Partner Mint
    //***************************************************************************************************
    function partnerMint(bytes32[] calldata __proof, uint256 __count) external payable {
        uint256 supply = totalSupply();
        uint256 tokenCount = numberMinted(msg.sender);

        require(isPartnerSaleActive,           'Partner Sale is not active');
        require(__count > 0,                   'Count can not be 0');
        require(__count <= maxPartnerMint,     string(abi.encodePacked('You can only mint ', maxPartnerMint.toString())));
        require(tokenCount + __count <= maxPartnerMint,  string(abi.encodePacked('You can only mint ', maxPartnerMint.toString())));
        require(tokenCount <= maxPartnerMint,  string(abi.encodePacked('You can only mint ', maxPartnerMint.toString())));
        require(supply + __count <= maxSupply, 'This transaction would exceed max supply.');
        require(msg.value >= pricePartner * __count,  'Ether value is too low');

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(__proof, merkleRootPartner, leaf), "Not in partner list.");

        _safeMint(msg.sender, __count);
    }

    //***************************************************************************************************
    //Presale Mint
    //***************************************************************************************************
    function preSale(bytes32[] calldata __proof, uint256 __count) external payable {
        uint256 supply = totalSupply();
        uint256 tokenCount = numberMinted(msg.sender);

        require(isPreSaleActive,               'Pre sale is not active');
        require(__count > 0,                   'Count can not be 0');
        require(__count <= maxPreSaleMint,     string(abi.encodePacked('You can only mint ', maxPreSaleMint.toString())));
        require(tokenCount + __count <= maxPreSaleMint,  string(abi.encodePacked('You can only mint ', maxPreSaleMint.toString())));
        require(tokenCount <= maxPreSaleMint,  string(abi.encodePacked('You can only mint ', maxPreSaleMint.toString())));
        require(supply + __count <= maxSupply, 'This transaction would exceed max supply.');
        require(msg.value >= pricePresale * __count,  'Ether value is too low');

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(__proof, merkleRootPresale, leaf), "Not whitelisted.");

        _safeMint(msg.sender, __count);
    }

    //***************************************************************************************************
    //Public Mint
    //***************************************************************************************************
    function publicSale(uint256 __count) external payable {
        uint256 supply = totalSupply();
        uint256 tokenCount = numberMinted(msg.sender);

        require(isPublicSaleActive,               'Public sale is not active');
        require(__count > 0,                      'Count can not be 0');
        require(__count <= maxPublicSaleMint,     string(abi.encodePacked('You can only mint ', maxPublicSaleMint.toString())));
        require(tokenCount + __count <= maxPublicSaleMint,  string(abi.encodePacked('You can only mint ', maxPublicSaleMint.toString())));
        require(tokenCount <= maxPublicSaleMint,  string(abi.encodePacked('You can only mint ', maxPublicSaleMint.toString())));
        require(supply + __count <= maxSupply,    'This transaction would exceed max supply.');
        require(msg.value >= pricePublic * __count,     'Ether value is too low');

        _safeMint(msg.sender, __count);
    }

    //***************************************************************************************************
    //***************************************************************************************************
    function gift(address _address, uint256 __count) external onlyOwner {
        uint256 supply = totalSupply();
        require(__count > 0,                      'Count can not be 0');
        require(supply + __count <= maxSupply,    'This transaction would exceed max supply.');

        _safeMint(_address, __count);
    }

    //***************************************************************************************************
    //returns baseURI of collection
    //***************************************************************************************************
    function _baseURI() internal view virtual override returns (string memory) { return baseURI; }

    //***************************************************************************************************
    // MetaData
    //***************************************************************************************************
    function tokenURI(uint256 tokenId) public view override returns (string memory) {

        // return not revealed URI
        if (!isRevealed) { return hiddenURI; }

        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        return bytes(baseURI).length != 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), uriExtension)) : '';
    }

    //***************************************************************************************************
    //Change baseURI or hiddenURI of collection
    //***************************************************************************************************
    function setBaseURI(string memory __baseURI) public onlyOwner { baseURI = __baseURI; }
    function setHiddenURI(string memory __hiddenURI) public onlyOwner { hiddenURI = __hiddenURI; }

    //***************************************************************************************************
    //Change prices of NFT
    //***************************************************************************************************
    function setPartnerPrice(uint256 __price) public onlyOwner { pricePartner = __price; }
    function setPresalePrice(uint256 __price) public onlyOwner { pricePresale = __price; }
    function setPublicPrice(uint256 __price) public onlyOwner { pricePublic = __price; }

    //***************************************************************************************************
    //Change how many NFTs can be minted per wallets
    //***************************************************************************************************
    function setMaxPartnerSale(uint256 __number) public onlyOwner { maxPartnerMint = __number; }
    function setMaxPreSale(uint256 __number) public onlyOwner { maxPreSaleMint = __number; }
    function setMaxPublicSale(uint256 __number) public onlyOwner { maxPublicSaleMint = __number; }

    //***************************************************************************************************
    //Change merkle roots
    //***************************************************************************************************
    function setPartnerMerkleRoot(bytes32 __merkleRoot) public onlyOwner { merkleRootPartner = __merkleRoot; }
    function setPresaleMerkleRoot(bytes32 __merkleRoot) public onlyOwner { merkleRootPresale = __merkleRoot; }

    //***************************************************************************************************
    //Change revealed state of collection
    //***************************************************************************************************
    function flipRevealed() public onlyOwner { isRevealed = !isRevealed; }

    //***************************************************************************************************
    //Change pre sale state of collection
    //***************************************************************************************************
    function flipPartnerSale() public onlyOwner { isPartnerSaleActive = !isPartnerSaleActive; }
    function flipPreSale() public onlyOwner { isPreSaleActive = !isPreSaleActive; }
    function flipPublicSale() public onlyOwner { isPublicSaleActive = !isPublicSaleActive; }

    //***************************************************************************************************
    //Returns total minted NFTs by specific user
    //***************************************************************************************************
    function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); }

    //***************************************************************************************************
    //Ownership
    //***************************************************************************************************
    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory)
    {
        return _ownershipOf(tokenId);
    }

    //***************************************************************************************************
    //Withdraw Funds
    //***************************************************************************************************
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;

        require(balance > 0, "No ether to withdraw");

        uint256 devCut = balance * devShare / 100;
        uint remaining = balance - devCut;

        payable(devAddress).transfer(devCut);
        payable(ownerWithdrawAddress).transfer(remaining);
    }

    //***************************************************************************************************
    //Fallback function for receiving Ether
    //***************************************************************************************************
    receive() external payable {  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initHiddenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPartnerSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"__count","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hiddenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPartnerSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPartnerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreSaleMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSaleMint","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":"merkleRootPartner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootPresale","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","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":"ownerWithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"__proof","type":"bytes32[]"},{"internalType":"uint256","name":"__count","type":"uint256"}],"name":"partnerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"__proof","type":"bytes32[]"},{"internalType":"uint256","name":"__count","type":"uint256"}],"name":"preSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pricePartner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"__count","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__hiddenURI","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__number","type":"uint256"}],"name":"setMaxPartnerSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__number","type":"uint256"}],"name":"setMaxPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__number","type":"uint256"}],"name":"setMaxPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"__merkleRoot","type":"bytes32"}],"name":"setPartnerMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__price","type":"uint256"}],"name":"setPartnerPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"__merkleRoot","type":"bytes32"}],"name":"setPresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__price","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__price","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a9080519060200190620000519291906200034b565b5066470de4df820000600c5566470de4df820000600d5566470de4df820000600e55611388600f55600a6010556003601155600260125561270f6013556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff0219169083151502179055506000601460036101000a81548160ff0219169083151502179055503480156200010757600080fd5b5060405162005d2038038062005d2083398181016040528101906200012d91906200046d565b83838160029080519060200190620001479291906200034b565b508060039080519060200190620001609291906200034b565b50620001716200027460201b60201c565b6000819055505050620001996200018d6200027d60201b60201c565b6200028560201b60201c565b8160099080519060200190620001b19291906200034b565b5080600b9080519060200190620001ca9291906200034b565b5073b9cd42c60d23c5475d4b23325ed96a157b738a9373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600a60c0818152505073a50d6f46c2d969f8c8c635975f6c824c1ec75eb873ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050505050620006ad565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200035990620005d2565b90600052602060002090601f0160209004810192826200037d5760008555620003c9565b82601f106200039857805160ff1916838001178555620003c9565b82800160010185558215620003c9579182015b82811115620003c8578251825591602001919060010190620003ab565b5b509050620003d89190620003dc565b5090565b5b80821115620003f7576000816000905550600101620003dd565b5090565b6000620004126200040c8462000566565b6200053d565b9050828152602081018484840111156200042b57600080fd5b620004388482856200059c565b509392505050565b600082601f8301126200045257600080fd5b815162000464848260208601620003fb565b91505092915050565b600080600080608085870312156200048457600080fd5b600085015167ffffffffffffffff8111156200049f57600080fd5b620004ad8782880162000440565b945050602085015167ffffffffffffffff811115620004cb57600080fd5b620004d98782880162000440565b935050604085015167ffffffffffffffff811115620004f757600080fd5b620005058782880162000440565b925050606085015167ffffffffffffffff8111156200052357600080fd5b620005318782880162000440565b91505092959194509250565b6000620005496200055c565b905062000557828262000608565b919050565b6000604051905090565b600067ffffffffffffffff8211156200058457620005836200066d565b5b6200058f826200069c565b9050602081019050919050565b60005b83811015620005bc5780820151818401526020810190506200059f565b83811115620005cc576000848401525b50505050565b60006002820490506001821680620005eb57607f821691505b602082108114156200060257620006016200063e565b5b50919050565b62000613826200069c565b810181811067ffffffffffffffff821117156200063557620006346200066d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60805160601c60a05160601c60c051615628620006f86000396000818161131d0152611f0901526000818161118901526113650152600081816113cc0152612fbe01526156286000f3fe6080604052600436106103905760003560e01c806388084605116101dc578063b88d4fde11610102578063cd3293de116100a0578063f2fde38b1161006f578063f2fde38b14610c9f578063f37340a514610cc8578063f6cb274214610ce4578063f88a990514610d0f57610397565b8063cd3293de14610bcf578063d5abeb0114610bfa578063dc33e68114610c25578063e985e9c514610c6257610397565b8063c37a88e6116100dc578063c37a88e614610b17578063c627525514610b40578063c87b56dd14610b69578063cbce4c9714610ba657610397565b8063b88d4fde14610a9a578063bbaac02f14610ac3578063bdc1e43414610aec57610397565b806395d89b411161017a578063aed04fae11610149578063aed04fae14610a0e578063b287c8ed14610a39578063b3e31b5014610a55578063b6d8f66214610a7157610397565b806395d89b41146109665780639d044ed314610991578063a22cb465146109bc578063a2a48606146109e557610397565b80638cc54e7f116101b65780638cc54e7f146108a85780638da5cb5b146108d35780639147dd1b146108fe5780639231ab2a1461092957610397565b80638808460514610863578063890ac3661461087a5780638b62f5331461089157610397565b806342842e0e116102c157806364c22f131161025f578063715018a61161022e578063715018a6146107cf578063805e0b20146107e657806381221c141461080f57806381c797c11461083857610397565b806364c22f13146107115780636c0360eb1461073c578063704e3d9d1461076757806370a082311461079257610397565b806354214f691161029b57806354214f691461065557806355f804b31461068057806357b2e1f7146106a95780636352211e146106d457610397565b806342842e0e146105ea5780634c6d74d01461061357806352ee46961461062a57610397565b80631e84c4131161032e5780633549345e116103085780633549345e146105685780633ad10ef6146105915780633b2c3fb6146105bc5780633ccfd60b146105d357610397565b80631e84c413146104eb57806323b872dd1461051657806328d7b2761461053f57610397565b8063081812fc1161036a578063081812fc1461042f578063095ea7b31461046c578063102e766d1461049557806318160ddd146104c057610397565b806301c124b71461039c57806301ffc9a7146103c757806306fdde031461040457610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610d3a565b6040516103be9190614c62565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e9919061470b565b610d40565b6040516103fb9190614c47565b60405180910390f35b34801561041057600080fd5b50610419610e22565b6040516104269190614c7d565b60405180910390f35b34801561043b57600080fd5b506104566004803603810190610451919061479e565b610eb4565b6040516104639190614be0565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061464e565b610f30565b005b3480156104a157600080fd5b506104aa61103b565b6040516104b79190614e3a565b60405180910390f35b3480156104cc57600080fd5b506104d5611041565b6040516104e29190614e3a565b60405180910390f35b3480156104f757600080fd5b50610500611058565b60405161050d9190614c47565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190614548565b61106b565b005b34801561054b57600080fd5b50610566600480360381019061056191906146e2565b61107b565b005b34801561057457600080fd5b5061058f600480360381019061058a919061479e565b611101565b005b34801561059d57600080fd5b506105a6611187565b6040516105b39190614be0565b60405180910390f35b3480156105c857600080fd5b506105d16111ab565b005b3480156105df57600080fd5b506105e8611253565b005b3480156105f657600080fd5b50610611600480360381019061060c9190614548565b611436565b005b34801561061f57600080fd5b50610628611456565b005b34801561063657600080fd5b5061063f6114fe565b60405161064c9190614c7d565b60405180910390f35b34801561066157600080fd5b5061066a61158c565b6040516106779190614c47565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a2919061475d565b61159f565b005b3480156106b557600080fd5b506106be611635565b6040516106cb9190614c62565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f6919061479e565b61163b565b6040516107089190614be0565b60405180910390f35b34801561071d57600080fd5b50610726611651565b6040516107339190614e3a565b60405180910390f35b34801561074857600080fd5b50610751611657565b60405161075e9190614c7d565b60405180910390f35b34801561077357600080fd5b5061077c6116e5565b6040516107899190614e3a565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b491906144e3565b6116eb565b6040516107c69190614e3a565b60405180910390f35b3480156107db57600080fd5b506107e46117bb565b005b3480156107f257600080fd5b5061080d6004803603810190610808919061479e565b611843565b005b34801561081b57600080fd5b506108366004803603810190610831919061479e565b6118c9565b005b34801561084457600080fd5b5061084d61194f565b60405161085a9190614e3a565b60405180910390f35b34801561086f57600080fd5b50610878611955565b005b34801561088657600080fd5b5061088f6119fd565b005b34801561089d57600080fd5b506108a6611ae6565b005b3480156108b457600080fd5b506108bd611b8e565b6040516108ca9190614c7d565b60405180910390f35b3480156108df57600080fd5b506108e8611c1c565b6040516108f59190614be0565b60405180910390f35b34801561090a57600080fd5b50610913611c46565b6040516109209190614e3a565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b919061479e565b611c4c565b60405161095d9190614e1f565b60405180910390f35b34801561097257600080fd5b5061097b611c64565b6040516109889190614c7d565b60405180910390f35b34801561099d57600080fd5b506109a6611cf6565b6040516109b39190614c47565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190614612565b611d09565b005b3480156109f157600080fd5b50610a0c6004803603810190610a07919061479e565b611e81565b005b348015610a1a57600080fd5b50610a23611f07565b604051610a309190614e3a565b60405180910390f35b610a536004803603810190610a4e919061479e565b611f2b565b005b610a6f6004803603810190610a6a919061468a565b6121e6565b005b348015610a7d57600080fd5b50610a986004803603810190610a9391906146e2565b61255c565b005b348015610aa657600080fd5b50610ac16004803603810190610abc9190614597565b6125e2565b005b348015610acf57600080fd5b50610aea6004803603810190610ae5919061475d565b61265e565b005b348015610af857600080fd5b50610b016126f4565b604051610b0e9190614e3a565b60405180910390f35b348015610b2357600080fd5b50610b3e6004803603810190610b39919061479e565b6126fa565b005b348015610b4c57600080fd5b50610b676004803603810190610b62919061479e565b612780565b005b348015610b7557600080fd5b50610b906004803603810190610b8b919061479e565b612806565b604051610b9d9190614c7d565b60405180910390f35b348015610bb257600080fd5b50610bcd6004803603810190610bc8919061464e565b61295f565b005b348015610bdb57600080fd5b50610be4612a89565b604051610bf19190614e3a565b60405180910390f35b348015610c0657600080fd5b50610c0f612a8f565b604051610c1c9190614e3a565b60405180910390f35b348015610c3157600080fd5b50610c4c6004803603810190610c4791906144e3565b612a95565b604051610c599190614e3a565b60405180910390f35b348015610c6e57600080fd5b50610c896004803603810190610c84919061450c565b612aa7565b604051610c969190614c47565b60405180910390f35b348015610cab57600080fd5b50610cc66004803603810190610cc191906144e3565b612b3b565b005b610ce26004803603810190610cdd919061468a565b612c33565b005b348015610cf057600080fd5b50610cf9612fa9565b604051610d069190614c47565b60405180910390f35b348015610d1b57600080fd5b50610d24612fbc565b604051610d319190614be0565b60405180910390f35b60165481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e1b5750610e1a82612fe0565b5b9050919050565b606060028054610e319061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d9061511d565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b5050505050905090565b6000610ebf8261304a565b610ef5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f3b8261163b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fa3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fc2613098565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ff45750610ff281610fed613098565b612aa7565b155b1561102b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110368383836130a0565b505050565b600e5481565b600061104b613152565b6001546000540303905090565b601460029054906101000a900460ff1681565b61107683838361315b565b505050565b611083613098565b73ffffffffffffffffffffffffffffffffffffffff166110a1611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90614d7f565b60405180910390fd5b8060168190555050565b611109613098565b73ffffffffffffffffffffffffffffffffffffffff16611127611c1c565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490614d7f565b60405180910390fd5b80600d8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111b3613098565b73ffffffffffffffffffffffffffffffffffffffff166111d1611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90614d7f565b60405180910390fd5b601460039054906101000a900460ff1615601460036101000a81548160ff021916908315150217905550565b61125b613098565b73ffffffffffffffffffffffffffffffffffffffff16611279611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614d7f565b60405180910390fd5b600047905060008111611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e90614cff565b60405180910390fd5b600060647f0000000000000000000000000000000000000000000000000000000000000000836113479190614fbb565b6113519190614f8a565b9050600081836113619190615015565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156113c9573d6000803e3d6000fd5b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611430573d6000803e3d6000fd5b50505050565b611451838383604051806020016040528060008152506125e2565b505050565b61145e613098565b73ffffffffffffffffffffffffffffffffffffffff1661147c611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614d7f565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b600a805461150b9061511d565b80601f01602080910402602001604051908101604052809291908181526020018280546115379061511d565b80156115845780601f1061155957610100808354040283529160200191611584565b820191906000526020600020905b81548152906001019060200180831161156757829003601f168201915b505050505081565b601460039054906101000a900460ff1681565b6115a7613098565b73ffffffffffffffffffffffffffffffffffffffff166115c5611c1c565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290614d7f565b60405180910390fd5b8060099080519060200190611631929190614265565b5050565b60155481565b600061164682613611565b600001519050919050565b60125481565b600980546116649061511d565b80601f01602080910402602001604051908101604052809291908181526020018280546116909061511d565b80156116dd5780601f106116b2576101008083540402835291602001916116dd565b820191906000526020600020905b8154815290600101906020018083116116c057829003601f168201915b505050505081565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611753576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6117c3613098565b73ffffffffffffffffffffffffffffffffffffffff166117e1611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614d7f565b60405180910390fd5b61184160006138a0565b565b61184b613098565b73ffffffffffffffffffffffffffffffffffffffff16611869611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690614d7f565b60405180910390fd5b8060138190555050565b6118d1613098565b73ffffffffffffffffffffffffffffffffffffffff166118ef611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c90614d7f565b60405180910390fd5b8060128190555050565b60115481565b61195d613098565b73ffffffffffffffffffffffffffffffffffffffff1661197b611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c890614d7f565b60405180910390fd5b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b611a05613098565b73ffffffffffffffffffffffffffffffffffffffff16611a23611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7090614d7f565b60405180910390fd5b6000611a83611041565b9050600f5460105482611a969190614f34565b1115611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614cbf565b60405180910390fd5b611ae333601054613966565b50565b611aee613098565b73ffffffffffffffffffffffffffffffffffffffff16611b0c611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614d7f565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b600b8054611b9b9061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc79061511d565b8015611c145780601f10611be957610100808354040283529160200191611c14565b820191906000526020600020905b815481529060010190602001808311611bf757829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b611c546142eb565b611c5d82613611565b9050919050565b606060038054611c739061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9f9061511d565b8015611cec5780601f10611cc157610100808354040283529160200191611cec565b820191906000526020600020905b815481529060010190602001808311611ccf57829003601f168201915b5050505050905090565b601460019054906101000a900460ff1681565b611d11613098565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d76576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d83613098565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e30613098565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e759190614c47565b60405180910390a35050565b611e89613098565b73ffffffffffffffffffffffffffffffffffffffff16611ea7611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490614d7f565b60405180910390fd5b80600c8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611f35611041565b90506000611f4233612a95565b9050601460029054906101000a900460ff16611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614d3f565b60405180910390fd5b60008311611fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcd90614cdf565b60405180910390fd5b601354831115611fe7601354613984565b604051602001611ff79190614bbe565b60405160208183030381529060405290612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e9190614c7d565b60405180910390fd5b5060135483826120579190614f34565b1115612064601354613984565b6040516020016120749190614bbe565b604051602081830303815290604052906120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb9190614c7d565b60405180910390fd5b506013548111156120d6601354613984565b6040516020016120e69190614bbe565b60405160208183030381529060405290612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212d9190614c7d565b60405180910390fd5b50600f5483836121469190614f34565b1115612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614cbf565b60405180910390fd5b82600e546121959190614fbb565b3410156121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce90614ddf565b60405180910390fd5b6121e13384613966565b505050565b60006121f0611041565b905060006121fd33612a95565b9050601460009054906101000a900460ff1661224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590614d1f565b60405180910390fd5b60008311612291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228890614cdf565b60405180910390fd5b6011548311156122a2601154613984565b6040516020016122b29190614bbe565b60405160208183030381529060405290612302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f99190614c7d565b60405180910390fd5b5060115483826123129190614f34565b111561231f601154613984565b60405160200161232f9190614bbe565b6040516020818303038152906040529061237f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123769190614c7d565b60405180910390fd5b50601154811115612391601154613984565b6040516020016123a19190614bbe565b604051602081830303815290604052906123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e89190614c7d565b60405180910390fd5b50600f5483836124019190614f34565b1115612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990614cbf565b60405180910390fd5b82600c546124509190614fbb565b341015612492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248990614ddf565b60405180910390fd5b6000336040516020016124a59190614b72565b60405160208183030381529060405280519060200120905061250b868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483613b31565b61254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254190614d5f565b60405180910390fd5b6125543385613966565b505050505050565b612564613098565b73ffffffffffffffffffffffffffffffffffffffff16612582611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cf90614d7f565b60405180910390fd5b8060158190555050565b6125ed84848461315b565b61260c8373ffffffffffffffffffffffffffffffffffffffff16613b48565b8015612621575061261f84848484613b6b565b155b15612658576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b612666613098565b73ffffffffffffffffffffffffffffffffffffffff16612684611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d190614d7f565b60405180910390fd5b80600b90805190602001906126f0929190614265565b5050565b600c5481565b612702613098565b73ffffffffffffffffffffffffffffffffffffffff16612720611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90614d7f565b60405180910390fd5b8060118190555050565b612788613098565b73ffffffffffffffffffffffffffffffffffffffff166127a6611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390614d7f565b60405180910390fd5b80600e8190555050565b6060601460039054906101000a900460ff166128ae57600b80546128299061511d565b80601f01602080910402602001604051908101604052809291908181526020018280546128559061511d565b80156128a25780601f10612877576101008083540402835291602001916128a2565b820191906000526020600020905b81548152906001019060200180831161288557829003601f168201915b5050505050905061295a565b6128b78261304a565b6128f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ed90614dbf565b60405180910390fd5b6000600980546129059061511d565b905014156129225760405180602001604052806000815250612957565b61292a613ccb565b61293383613984565b600a60405160200161294793929190614b8d565b6040516020818303038152906040525b90505b919050565b612967613098565b73ffffffffffffffffffffffffffffffffffffffff16612985611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d290614d7f565b60405180910390fd5b60006129e5611041565b905060008211612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190614cdf565b60405180910390fd5b600f548282612a399190614f34565b1115612a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7190614cbf565b60405180910390fd5b612a848383613966565b505050565b60105481565b600f5481565b6000612aa082613d5d565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b43613098565b73ffffffffffffffffffffffffffffffffffffffff16612b61611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614d7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1e90614c9f565b60405180910390fd5b612c30816138a0565b50565b6000612c3d611041565b90506000612c4a33612a95565b9050601460019054906101000a900460ff16612c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9290614d9f565b60405180910390fd5b60008311612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd590614cdf565b60405180910390fd5b601254831115612cef601254613984565b604051602001612cff9190614bbe565b60405160208183030381529060405290612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d469190614c7d565b60405180910390fd5b506012548382612d5f9190614f34565b1115612d6c601254613984565b604051602001612d7c9190614bbe565b60405160208183030381529060405290612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc39190614c7d565b60405180910390fd5b50601254811115612dde601254613984565b604051602001612dee9190614bbe565b60405160208183030381529060405290612e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e359190614c7d565b60405180910390fd5b50600f548383612e4e9190614f34565b1115612e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8690614cbf565b60405180910390fd5b82600d54612e9d9190614fbb565b341015612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed690614ddf565b60405180910390fd5b600033604051602001612ef29190614b72565b604051602081830303815290604052805190602001209050612f58868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483613b31565b612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90614dff565b60405180910390fd5b612fa13385613966565b505050505050565b601460009054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081613055613152565b11158015613064575060005482105b8015613091575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061316682613611565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131d1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166131f2613098565b73ffffffffffffffffffffffffffffffffffffffff16148061322157506132208561321b613098565b612aa7565b5b80613266575061322f613098565b73ffffffffffffffffffffffffffffffffffffffff1661324e84610eb4565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061329f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613306576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133138585856001613dc7565b61331f600084876130a0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561359f57600054821461359e57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461360a8585856001613dcd565b5050505050565b6136196142eb565b600082905080613627613152565b11158015613636575060005481105b15613869576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161386757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461374b57809250505061389b565b5b60011561386657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461386157809250505061389b565b61374c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613980828260405180602001604052806000815250613dd3565b5050565b606060008214156139cc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b2c565b600082905060005b600082146139fe5780806139e790615180565b915050600a826139f79190614f8a565b91506139d4565b60008167ffffffffffffffff811115613a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613a725781602001600182028036833780820191505090505b5090505b60008514613b2557600182613a8b9190615015565b9150600a85613a9a91906151ed565b6030613aa69190614f34565b60f81b818381518110613ae2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b1e9190614f8a565b9450613a76565b8093505050505b919050565b600082613b3e8584613de5565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b91613098565b8786866040518563ffffffff1660e01b8152600401613bb39493929190614bfb565b602060405180830381600087803b158015613bcd57600080fd5b505af1925050508015613bfe57506040513d601f19601f82011682018060405250810190613bfb9190614734565b60015b613c78573d8060008114613c2e576040519150601f19603f3d011682016040523d82523d6000602084013e613c33565b606091505b50600081511415613c70576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054613cda9061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d069061511d565b8015613d535780601f10613d2857610100808354040283529160200191613d53565b820191906000526020600020905b815481529060010190602001808311613d3657829003601f168201915b5050505050905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b613de08383836001613e80565b505050565b60008082905060005b8451811015613e75576000858281518110613e32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613e5457613e4d838261424e565b9250613e61565b613e5e818461424e565b92505b508080613e6d90615180565b915050613dee565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613eed576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613f28576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f356000868387613dc7565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156140ff57506140fe8773ffffffffffffffffffffffffffffffffffffffff16613b48565b5b156141c5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46141746000888480600101955088613b6b565b6141aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156141055782600054146141c057600080fd5b614231565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156141c6575b8160008190555050506142476000868387613dcd565b5050505050565b600082600052816020526040600020905092915050565b8280546142719061511d565b90600052602060002090601f01602090048101928261429357600085556142da565b82601f106142ac57805160ff19168380011785556142da565b828001600101855582156142da579182015b828111156142d95782518255916020019190600101906142be565b5b5090506142e7919061432e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561434757600081600090555060010161432f565b5090565b600061435e61435984614e7a565b614e55565b90508281526020810184848401111561437657600080fd5b6143818482856150db565b509392505050565b600061439c61439784614eab565b614e55565b9050828152602081018484840111156143b457600080fd5b6143bf8482856150db565b509392505050565b6000813590506143d68161557f565b92915050565b60008083601f8401126143ee57600080fd5b8235905067ffffffffffffffff81111561440757600080fd5b60208301915083602082028301111561441f57600080fd5b9250929050565b60008135905061443581615596565b92915050565b60008135905061444a816155ad565b92915050565b60008135905061445f816155c4565b92915050565b600081519050614474816155c4565b92915050565b600082601f83011261448b57600080fd5b813561449b84826020860161434b565b91505092915050565b600082601f8301126144b557600080fd5b81356144c5848260208601614389565b91505092915050565b6000813590506144dd816155db565b92915050565b6000602082840312156144f557600080fd5b6000614503848285016143c7565b91505092915050565b6000806040838503121561451f57600080fd5b600061452d858286016143c7565b925050602061453e858286016143c7565b9150509250929050565b60008060006060848603121561455d57600080fd5b600061456b868287016143c7565b935050602061457c868287016143c7565b925050604061458d868287016144ce565b9150509250925092565b600080600080608085870312156145ad57600080fd5b60006145bb878288016143c7565b94505060206145cc878288016143c7565b93505060406145dd878288016144ce565b925050606085013567ffffffffffffffff8111156145fa57600080fd5b6146068782880161447a565b91505092959194509250565b6000806040838503121561462557600080fd5b6000614633858286016143c7565b925050602061464485828601614426565b9150509250929050565b6000806040838503121561466157600080fd5b600061466f858286016143c7565b9250506020614680858286016144ce565b9150509250929050565b60008060006040848603121561469f57600080fd5b600084013567ffffffffffffffff8111156146b957600080fd5b6146c5868287016143dc565b935093505060206146d8868287016144ce565b9150509250925092565b6000602082840312156146f457600080fd5b60006147028482850161443b565b91505092915050565b60006020828403121561471d57600080fd5b600061472b84828501614450565b91505092915050565b60006020828403121561474657600080fd5b600061475484828501614465565b91505092915050565b60006020828403121561476f57600080fd5b600082013567ffffffffffffffff81111561478957600080fd5b614795848285016144a4565b91505092915050565b6000602082840312156147b057600080fd5b60006147be848285016144ce565b91505092915050565b6147d081615049565b82525050565b6147df81615049565b82525050565b6147f66147f182615049565b6151c9565b82525050565b6148058161505b565b82525050565b6148148161505b565b82525050565b61482381615067565b82525050565b600061483482614ef1565b61483e8185614f07565b935061484e8185602086016150ea565b614857816152da565b840191505092915050565b600061486d82614efc565b6148778185614f18565b93506148878185602086016150ea565b614890816152da565b840191505092915050565b60006148a682614efc565b6148b08185614f29565b93506148c08185602086016150ea565b80840191505092915050565b600081546148d98161511d565b6148e38186614f29565b945060018216600081146148fe576001811461490f57614942565b60ff19831686528186019350614942565b61491885614edc565b60005b8381101561493a5781548189015260018201915060208101905061491b565b838801955050505b50505092915050565b6000614958602683614f18565b9150614963826152f8565b604082019050919050565b600061497b602983614f18565b915061498682615347565b604082019050919050565b600061499e601283614f18565b91506149a982615396565b602082019050919050565b60006149c1601483614f18565b91506149cc826153bf565b602082019050919050565b60006149e4601a83614f18565b91506149ef826153e8565b602082019050919050565b6000614a07601983614f18565b9150614a1282615411565b602082019050919050565b6000614a2a601483614f18565b9150614a358261543a565b602082019050919050565b6000614a4d602083614f18565b9150614a5882615463565b602082019050919050565b6000614a70601683614f18565b9150614a7b8261548c565b602082019050919050565b6000614a93602f83614f18565b9150614a9e826154b5565b604082019050919050565b6000614ab6601683614f18565b9150614ac182615504565b602082019050919050565b6000614ad9601083614f18565b9150614ae48261552d565b602082019050919050565b6000614afc601283614f29565b9150614b0782615556565b601282019050919050565b606082016000820151614b2860008501826147c7565b506020820151614b3b6020850182614b63565b506040820151614b4e60408501826147fc565b50505050565b614b5d816150bd565b82525050565b614b6c816150c7565b82525050565b6000614b7e82846147e5565b60148201915081905092915050565b6000614b99828661489b565b9150614ba5828561489b565b9150614bb182846148cc565b9150819050949350505050565b6000614bc982614aef565b9150614bd5828461489b565b915081905092915050565b6000602082019050614bf560008301846147d6565b92915050565b6000608082019050614c1060008301876147d6565b614c1d60208301866147d6565b614c2a6040830185614b54565b8181036060830152614c3c8184614829565b905095945050505050565b6000602082019050614c5c600083018461480b565b92915050565b6000602082019050614c77600083018461481a565b92915050565b60006020820190508181036000830152614c978184614862565b905092915050565b60006020820190508181036000830152614cb88161494b565b9050919050565b60006020820190508181036000830152614cd88161496e565b9050919050565b60006020820190508181036000830152614cf881614991565b9050919050565b60006020820190508181036000830152614d18816149b4565b9050919050565b60006020820190508181036000830152614d38816149d7565b9050919050565b60006020820190508181036000830152614d58816149fa565b9050919050565b60006020820190508181036000830152614d7881614a1d565b9050919050565b60006020820190508181036000830152614d9881614a40565b9050919050565b60006020820190508181036000830152614db881614a63565b9050919050565b60006020820190508181036000830152614dd881614a86565b9050919050565b60006020820190508181036000830152614df881614aa9565b9050919050565b60006020820190508181036000830152614e1881614acc565b9050919050565b6000606082019050614e346000830184614b12565b92915050565b6000602082019050614e4f6000830184614b54565b92915050565b6000614e5f614e70565b9050614e6b828261514f565b919050565b6000604051905090565b600067ffffffffffffffff821115614e9557614e946152ab565b5b614e9e826152da565b9050602081019050919050565b600067ffffffffffffffff821115614ec657614ec56152ab565b5b614ecf826152da565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f3f826150bd565b9150614f4a836150bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f7f57614f7e61521e565b5b828201905092915050565b6000614f95826150bd565b9150614fa0836150bd565b925082614fb057614faf61524d565b5b828204905092915050565b6000614fc6826150bd565b9150614fd1836150bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561500a5761500961521e565b5b828202905092915050565b6000615020826150bd565b915061502b836150bd565b92508282101561503e5761503d61521e565b5b828203905092915050565b60006150548261509d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156151085780820151818401526020810190506150ed565b83811115615117576000848401525b50505050565b6000600282049050600182168061513557607f821691505b602082108114156151495761514861527c565b5b50919050565b615158826152da565b810181811067ffffffffffffffff82111715615177576151766152ab565b5b80604052505050565b600061518b826150bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151be576151bd61521e565b5b600182019050919050565b60006151d4826151db565b9050919050565b60006151e6826152eb565b9050919050565b60006151f8826150bd565b9150615203836150bd565b9250826152135761521261524d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54686973207472616e73616374696f6e20776f756c6420657863656564206d6160008201527f7820737570706c792e0000000000000000000000000000000000000000000000602082015250565b7f436f756e742063616e206e6f7420626520300000000000000000000000000000600082015250565b7f4e6f20657468657220746f207769746864726177000000000000000000000000600082015250565b7f506172746e65722053616c65206973206e6f7420616374697665000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4e6f7420696e20706172746e6572206c6973742e000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652073616c65206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45746865722076616c756520697320746f6f206c6f7700000000000000000000600082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f596f752063616e206f6e6c79206d696e74200000000000000000000000000000600082015250565b61558881615049565b811461559357600080fd5b50565b61559f8161505b565b81146155aa57600080fd5b50565b6155b681615067565b81146155c157600080fd5b50565b6155cd81615071565b81146155d857600080fd5b50565b6155e4816150bd565b81146155ef57600080fd5b5056fea2646970667358221220a75727ff74090cc7300c951e64ed8f687189e004325bfbec835ceed5801f295564736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000175368656c7465726672656e7320436f6c6c656374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000553464e5631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f7368656c7465726672656e732e6d7970696e6174612e636c6f75642f697066732f516d5448754a34567259524b79473543366453744b485a4e6f4c6a3548455839454d48565247446972356f5259612f0000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f7368656c7465726672656e732e6d7970696e6174612e636c6f75642f697066732f516d5448754a34567259524b79473543366453744b485a4e6f4c6a3548455839454d48565247446972356f5259612f0000000000000000

Deployed Bytecode

0x6080604052600436106103905760003560e01c806388084605116101dc578063b88d4fde11610102578063cd3293de116100a0578063f2fde38b1161006f578063f2fde38b14610c9f578063f37340a514610cc8578063f6cb274214610ce4578063f88a990514610d0f57610397565b8063cd3293de14610bcf578063d5abeb0114610bfa578063dc33e68114610c25578063e985e9c514610c6257610397565b8063c37a88e6116100dc578063c37a88e614610b17578063c627525514610b40578063c87b56dd14610b69578063cbce4c9714610ba657610397565b8063b88d4fde14610a9a578063bbaac02f14610ac3578063bdc1e43414610aec57610397565b806395d89b411161017a578063aed04fae11610149578063aed04fae14610a0e578063b287c8ed14610a39578063b3e31b5014610a55578063b6d8f66214610a7157610397565b806395d89b41146109665780639d044ed314610991578063a22cb465146109bc578063a2a48606146109e557610397565b80638cc54e7f116101b65780638cc54e7f146108a85780638da5cb5b146108d35780639147dd1b146108fe5780639231ab2a1461092957610397565b80638808460514610863578063890ac3661461087a5780638b62f5331461089157610397565b806342842e0e116102c157806364c22f131161025f578063715018a61161022e578063715018a6146107cf578063805e0b20146107e657806381221c141461080f57806381c797c11461083857610397565b806364c22f13146107115780636c0360eb1461073c578063704e3d9d1461076757806370a082311461079257610397565b806354214f691161029b57806354214f691461065557806355f804b31461068057806357b2e1f7146106a95780636352211e146106d457610397565b806342842e0e146105ea5780634c6d74d01461061357806352ee46961461062a57610397565b80631e84c4131161032e5780633549345e116103085780633549345e146105685780633ad10ef6146105915780633b2c3fb6146105bc5780633ccfd60b146105d357610397565b80631e84c413146104eb57806323b872dd1461051657806328d7b2761461053f57610397565b8063081812fc1161036a578063081812fc1461042f578063095ea7b31461046c578063102e766d1461049557806318160ddd146104c057610397565b806301c124b71461039c57806301ffc9a7146103c757806306fdde031461040457610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610d3a565b6040516103be9190614c62565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e9919061470b565b610d40565b6040516103fb9190614c47565b60405180910390f35b34801561041057600080fd5b50610419610e22565b6040516104269190614c7d565b60405180910390f35b34801561043b57600080fd5b506104566004803603810190610451919061479e565b610eb4565b6040516104639190614be0565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061464e565b610f30565b005b3480156104a157600080fd5b506104aa61103b565b6040516104b79190614e3a565b60405180910390f35b3480156104cc57600080fd5b506104d5611041565b6040516104e29190614e3a565b60405180910390f35b3480156104f757600080fd5b50610500611058565b60405161050d9190614c47565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190614548565b61106b565b005b34801561054b57600080fd5b50610566600480360381019061056191906146e2565b61107b565b005b34801561057457600080fd5b5061058f600480360381019061058a919061479e565b611101565b005b34801561059d57600080fd5b506105a6611187565b6040516105b39190614be0565b60405180910390f35b3480156105c857600080fd5b506105d16111ab565b005b3480156105df57600080fd5b506105e8611253565b005b3480156105f657600080fd5b50610611600480360381019061060c9190614548565b611436565b005b34801561061f57600080fd5b50610628611456565b005b34801561063657600080fd5b5061063f6114fe565b60405161064c9190614c7d565b60405180910390f35b34801561066157600080fd5b5061066a61158c565b6040516106779190614c47565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a2919061475d565b61159f565b005b3480156106b557600080fd5b506106be611635565b6040516106cb9190614c62565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f6919061479e565b61163b565b6040516107089190614be0565b60405180910390f35b34801561071d57600080fd5b50610726611651565b6040516107339190614e3a565b60405180910390f35b34801561074857600080fd5b50610751611657565b60405161075e9190614c7d565b60405180910390f35b34801561077357600080fd5b5061077c6116e5565b6040516107899190614e3a565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b491906144e3565b6116eb565b6040516107c69190614e3a565b60405180910390f35b3480156107db57600080fd5b506107e46117bb565b005b3480156107f257600080fd5b5061080d6004803603810190610808919061479e565b611843565b005b34801561081b57600080fd5b506108366004803603810190610831919061479e565b6118c9565b005b34801561084457600080fd5b5061084d61194f565b60405161085a9190614e3a565b60405180910390f35b34801561086f57600080fd5b50610878611955565b005b34801561088657600080fd5b5061088f6119fd565b005b34801561089d57600080fd5b506108a6611ae6565b005b3480156108b457600080fd5b506108bd611b8e565b6040516108ca9190614c7d565b60405180910390f35b3480156108df57600080fd5b506108e8611c1c565b6040516108f59190614be0565b60405180910390f35b34801561090a57600080fd5b50610913611c46565b6040516109209190614e3a565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b919061479e565b611c4c565b60405161095d9190614e1f565b60405180910390f35b34801561097257600080fd5b5061097b611c64565b6040516109889190614c7d565b60405180910390f35b34801561099d57600080fd5b506109a6611cf6565b6040516109b39190614c47565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190614612565b611d09565b005b3480156109f157600080fd5b50610a0c6004803603810190610a07919061479e565b611e81565b005b348015610a1a57600080fd5b50610a23611f07565b604051610a309190614e3a565b60405180910390f35b610a536004803603810190610a4e919061479e565b611f2b565b005b610a6f6004803603810190610a6a919061468a565b6121e6565b005b348015610a7d57600080fd5b50610a986004803603810190610a9391906146e2565b61255c565b005b348015610aa657600080fd5b50610ac16004803603810190610abc9190614597565b6125e2565b005b348015610acf57600080fd5b50610aea6004803603810190610ae5919061475d565b61265e565b005b348015610af857600080fd5b50610b016126f4565b604051610b0e9190614e3a565b60405180910390f35b348015610b2357600080fd5b50610b3e6004803603810190610b39919061479e565b6126fa565b005b348015610b4c57600080fd5b50610b676004803603810190610b62919061479e565b612780565b005b348015610b7557600080fd5b50610b906004803603810190610b8b919061479e565b612806565b604051610b9d9190614c7d565b60405180910390f35b348015610bb257600080fd5b50610bcd6004803603810190610bc8919061464e565b61295f565b005b348015610bdb57600080fd5b50610be4612a89565b604051610bf19190614e3a565b60405180910390f35b348015610c0657600080fd5b50610c0f612a8f565b604051610c1c9190614e3a565b60405180910390f35b348015610c3157600080fd5b50610c4c6004803603810190610c4791906144e3565b612a95565b604051610c599190614e3a565b60405180910390f35b348015610c6e57600080fd5b50610c896004803603810190610c84919061450c565b612aa7565b604051610c969190614c47565b60405180910390f35b348015610cab57600080fd5b50610cc66004803603810190610cc191906144e3565b612b3b565b005b610ce26004803603810190610cdd919061468a565b612c33565b005b348015610cf057600080fd5b50610cf9612fa9565b604051610d069190614c47565b60405180910390f35b348015610d1b57600080fd5b50610d24612fbc565b604051610d319190614be0565b60405180910390f35b60165481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e1b5750610e1a82612fe0565b5b9050919050565b606060028054610e319061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d9061511d565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b5050505050905090565b6000610ebf8261304a565b610ef5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f3b8261163b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fa3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fc2613098565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ff45750610ff281610fed613098565b612aa7565b155b1561102b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110368383836130a0565b505050565b600e5481565b600061104b613152565b6001546000540303905090565b601460029054906101000a900460ff1681565b61107683838361315b565b505050565b611083613098565b73ffffffffffffffffffffffffffffffffffffffff166110a1611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90614d7f565b60405180910390fd5b8060168190555050565b611109613098565b73ffffffffffffffffffffffffffffffffffffffff16611127611c1c565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490614d7f565b60405180910390fd5b80600d8190555050565b7f000000000000000000000000b9cd42c60d23c5475d4b23325ed96a157b738a9381565b6111b3613098565b73ffffffffffffffffffffffffffffffffffffffff166111d1611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90614d7f565b60405180910390fd5b601460039054906101000a900460ff1615601460036101000a81548160ff021916908315150217905550565b61125b613098565b73ffffffffffffffffffffffffffffffffffffffff16611279611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614d7f565b60405180910390fd5b600047905060008111611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e90614cff565b60405180910390fd5b600060647f000000000000000000000000000000000000000000000000000000000000000a836113479190614fbb565b6113519190614f8a565b9050600081836113619190615015565b90507f000000000000000000000000b9cd42c60d23c5475d4b23325ed96a157b738a9373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156113c9573d6000803e3d6000fd5b507f000000000000000000000000a50d6f46c2d969f8c8c635975f6c824c1ec75eb873ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611430573d6000803e3d6000fd5b50505050565b611451838383604051806020016040528060008152506125e2565b505050565b61145e613098565b73ffffffffffffffffffffffffffffffffffffffff1661147c611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614d7f565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b600a805461150b9061511d565b80601f01602080910402602001604051908101604052809291908181526020018280546115379061511d565b80156115845780601f1061155957610100808354040283529160200191611584565b820191906000526020600020905b81548152906001019060200180831161156757829003601f168201915b505050505081565b601460039054906101000a900460ff1681565b6115a7613098565b73ffffffffffffffffffffffffffffffffffffffff166115c5611c1c565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290614d7f565b60405180910390fd5b8060099080519060200190611631929190614265565b5050565b60155481565b600061164682613611565b600001519050919050565b60125481565b600980546116649061511d565b80601f01602080910402602001604051908101604052809291908181526020018280546116909061511d565b80156116dd5780601f106116b2576101008083540402835291602001916116dd565b820191906000526020600020905b8154815290600101906020018083116116c057829003601f168201915b505050505081565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611753576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6117c3613098565b73ffffffffffffffffffffffffffffffffffffffff166117e1611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614d7f565b60405180910390fd5b61184160006138a0565b565b61184b613098565b73ffffffffffffffffffffffffffffffffffffffff16611869611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690614d7f565b60405180910390fd5b8060138190555050565b6118d1613098565b73ffffffffffffffffffffffffffffffffffffffff166118ef611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c90614d7f565b60405180910390fd5b8060128190555050565b60115481565b61195d613098565b73ffffffffffffffffffffffffffffffffffffffff1661197b611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c890614d7f565b60405180910390fd5b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b611a05613098565b73ffffffffffffffffffffffffffffffffffffffff16611a23611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7090614d7f565b60405180910390fd5b6000611a83611041565b9050600f5460105482611a969190614f34565b1115611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614cbf565b60405180910390fd5b611ae333601054613966565b50565b611aee613098565b73ffffffffffffffffffffffffffffffffffffffff16611b0c611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614d7f565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b600b8054611b9b9061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc79061511d565b8015611c145780601f10611be957610100808354040283529160200191611c14565b820191906000526020600020905b815481529060010190602001808311611bf757829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b611c546142eb565b611c5d82613611565b9050919050565b606060038054611c739061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9f9061511d565b8015611cec5780601f10611cc157610100808354040283529160200191611cec565b820191906000526020600020905b815481529060010190602001808311611ccf57829003601f168201915b5050505050905090565b601460019054906101000a900460ff1681565b611d11613098565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d76576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d83613098565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e30613098565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e759190614c47565b60405180910390a35050565b611e89613098565b73ffffffffffffffffffffffffffffffffffffffff16611ea7611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490614d7f565b60405180910390fd5b80600c8190555050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b6000611f35611041565b90506000611f4233612a95565b9050601460029054906101000a900460ff16611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614d3f565b60405180910390fd5b60008311611fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcd90614cdf565b60405180910390fd5b601354831115611fe7601354613984565b604051602001611ff79190614bbe565b60405160208183030381529060405290612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e9190614c7d565b60405180910390fd5b5060135483826120579190614f34565b1115612064601354613984565b6040516020016120749190614bbe565b604051602081830303815290604052906120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb9190614c7d565b60405180910390fd5b506013548111156120d6601354613984565b6040516020016120e69190614bbe565b60405160208183030381529060405290612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212d9190614c7d565b60405180910390fd5b50600f5483836121469190614f34565b1115612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614cbf565b60405180910390fd5b82600e546121959190614fbb565b3410156121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce90614ddf565b60405180910390fd5b6121e13384613966565b505050565b60006121f0611041565b905060006121fd33612a95565b9050601460009054906101000a900460ff1661224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590614d1f565b60405180910390fd5b60008311612291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228890614cdf565b60405180910390fd5b6011548311156122a2601154613984565b6040516020016122b29190614bbe565b60405160208183030381529060405290612302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f99190614c7d565b60405180910390fd5b5060115483826123129190614f34565b111561231f601154613984565b60405160200161232f9190614bbe565b6040516020818303038152906040529061237f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123769190614c7d565b60405180910390fd5b50601154811115612391601154613984565b6040516020016123a19190614bbe565b604051602081830303815290604052906123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e89190614c7d565b60405180910390fd5b50600f5483836124019190614f34565b1115612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990614cbf565b60405180910390fd5b82600c546124509190614fbb565b341015612492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248990614ddf565b60405180910390fd5b6000336040516020016124a59190614b72565b60405160208183030381529060405280519060200120905061250b868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483613b31565b61254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254190614d5f565b60405180910390fd5b6125543385613966565b505050505050565b612564613098565b73ffffffffffffffffffffffffffffffffffffffff16612582611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cf90614d7f565b60405180910390fd5b8060158190555050565b6125ed84848461315b565b61260c8373ffffffffffffffffffffffffffffffffffffffff16613b48565b8015612621575061261f84848484613b6b565b155b15612658576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b612666613098565b73ffffffffffffffffffffffffffffffffffffffff16612684611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d190614d7f565b60405180910390fd5b80600b90805190602001906126f0929190614265565b5050565b600c5481565b612702613098565b73ffffffffffffffffffffffffffffffffffffffff16612720611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90614d7f565b60405180910390fd5b8060118190555050565b612788613098565b73ffffffffffffffffffffffffffffffffffffffff166127a6611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390614d7f565b60405180910390fd5b80600e8190555050565b6060601460039054906101000a900460ff166128ae57600b80546128299061511d565b80601f01602080910402602001604051908101604052809291908181526020018280546128559061511d565b80156128a25780601f10612877576101008083540402835291602001916128a2565b820191906000526020600020905b81548152906001019060200180831161288557829003601f168201915b5050505050905061295a565b6128b78261304a565b6128f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ed90614dbf565b60405180910390fd5b6000600980546129059061511d565b905014156129225760405180602001604052806000815250612957565b61292a613ccb565b61293383613984565b600a60405160200161294793929190614b8d565b6040516020818303038152906040525b90505b919050565b612967613098565b73ffffffffffffffffffffffffffffffffffffffff16612985611c1c565b73ffffffffffffffffffffffffffffffffffffffff16146129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d290614d7f565b60405180910390fd5b60006129e5611041565b905060008211612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190614cdf565b60405180910390fd5b600f548282612a399190614f34565b1115612a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7190614cbf565b60405180910390fd5b612a848383613966565b505050565b60105481565b600f5481565b6000612aa082613d5d565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b43613098565b73ffffffffffffffffffffffffffffffffffffffff16612b61611c1c565b73ffffffffffffffffffffffffffffffffffffffff1614612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614d7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1e90614c9f565b60405180910390fd5b612c30816138a0565b50565b6000612c3d611041565b90506000612c4a33612a95565b9050601460019054906101000a900460ff16612c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9290614d9f565b60405180910390fd5b60008311612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd590614cdf565b60405180910390fd5b601254831115612cef601254613984565b604051602001612cff9190614bbe565b60405160208183030381529060405290612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d469190614c7d565b60405180910390fd5b506012548382612d5f9190614f34565b1115612d6c601254613984565b604051602001612d7c9190614bbe565b60405160208183030381529060405290612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc39190614c7d565b60405180910390fd5b50601254811115612dde601254613984565b604051602001612dee9190614bbe565b60405160208183030381529060405290612e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e359190614c7d565b60405180910390fd5b50600f548383612e4e9190614f34565b1115612e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8690614cbf565b60405180910390fd5b82600d54612e9d9190614fbb565b341015612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed690614ddf565b60405180910390fd5b600033604051602001612ef29190614b72565b604051602081830303815290604052805190602001209050612f58868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483613b31565b612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90614dff565b60405180910390fd5b612fa13385613966565b505050505050565b601460009054906101000a900460ff1681565b7f000000000000000000000000a50d6f46c2d969f8c8c635975f6c824c1ec75eb881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081613055613152565b11158015613064575060005482105b8015613091575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061316682613611565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131d1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166131f2613098565b73ffffffffffffffffffffffffffffffffffffffff16148061322157506132208561321b613098565b612aa7565b5b80613266575061322f613098565b73ffffffffffffffffffffffffffffffffffffffff1661324e84610eb4565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061329f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613306576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133138585856001613dc7565b61331f600084876130a0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561359f57600054821461359e57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461360a8585856001613dcd565b5050505050565b6136196142eb565b600082905080613627613152565b11158015613636575060005481105b15613869576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161386757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461374b57809250505061389b565b5b60011561386657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461386157809250505061389b565b61374c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613980828260405180602001604052806000815250613dd3565b5050565b606060008214156139cc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b2c565b600082905060005b600082146139fe5780806139e790615180565b915050600a826139f79190614f8a565b91506139d4565b60008167ffffffffffffffff811115613a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613a725781602001600182028036833780820191505090505b5090505b60008514613b2557600182613a8b9190615015565b9150600a85613a9a91906151ed565b6030613aa69190614f34565b60f81b818381518110613ae2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b1e9190614f8a565b9450613a76565b8093505050505b919050565b600082613b3e8584613de5565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b91613098565b8786866040518563ffffffff1660e01b8152600401613bb39493929190614bfb565b602060405180830381600087803b158015613bcd57600080fd5b505af1925050508015613bfe57506040513d601f19601f82011682018060405250810190613bfb9190614734565b60015b613c78573d8060008114613c2e576040519150601f19603f3d011682016040523d82523d6000602084013e613c33565b606091505b50600081511415613c70576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054613cda9061511d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d069061511d565b8015613d535780601f10613d2857610100808354040283529160200191613d53565b820191906000526020600020905b815481529060010190602001808311613d3657829003601f168201915b5050505050905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b613de08383836001613e80565b505050565b60008082905060005b8451811015613e75576000858281518110613e32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613e5457613e4d838261424e565b9250613e61565b613e5e818461424e565b92505b508080613e6d90615180565b915050613dee565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613eed576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613f28576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f356000868387613dc7565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156140ff57506140fe8773ffffffffffffffffffffffffffffffffffffffff16613b48565b5b156141c5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46141746000888480600101955088613b6b565b6141aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156141055782600054146141c057600080fd5b614231565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156141c6575b8160008190555050506142476000868387613dcd565b5050505050565b600082600052816020526040600020905092915050565b8280546142719061511d565b90600052602060002090601f01602090048101928261429357600085556142da565b82601f106142ac57805160ff19168380011785556142da565b828001600101855582156142da579182015b828111156142d95782518255916020019190600101906142be565b5b5090506142e7919061432e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561434757600081600090555060010161432f565b5090565b600061435e61435984614e7a565b614e55565b90508281526020810184848401111561437657600080fd5b6143818482856150db565b509392505050565b600061439c61439784614eab565b614e55565b9050828152602081018484840111156143b457600080fd5b6143bf8482856150db565b509392505050565b6000813590506143d68161557f565b92915050565b60008083601f8401126143ee57600080fd5b8235905067ffffffffffffffff81111561440757600080fd5b60208301915083602082028301111561441f57600080fd5b9250929050565b60008135905061443581615596565b92915050565b60008135905061444a816155ad565b92915050565b60008135905061445f816155c4565b92915050565b600081519050614474816155c4565b92915050565b600082601f83011261448b57600080fd5b813561449b84826020860161434b565b91505092915050565b600082601f8301126144b557600080fd5b81356144c5848260208601614389565b91505092915050565b6000813590506144dd816155db565b92915050565b6000602082840312156144f557600080fd5b6000614503848285016143c7565b91505092915050565b6000806040838503121561451f57600080fd5b600061452d858286016143c7565b925050602061453e858286016143c7565b9150509250929050565b60008060006060848603121561455d57600080fd5b600061456b868287016143c7565b935050602061457c868287016143c7565b925050604061458d868287016144ce565b9150509250925092565b600080600080608085870312156145ad57600080fd5b60006145bb878288016143c7565b94505060206145cc878288016143c7565b93505060406145dd878288016144ce565b925050606085013567ffffffffffffffff8111156145fa57600080fd5b6146068782880161447a565b91505092959194509250565b6000806040838503121561462557600080fd5b6000614633858286016143c7565b925050602061464485828601614426565b9150509250929050565b6000806040838503121561466157600080fd5b600061466f858286016143c7565b9250506020614680858286016144ce565b9150509250929050565b60008060006040848603121561469f57600080fd5b600084013567ffffffffffffffff8111156146b957600080fd5b6146c5868287016143dc565b935093505060206146d8868287016144ce565b9150509250925092565b6000602082840312156146f457600080fd5b60006147028482850161443b565b91505092915050565b60006020828403121561471d57600080fd5b600061472b84828501614450565b91505092915050565b60006020828403121561474657600080fd5b600061475484828501614465565b91505092915050565b60006020828403121561476f57600080fd5b600082013567ffffffffffffffff81111561478957600080fd5b614795848285016144a4565b91505092915050565b6000602082840312156147b057600080fd5b60006147be848285016144ce565b91505092915050565b6147d081615049565b82525050565b6147df81615049565b82525050565b6147f66147f182615049565b6151c9565b82525050565b6148058161505b565b82525050565b6148148161505b565b82525050565b61482381615067565b82525050565b600061483482614ef1565b61483e8185614f07565b935061484e8185602086016150ea565b614857816152da565b840191505092915050565b600061486d82614efc565b6148778185614f18565b93506148878185602086016150ea565b614890816152da565b840191505092915050565b60006148a682614efc565b6148b08185614f29565b93506148c08185602086016150ea565b80840191505092915050565b600081546148d98161511d565b6148e38186614f29565b945060018216600081146148fe576001811461490f57614942565b60ff19831686528186019350614942565b61491885614edc565b60005b8381101561493a5781548189015260018201915060208101905061491b565b838801955050505b50505092915050565b6000614958602683614f18565b9150614963826152f8565b604082019050919050565b600061497b602983614f18565b915061498682615347565b604082019050919050565b600061499e601283614f18565b91506149a982615396565b602082019050919050565b60006149c1601483614f18565b91506149cc826153bf565b602082019050919050565b60006149e4601a83614f18565b91506149ef826153e8565b602082019050919050565b6000614a07601983614f18565b9150614a1282615411565b602082019050919050565b6000614a2a601483614f18565b9150614a358261543a565b602082019050919050565b6000614a4d602083614f18565b9150614a5882615463565b602082019050919050565b6000614a70601683614f18565b9150614a7b8261548c565b602082019050919050565b6000614a93602f83614f18565b9150614a9e826154b5565b604082019050919050565b6000614ab6601683614f18565b9150614ac182615504565b602082019050919050565b6000614ad9601083614f18565b9150614ae48261552d565b602082019050919050565b6000614afc601283614f29565b9150614b0782615556565b601282019050919050565b606082016000820151614b2860008501826147c7565b506020820151614b3b6020850182614b63565b506040820151614b4e60408501826147fc565b50505050565b614b5d816150bd565b82525050565b614b6c816150c7565b82525050565b6000614b7e82846147e5565b60148201915081905092915050565b6000614b99828661489b565b9150614ba5828561489b565b9150614bb182846148cc565b9150819050949350505050565b6000614bc982614aef565b9150614bd5828461489b565b915081905092915050565b6000602082019050614bf560008301846147d6565b92915050565b6000608082019050614c1060008301876147d6565b614c1d60208301866147d6565b614c2a6040830185614b54565b8181036060830152614c3c8184614829565b905095945050505050565b6000602082019050614c5c600083018461480b565b92915050565b6000602082019050614c77600083018461481a565b92915050565b60006020820190508181036000830152614c978184614862565b905092915050565b60006020820190508181036000830152614cb88161494b565b9050919050565b60006020820190508181036000830152614cd88161496e565b9050919050565b60006020820190508181036000830152614cf881614991565b9050919050565b60006020820190508181036000830152614d18816149b4565b9050919050565b60006020820190508181036000830152614d38816149d7565b9050919050565b60006020820190508181036000830152614d58816149fa565b9050919050565b60006020820190508181036000830152614d7881614a1d565b9050919050565b60006020820190508181036000830152614d9881614a40565b9050919050565b60006020820190508181036000830152614db881614a63565b9050919050565b60006020820190508181036000830152614dd881614a86565b9050919050565b60006020820190508181036000830152614df881614aa9565b9050919050565b60006020820190508181036000830152614e1881614acc565b9050919050565b6000606082019050614e346000830184614b12565b92915050565b6000602082019050614e4f6000830184614b54565b92915050565b6000614e5f614e70565b9050614e6b828261514f565b919050565b6000604051905090565b600067ffffffffffffffff821115614e9557614e946152ab565b5b614e9e826152da565b9050602081019050919050565b600067ffffffffffffffff821115614ec657614ec56152ab565b5b614ecf826152da565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f3f826150bd565b9150614f4a836150bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f7f57614f7e61521e565b5b828201905092915050565b6000614f95826150bd565b9150614fa0836150bd565b925082614fb057614faf61524d565b5b828204905092915050565b6000614fc6826150bd565b9150614fd1836150bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561500a5761500961521e565b5b828202905092915050565b6000615020826150bd565b915061502b836150bd565b92508282101561503e5761503d61521e565b5b828203905092915050565b60006150548261509d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156151085780820151818401526020810190506150ed565b83811115615117576000848401525b50505050565b6000600282049050600182168061513557607f821691505b602082108114156151495761514861527c565b5b50919050565b615158826152da565b810181811067ffffffffffffffff82111715615177576151766152ab565b5b80604052505050565b600061518b826150bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151be576151bd61521e565b5b600182019050919050565b60006151d4826151db565b9050919050565b60006151e6826152eb565b9050919050565b60006151f8826150bd565b9150615203836150bd565b9250826152135761521261524d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54686973207472616e73616374696f6e20776f756c6420657863656564206d6160008201527f7820737570706c792e0000000000000000000000000000000000000000000000602082015250565b7f436f756e742063616e206e6f7420626520300000000000000000000000000000600082015250565b7f4e6f20657468657220746f207769746864726177000000000000000000000000600082015250565b7f506172746e65722053616c65206973206e6f7420616374697665000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4e6f7420696e20706172746e6572206c6973742e000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652073616c65206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45746865722076616c756520697320746f6f206c6f7700000000000000000000600082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f596f752063616e206f6e6c79206d696e74200000000000000000000000000000600082015250565b61558881615049565b811461559357600080fd5b50565b61559f8161505b565b81146155aa57600080fd5b50565b6155b681615067565b81146155c157600080fd5b50565b6155cd81615071565b81146155d857600080fd5b50565b6155e4816150bd565b81146155ef57600080fd5b5056fea2646970667358221220a75727ff74090cc7300c951e64ed8f687189e004325bfbec835ceed5801f295564736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000175368656c7465726672656e7320436f6c6c656374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000553464e5631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f7368656c7465726672656e732e6d7970696e6174612e636c6f75642f697066732f516d5448754a34567259524b79473543366453744b485a4e6f4c6a3548455839454d48565247446972356f5259612f0000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f7368656c7465726672656e732e6d7970696e6174612e636c6f75642f697066732f516d5448754a34567259524b79473543366453744b485a4e6f4c6a3548455839454d48565247446972356f5259612f0000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Shelterfrens Collection
Arg [1] : _symbol (string): SFNV1
Arg [2] : _initBaseURI (string): https://shelterfrens.mypinata.cloud/ipfs/QmTHuJ4VrYRKyG5C6dStKHZNoLj5HEX9EMHVRGDir5oRYa/
Arg [3] : _initHiddenURI (string): https://shelterfrens.mypinata.cloud/ipfs/QmTHuJ4VrYRKyG5C6dStKHZNoLj5HEX9EMHVRGDir5oRYa/

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [5] : 5368656c7465726672656e7320436f6c6c656374696f6e000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 53464e5631000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [9] : 68747470733a2f2f7368656c7465726672656e732e6d7970696e6174612e636c
Arg [10] : 6f75642f697066732f516d5448754a34567259524b79473543366453744b485a
Arg [11] : 4e6f4c6a3548455839454d48565247446972356f5259612f0000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [13] : 68747470733a2f2f7368656c7465726672656e732e6d7970696e6174612e636c
Arg [14] : 6f75642f697066732f516d5448754a34567259524b79473543366453744b485a
Arg [15] : 4e6f4c6a3548455839454d48565247446972356f5259612f0000000000000000


Deployed Bytecode Sourcemap

47333:14088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49319:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24568:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27681:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29184:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28747:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47881:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23817:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49198:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30049:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58786:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57687:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49898:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59157:70;;;;;;;;;;;;;:::i;:::-;;60757:361;;;;;;;;;;;;;:::i;:::-;;30290:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59492:91;;;;;;;;;;;;;:::i;:::-;;47451:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49243:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57159:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49280:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27489:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48655:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47423:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48752:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24937:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44045:103;;;;;;;;;;;;;:::i;:::-;;58331:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58237:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48558:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59674:88;;;;;;;;;;;;;:::i;:::-;;51268:229;;;;;;;;;;;;;:::i;:::-;;59589:79;;;;;;;;;;;;;:::i;:::-;;47494:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43394:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47818:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60372:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27850:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49156:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29460:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57595:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49940:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54418:940;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51739:1104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58674:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30546:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57251:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47755:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58139:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57779:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56501:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55580:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48264:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48185:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60034:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29818:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44303:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53085:1092;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49110:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49604:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49319:32;;;;:::o;24568:305::-;24670:4;24722:25;24707:40;;;:11;:40;;;;:105;;;;24779:33;24764:48;;;:11;:48;;;;24707:105;:158;;;;24829:36;24853:11;24829:23;:36::i;:::-;24707:158;24687:178;;24568:305;;;:::o;27681:100::-;27735:13;27768:5;27761:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27681:100;:::o;29184:204::-;29252:7;29277:16;29285:7;29277;:16::i;:::-;29272:64;;29302:34;;;;;;;;;;;;;;29272:64;29356:15;:24;29372:7;29356:24;;;;;;;;;;;;;;;;;;;;;29349:31;;29184:204;;;:::o;28747:371::-;28820:13;28836:24;28852:7;28836:15;:24::i;:::-;28820:40;;28881:5;28875:11;;:2;:11;;;28871:48;;;28895:24;;;;;;;;;;;;;;28871:48;28952:5;28936:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28962:37;28979:5;28986:12;:10;:12::i;:::-;28962:16;:37::i;:::-;28961:38;28936:63;28932:138;;;29023:35;;;;;;;;;;;;;;28932:138;29082:28;29091:2;29095:7;29104:5;29082:8;:28::i;:::-;28747:371;;;:::o;47881:39::-;;;;:::o;23817:303::-;23861:7;24086:15;:13;:15::i;:::-;24071:12;;24055:13;;:28;:46;24048:53;;23817:303;:::o;49198:38::-;;;;;;;;;;;;;:::o;30049:170::-;30183:28;30193:4;30199:2;30203:7;30183:9;:28::i;:::-;30049:170;;;:::o;58786:106::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58877:12:::1;58857:17;:32;;;;58786:106:::0;:::o;57687:86::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57763:7:::1;57748:12;:22;;;;57687:86:::0;:::o;49898:35::-;;;:::o;59157:70::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59214:10:::1;;;;;;;;;;;59213:11;59200:10;;:24;;;;;;;;;;;;;;;;;;59157:70::o:0;60757:361::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60807:15:::1;60825:21;60807:39;;60877:1;60867:7;:11;60859:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60916:14;60954:3;60943:8;60933:7;:18;;;;:::i;:::-;:24;;;;:::i;:::-;60916:41;;60968:14;60995:6;60985:7;:16;;;;:::i;:::-;60968:33;;61022:10;61014:28;;:36;61043:6;61014:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61069:20;61061:38;;:49;61100:9;61061:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;43685:1;;;60757:361::o:0;30290:185::-;30428:39;30445:4;30451:2;30455:7;30428:39;;;;;;;;;;;;:16;:39::i;:::-;30290:185;;;:::o;59492:91::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59561:19:::1;;;;;;;;;;;59560:20;59538:19;;:42;;;;;;;;;;;;;;;;;;59492:91::o:0;47451:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49243:30::-;;;;;;;;;;;;;:::o;57159:86::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57233:9:::1;57223:7;:19;;;;;;;;;;;;:::i;:::-;;57159:86:::0;:::o;49280:32::-;;;;:::o;27489:125::-;27553:7;27580:21;27593:7;27580:12;:21::i;:::-;:26;;;27573:33;;27489:125;;;:::o;48655:33::-;;;;:::o;47423:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48752:39::-;;;;:::o;24937:206::-;25001:7;25042:1;25025:19;;:5;:19;;;25021:60;;;25053:28;;;;;;;;;;;;;;25021:60;25107:12;:19;25120:5;25107:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25099:36;;25092:43;;24937:206;;;:::o;44045:103::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44110:30:::1;44137:1;44110:18;:30::i;:::-;44045:103::o:0;58331:94::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58414:8:::1;58394:17;:28;;;;58331:94:::0;:::o;58237:88::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58314:8:::1;58297:14;:25;;;;58237:88:::0;:::o;48558:33::-;;;;:::o;59674:88::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59741:18:::1;;;;;;;;;;;59740:19;59719:18;;:40;;;;;;;;;;;;;;;;;;59674:88::o:0;51268:229::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51321:14:::1;51338:13;:11;:13::i;:::-;51321:30;;51390:9;;51379:7;;51370:6;:16;;;;:::i;:::-;:29;;51362:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;51459:30;51469:10;51481:7;;51459:9;:30::i;:::-;43685:1;51268:229::o:0;59589:79::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59650:15:::1;;;;;;;;;;;59649:16;59631:15;;:34;;;;;;;;;;;;;;;;;;59589:79::o:0;47494:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43394:87::-;43440:7;43467:6;;;;;;;;;;;43460:13;;43394:87;:::o;47818:40::-;;;;:::o;60372:141::-;60438:21;;:::i;:::-;60484;60497:7;60484:12;:21::i;:::-;60477:28;;60372:141;;;:::o;27850:104::-;27906:13;27939:7;27932:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27850:104;:::o;49156:35::-;;;;;;;;;;;;;:::o;29460:287::-;29571:12;:10;:12::i;:::-;29559:24;;:8;:24;;;29555:54;;;29592:17;;;;;;;;;;;;;;29555:54;29667:8;29622:18;:32;29641:12;:10;:12::i;:::-;29622:32;;;;;;;;;;;;;;;:42;29655:8;29622:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29720:8;29691:48;;29706:12;:10;:12::i;:::-;29691:48;;;29730:8;29691:48;;;;;;:::i;:::-;;;;;;;;29460:287;;:::o;57595:86::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57671:7:::1;57656:12;:22;;;;57595:86:::0;:::o;49940:33::-;;;:::o;54418:940::-;54483:14;54500:13;:11;:13::i;:::-;54483:30;;54524:18;54545:24;54558:10;54545:12;:24::i;:::-;54524:45;;54590:18;;;;;;;;;;;54582:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54681:1;54671:7;:11;54663:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54756:17;;54745:7;:28;;54825;:17;;:26;:28::i;:::-;54786:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;54737:119;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;54899:17;;54888:7;54875:10;:20;;;;:::i;:::-;:41;;54965:28;:17;;:26;:28::i;:::-;54926:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;54867:129;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;55029:17;;55015:10;:31;;55095:28;:17;;:26;:28::i;:::-;55056:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;55007:119;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;55165:9;;55154:7;55145:6;:16;;;;:::i;:::-;:29;;55137:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;55269:7;55255:11;;:21;;;;:::i;:::-;55242:9;:34;;55234:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55320:30;55330:10;55342:7;55320:9;:30::i;:::-;54418:940;;;:::o;51739:1104::-;51833:14;51850:13;:11;:13::i;:::-;51833:30;;51874:18;51895:24;51908:10;51895:12;:24::i;:::-;51874:45;;51940:19;;;;;;;;;;;51932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52029:1;52019:7;:11;52011:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52101:14;;52090:7;:25;;52167;:14;;:23;:25::i;:::-;52128:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;52082:113;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;52238:14;;52227:7;52214:10;:20;;;;:::i;:::-;:38;;52301:25;:14;;:23;:25::i;:::-;52262:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;52206:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;52362:14;;52348:10;:28;;52425:25;:14;;:23;:25::i;:::-;52386:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;52340:113;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;52492:9;;52481:7;52472:6;:16;;;;:::i;:::-;:29;;52464:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52594:7;52579:12;;:22;;;;:::i;:::-;52566:9;:35;;52558:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52642:12;52684:10;52667:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52657:39;;;;;;52642:54;;52715:52;52734:7;;52715:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52743:17;;52762:4;52715:18;:52::i;:::-;52707:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52805:30;52815:10;52827:7;52805:9;:30::i;:::-;51739:1104;;;;;;:::o;58674:106::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58765:12:::1;58745:17;:32;;;;58674:106:::0;:::o;30546:369::-;30713:28;30723:4;30729:2;30733:7;30713:9;:28::i;:::-;30756:15;:2;:13;;;:15::i;:::-;:76;;;;;30776:56;30807:4;30813:2;30817:7;30826:5;30776:30;:56::i;:::-;30775:57;30756:76;30752:156;;;30856:40;;;;;;;;;;;;;;30752:156;30546:369;;;;:::o;57251:94::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57331:11:::1;57319:9;:23;;;;;;;;;;;;:::i;:::-;;57251:94:::0;:::o;47755:40::-;;;;:::o;58139:92::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58220:8:::1;58203:14;:25;;;;58139:92:::0;:::o;57779:84::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57853:7:::1;57839:11;:21;;;;57779:84:::0;:::o;56501:387::-;56566:13;56635:10;;;;;;;;;;;56630:38;;56656:9;56649:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56630:38;56688:16;56696:7;56688;:16::i;:::-;56680:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56801:1;56782:7;56776:21;;;;;:::i;:::-;;;:26;;:104;;;;;;;;;;;;;;;;;56829:10;:8;:10::i;:::-;56841:18;:7;:16;:18::i;:::-;56861:12;56812:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56776:104;56769:111;;56501:387;;;;:::o;55580:329::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55659:14:::1;55676:13;:11;:13::i;:::-;55659:30;;55718:1;55708:7;:11;55700:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55802:9;;55791:7;55782:6;:16;;;;:::i;:::-;:29;;55774:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;55873:28;55883:8;55893:7;55873:9;:28::i;:::-;43685:1;55580:329:::0;;:::o;48264:27::-;;;;:::o;48185:31::-;;;;:::o;60034:99::-;60092:7;60110:20;60124:5;60110:13;:20::i;:::-;60103:27;;60034:99;;;:::o;29818:164::-;29915:4;29939:18;:25;29958:5;29939:25;;;;;;;;;;;;;;;:35;29965:8;29939:35;;;;;;;;;;;;;;;;;;;;;;;;;29932:42;;29818:164;;;;:::o;44303:201::-;43625:12;:10;:12::i;:::-;43614:23;;:7;:5;:7::i;:::-;:23;;;43606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44412:1:::1;44392:22;;:8;:22;;;;44384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44468:28;44487:8;44468:18;:28::i;:::-;44303:201:::0;:::o;53085:1092::-;53175:14;53192:13;:11;:13::i;:::-;53175:30;;53216:18;53237:24;53250:10;53237:12;:24::i;:::-;53216:45;;53282:15;;;;;;;;;;;53274:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53367:1;53357:7;:11;53349:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53439:14;;53428:7;:25;;53505;:14;;:23;:25::i;:::-;53466:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;53420:113;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;53576:14;;53565:7;53552:10;:20;;;;:::i;:::-;:38;;53639:25;:14;;:23;:25::i;:::-;53600:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;53544:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;53700:14;;53686:10;:28;;53763:25;:14;;:23;:25::i;:::-;53724:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;53678:113;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;53830:9;;53819:7;53810:6;:16;;;;:::i;:::-;:29;;53802:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53932:7;53917:12;;:22;;;;:::i;:::-;53904:9;:35;;53896:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53980:12;54022:10;54005:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;53995:39;;;;;;53980:54;;54053:52;54072:7;;54053:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54081:17;;54100:4;54053:18;:52::i;:::-;54045:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54139:30;54149:10;54161:7;54139:9;:30::i;:::-;53085:1092;;;;;;:::o;49110:39::-;;;;;;;;;;;;;:::o;49604:45::-;;;:::o;20128:157::-;20213:4;20252:25;20237:40;;;:11;:40;;;;20230:47;;20128:157;;;:::o;31170:187::-;31227:4;31270:7;31251:15;:13;:15::i;:::-;:26;;:53;;;;;31291:13;;31281:7;:23;31251:53;:98;;;;;31322:11;:20;31334:7;31322:20;;;;;;;;;;;:27;;;;;;;;;;;;31321:28;31251:98;31244:105;;31170:187;;;:::o;16911:98::-;16964:7;16991:10;16984:17;;16911:98;:::o;39340:196::-;39482:2;39455:15;:24;39471:7;39455:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39520:7;39516:2;39500:28;;39509:5;39500:28;;;;;;;;;;;;39340:196;;;:::o;50902:87::-;50967:7;50985:1;50978:8;;50902:87;:::o;34283:2130::-;34398:35;34436:21;34449:7;34436:12;:21::i;:::-;34398:59;;34496:4;34474:26;;:13;:18;;;:26;;;34470:67;;34509:28;;;;;;;;;;;;;;34470:67;34550:22;34592:4;34576:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34613:36;34630:4;34636:12;:10;:12::i;:::-;34613:16;:36::i;:::-;34576:73;:126;;;;34690:12;:10;:12::i;:::-;34666:36;;:20;34678:7;34666:11;:20::i;:::-;:36;;;34576:126;34550:153;;34721:17;34716:66;;34747:35;;;;;;;;;;;;;;34716:66;34811:1;34797:16;;:2;:16;;;34793:52;;;34822:23;;;;;;;;;;;;;;34793:52;34858:43;34880:4;34886:2;34890:7;34899:1;34858:21;:43::i;:::-;34966:35;34983:1;34987:7;34996:4;34966:8;:35::i;:::-;35327:1;35297:12;:18;35310:4;35297:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35371:1;35343:12;:16;35356:2;35343:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35389:31;35423:11;:20;35435:7;35423:20;;;;;;;;;;;35389:54;;35474:2;35458:8;:13;;;:18;;;;;;;;;;;;;;;;;;35524:15;35491:8;:23;;;:49;;;;;;;;;;;;;;;;;;35792:19;35824:1;35814:7;:11;35792:33;;35840:31;35874:11;:24;35886:11;35874:24;;;;;;;;;;;35840:58;;35942:1;35917:27;;:8;:13;;;;;;;;;;;;:27;;;35913:384;;;36127:13;;36112:11;:28;36108:174;;36181:4;36165:8;:13;;;:20;;;;;;;;;;;;;;;;;;36234:13;:28;;;36208:8;:23;;;:54;;;;;;;;;;;;;;;;;;36108:174;35913:384;34283:2130;;;36344:7;36340:2;36325:27;;36334:4;36325:27;;;;;;;;;;;;36363:42;36384:4;36390:2;36394:7;36403:1;36363:20;:42::i;:::-;34283:2130;;;;;:::o;26318:1109::-;26380:21;;:::i;:::-;26414:12;26429:7;26414:22;;26497:4;26478:15;:13;:15::i;:::-;:23;;:47;;;;;26512:13;;26505:4;:20;26478:47;26474:886;;;26546:31;26580:11;:17;26592:4;26580:17;;;;;;;;;;;26546:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26621:9;:16;;;26616:729;;26692:1;26666:28;;:9;:14;;;:28;;;26662:101;;26730:9;26723:16;;;;;;26662:101;27065:261;27072:4;27065:261;;;27105:6;;;;;;;;27150:11;:17;27162:4;27150:17;;;;;;;;;;;27138:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27224:1;27198:28;;:9;:14;;;:28;;;27194:109;;27266:9;27259:16;;;;;;27194:109;27065:261;;;26616:729;26474:886;;27388:31;;;;;;;;;;;;;;26318:1109;;;;:::o;44664:191::-;44738:16;44757:6;;;;;;;;;;;44738:25;;44783:8;44774:6;;:17;;;;;;;;;;;;;;;;;;44838:8;44807:40;;44828:8;44807:40;;;;;;;;;;;;44664:191;;:::o;31365:104::-;31434:27;31444:2;31448:8;31434:27;;;;;;;;;;;;:9;:27::i;:::-;31365:104;;:::o;17498:723::-;17554:13;17784:1;17775:5;:10;17771:53;;;17802:10;;;;;;;;;;;;;;;;;;;;;17771:53;17834:12;17849:5;17834:20;;17865:14;17890:78;17905:1;17897:4;:9;17890:78;;17923:8;;;;;:::i;:::-;;;;17954:2;17946:10;;;;;:::i;:::-;;;17890:78;;;17978:19;18010:6;18000:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17978:39;;18028:154;18044:1;18035:5;:10;18028:154;;18072:1;18062:11;;;;;:::i;:::-;;;18139:2;18131:5;:10;;;;:::i;:::-;18118:2;:24;;;;:::i;:::-;18105:39;;18088:6;18095;18088:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18168:2;18159:11;;;;;:::i;:::-;;;18028:154;;;18206:6;18192:21;;;;;17498:723;;;;:::o;45793:190::-;45918:4;45971;45942:25;45955:5;45962:4;45942:12;:25::i;:::-;:33;45935:40;;45793:190;;;;;:::o;8954:326::-;9014:4;9271:1;9249:7;:19;;;:23;9242:30;;8954:326;;;:::o;40028:667::-;40191:4;40228:2;40212:36;;;40249:12;:10;:12::i;:::-;40263:4;40269:7;40278:5;40212:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40208:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40463:1;40446:6;:13;:18;40442:235;;;40492:40;;;;;;;;;;;;;;40442:235;40635:6;40629:13;40620:6;40616:2;40612:15;40605:38;40208:480;40341:45;;;40331:55;;;:6;:55;;;;40324:62;;;40028:667;;;;;;:::o;56168:94::-;56228:13;56252:7;56245:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56168:94;:::o;25225:137::-;25286:7;25321:12;:19;25334:5;25321:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;25313:41;;25306:48;;25225:137;;;:::o;41343:159::-;;;;;:::o;42161:158::-;;;;;:::o;31832:163::-;31955:32;31961:2;31965:8;31975:5;31982:4;31955:5;:32::i;:::-;31832:163;;;:::o;46345:675::-;46428:7;46448:20;46471:4;46448:27;;46491:9;46486:497;46510:5;:12;46506:1;:16;46486:497;;;46544:20;46567:5;46573:1;46567:8;;;;;;;;;;;;;;;;;;;;;;46544:31;;46610:12;46594;:28;46590:382;;46737:42;46752:12;46766;46737:14;:42::i;:::-;46722:57;;46590:382;;;46914:42;46929:12;46943;46914:14;:42::i;:::-;46899:57;;46590:382;46486:497;46524:3;;;;;:::i;:::-;;;;46486:497;;;;47000:12;46993:19;;;46345:675;;;;:::o;32254:1775::-;32393:20;32416:13;;32393:36;;32458:1;32444:16;;:2;:16;;;32440:48;;;32469:19;;;;;;;;;;;;;;32440:48;32515:1;32503:8;:13;32499:44;;;32525:18;;;;;;;;;;;;;;32499:44;32556:61;32586:1;32590:2;32594:12;32608:8;32556:21;:61::i;:::-;32929:8;32894:12;:16;32907:2;32894:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32993:8;32953:12;:16;32966:2;32953:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33052:2;33019:11;:25;33031:12;33019:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33119:15;33069:11;:25;33081:12;33069:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33152:20;33175:12;33152:35;;33202:11;33231:8;33216:12;:23;33202:37;;33260:4;:23;;;;;33268:15;:2;:13;;;:15::i;:::-;33260:23;33256:641;;;33304:314;33360:12;33356:2;33335:38;;33352:1;33335:38;;;;;;;;;;;;33401:69;33440:1;33444:2;33448:14;;;;;;33464:5;33401:30;:69::i;:::-;33396:174;;33506:40;;;;;;;;;;;;;;33396:174;33613:3;33597:12;:19;;33304:314;;33699:12;33682:13;;:29;33678:43;;33713:8;;;33678:43;33256:641;;;33762:120;33818:14;;;;;;33814:2;33793:40;;33810:1;33793:40;;;;;;;;;;;;33877:3;33861:12;:19;;33762:120;;33256:641;33927:12;33911:13;:28;;;;32254:1775;;33961:60;33990:1;33994:2;33998:12;34012:8;33961:20;:60::i;:::-;32254:1775;;;;;:::o;47028:224::-;47096:13;47159:1;47153:4;47146:15;47188:1;47182:4;47175:15;47229:4;47223;47213:21;47204:30;;47131:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;4663:6;4671;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;5073:6;5081;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:570::-;5513:6;5521;5529;5578:2;5566:9;5557:7;5553:23;5549:32;5546:2;;;5594:1;5591;5584:12;5546:2;5665:1;5654:9;5650:17;5637:31;5695:18;5687:6;5684:30;5681:2;;;5727:1;5724;5717:12;5681:2;5763:80;5835:7;5826:6;5815:9;5811:22;5763:80;:::i;:::-;5745:98;;;;5608:245;5892:2;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5863:118;5536:452;;;;;:::o;5994:262::-;6053:6;6102:2;6090:9;6081:7;6077:23;6073:32;6070:2;;;6118:1;6115;6108:12;6070:2;6161:1;6186:53;6231:7;6222:6;6211:9;6207:22;6186:53;:::i;:::-;6176:63;;6132:117;6060:196;;;;:::o;6262:260::-;6320:6;6369:2;6357:9;6348:7;6344:23;6340:32;6337:2;;;6385:1;6382;6375:12;6337:2;6428:1;6453:52;6497:7;6488:6;6477:9;6473:22;6453:52;:::i;:::-;6443:62;;6399:116;6327:195;;;;:::o;6528:282::-;6597:6;6646:2;6634:9;6625:7;6621:23;6617:32;6614:2;;;6662:1;6659;6652:12;6614:2;6705:1;6730:63;6785:7;6776:6;6765:9;6761:22;6730:63;:::i;:::-;6720:73;;6676:127;6604:206;;;;:::o;6816:375::-;6885:6;6934:2;6922:9;6913:7;6909:23;6905:32;6902:2;;;6950:1;6947;6940:12;6902:2;7021:1;7010:9;7006:17;6993:31;7051:18;7043:6;7040:30;7037:2;;;7083:1;7080;7073:12;7037:2;7111:63;7166:7;7157:6;7146:9;7142:22;7111:63;:::i;:::-;7101:73;;6964:220;6892:299;;;;:::o;7197:262::-;7256:6;7305:2;7293:9;7284:7;7280:23;7276:32;7273:2;;;7321:1;7318;7311:12;7273:2;7364:1;7389:53;7434:7;7425:6;7414:9;7410:22;7389:53;:::i;:::-;7379:63;;7335:117;7263:196;;;;:::o;7465:108::-;7542:24;7560:5;7542:24;:::i;:::-;7537:3;7530:37;7520:53;;:::o;7579:118::-;7666:24;7684:5;7666:24;:::i;:::-;7661:3;7654:37;7644:53;;:::o;7703:157::-;7808:45;7828:24;7846:5;7828:24;:::i;:::-;7808:45;:::i;:::-;7803:3;7796:58;7786:74;;:::o;7866:99::-;7937:21;7952:5;7937:21;:::i;:::-;7932:3;7925:34;7915:50;;:::o;7971:109::-;8052:21;8067:5;8052:21;:::i;:::-;8047:3;8040:34;8030:50;;:::o;8086:118::-;8173:24;8191:5;8173:24;:::i;:::-;8168:3;8161:37;8151:53;;:::o;8210:360::-;8296:3;8324:38;8356:5;8324:38;:::i;:::-;8378:70;8441:6;8436:3;8378:70;:::i;:::-;8371:77;;8457:52;8502:6;8497:3;8490:4;8483:5;8479:16;8457:52;:::i;:::-;8534:29;8556:6;8534:29;:::i;:::-;8529:3;8525:39;8518:46;;8300:270;;;;;:::o;8576:364::-;8664:3;8692:39;8725:5;8692:39;:::i;:::-;8747:71;8811:6;8806:3;8747:71;:::i;:::-;8740:78;;8827:52;8872:6;8867:3;8860:4;8853:5;8849:16;8827:52;:::i;:::-;8904:29;8926:6;8904:29;:::i;:::-;8899:3;8895:39;8888:46;;8668:272;;;;;:::o;8946:377::-;9052:3;9080:39;9113:5;9080:39;:::i;:::-;9135:89;9217:6;9212:3;9135:89;:::i;:::-;9128:96;;9233:52;9278:6;9273:3;9266:4;9259:5;9255:16;9233:52;:::i;:::-;9310:6;9305:3;9301:16;9294:23;;9056:267;;;;;:::o;9353:845::-;9456:3;9493:5;9487:12;9522:36;9548:9;9522:36;:::i;:::-;9574:89;9656:6;9651:3;9574:89;:::i;:::-;9567:96;;9694:1;9683:9;9679:17;9710:1;9705:137;;;;9856:1;9851:341;;;;9672:520;;9705:137;9789:4;9785:9;9774;9770:25;9765:3;9758:38;9825:6;9820:3;9816:16;9809:23;;9705:137;;9851:341;9918:38;9950:5;9918:38;:::i;:::-;9978:1;9992:154;10006:6;10003:1;10000:13;9992:154;;;10080:7;10074:14;10070:1;10065:3;10061:11;10054:35;10130:1;10121:7;10117:15;10106:26;;10028:4;10025:1;10021:12;10016:17;;9992:154;;;10175:6;10170:3;10166:16;10159:23;;9858:334;;9672:520;;9460:738;;;;;;:::o;10204:366::-;10346:3;10367:67;10431:2;10426:3;10367:67;:::i;:::-;10360:74;;10443:93;10532:3;10443:93;:::i;:::-;10561:2;10556:3;10552:12;10545:19;;10350:220;;;:::o;10576:366::-;10718:3;10739:67;10803:2;10798:3;10739:67;:::i;:::-;10732:74;;10815:93;10904:3;10815:93;:::i;:::-;10933:2;10928:3;10924:12;10917:19;;10722:220;;;:::o;10948:366::-;11090:3;11111:67;11175:2;11170:3;11111:67;:::i;:::-;11104:74;;11187:93;11276:3;11187:93;:::i;:::-;11305:2;11300:3;11296:12;11289:19;;11094:220;;;:::o;11320:366::-;11462:3;11483:67;11547:2;11542:3;11483:67;:::i;:::-;11476:74;;11559:93;11648:3;11559:93;:::i;:::-;11677:2;11672:3;11668:12;11661:19;;11466:220;;;:::o;11692:366::-;11834:3;11855:67;11919:2;11914:3;11855:67;:::i;:::-;11848:74;;11931:93;12020:3;11931:93;:::i;:::-;12049:2;12044:3;12040:12;12033:19;;11838:220;;;:::o;12064:366::-;12206:3;12227:67;12291:2;12286:3;12227:67;:::i;:::-;12220:74;;12303:93;12392:3;12303:93;:::i;:::-;12421:2;12416:3;12412:12;12405:19;;12210:220;;;:::o;12436:366::-;12578:3;12599:67;12663:2;12658:3;12599:67;:::i;:::-;12592:74;;12675:93;12764:3;12675:93;:::i;:::-;12793:2;12788:3;12784:12;12777:19;;12582:220;;;:::o;12808:366::-;12950:3;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13047:93;13136:3;13047:93;:::i;:::-;13165:2;13160:3;13156:12;13149:19;;12954:220;;;:::o;13180:366::-;13322:3;13343:67;13407:2;13402:3;13343:67;:::i;:::-;13336:74;;13419:93;13508:3;13419:93;:::i;:::-;13537:2;13532:3;13528:12;13521:19;;13326:220;;;:::o;13552:366::-;13694:3;13715:67;13779:2;13774:3;13715:67;:::i;:::-;13708:74;;13791:93;13880:3;13791:93;:::i;:::-;13909:2;13904:3;13900:12;13893:19;;13698:220;;;:::o;13924:366::-;14066:3;14087:67;14151:2;14146:3;14087:67;:::i;:::-;14080:74;;14163:93;14252:3;14163:93;:::i;:::-;14281:2;14276:3;14272:12;14265:19;;14070:220;;;:::o;14296:366::-;14438:3;14459:67;14523:2;14518:3;14459:67;:::i;:::-;14452:74;;14535:93;14624:3;14535:93;:::i;:::-;14653:2;14648:3;14644:12;14637:19;;14442:220;;;:::o;14668:402::-;14828:3;14849:85;14931:2;14926:3;14849:85;:::i;:::-;14842:92;;14943:93;15032:3;14943:93;:::i;:::-;15061:2;15056:3;15052:12;15045:19;;14832:238;;;:::o;15146:697::-;15305:4;15300:3;15296:14;15392:4;15385:5;15381:16;15375:23;15411:63;15468:4;15463:3;15459:14;15445:12;15411:63;:::i;:::-;15320:164;15576:4;15569:5;15565:16;15559:23;15595:61;15650:4;15645:3;15641:14;15627:12;15595:61;:::i;:::-;15494:172;15750:4;15743:5;15739:16;15733:23;15769:57;15820:4;15815:3;15811:14;15797:12;15769:57;:::i;:::-;15676:160;15274:569;;;:::o;15849:118::-;15936:24;15954:5;15936:24;:::i;:::-;15931:3;15924:37;15914:53;;:::o;15973:105::-;16048:23;16065:5;16048:23;:::i;:::-;16043:3;16036:36;16026:52;;:::o;16084:256::-;16196:3;16211:75;16282:3;16273:6;16211:75;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;16331:3;16324:10;;16200:140;;;;:::o;16346:589::-;16571:3;16593:95;16684:3;16675:6;16593:95;:::i;:::-;16586:102;;16705:95;16796:3;16787:6;16705:95;:::i;:::-;16698:102;;16817:92;16905:3;16896:6;16817:92;:::i;:::-;16810:99;;16926:3;16919:10;;16575:360;;;;;;:::o;16941:541::-;17174:3;17196:148;17340:3;17196:148;:::i;:::-;17189:155;;17361:95;17452:3;17443:6;17361:95;:::i;:::-;17354:102;;17473:3;17466:10;;17178:304;;;;:::o;17488:222::-;17581:4;17619:2;17608:9;17604:18;17596:26;;17632:71;17700:1;17689:9;17685:17;17676:6;17632:71;:::i;:::-;17586:124;;;;:::o;17716:640::-;17911:4;17949:3;17938:9;17934:19;17926:27;;17963:71;18031:1;18020:9;18016:17;18007:6;17963:71;:::i;:::-;18044:72;18112:2;18101:9;18097:18;18088:6;18044:72;:::i;:::-;18126;18194:2;18183:9;18179:18;18170:6;18126:72;:::i;:::-;18245:9;18239:4;18235:20;18230:2;18219:9;18215:18;18208:48;18273:76;18344:4;18335:6;18273:76;:::i;:::-;18265:84;;17916:440;;;;;;;:::o;18362:210::-;18449:4;18487:2;18476:9;18472:18;18464:26;;18500:65;18562:1;18551:9;18547:17;18538:6;18500:65;:::i;:::-;18454:118;;;;:::o;18578:222::-;18671:4;18709:2;18698:9;18694:18;18686:26;;18722:71;18790:1;18779:9;18775:17;18766:6;18722:71;:::i;:::-;18676:124;;;;:::o;18806:313::-;18919:4;18957:2;18946:9;18942:18;18934:26;;19006:9;19000:4;18996:20;18992:1;18981:9;18977:17;18970:47;19034:78;19107:4;19098:6;19034:78;:::i;:::-;19026:86;;18924:195;;;;:::o;19125:419::-;19291:4;19329:2;19318:9;19314:18;19306:26;;19378:9;19372:4;19368:20;19364:1;19353:9;19349:17;19342:47;19406:131;19532:4;19406:131;:::i;:::-;19398:139;;19296:248;;;:::o;19550:419::-;19716:4;19754:2;19743:9;19739:18;19731:26;;19803:9;19797:4;19793:20;19789:1;19778:9;19774:17;19767:47;19831:131;19957:4;19831:131;:::i;:::-;19823:139;;19721:248;;;:::o;19975:419::-;20141:4;20179:2;20168:9;20164:18;20156:26;;20228:9;20222:4;20218:20;20214:1;20203:9;20199:17;20192:47;20256:131;20382:4;20256:131;:::i;:::-;20248:139;;20146:248;;;:::o;20400:419::-;20566:4;20604:2;20593:9;20589:18;20581:26;;20653:9;20647:4;20643:20;20639:1;20628:9;20624:17;20617:47;20681:131;20807:4;20681:131;:::i;:::-;20673:139;;20571:248;;;:::o;20825:419::-;20991:4;21029:2;21018:9;21014:18;21006:26;;21078:9;21072:4;21068:20;21064:1;21053:9;21049:17;21042:47;21106:131;21232:4;21106:131;:::i;:::-;21098:139;;20996:248;;;:::o;21250:419::-;21416:4;21454:2;21443:9;21439:18;21431:26;;21503:9;21497:4;21493:20;21489:1;21478:9;21474:17;21467:47;21531:131;21657:4;21531:131;:::i;:::-;21523:139;;21421:248;;;:::o;21675:419::-;21841:4;21879:2;21868:9;21864:18;21856:26;;21928:9;21922:4;21918:20;21914:1;21903:9;21899:17;21892:47;21956:131;22082:4;21956:131;:::i;:::-;21948:139;;21846:248;;;:::o;22100:419::-;22266:4;22304:2;22293:9;22289:18;22281:26;;22353:9;22347:4;22343:20;22339:1;22328:9;22324:17;22317:47;22381:131;22507:4;22381:131;:::i;:::-;22373:139;;22271:248;;;:::o;22525:419::-;22691:4;22729:2;22718:9;22714:18;22706:26;;22778:9;22772:4;22768:20;22764:1;22753:9;22749:17;22742:47;22806:131;22932:4;22806:131;:::i;:::-;22798:139;;22696:248;;;:::o;22950:419::-;23116:4;23154:2;23143:9;23139:18;23131:26;;23203:9;23197:4;23193:20;23189:1;23178:9;23174:17;23167:47;23231:131;23357:4;23231:131;:::i;:::-;23223:139;;23121:248;;;:::o;23375:419::-;23541:4;23579:2;23568:9;23564:18;23556:26;;23628:9;23622:4;23618:20;23614:1;23603:9;23599:17;23592:47;23656:131;23782:4;23656:131;:::i;:::-;23648:139;;23546:248;;;:::o;23800:419::-;23966:4;24004:2;23993:9;23989:18;23981:26;;24053:9;24047:4;24043:20;24039:1;24028:9;24024:17;24017:47;24081:131;24207:4;24081:131;:::i;:::-;24073:139;;23971:248;;;:::o;24225:346::-;24380:4;24418:2;24407:9;24403:18;24395:26;;24431:133;24561:1;24550:9;24546:17;24537:6;24431:133;:::i;:::-;24385:186;;;;:::o;24577:222::-;24670:4;24708:2;24697:9;24693:18;24685:26;;24721:71;24789:1;24778:9;24774:17;24765:6;24721:71;:::i;:::-;24675:124;;;;:::o;24805:129::-;24839:6;24866:20;;:::i;:::-;24856:30;;24895:33;24923:4;24915:6;24895:33;:::i;:::-;24846:88;;;:::o;24940:75::-;24973:6;25006:2;25000:9;24990:19;;24980:35;:::o;25021:307::-;25082:4;25172:18;25164:6;25161:30;25158:2;;;25194:18;;:::i;:::-;25158:2;25232:29;25254:6;25232:29;:::i;:::-;25224:37;;25316:4;25310;25306:15;25298:23;;25087:241;;;:::o;25334:308::-;25396:4;25486:18;25478:6;25475:30;25472:2;;;25508:18;;:::i;:::-;25472:2;25546:29;25568:6;25546:29;:::i;:::-;25538:37;;25630:4;25624;25620:15;25612:23;;25401:241;;;:::o;25648:141::-;25697:4;25720:3;25712:11;;25743:3;25740:1;25733:14;25777:4;25774:1;25764:18;25756:26;;25702:87;;;:::o;25795:98::-;25846:6;25880:5;25874:12;25864:22;;25853:40;;;:::o;25899:99::-;25951:6;25985:5;25979:12;25969:22;;25958:40;;;:::o;26004:168::-;26087:11;26121:6;26116:3;26109:19;26161:4;26156:3;26152:14;26137:29;;26099:73;;;;:::o;26178:169::-;26262:11;26296:6;26291:3;26284:19;26336:4;26331:3;26327:14;26312:29;;26274:73;;;;:::o;26353:148::-;26455:11;26492:3;26477:18;;26467:34;;;;:::o;26507:305::-;26547:3;26566:20;26584:1;26566:20;:::i;:::-;26561:25;;26600:20;26618:1;26600:20;:::i;:::-;26595:25;;26754:1;26686:66;26682:74;26679:1;26676:81;26673:2;;;26760:18;;:::i;:::-;26673:2;26804:1;26801;26797:9;26790:16;;26551:261;;;;:::o;26818:185::-;26858:1;26875:20;26893:1;26875:20;:::i;:::-;26870:25;;26909:20;26927:1;26909:20;:::i;:::-;26904:25;;26948:1;26938:2;;26953:18;;:::i;:::-;26938:2;26995:1;26992;26988:9;26983:14;;26860:143;;;;:::o;27009:348::-;27049:7;27072:20;27090:1;27072:20;:::i;:::-;27067:25;;27106:20;27124:1;27106:20;:::i;:::-;27101:25;;27294:1;27226:66;27222:74;27219:1;27216:81;27211:1;27204:9;27197:17;27193:105;27190:2;;;27301:18;;:::i;:::-;27190:2;27349:1;27346;27342:9;27331:20;;27057:300;;;;:::o;27363:191::-;27403:4;27423:20;27441:1;27423:20;:::i;:::-;27418:25;;27457:20;27475:1;27457:20;:::i;:::-;27452:25;;27496:1;27493;27490:8;27487:2;;;27501:18;;:::i;:::-;27487:2;27546:1;27543;27539:9;27531:17;;27408:146;;;;:::o;27560:96::-;27597:7;27626:24;27644:5;27626:24;:::i;:::-;27615:35;;27605:51;;;:::o;27662:90::-;27696:7;27739:5;27732:13;27725:21;27714:32;;27704:48;;;:::o;27758:77::-;27795:7;27824:5;27813:16;;27803:32;;;:::o;27841:149::-;27877:7;27917:66;27910:5;27906:78;27895:89;;27885:105;;;:::o;27996:126::-;28033:7;28073:42;28066:5;28062:54;28051:65;;28041:81;;;:::o;28128:77::-;28165:7;28194:5;28183:16;;28173:32;;;:::o;28211:101::-;28247:7;28287:18;28280:5;28276:30;28265:41;;28255:57;;;:::o;28318:154::-;28402:6;28397:3;28392;28379:30;28464:1;28455:6;28450:3;28446:16;28439:27;28369:103;;;:::o;28478:307::-;28546:1;28556:113;28570:6;28567:1;28564:13;28556:113;;;28655:1;28650:3;28646:11;28640:18;28636:1;28631:3;28627:11;28620:39;28592:2;28589:1;28585:10;28580:15;;28556:113;;;28687:6;28684:1;28681:13;28678:2;;;28767:1;28758:6;28753:3;28749:16;28742:27;28678:2;28527:258;;;;:::o;28791:320::-;28835:6;28872:1;28866:4;28862:12;28852:22;;28919:1;28913:4;28909:12;28940:18;28930:2;;28996:4;28988:6;28984:17;28974:27;;28930:2;29058;29050:6;29047:14;29027:18;29024:38;29021:2;;;29077:18;;:::i;:::-;29021:2;28842:269;;;;:::o;29117:281::-;29200:27;29222:4;29200:27;:::i;:::-;29192:6;29188:40;29330:6;29318:10;29315:22;29294:18;29282:10;29279:34;29276:62;29273:2;;;29341:18;;:::i;:::-;29273:2;29381:10;29377:2;29370:22;29160:238;;;:::o;29404:233::-;29443:3;29466:24;29484:5;29466:24;:::i;:::-;29457:33;;29512:66;29505:5;29502:77;29499:2;;;29582:18;;:::i;:::-;29499:2;29629:1;29622:5;29618:13;29611:20;;29447:190;;;:::o;29643:100::-;29682:7;29711:26;29731:5;29711:26;:::i;:::-;29700:37;;29690:53;;;:::o;29749:94::-;29788:7;29817:20;29831:5;29817:20;:::i;:::-;29806:31;;29796:47;;;:::o;29849:176::-;29881:1;29898:20;29916:1;29898:20;:::i;:::-;29893:25;;29932:20;29950:1;29932:20;:::i;:::-;29927:25;;29971:1;29961:2;;29976:18;;:::i;:::-;29961:2;30017:1;30014;30010:9;30005:14;;29883:142;;;;:::o;30031:180::-;30079:77;30076:1;30069:88;30176:4;30173:1;30166:15;30200:4;30197:1;30190:15;30217:180;30265:77;30262:1;30255:88;30362:4;30359:1;30352:15;30386:4;30383:1;30376:15;30403:180;30451:77;30448:1;30441:88;30548:4;30545:1;30538:15;30572:4;30569:1;30562:15;30589:180;30637:77;30634:1;30627:88;30734:4;30731:1;30724:15;30758:4;30755:1;30748:15;30775:102;30816:6;30867:2;30863:7;30858:2;30851:5;30847:14;30843:28;30833:38;;30823:54;;;:::o;30883:94::-;30916:8;30964:5;30960:2;30956:14;30935:35;;30925:52;;;:::o;30983:225::-;31123:34;31119:1;31111:6;31107:14;31100:58;31192:8;31187:2;31179:6;31175:15;31168:33;31089:119;:::o;31214:228::-;31354:34;31350:1;31342:6;31338:14;31331:58;31423:11;31418:2;31410:6;31406:15;31399:36;31320:122;:::o;31448:168::-;31588:20;31584:1;31576:6;31572:14;31565:44;31554:62;:::o;31622:170::-;31762:22;31758:1;31750:6;31746:14;31739:46;31728:64;:::o;31798:176::-;31938:28;31934:1;31926:6;31922:14;31915:52;31904:70;:::o;31980:175::-;32120:27;32116:1;32108:6;32104:14;32097:51;32086:69;:::o;32161:170::-;32301:22;32297:1;32289:6;32285:14;32278:46;32267:64;:::o;32337:182::-;32477:34;32473:1;32465:6;32461:14;32454:58;32443:76;:::o;32525:172::-;32665:24;32661:1;32653:6;32649:14;32642:48;32631:66;:::o;32703:234::-;32843:34;32839:1;32831:6;32827:14;32820:58;32912:17;32907:2;32899:6;32895:15;32888:42;32809:128;:::o;32943:172::-;33083:24;33079:1;33071:6;33067:14;33060:48;33049:66;:::o;33121:166::-;33261:18;33257:1;33249:6;33245:14;33238:42;33227:60;:::o;33293:168::-;33433:20;33429:1;33421:6;33417:14;33410:44;33399:62;:::o;33467:122::-;33540:24;33558:5;33540:24;:::i;:::-;33533:5;33530:35;33520:2;;33579:1;33576;33569:12;33520:2;33510:79;:::o;33595:116::-;33665:21;33680:5;33665:21;:::i;:::-;33658:5;33655:32;33645:2;;33701:1;33698;33691:12;33645:2;33635:76;:::o;33717:122::-;33790:24;33808:5;33790:24;:::i;:::-;33783:5;33780:35;33770:2;;33829:1;33826;33819:12;33770:2;33760:79;:::o;33845:120::-;33917:23;33934:5;33917:23;:::i;:::-;33910:5;33907:34;33897:2;;33955:1;33952;33945:12;33897:2;33887:78;:::o;33971:122::-;34044:24;34062:5;34044:24;:::i;:::-;34037:5;34034:35;34024:2;;34083:1;34080;34073:12;34024:2;34014:79;:::o

Swarm Source

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