ETH Price: $3,464.88 (+2.09%)
Gas: 12 Gwei

Token

Lostboy (LOSTBOY)
 

Overview

Max Total Supply

10,000 LOSTBOY

Holders

2,890

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LOSTBOY
0x624fec774a888c18c9aa51180d770e20ee636bea
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 10,000 randomly born NFTs living on the Ethereum blockchain as ERC-721 tokens and hosted on IPFS.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Lostboy

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-25
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @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/IERC721.sol

/**
 * @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/IERC721Receiver.sol

/**
 * @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/IERC721Metadata.sol

/**
 * @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/Address.sol

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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


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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/Lostboy.sol
contract Lostboy is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    // Private members
    enum MemberClaimStatus { Invalid, Listed }                                  // Members, listed? 
    mapping (address => MemberClaimStatus) private _whiteListedMembers;         // Whitelisted members for presale
    mapping (address => uint256) private _whiteListMints;                       // Whitelisted mints per address
    string private m_BaseURI = "";                                              // Base URI

    // Supply / sale variables
    uint256 public MAX_LOSTBOYS = 10000;                                        // Maximum supply
    uint256 public MAX_PRESALE_BOYS_PER_ADDRESS = 50;                           // Total maximum boys for whitelisted wallet
    uint256 public lostBoyPrice = 50000000000000000;                            // 0.05 ETH

    // Per TX
    uint public maxBoysPerMint = 15;                                            // Max lostboys in one go !
    uint public maxBoysPerPresaleMint = 25;                                     // Max pre-sale lostboys in one go !

    // Active?!
    bool public mintingActive = false;                                          // Minting active
    bool public isPresaleActive = false;                                        // Presale active

    // Provenance
    string public provenanceHash = "";                                          // Provencance, data integrity

    // Donation
    uint public donationPercentage = 10;                                        // Percent to donate to charity wallet
    address public donationWallet = 0x9715f6a7510AA98D4F8eB8E17C9e01859a05937A; // The charity wallet all donations will go to when balance is withdrawn

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI
    ) ERC721(name, symbol) {
        m_BaseURI = baseURI;
    }

    // withdrawBalance
    //  -   Withdraws balance to contract owner
    //  -   Automatic withdrawal of donation 
    function withdrawBalance() public onlyOwner {
        // Get the total balance
        uint256 balance = address(this).balance;

        // Get share to send to donation wallet (10 % charity donation)
        uint256 donationShare = balance.mul(donationPercentage).div(100);
        uint256 ownerShare = balance.sub(donationShare);
        
        // Transfer respective amounts
        payable(msg.sender).transfer(ownerShare);
        payable(donationWallet).transfer(donationShare);
    }

    // reserveBoys
    //  -   Reserves lostboys for owner
    //  -   Used for giveaways/etc
    function reserveBoys(uint256 quantity) public onlyOwner {
        for(uint i = 0; i < quantity; i++) {
            uint mintIndex = totalSupply();
            if (mintIndex < MAX_LOSTBOYS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }

    // Mint boy
    //  -   Mints lostboys by quantities
    function mintBoy(uint numberOfBoys) public payable  {
        require(mintingActive, "Minting is not activated yet.");
        require(numberOfBoys > 0, "Why are you minting less than zero boys.");
        require(
            totalSupply().add(numberOfBoys) <= MAX_LOSTBOYS,
            'Only 10,000 boys are available'
        );
        require(numberOfBoys <= maxBoysPerMint, "Cannot mint this number of boys in one go !");
        require(lostBoyPrice.mul(numberOfBoys) <= msg.value, 'Ethereum sent is not sufficient.');

        for(uint i = 0; i < numberOfBoys; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_LOSTBOYS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
    
    // mintBoyAsMember
    //  -   Mints lostboy as whitelisted member
     function mintBoyAsMember(uint numberOfBoys) public payable {
        require(isPresaleActive, "Presale is not active yet.");
        require(numberOfBoys > 0, "Why are you minting less than zero boys.");
        require(_whiteListedMembers[msg.sender] == MemberClaimStatus.Listed, "You are not a whitelisted member !");
        require(_whiteListMints[msg.sender].add(numberOfBoys) <= MAX_PRESALE_BOYS_PER_ADDRESS, "You are minting more than your allowed presale boys!");
        require(totalSupply().add(numberOfBoys) <= MAX_LOSTBOYS, "Only 10,000 boys are available");
        require(numberOfBoys <= maxBoysPerPresaleMint, "Cannot mint this number of presale boys in one go !");
        require(lostBoyPrice.mul(numberOfBoys) <= msg.value, 'Ethereum sent is not sufficient.');
        
        for(uint i = 0; i < numberOfBoys; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_LOSTBOYS) {
                _safeMint(msg.sender, mintIndex);
                _whiteListMints[msg.sender] = _whiteListMints[msg.sender].add(1);
            }
        }
    }

    // addToWhitelist
    //  -   Adds discord/invited members to presale whitelist
    function addToWhitelist(address[] memory members) public onlyOwner {
        for (uint256 i = 0; i < members.length; i++) {
            _whiteListedMembers[members[i]] = MemberClaimStatus.Listed;
            _whiteListMints[members[i]] = 0;
        }
    }

    // isWhitelisted
    //  -   Public helper to check if an address is whitelisted
    function isWhitelisted (address addr) public view returns (bool) {
        return _whiteListedMembers[addr] == MemberClaimStatus.Listed;
    }

    // setDonationAddress
    //  -   Emergency function to update the donation charity wallet in case
    function setCharityWalletAddress (address charityAddress) public onlyOwner {
        donationWallet = charityAddress;
    }

    // switchMinting
    //  -   Allows, disallows minting
    function switchMinting() public onlyOwner {
        mintingActive = !mintingActive;
    }

    // switchPresale
    //  -   Allows, disallows presale
    function switchPresale() public onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    // setMaxQuantityPerMint
    //  -   Sets the maximum mints per tx
    function setMaxQuantityPerMint (uint256 quantity) public onlyOwner {
        maxBoysPerMint = quantity;
    }

     // setMaxQuantityPerPresaleMint
    //  -   Sets the maximum mints per tx for presale
    function setMaxQuantityPerPresaleMint (uint256 quantity) public onlyOwner {
        maxBoysPerPresaleMint = quantity;
    }
    
    // setPresaleMaxPerWallet
    //  -   Emergency function to update the max per presale wallet
    function setMaxPerPresaleWallet (uint256 quantity) public onlyOwner {
        MAX_PRESALE_BOYS_PER_ADDRESS = quantity;
    }
    
    // setBaseURI
    //  -  Metadata lives here
    function setBaseURI(string memory baseURI) external onlyOwner() {
        m_BaseURI = baseURI;
    }

    // _baseURI
    function _baseURI() internal view override returns (string memory) {
        return m_BaseURI;
    }

    // setProvenance
    //  -   Provenance for data integrity
    function setProvenance(string memory _provenance)
        external
        onlyOwner
    {
        provenanceHash = _provenance;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_LOSTBOYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE_BOYS_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donationPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donationWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lostBoyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBoysPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBoysPerPresaleMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfBoys","type":"uint256"}],"name":"mintBoy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfBoys","type":"uint256"}],"name":"mintBoyAsMember","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveBoys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"address","name":"charityAddress","type":"address"}],"name":"setCharityWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMaxPerPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMaxQuantityPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMaxQuantityPerPresaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","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":"switchMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600d90805190602001906200002b92919062000248565b50612710600e556032600f5566b1a2bc2ec50000601055600f60115560196012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506040518060200160405280600081525060149080519060200190620000a992919062000248565b50600a601555739715f6a7510aa98d4f8eb8e17c9e01859a05937a601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011157600080fd5b50604051620057973803806200579783398181016040528101906200013791906200036a565b828281600090805190602001906200015192919062000248565b5080600190805190602001906200016a92919062000248565b50505060006200017f6200024060201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600d90805190602001906200023692919062000248565b505050506200057b565b600033905090565b8280546200025690620004a0565b90600052602060002090601f0160209004810192826200027a5760008555620002c6565b82601f106200029557805160ff1916838001178555620002c6565b82800160010185558215620002c6579182015b82811115620002c5578251825591602001919060010190620002a8565b5b509050620002d59190620002d9565b5090565b5b80821115620002f4576000816000905550600101620002da565b5090565b60006200030f620003098462000434565b6200040b565b9050828152602081018484840111156200032857600080fd5b620003358482856200046a565b509392505050565b600082601f8301126200034f57600080fd5b815162000361848260208601620002f8565b91505092915050565b6000806000606084860312156200038057600080fd5b600084015167ffffffffffffffff8111156200039b57600080fd5b620003a9868287016200033d565b935050602084015167ffffffffffffffff811115620003c757600080fd5b620003d5868287016200033d565b925050604084015167ffffffffffffffff811115620003f357600080fd5b62000401868287016200033d565b9150509250925092565b6000620004176200042a565b9050620004258282620004d6565b919050565b6000604051905090565b600067ffffffffffffffff8211156200045257620004516200053b565b5b6200045d826200056a565b9050602081019050919050565b60005b838110156200048a5780820151818401526020810190506200046d565b838111156200049a576000848401525b50505050565b60006002820490506001821680620004b957607f821691505b60208210811415620004d057620004cf6200050c565b5b50919050565b620004e1826200056a565b810181811067ffffffffffffffff821117156200050357620005026200053b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61520c806200058b6000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063b88d4fde116100b6578063cf8f479f1161007a578063cf8f479f146108a2578063e1b7f9d6146108cd578063e7b94df4146108f8578063e985e9c514610923578063f2fde38b14610960578063ffe630b5146109895761025c565b8063b88d4fde146107cf578063c16cc810146107f8578063c29ad3ff14610823578063c6ab67a31461083a578063c87b56dd146108655761025c565b806390fd50ca1161010857806390fd50ca146106e057806395d89b4114610709578063a22cb46514610734578063a4b4839d1461075d578063a7d30e0f14610788578063b6e67bdd146107a45761025c565b806370a082311461060f578063715018a61461064c5780637f649783146106635780638da5cb5b1461068c5780638f95a445146106b75761025c565b806331f9c919116101dd57806355f804b3116101a157806355f804b3146105135780635fd8c7101461053c578063600227fa1461055357806360d938dc1461057e57806361edf7c7146105a95780636352211e146105d25761025c565b806331f9c9191461042e5780633af32abf146104595780633b6ccee71461049657806342842e0e146104ad5780634f6ccce7146104d65761025c565b806318160ddd1161022457806318160ddd1461035857806323b872dd14610383578063290b2a0f146103ac5780632ad0dff5146103d55780632f745c59146103f15761025c565b806301ffc9a714610261578063037424e41461029e57806306fdde03146102c7578063081812fc146102f2578063095ea7b31461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613c6a565b6109b2565b6040516102959190614232565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613cfd565b610a2c565b005b3480156102d357600080fd5b506102dc610aec565b6040516102e9919061424d565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190613cfd565b610b7e565b60405161032691906141cb565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613bed565b610c03565b005b34801561036457600080fd5b5061036d610d1b565b60405161037a91906145cf565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613ae7565b610d28565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190613cfd565b610d88565b005b6103ef60048036038101906103ea9190613cfd565b610e0e565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613bed565b61120f565b60405161042591906145cf565b60405180910390f35b34801561043a57600080fd5b506104436112b4565b6040516104509190614232565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b9190613a82565b6112c7565b60405161048d9190614232565b60405180910390f35b3480156104a257600080fd5b506104ab61138f565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613ae7565b611437565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613cfd565b611457565b60405161050a91906145cf565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613cbc565b6114ee565b005b34801561054857600080fd5b50610551611584565b005b34801561055f57600080fd5b506105686116fd565b60405161057591906145cf565b60405180910390f35b34801561058a57600080fd5b50610593611703565b6040516105a09190614232565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613cfd565b611716565b005b3480156105de57600080fd5b506105f960048036038101906105f49190613cfd565b61179c565b60405161060691906141cb565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613a82565b61184e565b60405161064391906145cf565b60405180910390f35b34801561065857600080fd5b50610661611906565b005b34801561066f57600080fd5b5061068a60048036038101906106859190613c29565b611a43565b005b34801561069857600080fd5b506106a1611c35565b6040516106ae91906141cb565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190613a82565b611c5f565b005b3480156106ec57600080fd5b5061070760048036038101906107029190613cfd565b611d1f565b005b34801561071557600080fd5b5061071e611da5565b60405161072b919061424d565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190613bb1565b611e37565b005b34801561076957600080fd5b50610772611fb8565b60405161077f91906145cf565b60405180910390f35b6107a2600480360381019061079d9190613cfd565b611fbe565b005b3480156107b057600080fd5b506107b9612195565b6040516107c691906145cf565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f19190613b36565b61219b565b005b34801561080457600080fd5b5061080d6121fd565b60405161081a91906145cf565b60405180910390f35b34801561082f57600080fd5b50610838612203565b005b34801561084657600080fd5b5061084f6122ab565b60405161085c919061424d565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613cfd565b612339565b604051610899919061424d565b60405180910390f35b3480156108ae57600080fd5b506108b76123e0565b6040516108c491906145cf565b60405180910390f35b3480156108d957600080fd5b506108e26123e6565b6040516108ef91906145cf565b60405180910390f35b34801561090457600080fd5b5061090d6123ec565b60405161091a91906141cb565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613aab565b612412565b6040516109579190614232565b60405180910390f35b34801561096c57600080fd5b5061098760048036038101906109829190613a82565b6124a6565b005b34801561099557600080fd5b506109b060048036038101906109ab9190613cbc565b612652565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a255750610a24826126e8565b5b9050919050565b610a346127ca565b73ffffffffffffffffffffffffffffffffffffffff16610a52611c35565b73ffffffffffffffffffffffffffffffffffffffff1614610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f9061448f565b60405180910390fd5b60005b81811015610ae8576000610abd610d1b565b9050600e54811015610ad457610ad333826127d2565b5b508080610ae09061490e565b915050610aab565b5050565b606060008054610afb906148ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b27906148ab565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b5050505050905090565b6000610b89826127f0565b610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061446f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0e8261179c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c769061452f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c9e6127ca565b73ffffffffffffffffffffffffffffffffffffffff161480610ccd5750610ccc81610cc76127ca565b612412565b5b610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d03906143af565b60405180910390fd5b610d16838361285c565b505050565b6000600880549050905090565b610d39610d336127ca565b82612915565b610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f9061456f565b60405180910390fd5b610d838383836129f3565b505050565b610d906127ca565b73ffffffffffffffffffffffffffffffffffffffff16610dae611c35565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061448f565b60405180910390fd5b8060118190555050565b601360019054906101000a900460ff16610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e549061426f565b60405180910390fd5b60008111610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e979061428f565b60405180910390fd5b600180811115610ed9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166001811115610f5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061454f565b60405180910390fd5b600f54610ff382600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c4f90919063ffffffff16565b1115611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b906143cf565b60405180910390fd5b600e5461105182611043610d1b565b612c4f90919063ffffffff16565b1115611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061450f565b60405180910390fd5b6012548111156110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce906142ef565b60405180910390fd5b346110ed82601054612c6590919063ffffffff16565b111561112e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111259061444f565b60405180910390fd5b60005b8181101561120b576000611143610d1b565b9050600e54611150610d1b565b10156111f75761116033826127d2565b6111b36001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c4f90919063ffffffff16565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5080806112039061490e565b915050611131565b5050565b600061121a8361184e565b821061125b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611252906142af565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601360009054906101000a900460ff1681565b6000600180811115611302577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166001811115611387577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b149050919050565b6113976127ca565b73ffffffffffffffffffffffffffffffffffffffff166113b5611c35565b73ffffffffffffffffffffffffffffffffffffffff161461140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061448f565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b6114528383836040518060200160405280600081525061219b565b505050565b6000611461610d1b565b82106114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499906145af565b60405180910390fd5b600882815481106114dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6114f66127ca565b73ffffffffffffffffffffffffffffffffffffffff16611514611c35565b73ffffffffffffffffffffffffffffffffffffffff161461156a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115619061448f565b60405180910390fd5b80600d9080519060200190611580929190613810565b5050565b61158c6127ca565b73ffffffffffffffffffffffffffffffffffffffff166115aa611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f79061448f565b60405180910390fd5b6000479050600061162f606461162160155485612c6590919063ffffffff16565b612c7b90919063ffffffff16565b905060006116468284612c9190919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561168e573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156116f7573d6000803e3d6000fd5b50505050565b60125481565b601360019054906101000a900460ff1681565b61171e6127ca565b73ffffffffffffffffffffffffffffffffffffffff1661173c611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117899061448f565b60405180910390fd5b8060128190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183c9061440f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b6906143ef565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61190e6127ca565b73ffffffffffffffffffffffffffffffffffffffff1661192c611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119799061448f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611a4b6127ca565b73ffffffffffffffffffffffffffffffffffffffff16611a69611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab69061448f565b60405180910390fd5b60005b8151811015611c31576001600b6000848481518110611b0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836001811115611b94577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000600c6000848481518110611bd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611c299061490e565b915050611ac2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c676127ca565b73ffffffffffffffffffffffffffffffffffffffff16611c85611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061448f565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d276127ca565b73ffffffffffffffffffffffffffffffffffffffff16611d45611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d929061448f565b60405180910390fd5b80600f8190555050565b606060018054611db4906148ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611de0906148ab565b8015611e2d5780601f10611e0257610100808354040283529160200191611e2d565b820191906000526020600020905b815481529060010190602001808311611e1057829003601f168201915b5050505050905090565b611e3f6127ca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea49061436f565b60405180910390fd5b8060056000611eba6127ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f676127ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fac9190614232565b60405180910390a35050565b600e5481565b601360009054906101000a900460ff1661200d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120049061458f565b60405180910390fd5b60008111612050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120479061428f565b60405180910390fd5b600e5461206d8261205f610d1b565b612c4f90919063ffffffff16565b11156120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a59061450f565b60405180910390fd5b6011548111156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea906144af565b60405180910390fd5b3461210982601054612c6590919063ffffffff16565b111561214a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121419061444f565b60405180910390fd5b60005b8181101561219157600061215f610d1b565b9050600e5461216c610d1b565b101561217d5761217c33826127d2565b5b5080806121899061490e565b91505061214d565b5050565b600f5481565b6121ac6121a66127ca565b83612915565b6121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e29061456f565b60405180910390fd5b6121f784848484612ca7565b50505050565b60155481565b61220b6127ca565b73ffffffffffffffffffffffffffffffffffffffff16612229611c35565b73ffffffffffffffffffffffffffffffffffffffff161461227f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122769061448f565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b601480546122b8906148ab565b80601f01602080910402602001604051908101604052809291908181526020018280546122e4906148ab565b80156123315780601f1061230657610100808354040283529160200191612331565b820191906000526020600020905b81548152906001019060200180831161231457829003601f168201915b505050505081565b6060612344826127f0565b612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a906144ef565b60405180910390fd5b600061238d612d03565b905060008151116123ad57604051806020016040528060008152506123d8565b806123b784612d95565b6040516020016123c89291906141a7565b6040516020818303038152906040525b915050919050565b60115481565b60105481565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124ae6127ca565b73ffffffffffffffffffffffffffffffffffffffff166124cc611c35565b73ffffffffffffffffffffffffffffffffffffffff1614612522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125199061448f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125899061430f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61265a6127ca565b73ffffffffffffffffffffffffffffffffffffffff16612678611c35565b73ffffffffffffffffffffffffffffffffffffffff16146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c59061448f565b60405180910390fd5b80601490805190602001906126e4929190613810565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127b357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127c357506127c282612f42565b5b9050919050565b600033905090565b6127ec828260405180602001604052806000815250612fac565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128cf8361179c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612920826127f0565b61295f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129569061438f565b60405180910390fd5b600061296a8361179c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129d957508373ffffffffffffffffffffffffffffffffffffffff166129c184610b7e565b73ffffffffffffffffffffffffffffffffffffffff16145b806129ea57506129e98185612412565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a138261179c565b73ffffffffffffffffffffffffffffffffffffffff1614612a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a60906144cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad09061434f565b60405180910390fd5b612ae4838383613007565b612aef60008261285c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b3f91906147c1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b9691906146e0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612c5d91906146e0565b905092915050565b60008183612c739190614767565b905092915050565b60008183612c899190614736565b905092915050565b60008183612c9f91906147c1565b905092915050565b612cb28484846129f3565b612cbe8484848461311b565b612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf4906142cf565b60405180910390fd5b50505050565b6060600d8054612d12906148ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3e906148ab565b8015612d8b5780601f10612d6057610100808354040283529160200191612d8b565b820191906000526020600020905b815481529060010190602001808311612d6e57829003601f168201915b5050505050905090565b60606000821415612ddd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f3d565b600082905060005b60008214612e0f578080612df89061490e565b915050600a82612e089190614736565b9150612de5565b60008167ffffffffffffffff811115612e51577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e835781602001600182028036833780820191505090505b5090505b60008514612f3657600182612e9c91906147c1565b9150600a85612eab9190614957565b6030612eb791906146e0565b60f81b818381518110612ef3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f2f9190614736565b9450612e87565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fb683836132b2565b612fc3600084848461311b565b613002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff9906142cf565b60405180910390fd5b505050565b613012838383613480565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130555761305081613485565b613094565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130935761309283826134ce565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d7576130d28161363b565b613116565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461311557613114828261377e565b5b5b505050565b600061313c8473ffffffffffffffffffffffffffffffffffffffff166137fd565b156132a5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131656127ca565b8786866040518563ffffffff1660e01b815260040161318794939291906141e6565b602060405180830381600087803b1580156131a157600080fd5b505af19250505080156131d257506040513d601f19601f820116820180604052508101906131cf9190613c93565b60015b613255573d8060008114613202576040519150601f19603f3d011682016040523d82523d6000602084013e613207565b606091505b5060008151141561324d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613244906142cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132aa565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133199061442f565b60405180910390fd5b61332b816127f0565b1561336b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133629061432f565b60405180910390fd5b61337760008383613007565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133c791906146e0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134db8461184e565b6134e591906147c1565b90506000600760008481526020019081526020016000205490508181146135ca576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061364f91906147c1565b90506000600960008481526020019081526020016000205490506000600883815481106136a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106136ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006137898361184e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461381c906148ab565b90600052602060002090601f01602090048101928261383e5760008555613885565b82601f1061385757805160ff1916838001178555613885565b82800160010185558215613885579182015b82811115613884578251825591602001919060010190613869565b5b5090506138929190613896565b5090565b5b808211156138af576000816000905550600101613897565b5090565b60006138c66138c18461460f565b6145ea565b905080838252602082019050828560208602820111156138e557600080fd5b60005b8581101561391557816138fb888261399b565b8452602084019350602083019250506001810190506138e8565b5050509392505050565b600061393261392d8461463b565b6145ea565b90508281526020810184848401111561394a57600080fd5b613955848285614869565b509392505050565b600061397061396b8461466c565b6145ea565b90508281526020810184848401111561398857600080fd5b613993848285614869565b509392505050565b6000813590506139aa8161517a565b92915050565b600082601f8301126139c157600080fd5b81356139d18482602086016138b3565b91505092915050565b6000813590506139e981615191565b92915050565b6000813590506139fe816151a8565b92915050565b600081519050613a13816151a8565b92915050565b600082601f830112613a2a57600080fd5b8135613a3a84826020860161391f565b91505092915050565b600082601f830112613a5457600080fd5b8135613a6484826020860161395d565b91505092915050565b600081359050613a7c816151bf565b92915050565b600060208284031215613a9457600080fd5b6000613aa28482850161399b565b91505092915050565b60008060408385031215613abe57600080fd5b6000613acc8582860161399b565b9250506020613add8582860161399b565b9150509250929050565b600080600060608486031215613afc57600080fd5b6000613b0a8682870161399b565b9350506020613b1b8682870161399b565b9250506040613b2c86828701613a6d565b9150509250925092565b60008060008060808587031215613b4c57600080fd5b6000613b5a8782880161399b565b9450506020613b6b8782880161399b565b9350506040613b7c87828801613a6d565b925050606085013567ffffffffffffffff811115613b9957600080fd5b613ba587828801613a19565b91505092959194509250565b60008060408385031215613bc457600080fd5b6000613bd28582860161399b565b9250506020613be3858286016139da565b9150509250929050565b60008060408385031215613c0057600080fd5b6000613c0e8582860161399b565b9250506020613c1f85828601613a6d565b9150509250929050565b600060208284031215613c3b57600080fd5b600082013567ffffffffffffffff811115613c5557600080fd5b613c61848285016139b0565b91505092915050565b600060208284031215613c7c57600080fd5b6000613c8a848285016139ef565b91505092915050565b600060208284031215613ca557600080fd5b6000613cb384828501613a04565b91505092915050565b600060208284031215613cce57600080fd5b600082013567ffffffffffffffff811115613ce857600080fd5b613cf484828501613a43565b91505092915050565b600060208284031215613d0f57600080fd5b6000613d1d84828501613a6d565b91505092915050565b613d2f816147f5565b82525050565b613d3e81614807565b82525050565b6000613d4f8261469d565b613d5981856146b3565b9350613d69818560208601614878565b613d7281614a44565b840191505092915050565b6000613d88826146a8565b613d9281856146c4565b9350613da2818560208601614878565b613dab81614a44565b840191505092915050565b6000613dc1826146a8565b613dcb81856146d5565b9350613ddb818560208601614878565b80840191505092915050565b6000613df4601a836146c4565b9150613dff82614a55565b602082019050919050565b6000613e176028836146c4565b9150613e2282614a7e565b604082019050919050565b6000613e3a602b836146c4565b9150613e4582614acd565b604082019050919050565b6000613e5d6032836146c4565b9150613e6882614b1c565b604082019050919050565b6000613e806033836146c4565b9150613e8b82614b6b565b604082019050919050565b6000613ea36026836146c4565b9150613eae82614bba565b604082019050919050565b6000613ec6601c836146c4565b9150613ed182614c09565b602082019050919050565b6000613ee96024836146c4565b9150613ef482614c32565b604082019050919050565b6000613f0c6019836146c4565b9150613f1782614c81565b602082019050919050565b6000613f2f602c836146c4565b9150613f3a82614caa565b604082019050919050565b6000613f526038836146c4565b9150613f5d82614cf9565b604082019050919050565b6000613f756034836146c4565b9150613f8082614d48565b604082019050919050565b6000613f98602a836146c4565b9150613fa382614d97565b604082019050919050565b6000613fbb6029836146c4565b9150613fc682614de6565b604082019050919050565b6000613fde6020836146c4565b9150613fe982614e35565b602082019050919050565b60006140016020836146c4565b915061400c82614e5e565b602082019050919050565b6000614024602c836146c4565b915061402f82614e87565b604082019050919050565b60006140476020836146c4565b915061405282614ed6565b602082019050919050565b600061406a602b836146c4565b915061407582614eff565b604082019050919050565b600061408d6029836146c4565b915061409882614f4e565b604082019050919050565b60006140b0602f836146c4565b91506140bb82614f9d565b604082019050919050565b60006140d3601e836146c4565b91506140de82614fec565b602082019050919050565b60006140f66021836146c4565b915061410182615015565b604082019050919050565b60006141196022836146c4565b915061412482615064565b604082019050919050565b600061413c6031836146c4565b9150614147826150b3565b604082019050919050565b600061415f601d836146c4565b915061416a82615102565b602082019050919050565b6000614182602c836146c4565b915061418d8261512b565b604082019050919050565b6141a18161485f565b82525050565b60006141b38285613db6565b91506141bf8284613db6565b91508190509392505050565b60006020820190506141e06000830184613d26565b92915050565b60006080820190506141fb6000830187613d26565b6142086020830186613d26565b6142156040830185614198565b81810360608301526142278184613d44565b905095945050505050565b60006020820190506142476000830184613d35565b92915050565b600060208201905081810360008301526142678184613d7d565b905092915050565b6000602082019050818103600083015261428881613de7565b9050919050565b600060208201905081810360008301526142a881613e0a565b9050919050565b600060208201905081810360008301526142c881613e2d565b9050919050565b600060208201905081810360008301526142e881613e50565b9050919050565b6000602082019050818103600083015261430881613e73565b9050919050565b6000602082019050818103600083015261432881613e96565b9050919050565b6000602082019050818103600083015261434881613eb9565b9050919050565b6000602082019050818103600083015261436881613edc565b9050919050565b6000602082019050818103600083015261438881613eff565b9050919050565b600060208201905081810360008301526143a881613f22565b9050919050565b600060208201905081810360008301526143c881613f45565b9050919050565b600060208201905081810360008301526143e881613f68565b9050919050565b6000602082019050818103600083015261440881613f8b565b9050919050565b6000602082019050818103600083015261442881613fae565b9050919050565b6000602082019050818103600083015261444881613fd1565b9050919050565b6000602082019050818103600083015261446881613ff4565b9050919050565b6000602082019050818103600083015261448881614017565b9050919050565b600060208201905081810360008301526144a88161403a565b9050919050565b600060208201905081810360008301526144c88161405d565b9050919050565b600060208201905081810360008301526144e881614080565b9050919050565b60006020820190508181036000830152614508816140a3565b9050919050565b60006020820190508181036000830152614528816140c6565b9050919050565b60006020820190508181036000830152614548816140e9565b9050919050565b600060208201905081810360008301526145688161410c565b9050919050565b600060208201905081810360008301526145888161412f565b9050919050565b600060208201905081810360008301526145a881614152565b9050919050565b600060208201905081810360008301526145c881614175565b9050919050565b60006020820190506145e46000830184614198565b92915050565b60006145f4614605565b905061460082826148dd565b919050565b6000604051905090565b600067ffffffffffffffff82111561462a57614629614a15565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561465657614655614a15565b5b61465f82614a44565b9050602081019050919050565b600067ffffffffffffffff82111561468757614686614a15565b5b61469082614a44565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006146eb8261485f565b91506146f68361485f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561472b5761472a614988565b5b828201905092915050565b60006147418261485f565b915061474c8361485f565b92508261475c5761475b6149b7565b5b828204905092915050565b60006147728261485f565b915061477d8361485f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147b6576147b5614988565b5b828202905092915050565b60006147cc8261485f565b91506147d78361485f565b9250828210156147ea576147e9614988565b5b828203905092915050565b60006148008261483f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561489657808201518184015260208101905061487b565b838111156148a5576000848401525b50505050565b600060028204905060018216806148c357607f821691505b602082108114156148d7576148d66149e6565b5b50919050565b6148e682614a44565b810181811067ffffffffffffffff8211171561490557614904614a15565b5b80604052505050565b60006149198261485f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561494c5761494b614988565b5b600182019050919050565b60006149628261485f565b915061496d8361485f565b92508261497d5761497c6149b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f50726573616c65206973206e6f7420616374697665207965742e000000000000600082015250565b7f5768792061726520796f75206d696e74696e67206c657373207468616e207a6560008201527f726f20626f79732e000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f43616e6e6f74206d696e742074686973206e756d626572206f6620707265736160008201527f6c6520626f797320696e206f6e6520676f202100000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f7520617265206d696e74696e67206d6f7265207468616e20796f7572206160008201527f6c6c6f7765642070726573616c6520626f797321000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f457468657265756d2073656e74206973206e6f742073756666696369656e742e600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206d696e742074686973206e756d626572206f6620626f79732060008201527f696e206f6e6520676f2021000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f6e6c792031302c30303020626f79732061726520617661696c61626c650000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420612077686974656c6973746564206d656d62657260008201527f2021000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f7420616374697661746564207965742e000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615183816147f5565b811461518e57600080fd5b50565b61519a81614807565b81146151a557600080fd5b50565b6151b181614813565b81146151bc57600080fd5b50565b6151c88161485f565b81146151d357600080fd5b5056fea2646970667358221220f90543537148545902a25e3fcab63e542ab96f348cf1647a435b5aaf659e27e164736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000074c6f7374626f790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074c4f5354424f5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001368747470733a2f2f6c6f7374626f792e696f2f00000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806370a0823111610144578063b88d4fde116100b6578063cf8f479f1161007a578063cf8f479f146108a2578063e1b7f9d6146108cd578063e7b94df4146108f8578063e985e9c514610923578063f2fde38b14610960578063ffe630b5146109895761025c565b8063b88d4fde146107cf578063c16cc810146107f8578063c29ad3ff14610823578063c6ab67a31461083a578063c87b56dd146108655761025c565b806390fd50ca1161010857806390fd50ca146106e057806395d89b4114610709578063a22cb46514610734578063a4b4839d1461075d578063a7d30e0f14610788578063b6e67bdd146107a45761025c565b806370a082311461060f578063715018a61461064c5780637f649783146106635780638da5cb5b1461068c5780638f95a445146106b75761025c565b806331f9c919116101dd57806355f804b3116101a157806355f804b3146105135780635fd8c7101461053c578063600227fa1461055357806360d938dc1461057e57806361edf7c7146105a95780636352211e146105d25761025c565b806331f9c9191461042e5780633af32abf146104595780633b6ccee71461049657806342842e0e146104ad5780634f6ccce7146104d65761025c565b806318160ddd1161022457806318160ddd1461035857806323b872dd14610383578063290b2a0f146103ac5780632ad0dff5146103d55780632f745c59146103f15761025c565b806301ffc9a714610261578063037424e41461029e57806306fdde03146102c7578063081812fc146102f2578063095ea7b31461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613c6a565b6109b2565b6040516102959190614232565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613cfd565b610a2c565b005b3480156102d357600080fd5b506102dc610aec565b6040516102e9919061424d565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190613cfd565b610b7e565b60405161032691906141cb565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613bed565b610c03565b005b34801561036457600080fd5b5061036d610d1b565b60405161037a91906145cf565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613ae7565b610d28565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190613cfd565b610d88565b005b6103ef60048036038101906103ea9190613cfd565b610e0e565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613bed565b61120f565b60405161042591906145cf565b60405180910390f35b34801561043a57600080fd5b506104436112b4565b6040516104509190614232565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b9190613a82565b6112c7565b60405161048d9190614232565b60405180910390f35b3480156104a257600080fd5b506104ab61138f565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613ae7565b611437565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613cfd565b611457565b60405161050a91906145cf565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613cbc565b6114ee565b005b34801561054857600080fd5b50610551611584565b005b34801561055f57600080fd5b506105686116fd565b60405161057591906145cf565b60405180910390f35b34801561058a57600080fd5b50610593611703565b6040516105a09190614232565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613cfd565b611716565b005b3480156105de57600080fd5b506105f960048036038101906105f49190613cfd565b61179c565b60405161060691906141cb565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613a82565b61184e565b60405161064391906145cf565b60405180910390f35b34801561065857600080fd5b50610661611906565b005b34801561066f57600080fd5b5061068a60048036038101906106859190613c29565b611a43565b005b34801561069857600080fd5b506106a1611c35565b6040516106ae91906141cb565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190613a82565b611c5f565b005b3480156106ec57600080fd5b5061070760048036038101906107029190613cfd565b611d1f565b005b34801561071557600080fd5b5061071e611da5565b60405161072b919061424d565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190613bb1565b611e37565b005b34801561076957600080fd5b50610772611fb8565b60405161077f91906145cf565b60405180910390f35b6107a2600480360381019061079d9190613cfd565b611fbe565b005b3480156107b057600080fd5b506107b9612195565b6040516107c691906145cf565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f19190613b36565b61219b565b005b34801561080457600080fd5b5061080d6121fd565b60405161081a91906145cf565b60405180910390f35b34801561082f57600080fd5b50610838612203565b005b34801561084657600080fd5b5061084f6122ab565b60405161085c919061424d565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613cfd565b612339565b604051610899919061424d565b60405180910390f35b3480156108ae57600080fd5b506108b76123e0565b6040516108c491906145cf565b60405180910390f35b3480156108d957600080fd5b506108e26123e6565b6040516108ef91906145cf565b60405180910390f35b34801561090457600080fd5b5061090d6123ec565b60405161091a91906141cb565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613aab565b612412565b6040516109579190614232565b60405180910390f35b34801561096c57600080fd5b5061098760048036038101906109829190613a82565b6124a6565b005b34801561099557600080fd5b506109b060048036038101906109ab9190613cbc565b612652565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a255750610a24826126e8565b5b9050919050565b610a346127ca565b73ffffffffffffffffffffffffffffffffffffffff16610a52611c35565b73ffffffffffffffffffffffffffffffffffffffff1614610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f9061448f565b60405180910390fd5b60005b81811015610ae8576000610abd610d1b565b9050600e54811015610ad457610ad333826127d2565b5b508080610ae09061490e565b915050610aab565b5050565b606060008054610afb906148ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b27906148ab565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b5050505050905090565b6000610b89826127f0565b610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061446f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0e8261179c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c769061452f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c9e6127ca565b73ffffffffffffffffffffffffffffffffffffffff161480610ccd5750610ccc81610cc76127ca565b612412565b5b610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d03906143af565b60405180910390fd5b610d16838361285c565b505050565b6000600880549050905090565b610d39610d336127ca565b82612915565b610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f9061456f565b60405180910390fd5b610d838383836129f3565b505050565b610d906127ca565b73ffffffffffffffffffffffffffffffffffffffff16610dae611c35565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061448f565b60405180910390fd5b8060118190555050565b601360019054906101000a900460ff16610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e549061426f565b60405180910390fd5b60008111610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e979061428f565b60405180910390fd5b600180811115610ed9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166001811115610f5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061454f565b60405180910390fd5b600f54610ff382600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c4f90919063ffffffff16565b1115611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b906143cf565b60405180910390fd5b600e5461105182611043610d1b565b612c4f90919063ffffffff16565b1115611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061450f565b60405180910390fd5b6012548111156110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce906142ef565b60405180910390fd5b346110ed82601054612c6590919063ffffffff16565b111561112e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111259061444f565b60405180910390fd5b60005b8181101561120b576000611143610d1b565b9050600e54611150610d1b565b10156111f75761116033826127d2565b6111b36001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c4f90919063ffffffff16565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5080806112039061490e565b915050611131565b5050565b600061121a8361184e565b821061125b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611252906142af565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601360009054906101000a900460ff1681565b6000600180811115611302577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166001811115611387577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b149050919050565b6113976127ca565b73ffffffffffffffffffffffffffffffffffffffff166113b5611c35565b73ffffffffffffffffffffffffffffffffffffffff161461140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061448f565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b6114528383836040518060200160405280600081525061219b565b505050565b6000611461610d1b565b82106114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499906145af565b60405180910390fd5b600882815481106114dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6114f66127ca565b73ffffffffffffffffffffffffffffffffffffffff16611514611c35565b73ffffffffffffffffffffffffffffffffffffffff161461156a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115619061448f565b60405180910390fd5b80600d9080519060200190611580929190613810565b5050565b61158c6127ca565b73ffffffffffffffffffffffffffffffffffffffff166115aa611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f79061448f565b60405180910390fd5b6000479050600061162f606461162160155485612c6590919063ffffffff16565b612c7b90919063ffffffff16565b905060006116468284612c9190919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561168e573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156116f7573d6000803e3d6000fd5b50505050565b60125481565b601360019054906101000a900460ff1681565b61171e6127ca565b73ffffffffffffffffffffffffffffffffffffffff1661173c611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117899061448f565b60405180910390fd5b8060128190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183c9061440f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b6906143ef565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61190e6127ca565b73ffffffffffffffffffffffffffffffffffffffff1661192c611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119799061448f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611a4b6127ca565b73ffffffffffffffffffffffffffffffffffffffff16611a69611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab69061448f565b60405180910390fd5b60005b8151811015611c31576001600b6000848481518110611b0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836001811115611b94577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000600c6000848481518110611bd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611c299061490e565b915050611ac2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c676127ca565b73ffffffffffffffffffffffffffffffffffffffff16611c85611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061448f565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d276127ca565b73ffffffffffffffffffffffffffffffffffffffff16611d45611c35565b73ffffffffffffffffffffffffffffffffffffffff1614611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d929061448f565b60405180910390fd5b80600f8190555050565b606060018054611db4906148ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611de0906148ab565b8015611e2d5780601f10611e0257610100808354040283529160200191611e2d565b820191906000526020600020905b815481529060010190602001808311611e1057829003601f168201915b5050505050905090565b611e3f6127ca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea49061436f565b60405180910390fd5b8060056000611eba6127ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f676127ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fac9190614232565b60405180910390a35050565b600e5481565b601360009054906101000a900460ff1661200d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120049061458f565b60405180910390fd5b60008111612050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120479061428f565b60405180910390fd5b600e5461206d8261205f610d1b565b612c4f90919063ffffffff16565b11156120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a59061450f565b60405180910390fd5b6011548111156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea906144af565b60405180910390fd5b3461210982601054612c6590919063ffffffff16565b111561214a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121419061444f565b60405180910390fd5b60005b8181101561219157600061215f610d1b565b9050600e5461216c610d1b565b101561217d5761217c33826127d2565b5b5080806121899061490e565b91505061214d565b5050565b600f5481565b6121ac6121a66127ca565b83612915565b6121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e29061456f565b60405180910390fd5b6121f784848484612ca7565b50505050565b60155481565b61220b6127ca565b73ffffffffffffffffffffffffffffffffffffffff16612229611c35565b73ffffffffffffffffffffffffffffffffffffffff161461227f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122769061448f565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b601480546122b8906148ab565b80601f01602080910402602001604051908101604052809291908181526020018280546122e4906148ab565b80156123315780601f1061230657610100808354040283529160200191612331565b820191906000526020600020905b81548152906001019060200180831161231457829003601f168201915b505050505081565b6060612344826127f0565b612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a906144ef565b60405180910390fd5b600061238d612d03565b905060008151116123ad57604051806020016040528060008152506123d8565b806123b784612d95565b6040516020016123c89291906141a7565b6040516020818303038152906040525b915050919050565b60115481565b60105481565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124ae6127ca565b73ffffffffffffffffffffffffffffffffffffffff166124cc611c35565b73ffffffffffffffffffffffffffffffffffffffff1614612522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125199061448f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125899061430f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61265a6127ca565b73ffffffffffffffffffffffffffffffffffffffff16612678611c35565b73ffffffffffffffffffffffffffffffffffffffff16146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c59061448f565b60405180910390fd5b80601490805190602001906126e4929190613810565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127b357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127c357506127c282612f42565b5b9050919050565b600033905090565b6127ec828260405180602001604052806000815250612fac565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128cf8361179c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612920826127f0565b61295f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129569061438f565b60405180910390fd5b600061296a8361179c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129d957508373ffffffffffffffffffffffffffffffffffffffff166129c184610b7e565b73ffffffffffffffffffffffffffffffffffffffff16145b806129ea57506129e98185612412565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a138261179c565b73ffffffffffffffffffffffffffffffffffffffff1614612a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a60906144cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad09061434f565b60405180910390fd5b612ae4838383613007565b612aef60008261285c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b3f91906147c1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b9691906146e0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612c5d91906146e0565b905092915050565b60008183612c739190614767565b905092915050565b60008183612c899190614736565b905092915050565b60008183612c9f91906147c1565b905092915050565b612cb28484846129f3565b612cbe8484848461311b565b612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf4906142cf565b60405180910390fd5b50505050565b6060600d8054612d12906148ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3e906148ab565b8015612d8b5780601f10612d6057610100808354040283529160200191612d8b565b820191906000526020600020905b815481529060010190602001808311612d6e57829003601f168201915b5050505050905090565b60606000821415612ddd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f3d565b600082905060005b60008214612e0f578080612df89061490e565b915050600a82612e089190614736565b9150612de5565b60008167ffffffffffffffff811115612e51577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e835781602001600182028036833780820191505090505b5090505b60008514612f3657600182612e9c91906147c1565b9150600a85612eab9190614957565b6030612eb791906146e0565b60f81b818381518110612ef3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f2f9190614736565b9450612e87565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fb683836132b2565b612fc3600084848461311b565b613002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff9906142cf565b60405180910390fd5b505050565b613012838383613480565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130555761305081613485565b613094565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130935761309283826134ce565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d7576130d28161363b565b613116565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461311557613114828261377e565b5b5b505050565b600061313c8473ffffffffffffffffffffffffffffffffffffffff166137fd565b156132a5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131656127ca565b8786866040518563ffffffff1660e01b815260040161318794939291906141e6565b602060405180830381600087803b1580156131a157600080fd5b505af19250505080156131d257506040513d601f19601f820116820180604052508101906131cf9190613c93565b60015b613255573d8060008114613202576040519150601f19603f3d011682016040523d82523d6000602084013e613207565b606091505b5060008151141561324d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613244906142cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132aa565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133199061442f565b60405180910390fd5b61332b816127f0565b1561336b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133629061432f565b60405180910390fd5b61337760008383613007565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133c791906146e0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134db8461184e565b6134e591906147c1565b90506000600760008481526020019081526020016000205490508181146135ca576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061364f91906147c1565b90506000600960008481526020019081526020016000205490506000600883815481106136a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106136ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006137898361184e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461381c906148ab565b90600052602060002090601f01602090048101928261383e5760008555613885565b82601f1061385757805160ff1916838001178555613885565b82800160010185558215613885579182015b82811115613884578251825591602001919060010190613869565b5b5090506138929190613896565b5090565b5b808211156138af576000816000905550600101613897565b5090565b60006138c66138c18461460f565b6145ea565b905080838252602082019050828560208602820111156138e557600080fd5b60005b8581101561391557816138fb888261399b565b8452602084019350602083019250506001810190506138e8565b5050509392505050565b600061393261392d8461463b565b6145ea565b90508281526020810184848401111561394a57600080fd5b613955848285614869565b509392505050565b600061397061396b8461466c565b6145ea565b90508281526020810184848401111561398857600080fd5b613993848285614869565b509392505050565b6000813590506139aa8161517a565b92915050565b600082601f8301126139c157600080fd5b81356139d18482602086016138b3565b91505092915050565b6000813590506139e981615191565b92915050565b6000813590506139fe816151a8565b92915050565b600081519050613a13816151a8565b92915050565b600082601f830112613a2a57600080fd5b8135613a3a84826020860161391f565b91505092915050565b600082601f830112613a5457600080fd5b8135613a6484826020860161395d565b91505092915050565b600081359050613a7c816151bf565b92915050565b600060208284031215613a9457600080fd5b6000613aa28482850161399b565b91505092915050565b60008060408385031215613abe57600080fd5b6000613acc8582860161399b565b9250506020613add8582860161399b565b9150509250929050565b600080600060608486031215613afc57600080fd5b6000613b0a8682870161399b565b9350506020613b1b8682870161399b565b9250506040613b2c86828701613a6d565b9150509250925092565b60008060008060808587031215613b4c57600080fd5b6000613b5a8782880161399b565b9450506020613b6b8782880161399b565b9350506040613b7c87828801613a6d565b925050606085013567ffffffffffffffff811115613b9957600080fd5b613ba587828801613a19565b91505092959194509250565b60008060408385031215613bc457600080fd5b6000613bd28582860161399b565b9250506020613be3858286016139da565b9150509250929050565b60008060408385031215613c0057600080fd5b6000613c0e8582860161399b565b9250506020613c1f85828601613a6d565b9150509250929050565b600060208284031215613c3b57600080fd5b600082013567ffffffffffffffff811115613c5557600080fd5b613c61848285016139b0565b91505092915050565b600060208284031215613c7c57600080fd5b6000613c8a848285016139ef565b91505092915050565b600060208284031215613ca557600080fd5b6000613cb384828501613a04565b91505092915050565b600060208284031215613cce57600080fd5b600082013567ffffffffffffffff811115613ce857600080fd5b613cf484828501613a43565b91505092915050565b600060208284031215613d0f57600080fd5b6000613d1d84828501613a6d565b91505092915050565b613d2f816147f5565b82525050565b613d3e81614807565b82525050565b6000613d4f8261469d565b613d5981856146b3565b9350613d69818560208601614878565b613d7281614a44565b840191505092915050565b6000613d88826146a8565b613d9281856146c4565b9350613da2818560208601614878565b613dab81614a44565b840191505092915050565b6000613dc1826146a8565b613dcb81856146d5565b9350613ddb818560208601614878565b80840191505092915050565b6000613df4601a836146c4565b9150613dff82614a55565b602082019050919050565b6000613e176028836146c4565b9150613e2282614a7e565b604082019050919050565b6000613e3a602b836146c4565b9150613e4582614acd565b604082019050919050565b6000613e5d6032836146c4565b9150613e6882614b1c565b604082019050919050565b6000613e806033836146c4565b9150613e8b82614b6b565b604082019050919050565b6000613ea36026836146c4565b9150613eae82614bba565b604082019050919050565b6000613ec6601c836146c4565b9150613ed182614c09565b602082019050919050565b6000613ee96024836146c4565b9150613ef482614c32565b604082019050919050565b6000613f0c6019836146c4565b9150613f1782614c81565b602082019050919050565b6000613f2f602c836146c4565b9150613f3a82614caa565b604082019050919050565b6000613f526038836146c4565b9150613f5d82614cf9565b604082019050919050565b6000613f756034836146c4565b9150613f8082614d48565b604082019050919050565b6000613f98602a836146c4565b9150613fa382614d97565b604082019050919050565b6000613fbb6029836146c4565b9150613fc682614de6565b604082019050919050565b6000613fde6020836146c4565b9150613fe982614e35565b602082019050919050565b60006140016020836146c4565b915061400c82614e5e565b602082019050919050565b6000614024602c836146c4565b915061402f82614e87565b604082019050919050565b60006140476020836146c4565b915061405282614ed6565b602082019050919050565b600061406a602b836146c4565b915061407582614eff565b604082019050919050565b600061408d6029836146c4565b915061409882614f4e565b604082019050919050565b60006140b0602f836146c4565b91506140bb82614f9d565b604082019050919050565b60006140d3601e836146c4565b91506140de82614fec565b602082019050919050565b60006140f66021836146c4565b915061410182615015565b604082019050919050565b60006141196022836146c4565b915061412482615064565b604082019050919050565b600061413c6031836146c4565b9150614147826150b3565b604082019050919050565b600061415f601d836146c4565b915061416a82615102565b602082019050919050565b6000614182602c836146c4565b915061418d8261512b565b604082019050919050565b6141a18161485f565b82525050565b60006141b38285613db6565b91506141bf8284613db6565b91508190509392505050565b60006020820190506141e06000830184613d26565b92915050565b60006080820190506141fb6000830187613d26565b6142086020830186613d26565b6142156040830185614198565b81810360608301526142278184613d44565b905095945050505050565b60006020820190506142476000830184613d35565b92915050565b600060208201905081810360008301526142678184613d7d565b905092915050565b6000602082019050818103600083015261428881613de7565b9050919050565b600060208201905081810360008301526142a881613e0a565b9050919050565b600060208201905081810360008301526142c881613e2d565b9050919050565b600060208201905081810360008301526142e881613e50565b9050919050565b6000602082019050818103600083015261430881613e73565b9050919050565b6000602082019050818103600083015261432881613e96565b9050919050565b6000602082019050818103600083015261434881613eb9565b9050919050565b6000602082019050818103600083015261436881613edc565b9050919050565b6000602082019050818103600083015261438881613eff565b9050919050565b600060208201905081810360008301526143a881613f22565b9050919050565b600060208201905081810360008301526143c881613f45565b9050919050565b600060208201905081810360008301526143e881613f68565b9050919050565b6000602082019050818103600083015261440881613f8b565b9050919050565b6000602082019050818103600083015261442881613fae565b9050919050565b6000602082019050818103600083015261444881613fd1565b9050919050565b6000602082019050818103600083015261446881613ff4565b9050919050565b6000602082019050818103600083015261448881614017565b9050919050565b600060208201905081810360008301526144a88161403a565b9050919050565b600060208201905081810360008301526144c88161405d565b9050919050565b600060208201905081810360008301526144e881614080565b9050919050565b60006020820190508181036000830152614508816140a3565b9050919050565b60006020820190508181036000830152614528816140c6565b9050919050565b60006020820190508181036000830152614548816140e9565b9050919050565b600060208201905081810360008301526145688161410c565b9050919050565b600060208201905081810360008301526145888161412f565b9050919050565b600060208201905081810360008301526145a881614152565b9050919050565b600060208201905081810360008301526145c881614175565b9050919050565b60006020820190506145e46000830184614198565b92915050565b60006145f4614605565b905061460082826148dd565b919050565b6000604051905090565b600067ffffffffffffffff82111561462a57614629614a15565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561465657614655614a15565b5b61465f82614a44565b9050602081019050919050565b600067ffffffffffffffff82111561468757614686614a15565b5b61469082614a44565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006146eb8261485f565b91506146f68361485f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561472b5761472a614988565b5b828201905092915050565b60006147418261485f565b915061474c8361485f565b92508261475c5761475b6149b7565b5b828204905092915050565b60006147728261485f565b915061477d8361485f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147b6576147b5614988565b5b828202905092915050565b60006147cc8261485f565b91506147d78361485f565b9250828210156147ea576147e9614988565b5b828203905092915050565b60006148008261483f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561489657808201518184015260208101905061487b565b838111156148a5576000848401525b50505050565b600060028204905060018216806148c357607f821691505b602082108114156148d7576148d66149e6565b5b50919050565b6148e682614a44565b810181811067ffffffffffffffff8211171561490557614904614a15565b5b80604052505050565b60006149198261485f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561494c5761494b614988565b5b600182019050919050565b60006149628261485f565b915061496d8361485f565b92508261497d5761497c6149b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f50726573616c65206973206e6f7420616374697665207965742e000000000000600082015250565b7f5768792061726520796f75206d696e74696e67206c657373207468616e207a6560008201527f726f20626f79732e000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f43616e6e6f74206d696e742074686973206e756d626572206f6620707265736160008201527f6c6520626f797320696e206f6e6520676f202100000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f7520617265206d696e74696e67206d6f7265207468616e20796f7572206160008201527f6c6c6f7765642070726573616c6520626f797321000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f457468657265756d2073656e74206973206e6f742073756666696369656e742e600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206d696e742074686973206e756d626572206f6620626f79732060008201527f696e206f6e6520676f2021000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f6e6c792031302c30303020626f79732061726520617661696c61626c650000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420612077686974656c6973746564206d656d62657260008201527f2021000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f7420616374697661746564207965742e000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615183816147f5565b811461518e57600080fd5b50565b61519a81614807565b81146151a557600080fd5b50565b6151b181614813565b81146151bc57600080fd5b50565b6151c88161485f565b81146151d357600080fd5b5056fea2646970667358221220f90543537148545902a25e3fcab63e542ab96f348cf1647a435b5aaf659e27e164736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000074c6f7374626f790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074c4f5354424f5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001368747470733a2f2f6c6f7374626f792e696f2f00000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Lostboy
Arg [1] : symbol (string): LOSTBOY
Arg [2] : baseURI (string): https://lostboy.io/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 4c6f7374626f7900000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 4c4f5354424f5900000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [8] : 68747470733a2f2f6c6f7374626f792e696f2f00000000000000000000000000


Deployed Bytecode Sourcemap

49338:7308:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40911:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52024:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28184:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29644:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29181:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41564:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30534:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55562:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53217:1108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41232:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50492:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54775:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55226:91;;;;;;;;;;;;;:::i;:::-;;30910:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41754:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56200:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51416:503;;;;;;;;;;;;;:::i;:::-;;50355:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50591:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55774:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27878:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27608:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48752:148;;;;;;;;;;;;;:::i;:::-;;54419:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48101:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55032:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56011:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28353:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29937:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49911:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52368:763;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50010:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31132:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50842:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55386:95;;;;;;;;;;;;;:::i;:::-;;50711:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28528:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50246:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50136:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50962:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30303:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49055:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56502:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40911:237;41013:4;41052:35;41037:50;;;:11;:50;;;;:103;;;;41104:36;41128:11;41104:23;:36::i;:::-;41037:103;41030:110;;40911:237;;;:::o;52024:277::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52095:6:::1;52091:203;52111:8;52107:1;:12;52091:203;;;52141:14;52158:13;:11;:13::i;:::-;52141:30;;52202:12;;52190:9;:24;52186:97;;;52235:32;52245:10;52257:9;52235;:32::i;:::-;52186:97;52091:203;52121:3;;;;;:::i;:::-;;;;52091:203;;;;52024:277:::0;:::o;28184:100::-;28238:13;28271:5;28264:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28184:100;:::o;29644:221::-;29720:7;29748:16;29756:7;29748;:16::i;:::-;29740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29833:15;:24;29849:7;29833:24;;;;;;;;;;;;;;;;;;;;;29826:31;;29644:221;;;:::o;29181:397::-;29262:13;29278:23;29293:7;29278:14;:23::i;:::-;29262:39;;29326:5;29320:11;;:2;:11;;;;29312:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29406:5;29390:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29415:37;29432:5;29439:12;:10;:12::i;:::-;29415:16;:37::i;:::-;29390:62;29382:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29549:21;29558:2;29562:7;29549:8;:21::i;:::-;29181:397;;;:::o;41564:113::-;41625:7;41652:10;:17;;;;41645:24;;41564:113;:::o;30534:305::-;30695:41;30714:12;:10;:12::i;:::-;30728:7;30695:18;:41::i;:::-;30687:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30803:28;30813:4;30819:2;30823:7;30803:9;:28::i;:::-;30534:305;;;:::o;55562:111::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55657:8:::1;55640:14;:25;;;;55562:111:::0;:::o;53217:1108::-;53295:15;;;;;;;;;;;53287:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53375:1;53360:12;:16;53352:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53475:24;53440:59;;;;;;;;;;;;;;;;:19;:31;53460:10;53440:31;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;53432:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;53606:28;;53557:45;53589:12;53557:15;:27;53573:10;53557:27;;;;;;;;;;;;;;;;:31;;:45;;;;:::i;:::-;:77;;53549:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;53745:12;;53710:31;53728:12;53710:13;:11;:13::i;:::-;:17;;:31;;;;:::i;:::-;:47;;53702:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;53827:21;;53811:12;:37;;53803:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;53957:9;53923:30;53940:12;53923;;:16;;:30;;;;:::i;:::-;:43;;53915:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;54028:6;54024:294;54044:12;54040:1;:16;54024:294;;;54078:14;54095:13;:11;:13::i;:::-;54078:30;;54143:12;;54127:13;:11;:13::i;:::-;:28;54123:184;;;54176:32;54186:10;54198:9;54176;:32::i;:::-;54257:34;54289:1;54257:15;:27;54273:10;54257:27;;;;;;;;;;;;;;;;:31;;:34;;;;:::i;:::-;54227:15;:27;54243:10;54227:27;;;;;;;;;;;;;;;:64;;;;54123:184;54024:294;54058:3;;;;;:::i;:::-;;;;54024:294;;;;53217:1108;:::o;41232:256::-;41329:7;41365:23;41382:5;41365:16;:23::i;:::-;41357:5;:31;41349:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41454:12;:19;41467:5;41454:19;;;;;;;;;;;;;;;:26;41474:5;41454:26;;;;;;;;;;;;41447:33;;41232:256;;;;:::o;50492:33::-;;;;;;;;;;;;;:::o;54775:144::-;54834:4;54887:24;54858:53;;;;;;;;;;;;;;;;:19;:25;54878:4;54858:25;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;54851:60;;54775:144;;;:::o;55226:91::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55296:13:::1;;;;;;;;;;;55295:14;55279:13;;:30;;;;;;;;;;;;;;;;;;55226:91::o:0;30910:151::-;31014:39;31031:4;31037:2;31041:7;31014:39;;;;;;;;;;;;:16;:39::i;:::-;30910:151;;;:::o;41754:233::-;41829:7;41865:30;:28;:30::i;:::-;41857:5;:38;41849:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41962:10;41973:5;41962:17;;;;;;;;;;;;;;;;;;;;;;;;41955:24;;41754:233;;;:::o;56200:102::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56287:7:::1;56275:9;:19;;;;;;;;;;;;:::i;:::-;;56200:102:::0;:::o;51416:503::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51505:15:::1;51523:21;51505:39;;51630:21;51654:40;51690:3;51654:31;51666:18;;51654:7;:11;;:31;;;;:::i;:::-;:35;;:40;;;;:::i;:::-;51630:64;;51705:18;51726:26;51738:13;51726:7;:11;;:26;;;;:::i;:::-;51705:47;;51821:10;51813:28;;:40;51842:10;51813:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51872:14;;;;;;;;;;;51864:32;;:47;51897:13;51864:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;48392:1;;;51416:503::o:0;50355:38::-;;;;:::o;50591:35::-;;;;;;;;;;;;;:::o;55774:125::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55883:8:::1;55859:21;:32;;;;55774:125:::0;:::o;27878:239::-;27950:7;27970:13;27986:7;:16;27994:7;27986:16;;;;;;;;;;;;;;;;;;;;;27970:32;;28038:1;28021:19;;:5;:19;;;;28013:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28104:5;28097:12;;;27878:239;;;:::o;27608:208::-;27680:7;27725:1;27708:19;;:5;:19;;;;27700:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27792:9;:16;27802:5;27792:16;;;;;;;;;;;;;;;;27785:23;;27608:208;;;:::o;48752:148::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48859:1:::1;48822:40;;48843:6;;;;;;;;;;;48822:40;;;;;;;;;;;;48890:1;48873:6;;:19;;;;;;;;;;;;;;;;;;48752:148::o:0;54419:261::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54502:9:::1;54497:176;54521:7;:14;54517:1;:18;54497:176;;;54591:24;54557:19;:31;54577:7;54585:1;54577:10;;;;;;;;;;;;;;;;;;;;;;54557:31;;;;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54660:1;54630:15;:27;54646:7;54654:1;54646:10;;;;;;;;;;;;;;;;;;;;;;54630:27;;;;;;;;;;;;;;;:31;;;;54537:3;;;;;:::i;:::-;;;;54497:176;;;;54419:261:::0;:::o;48101:87::-;48147:7;48174:6;;;;;;;;;;;48167:13;;48101:87;:::o;55032:125::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55135:14:::1;55118;;:31;;;;;;;;;;;;;;;;;;55032:125:::0;:::o;56011:126::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56121:8:::1;56090:28;:39;;;;56011:126:::0;:::o;28353:104::-;28409:13;28442:7;28435:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28353:104;:::o;29937:295::-;30052:12;:10;:12::i;:::-;30040:24;;:8;:24;;;;30032:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30152:8;30107:18;:32;30126:12;:10;:12::i;:::-;30107:32;;;;;;;;;;;;;;;:42;30140:8;30107:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30205:8;30176:48;;30191:12;:10;:12::i;:::-;30176:48;;;30215:8;30176:48;;;;;;:::i;:::-;;;;;;;;29937:295;;:::o;49911:35::-;;;;:::o;52368:763::-;52439:13;;;;;;;;;;;52431:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52520:1;52505:12;:16;52497:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52634:12;;52599:31;52617:12;52599:13;:11;:13::i;:::-;:17;;:31;;;;:::i;:::-;:47;;52577:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;52739:14;;52723:12;:30;;52715:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;52854:9;52820:30;52837:12;52820;;:16;;:30;;;;:::i;:::-;:43;;52812:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;52917:6;52913:211;52933:12;52929:1;:16;52913:211;;;52967:14;52984:13;:11;:13::i;:::-;52967:30;;53032:12;;53016:13;:11;:13::i;:::-;:28;53012:101;;;53065:32;53075:10;53087:9;53065;:32::i;:::-;53012:101;52913:211;52947:3;;;;;:::i;:::-;;;;52913:211;;;;52368:763;:::o;50010:48::-;;;;:::o;31132:285::-;31264:41;31283:12;:10;:12::i;:::-;31297:7;31264:18;:41::i;:::-;31256:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31370:39;31384:4;31390:2;31394:7;31403:5;31370:13;:39::i;:::-;31132:285;;;;:::o;50842:35::-;;;;:::o;55386:95::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55458:15:::1;;;;;;;;;;;55457:16;55439:15;;:34;;;;;;;;;;;;;;;;;;55386:95::o:0;50711:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28528:360::-;28601:13;28635:16;28643:7;28635;:16::i;:::-;28627:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28716:21;28740:10;:8;:10::i;:::-;28716:34;;28792:1;28774:7;28768:21;:25;:112;;;;;;;;;;;;;;;;;28833:7;28842:18;:7;:16;:18::i;:::-;28816:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28768:112;28761:119;;;28528:360;;;:::o;50246:31::-;;;;:::o;50136:47::-;;;;:::o;50962:74::-;;;;;;;;;;;;;:::o;30303:164::-;30400:4;30424:18;:25;30443:5;30424:25;;;;;;;;;;;;;;;:35;30450:8;30424:35;;;;;;;;;;;;;;;;;;;;;;;;;30417:42;;30303:164;;;;:::o;49055:244::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49164:1:::1;49144:22;;:8;:22;;;;49136:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49254:8;49225:38;;49246:6;;;;;;;;;;;49225:38;;;;;;;;;;;;49283:8;49274:6;;:17;;;;;;;;;;;;;;;;;;49055:244:::0;:::o;56502:139::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56622:11:::1;56605:14;:28;;;;;;;;;;;;:::i;:::-;;56502:139:::0;:::o;27252:292::-;27354:4;27393:25;27378:40;;;:11;:40;;;;:105;;;;27450:33;27435:48;;;:11;:48;;;;27378:105;:158;;;;27500:36;27524:11;27500:23;:36::i;:::-;27378:158;27371:165;;27252:292;;;:::o;22647:98::-;22700:7;22727:10;22720:17;;22647:98;:::o;33868:110::-;33944:26;33954:2;33958:7;33944:26;;;;;;;;;;;;:9;:26::i;:::-;33868:110;;:::o;32884:127::-;32949:4;33001:1;32973:30;;:7;:16;32981:7;32973:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32966:37;;32884:127;;;:::o;36761:174::-;36863:2;36836:15;:24;36852:7;36836:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36919:7;36915:2;36881:46;;36890:23;36905:7;36890:14;:23::i;:::-;36881:46;;;;;;;;;;;;36761:174;;:::o;33178:348::-;33271:4;33296:16;33304:7;33296;:16::i;:::-;33288:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33372:13;33388:23;33403:7;33388:14;:23::i;:::-;33372:39;;33441:5;33430:16;;:7;:16;;;:51;;;;33474:7;33450:31;;:20;33462:7;33450:11;:20::i;:::-;:31;;;33430:51;:87;;;;33485:32;33502:5;33509:7;33485:16;:32::i;:::-;33430:87;33422:96;;;33178:348;;;;:::o;36099:544::-;36224:4;36197:31;;:23;36212:7;36197:14;:23::i;:::-;:31;;;36189:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36307:1;36293:16;;:2;:16;;;;36285:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36363:39;36384:4;36390:2;36394:7;36363:20;:39::i;:::-;36467:29;36484:1;36488:7;36467:8;:29::i;:::-;36528:1;36509:9;:15;36519:4;36509:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36557:1;36540:9;:13;36550:2;36540:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36588:2;36569:7;:16;36577:7;36569:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36627:7;36623:2;36608:27;;36617:4;36608:27;;;;;;;;;;;;36099:544;;;:::o;2761:98::-;2819:7;2850:1;2846;:5;;;;:::i;:::-;2839:12;;2761:98;;;;:::o;3499:::-;3557:7;3588:1;3584;:5;;;;:::i;:::-;3577:12;;3499:98;;;;:::o;3898:::-;3956:7;3987:1;3983;:5;;;;:::i;:::-;3976:12;;3898:98;;;;:::o;3142:::-;3200:7;3231:1;3227;:5;;;;:::i;:::-;3220:12;;3142:98;;;;:::o;32299:272::-;32413:28;32423:4;32429:2;32433:7;32413:9;:28::i;:::-;32460:48;32483:4;32489:2;32493:7;32502:5;32460:22;:48::i;:::-;32452:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32299:272;;;;:::o;56327:102::-;56379:13;56412:9;56405:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56327:102;:::o;23271:723::-;23327:13;23557:1;23548:5;:10;23544:53;;;23575:10;;;;;;;;;;;;;;;;;;;;;23544:53;23607:12;23622:5;23607:20;;23638:14;23663:78;23678:1;23670:4;:9;23663:78;;23696:8;;;;;:::i;:::-;;;;23727:2;23719:10;;;;;:::i;:::-;;;23663:78;;;23751:19;23783:6;23773:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23751:39;;23801:154;23817:1;23808:5;:10;23801:154;;23845:1;23835:11;;;;;:::i;:::-;;;23912:2;23904:5;:10;;;;:::i;:::-;23891:2;:24;;;;:::i;:::-;23878:39;;23861:6;23868;23861:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;23941:2;23932:11;;;;;:::i;:::-;;;23801:154;;;23979:6;23965:21;;;;;23271:723;;;;:::o;25795:157::-;25880:4;25919:25;25904:40;;;:11;:40;;;;25897:47;;25795:157;;;:::o;34205:250::-;34301:18;34307:2;34311:7;34301:5;:18::i;:::-;34338:54;34369:1;34373:2;34377:7;34386:5;34338:22;:54::i;:::-;34330:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;34205:250;;;:::o;42600:555::-;42710:45;42737:4;42743:2;42747:7;42710:26;:45::i;:::-;42788:1;42772:18;;:4;:18;;;42768:187;;;42807:40;42839:7;42807:31;:40::i;:::-;42768:187;;;42877:2;42869:10;;:4;:10;;;42865:90;;42896:47;42929:4;42935:7;42896:32;:47::i;:::-;42865:90;42768:187;42983:1;42969:16;;:2;:16;;;42965:183;;;43002:45;43039:7;43002:36;:45::i;:::-;42965:183;;;43075:4;43069:10;;:2;:10;;;43065:83;;43096:40;43124:2;43128:7;43096:27;:40::i;:::-;43065:83;42965:183;42600:555;;;:::o;37500:843::-;37621:4;37647:15;:2;:13;;;:15::i;:::-;37643:693;;;37699:2;37683:36;;;37720:12;:10;:12::i;:::-;37734:4;37740:7;37749:5;37683:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37679:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37946:1;37929:6;:13;:18;37925:341;;;37972:60;;;;;;;;;;:::i;:::-;;;;;;;;37925:341;38216:6;38210:13;38201:6;38197:2;38193:15;38186:38;37679:602;37816:45;;;37806:55;;;:6;:55;;;;37799:62;;;;;37643:693;38320:4;38313:11;;37500:843;;;;;;;:::o;34791:382::-;34885:1;34871:16;;:2;:16;;;;34863:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34944:16;34952:7;34944;:16::i;:::-;34943:17;34935:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35006:45;35035:1;35039:2;35043:7;35006:20;:45::i;:::-;35081:1;35064:9;:13;35074:2;35064:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35112:2;35093:7;:16;35101:7;35093:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35157:7;35153:2;35132:33;;35149:1;35132:33;;;;;;;;;;;;34791:382;;:::o;38956:93::-;;;;:::o;43878:164::-;43982:10;:17;;;;43955:15;:24;43971:7;43955:24;;;;;;;;;;;:44;;;;44010:10;44026:7;44010:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43878:164;:::o;44669:988::-;44935:22;44985:1;44960:22;44977:4;44960:16;:22::i;:::-;:26;;;;:::i;:::-;44935:51;;44997:18;45018:17;:26;45036:7;45018:26;;;;;;;;;;;;44997:47;;45165:14;45151:10;:28;45147:328;;45196:19;45218:12;:18;45231:4;45218:18;;;;;;;;;;;;;;;:34;45237:14;45218:34;;;;;;;;;;;;45196:56;;45302:11;45269:12;:18;45282:4;45269:18;;;;;;;;;;;;;;;:30;45288:10;45269:30;;;;;;;;;;;:44;;;;45419:10;45386:17;:30;45404:11;45386:30;;;;;;;;;;;:43;;;;45147:328;;45571:17;:26;45589:7;45571:26;;;;;;;;;;;45564:33;;;45615:12;:18;45628:4;45615:18;;;;;;;;;;;;;;;:34;45634:14;45615:34;;;;;;;;;;;45608:41;;;44669:988;;;;:::o;45952:1079::-;46205:22;46250:1;46230:10;:17;;;;:21;;;;:::i;:::-;46205:46;;46262:18;46283:15;:24;46299:7;46283:24;;;;;;;;;;;;46262:45;;46634:19;46656:10;46667:14;46656:26;;;;;;;;;;;;;;;;;;;;;;;;46634:48;;46720:11;46695:10;46706;46695:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46831:10;46800:15;:28;46816:11;46800:28;;;;;;;;;;;:41;;;;46972:15;:24;46988:7;46972:24;;;;;;;;;;;46965:31;;;47007:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45952:1079;;;;:::o;43456:221::-;43541:14;43558:20;43575:2;43558:16;:20::i;:::-;43541:37;;43616:7;43589:12;:16;43602:2;43589:16;;;;;;;;;;;;;;;:24;43606:6;43589:24;;;;;;;;;;;:34;;;;43663:6;43634:17;:26;43652:7;43634:26;;;;;;;;;;;:35;;;;43456:221;;;:::o;14795:422::-;14855:4;15063:12;15174:7;15162:20;15154:28;;15208:1;15201:4;:8;15194:15;;;14795:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:273::-;2645:5;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2651:211;;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2920:87;;;;:::o;3013:262::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:2;;;3137:1;3134;3127:12;3089:2;3180:1;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;:::i;:::-;3195:63;;3151:117;3079:196;;;;:::o;3281:407::-;3349:6;3357;3406:2;3394:9;3385:7;3381:23;3377:32;3374:2;;;3422:1;3419;3412:12;3374:2;3465:1;3490:53;3535:7;3526:6;3515:9;3511:22;3490:53;:::i;:::-;3480:63;;3436:117;3592:2;3618:53;3663:7;3654:6;3643:9;3639:22;3618:53;:::i;:::-;3608:63;;3563:118;3364:324;;;;;:::o;3694:552::-;3771:6;3779;3787;3836:2;3824:9;3815:7;3811:23;3807:32;3804:2;;;3852:1;3849;3842:12;3804:2;3895:1;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3866:117;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4121:118;3794:452;;;;;:::o;4252:809::-;4347:6;4355;4363;4371;4420:3;4408:9;4399:7;4395:23;4391:33;4388:2;;;4437:1;4434;4427:12;4388:2;4480:1;4505:53;4550:7;4541:6;4530:9;4526:22;4505:53;:::i;:::-;4495:63;;4451:117;4607:2;4633:53;4678:7;4669:6;4658:9;4654:22;4633:53;:::i;:::-;4623:63;;4578:118;4735:2;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4706:118;4891:2;4880:9;4876:18;4863:32;4922:18;4914:6;4911:30;4908:2;;;4954:1;4951;4944:12;4908:2;4982:62;5036:7;5027:6;5016:9;5012:22;4982:62;:::i;:::-;4972:72;;4834:220;4378:683;;;;;;;:::o;5067:401::-;5132:6;5140;5189:2;5177:9;5168:7;5164:23;5160:32;5157:2;;;5205:1;5202;5195:12;5157:2;5248:1;5273:53;5318:7;5309:6;5298:9;5294:22;5273:53;:::i;:::-;5263:63;;5219:117;5375:2;5401:50;5443:7;5434:6;5423:9;5419:22;5401:50;:::i;:::-;5391:60;;5346:115;5147:321;;;;;:::o;5474:407::-;5542:6;5550;5599:2;5587:9;5578:7;5574:23;5570:32;5567:2;;;5615:1;5612;5605:12;5567:2;5658:1;5683:53;5728:7;5719:6;5708:9;5704:22;5683:53;:::i;:::-;5673:63;;5629:117;5785:2;5811:53;5856:7;5847:6;5836:9;5832:22;5811:53;:::i;:::-;5801:63;;5756:118;5557:324;;;;;:::o;5887:405::-;5971:6;6020:2;6008:9;5999:7;5995:23;5991:32;5988:2;;;6036:1;6033;6026:12;5988:2;6107:1;6096:9;6092:17;6079:31;6137:18;6129:6;6126:30;6123:2;;;6169:1;6166;6159:12;6123:2;6197:78;6267:7;6258:6;6247:9;6243:22;6197:78;:::i;:::-;6187:88;;6050:235;5978:314;;;;:::o;6298:260::-;6356:6;6405:2;6393:9;6384:7;6380:23;6376:32;6373:2;;;6421:1;6418;6411:12;6373:2;6464:1;6489:52;6533:7;6524:6;6513:9;6509:22;6489:52;:::i;:::-;6479:62;;6435:116;6363:195;;;;:::o;6564:282::-;6633:6;6682:2;6670:9;6661:7;6657:23;6653:32;6650:2;;;6698:1;6695;6688:12;6650:2;6741:1;6766:63;6821:7;6812:6;6801:9;6797:22;6766:63;:::i;:::-;6756:73;;6712:127;6640:206;;;;:::o;6852:375::-;6921:6;6970:2;6958:9;6949:7;6945:23;6941:32;6938:2;;;6986:1;6983;6976:12;6938:2;7057:1;7046:9;7042:17;7029:31;7087:18;7079:6;7076:30;7073:2;;;7119:1;7116;7109:12;7073:2;7147:63;7202:7;7193:6;7182:9;7178:22;7147:63;:::i;:::-;7137:73;;7000:220;6928:299;;;;:::o;7233:262::-;7292:6;7341:2;7329:9;7320:7;7316:23;7312:32;7309:2;;;7357:1;7354;7347:12;7309:2;7400:1;7425:53;7470:7;7461:6;7450:9;7446:22;7425:53;:::i;:::-;7415:63;;7371:117;7299:196;;;;:::o;7501:118::-;7588:24;7606:5;7588:24;:::i;:::-;7583:3;7576:37;7566:53;;:::o;7625:109::-;7706:21;7721:5;7706:21;:::i;:::-;7701:3;7694:34;7684:50;;:::o;7740:360::-;7826:3;7854:38;7886:5;7854:38;:::i;:::-;7908:70;7971:6;7966:3;7908:70;:::i;:::-;7901:77;;7987:52;8032:6;8027:3;8020:4;8013:5;8009:16;7987:52;:::i;:::-;8064:29;8086:6;8064:29;:::i;:::-;8059:3;8055:39;8048:46;;7830:270;;;;;:::o;8106:364::-;8194:3;8222:39;8255:5;8222:39;:::i;:::-;8277:71;8341:6;8336:3;8277:71;:::i;:::-;8270:78;;8357:52;8402:6;8397:3;8390:4;8383:5;8379:16;8357:52;:::i;:::-;8434:29;8456:6;8434:29;:::i;:::-;8429:3;8425:39;8418:46;;8198:272;;;;;:::o;8476:377::-;8582:3;8610:39;8643:5;8610:39;:::i;:::-;8665:89;8747:6;8742:3;8665:89;:::i;:::-;8658:96;;8763:52;8808:6;8803:3;8796:4;8789:5;8785:16;8763:52;:::i;:::-;8840:6;8835:3;8831:16;8824:23;;8586:267;;;;;:::o;8859:366::-;9001:3;9022:67;9086:2;9081:3;9022:67;:::i;:::-;9015:74;;9098:93;9187:3;9098:93;:::i;:::-;9216:2;9211:3;9207:12;9200:19;;9005:220;;;:::o;9231:366::-;9373:3;9394:67;9458:2;9453:3;9394:67;:::i;:::-;9387:74;;9470:93;9559:3;9470:93;:::i;:::-;9588:2;9583:3;9579:12;9572:19;;9377:220;;;:::o;9603:366::-;9745:3;9766:67;9830:2;9825:3;9766:67;:::i;:::-;9759:74;;9842:93;9931:3;9842:93;:::i;:::-;9960:2;9955:3;9951:12;9944:19;;9749:220;;;:::o;9975:366::-;10117:3;10138:67;10202:2;10197:3;10138:67;:::i;:::-;10131:74;;10214:93;10303:3;10214:93;:::i;:::-;10332:2;10327:3;10323:12;10316:19;;10121:220;;;:::o;10347:366::-;10489:3;10510:67;10574:2;10569:3;10510:67;:::i;:::-;10503:74;;10586:93;10675:3;10586:93;:::i;:::-;10704:2;10699:3;10695:12;10688:19;;10493:220;;;:::o;10719:366::-;10861:3;10882:67;10946:2;10941:3;10882:67;:::i;:::-;10875:74;;10958:93;11047:3;10958:93;:::i;:::-;11076:2;11071:3;11067:12;11060:19;;10865:220;;;:::o;11091:366::-;11233:3;11254:67;11318:2;11313:3;11254:67;:::i;:::-;11247:74;;11330:93;11419:3;11330:93;:::i;:::-;11448:2;11443:3;11439:12;11432:19;;11237:220;;;:::o;11463:366::-;11605:3;11626:67;11690:2;11685:3;11626:67;:::i;:::-;11619:74;;11702:93;11791:3;11702:93;:::i;:::-;11820:2;11815:3;11811:12;11804:19;;11609:220;;;:::o;11835:366::-;11977:3;11998:67;12062:2;12057:3;11998:67;:::i;:::-;11991:74;;12074:93;12163:3;12074:93;:::i;:::-;12192:2;12187:3;12183:12;12176:19;;11981:220;;;:::o;12207:366::-;12349:3;12370:67;12434:2;12429:3;12370:67;:::i;:::-;12363:74;;12446:93;12535:3;12446:93;:::i;:::-;12564:2;12559:3;12555:12;12548:19;;12353:220;;;:::o;12579:366::-;12721:3;12742:67;12806:2;12801:3;12742:67;:::i;:::-;12735:74;;12818:93;12907:3;12818:93;:::i;:::-;12936:2;12931:3;12927:12;12920:19;;12725:220;;;:::o;12951:366::-;13093:3;13114:67;13178:2;13173:3;13114:67;:::i;:::-;13107:74;;13190:93;13279:3;13190:93;:::i;:::-;13308:2;13303:3;13299:12;13292:19;;13097:220;;;:::o;13323:366::-;13465:3;13486:67;13550:2;13545:3;13486:67;:::i;:::-;13479:74;;13562:93;13651:3;13562:93;:::i;:::-;13680:2;13675:3;13671:12;13664:19;;13469:220;;;:::o;13695:366::-;13837:3;13858:67;13922:2;13917:3;13858:67;:::i;:::-;13851:74;;13934:93;14023:3;13934:93;:::i;:::-;14052:2;14047:3;14043:12;14036:19;;13841:220;;;:::o;14067:366::-;14209:3;14230:67;14294:2;14289:3;14230:67;:::i;:::-;14223:74;;14306:93;14395:3;14306:93;:::i;:::-;14424:2;14419:3;14415:12;14408:19;;14213:220;;;:::o;14439:366::-;14581:3;14602:67;14666:2;14661:3;14602:67;:::i;:::-;14595:74;;14678:93;14767:3;14678:93;:::i;:::-;14796:2;14791:3;14787:12;14780:19;;14585:220;;;:::o;14811:366::-;14953:3;14974:67;15038:2;15033:3;14974:67;:::i;:::-;14967:74;;15050:93;15139:3;15050:93;:::i;:::-;15168:2;15163:3;15159:12;15152:19;;14957:220;;;:::o;15183:366::-;15325:3;15346:67;15410:2;15405:3;15346:67;:::i;:::-;15339:74;;15422:93;15511:3;15422:93;:::i;:::-;15540:2;15535:3;15531:12;15524:19;;15329:220;;;:::o;15555:366::-;15697:3;15718:67;15782:2;15777:3;15718:67;:::i;:::-;15711:74;;15794:93;15883:3;15794:93;:::i;:::-;15912:2;15907:3;15903:12;15896:19;;15701:220;;;:::o;15927:366::-;16069:3;16090:67;16154:2;16149:3;16090:67;:::i;:::-;16083:74;;16166:93;16255:3;16166:93;:::i;:::-;16284:2;16279:3;16275:12;16268:19;;16073:220;;;:::o;16299:366::-;16441:3;16462:67;16526:2;16521:3;16462:67;:::i;:::-;16455:74;;16538:93;16627:3;16538:93;:::i;:::-;16656:2;16651:3;16647:12;16640:19;;16445:220;;;:::o;16671:366::-;16813:3;16834:67;16898:2;16893:3;16834:67;:::i;:::-;16827:74;;16910:93;16999:3;16910:93;:::i;:::-;17028:2;17023:3;17019:12;17012:19;;16817:220;;;:::o;17043:366::-;17185:3;17206:67;17270:2;17265:3;17206:67;:::i;:::-;17199:74;;17282:93;17371:3;17282:93;:::i;:::-;17400:2;17395:3;17391:12;17384:19;;17189:220;;;:::o;17415:366::-;17557:3;17578:67;17642:2;17637:3;17578:67;:::i;:::-;17571:74;;17654:93;17743:3;17654:93;:::i;:::-;17772:2;17767:3;17763:12;17756:19;;17561:220;;;:::o;17787:366::-;17929:3;17950:67;18014:2;18009:3;17950:67;:::i;:::-;17943:74;;18026:93;18115:3;18026:93;:::i;:::-;18144:2;18139:3;18135:12;18128:19;;17933:220;;;:::o;18159:366::-;18301:3;18322:67;18386:2;18381:3;18322:67;:::i;:::-;18315:74;;18398:93;18487:3;18398:93;:::i;:::-;18516:2;18511:3;18507:12;18500:19;;18305:220;;;:::o;18531:366::-;18673:3;18694:67;18758:2;18753:3;18694:67;:::i;:::-;18687:74;;18770:93;18859:3;18770:93;:::i;:::-;18888:2;18883:3;18879:12;18872:19;;18677:220;;;:::o;18903:118::-;18990:24;19008:5;18990:24;:::i;:::-;18985:3;18978:37;18968:53;;:::o;19027:435::-;19207:3;19229:95;19320:3;19311:6;19229:95;:::i;:::-;19222:102;;19341:95;19432:3;19423:6;19341:95;:::i;:::-;19334:102;;19453:3;19446:10;;19211:251;;;;;:::o;19468:222::-;19561:4;19599:2;19588:9;19584:18;19576:26;;19612:71;19680:1;19669:9;19665:17;19656:6;19612:71;:::i;:::-;19566:124;;;;:::o;19696:640::-;19891:4;19929:3;19918:9;19914:19;19906:27;;19943:71;20011:1;20000:9;19996:17;19987:6;19943:71;:::i;:::-;20024:72;20092:2;20081:9;20077:18;20068:6;20024:72;:::i;:::-;20106;20174:2;20163:9;20159:18;20150:6;20106:72;:::i;:::-;20225:9;20219:4;20215:20;20210:2;20199:9;20195:18;20188:48;20253:76;20324:4;20315:6;20253:76;:::i;:::-;20245:84;;19896:440;;;;;;;:::o;20342:210::-;20429:4;20467:2;20456:9;20452:18;20444:26;;20480:65;20542:1;20531:9;20527:17;20518:6;20480:65;:::i;:::-;20434:118;;;;:::o;20558:313::-;20671:4;20709:2;20698:9;20694:18;20686:26;;20758:9;20752:4;20748:20;20744:1;20733:9;20729:17;20722:47;20786:78;20859:4;20850:6;20786:78;:::i;:::-;20778:86;;20676:195;;;;:::o;20877:419::-;21043:4;21081:2;21070:9;21066:18;21058:26;;21130:9;21124:4;21120:20;21116:1;21105:9;21101:17;21094:47;21158:131;21284:4;21158:131;:::i;:::-;21150:139;;21048:248;;;:::o;21302:419::-;21468:4;21506:2;21495:9;21491:18;21483:26;;21555:9;21549:4;21545:20;21541:1;21530:9;21526:17;21519:47;21583:131;21709:4;21583:131;:::i;:::-;21575:139;;21473:248;;;:::o;21727:419::-;21893:4;21931:2;21920:9;21916:18;21908:26;;21980:9;21974:4;21970:20;21966:1;21955:9;21951:17;21944:47;22008:131;22134:4;22008:131;:::i;:::-;22000:139;;21898:248;;;:::o;22152:419::-;22318:4;22356:2;22345:9;22341:18;22333:26;;22405:9;22399:4;22395:20;22391:1;22380:9;22376:17;22369:47;22433:131;22559:4;22433:131;:::i;:::-;22425:139;;22323:248;;;:::o;22577:419::-;22743:4;22781:2;22770:9;22766:18;22758:26;;22830:9;22824:4;22820:20;22816:1;22805:9;22801:17;22794:47;22858:131;22984:4;22858:131;:::i;:::-;22850:139;;22748:248;;;:::o;23002:419::-;23168:4;23206:2;23195:9;23191:18;23183:26;;23255:9;23249:4;23245:20;23241:1;23230:9;23226:17;23219:47;23283:131;23409:4;23283:131;:::i;:::-;23275:139;;23173:248;;;:::o;23427:419::-;23593:4;23631:2;23620:9;23616:18;23608:26;;23680:9;23674:4;23670:20;23666:1;23655:9;23651:17;23644:47;23708:131;23834:4;23708:131;:::i;:::-;23700:139;;23598:248;;;:::o;23852:419::-;24018:4;24056:2;24045:9;24041:18;24033:26;;24105:9;24099:4;24095:20;24091:1;24080:9;24076:17;24069:47;24133:131;24259:4;24133:131;:::i;:::-;24125:139;;24023:248;;;:::o;24277:419::-;24443:4;24481:2;24470:9;24466:18;24458:26;;24530:9;24524:4;24520:20;24516:1;24505:9;24501:17;24494:47;24558:131;24684:4;24558:131;:::i;:::-;24550:139;;24448:248;;;:::o;24702:419::-;24868:4;24906:2;24895:9;24891:18;24883:26;;24955:9;24949:4;24945:20;24941:1;24930:9;24926:17;24919:47;24983:131;25109:4;24983:131;:::i;:::-;24975:139;;24873:248;;;:::o;25127:419::-;25293:4;25331:2;25320:9;25316:18;25308:26;;25380:9;25374:4;25370:20;25366:1;25355:9;25351:17;25344:47;25408:131;25534:4;25408:131;:::i;:::-;25400:139;;25298:248;;;:::o;25552:419::-;25718:4;25756:2;25745:9;25741:18;25733:26;;25805:9;25799:4;25795:20;25791:1;25780:9;25776:17;25769:47;25833:131;25959:4;25833:131;:::i;:::-;25825:139;;25723:248;;;:::o;25977:419::-;26143:4;26181:2;26170:9;26166:18;26158:26;;26230:9;26224:4;26220:20;26216:1;26205:9;26201:17;26194:47;26258:131;26384:4;26258:131;:::i;:::-;26250:139;;26148:248;;;:::o;26402:419::-;26568:4;26606:2;26595:9;26591:18;26583:26;;26655:9;26649:4;26645:20;26641:1;26630:9;26626:17;26619:47;26683:131;26809:4;26683:131;:::i;:::-;26675:139;;26573:248;;;:::o;26827:419::-;26993:4;27031:2;27020:9;27016:18;27008:26;;27080:9;27074:4;27070:20;27066:1;27055:9;27051:17;27044:47;27108:131;27234:4;27108:131;:::i;:::-;27100:139;;26998:248;;;:::o;27252:419::-;27418:4;27456:2;27445:9;27441:18;27433:26;;27505:9;27499:4;27495:20;27491:1;27480:9;27476:17;27469:47;27533:131;27659:4;27533:131;:::i;:::-;27525:139;;27423:248;;;:::o;27677:419::-;27843:4;27881:2;27870:9;27866:18;27858:26;;27930:9;27924:4;27920:20;27916:1;27905:9;27901:17;27894:47;27958:131;28084:4;27958:131;:::i;:::-;27950:139;;27848:248;;;:::o;28102:419::-;28268:4;28306:2;28295:9;28291:18;28283:26;;28355:9;28349:4;28345:20;28341:1;28330:9;28326:17;28319:47;28383:131;28509:4;28383:131;:::i;:::-;28375:139;;28273:248;;;:::o;28527:419::-;28693:4;28731:2;28720:9;28716:18;28708:26;;28780:9;28774:4;28770:20;28766:1;28755:9;28751:17;28744:47;28808:131;28934:4;28808:131;:::i;:::-;28800:139;;28698:248;;;:::o;28952:419::-;29118:4;29156:2;29145:9;29141:18;29133:26;;29205:9;29199:4;29195:20;29191:1;29180:9;29176:17;29169:47;29233:131;29359:4;29233:131;:::i;:::-;29225:139;;29123:248;;;:::o;29377:419::-;29543:4;29581:2;29570:9;29566:18;29558:26;;29630:9;29624:4;29620:20;29616:1;29605:9;29601:17;29594:47;29658:131;29784:4;29658:131;:::i;:::-;29650:139;;29548:248;;;:::o;29802:419::-;29968:4;30006:2;29995:9;29991:18;29983:26;;30055:9;30049:4;30045:20;30041:1;30030:9;30026:17;30019:47;30083:131;30209:4;30083:131;:::i;:::-;30075:139;;29973:248;;;:::o;30227:419::-;30393:4;30431:2;30420:9;30416:18;30408:26;;30480:9;30474:4;30470:20;30466:1;30455:9;30451:17;30444:47;30508:131;30634:4;30508:131;:::i;:::-;30500:139;;30398:248;;;:::o;30652:419::-;30818:4;30856:2;30845:9;30841:18;30833:26;;30905:9;30899:4;30895:20;30891:1;30880:9;30876:17;30869:47;30933:131;31059:4;30933:131;:::i;:::-;30925:139;;30823:248;;;:::o;31077:419::-;31243:4;31281:2;31270:9;31266:18;31258:26;;31330:9;31324:4;31320:20;31316:1;31305:9;31301:17;31294:47;31358:131;31484:4;31358:131;:::i;:::-;31350:139;;31248:248;;;:::o;31502:419::-;31668:4;31706:2;31695:9;31691:18;31683:26;;31755:9;31749:4;31745:20;31741:1;31730:9;31726:17;31719:47;31783:131;31909:4;31783:131;:::i;:::-;31775:139;;31673:248;;;:::o;31927:419::-;32093:4;32131:2;32120:9;32116:18;32108:26;;32180:9;32174:4;32170:20;32166:1;32155:9;32151:17;32144:47;32208:131;32334:4;32208:131;:::i;:::-;32200:139;;32098:248;;;:::o;32352:222::-;32445:4;32483:2;32472:9;32468:18;32460:26;;32496:71;32564:1;32553:9;32549:17;32540:6;32496:71;:::i;:::-;32450:124;;;;:::o;32580:129::-;32614:6;32641:20;;:::i;:::-;32631:30;;32670:33;32698:4;32690:6;32670:33;:::i;:::-;32621:88;;;:::o;32715:75::-;32748:6;32781:2;32775:9;32765:19;;32755:35;:::o;32796:311::-;32873:4;32963:18;32955:6;32952:30;32949:2;;;32985:18;;:::i;:::-;32949:2;33035:4;33027:6;33023:17;33015:25;;33095:4;33089;33085:15;33077:23;;32878:229;;;:::o;33113:307::-;33174:4;33264:18;33256:6;33253:30;33250:2;;;33286:18;;:::i;:::-;33250:2;33324:29;33346:6;33324:29;:::i;:::-;33316:37;;33408:4;33402;33398:15;33390:23;;33179:241;;;:::o;33426:308::-;33488:4;33578:18;33570:6;33567:30;33564:2;;;33600:18;;:::i;:::-;33564:2;33638:29;33660:6;33638:29;:::i;:::-;33630:37;;33722:4;33716;33712:15;33704:23;;33493:241;;;:::o;33740:98::-;33791:6;33825:5;33819:12;33809:22;;33798:40;;;:::o;33844:99::-;33896:6;33930:5;33924:12;33914:22;;33903:40;;;:::o;33949:168::-;34032:11;34066:6;34061:3;34054:19;34106:4;34101:3;34097:14;34082:29;;34044:73;;;;:::o;34123:169::-;34207:11;34241:6;34236:3;34229:19;34281:4;34276:3;34272:14;34257:29;;34219:73;;;;:::o;34298:148::-;34400:11;34437:3;34422:18;;34412:34;;;;:::o;34452:305::-;34492:3;34511:20;34529:1;34511:20;:::i;:::-;34506:25;;34545:20;34563:1;34545:20;:::i;:::-;34540:25;;34699:1;34631:66;34627:74;34624:1;34621:81;34618:2;;;34705:18;;:::i;:::-;34618:2;34749:1;34746;34742:9;34735:16;;34496:261;;;;:::o;34763:185::-;34803:1;34820:20;34838:1;34820:20;:::i;:::-;34815:25;;34854:20;34872:1;34854:20;:::i;:::-;34849:25;;34893:1;34883:2;;34898:18;;:::i;:::-;34883:2;34940:1;34937;34933:9;34928:14;;34805:143;;;;:::o;34954:348::-;34994:7;35017:20;35035:1;35017:20;:::i;:::-;35012:25;;35051:20;35069:1;35051:20;:::i;:::-;35046:25;;35239:1;35171:66;35167:74;35164:1;35161:81;35156:1;35149:9;35142:17;35138:105;35135:2;;;35246:18;;:::i;:::-;35135:2;35294:1;35291;35287:9;35276:20;;35002:300;;;;:::o;35308:191::-;35348:4;35368:20;35386:1;35368:20;:::i;:::-;35363:25;;35402:20;35420:1;35402:20;:::i;:::-;35397:25;;35441:1;35438;35435:8;35432:2;;;35446:18;;:::i;:::-;35432:2;35491:1;35488;35484:9;35476:17;;35353:146;;;;:::o;35505:96::-;35542:7;35571:24;35589:5;35571:24;:::i;:::-;35560:35;;35550:51;;;:::o;35607:90::-;35641:7;35684:5;35677:13;35670:21;35659:32;;35649:48;;;:::o;35703:149::-;35739:7;35779:66;35772:5;35768:78;35757:89;;35747:105;;;:::o;35858:126::-;35895:7;35935:42;35928:5;35924:54;35913:65;;35903:81;;;:::o;35990:77::-;36027:7;36056:5;36045:16;;36035:32;;;:::o;36073:154::-;36157:6;36152:3;36147;36134:30;36219:1;36210:6;36205:3;36201:16;36194:27;36124:103;;;:::o;36233:307::-;36301:1;36311:113;36325:6;36322:1;36319:13;36311:113;;;36410:1;36405:3;36401:11;36395:18;36391:1;36386:3;36382:11;36375:39;36347:2;36344:1;36340:10;36335:15;;36311:113;;;36442:6;36439:1;36436:13;36433:2;;;36522:1;36513:6;36508:3;36504:16;36497:27;36433:2;36282:258;;;;:::o;36546:320::-;36590:6;36627:1;36621:4;36617:12;36607:22;;36674:1;36668:4;36664:12;36695:18;36685:2;;36751:4;36743:6;36739:17;36729:27;;36685:2;36813;36805:6;36802:14;36782:18;36779:38;36776:2;;;36832:18;;:::i;:::-;36776:2;36597:269;;;;:::o;36872:281::-;36955:27;36977:4;36955:27;:::i;:::-;36947:6;36943:40;37085:6;37073:10;37070:22;37049:18;37037:10;37034:34;37031:62;37028:2;;;37096:18;;:::i;:::-;37028:2;37136:10;37132:2;37125:22;36915:238;;;:::o;37159:233::-;37198:3;37221:24;37239:5;37221:24;:::i;:::-;37212:33;;37267:66;37260:5;37257:77;37254:2;;;37337:18;;:::i;:::-;37254:2;37384:1;37377:5;37373:13;37366:20;;37202:190;;;:::o;37398:176::-;37430:1;37447:20;37465:1;37447:20;:::i;:::-;37442:25;;37481:20;37499:1;37481:20;:::i;:::-;37476:25;;37520:1;37510:2;;37525:18;;:::i;:::-;37510:2;37566:1;37563;37559:9;37554:14;;37432:142;;;;:::o;37580:180::-;37628:77;37625:1;37618:88;37725:4;37722:1;37715:15;37749:4;37746:1;37739:15;37766:180;37814:77;37811:1;37804:88;37911:4;37908:1;37901:15;37935:4;37932:1;37925:15;37952:180;38000:77;37997:1;37990:88;38097:4;38094:1;38087:15;38121:4;38118:1;38111:15;38138:180;38186:77;38183:1;38176:88;38283:4;38280:1;38273:15;38307:4;38304:1;38297:15;38324:102;38365:6;38416:2;38412:7;38407:2;38400:5;38396:14;38392:28;38382:38;;38372:54;;;:::o;38432:176::-;38572:28;38568:1;38560:6;38556:14;38549:52;38538:70;:::o;38614:227::-;38754:34;38750:1;38742:6;38738:14;38731:58;38823:10;38818:2;38810:6;38806:15;38799:35;38720:121;:::o;38847:230::-;38987:34;38983:1;38975:6;38971:14;38964:58;39056:13;39051:2;39043:6;39039:15;39032:38;38953:124;:::o;39083:237::-;39223:34;39219:1;39211:6;39207:14;39200:58;39292:20;39287:2;39279:6;39275:15;39268:45;39189:131;:::o;39326:238::-;39466:34;39462:1;39454:6;39450:14;39443:58;39535:21;39530:2;39522:6;39518:15;39511:46;39432:132;:::o;39570:225::-;39710:34;39706:1;39698:6;39694:14;39687:58;39779:8;39774:2;39766:6;39762:15;39755:33;39676:119;:::o;39801:178::-;39941:30;39937:1;39929:6;39925:14;39918:54;39907:72;:::o;39985:223::-;40125:34;40121:1;40113:6;40109:14;40102:58;40194:6;40189:2;40181:6;40177:15;40170:31;40091:117;:::o;40214:175::-;40354:27;40350:1;40342:6;40338:14;40331:51;40320:69;:::o;40395:231::-;40535:34;40531:1;40523:6;40519:14;40512:58;40604:14;40599:2;40591:6;40587:15;40580:39;40501:125;:::o;40632:243::-;40772:34;40768:1;40760:6;40756:14;40749:58;40841:26;40836:2;40828:6;40824:15;40817:51;40738:137;:::o;40881:239::-;41021:34;41017:1;41009:6;41005:14;40998:58;41090:22;41085:2;41077:6;41073:15;41066:47;40987:133;:::o;41126:229::-;41266:34;41262:1;41254:6;41250:14;41243:58;41335:12;41330:2;41322:6;41318:15;41311:37;41232:123;:::o;41361:228::-;41501:34;41497:1;41489:6;41485:14;41478:58;41570:11;41565:2;41557:6;41553:15;41546:36;41467:122;:::o;41595:182::-;41735:34;41731:1;41723:6;41719:14;41712:58;41701:76;:::o;41783:182::-;41923:34;41919:1;41911:6;41907:14;41900:58;41889:76;:::o;41971:231::-;42111:34;42107:1;42099:6;42095:14;42088:58;42180:14;42175:2;42167:6;42163:15;42156:39;42077:125;:::o;42208:182::-;42348:34;42344:1;42336:6;42332:14;42325:58;42314:76;:::o;42396:230::-;42536:34;42532:1;42524:6;42520:14;42513:58;42605:13;42600:2;42592:6;42588:15;42581:38;42502:124;:::o;42632:228::-;42772:34;42768:1;42760:6;42756:14;42749:58;42841:11;42836:2;42828:6;42824:15;42817:36;42738:122;:::o;42866:234::-;43006:34;43002:1;42994:6;42990:14;42983:58;43075:17;43070:2;43062:6;43058:15;43051:42;42972:128;:::o;43106:180::-;43246:32;43242:1;43234:6;43230:14;43223:56;43212:74;:::o;43292:220::-;43432:34;43428:1;43420:6;43416:14;43409:58;43501:3;43496:2;43488:6;43484:15;43477:28;43398:114;:::o;43518:221::-;43658:34;43654:1;43646:6;43642:14;43635:58;43727:4;43722:2;43714:6;43710:15;43703:29;43624:115;:::o;43745:236::-;43885:34;43881:1;43873:6;43869:14;43862:58;43954:19;43949:2;43941:6;43937:15;43930:44;43851:130;:::o;43987:179::-;44127:31;44123:1;44115:6;44111:14;44104:55;44093:73;:::o;44172:231::-;44312:34;44308:1;44300:6;44296:14;44289:58;44381:14;44376:2;44368:6;44364:15;44357:39;44278:125;:::o;44409:122::-;44482:24;44500:5;44482:24;:::i;:::-;44475:5;44472:35;44462:2;;44521:1;44518;44511:12;44462:2;44452:79;:::o;44537:116::-;44607:21;44622:5;44607:21;:::i;:::-;44600:5;44597:32;44587:2;;44643:1;44640;44633:12;44587:2;44577:76;:::o;44659:120::-;44731:23;44748:5;44731:23;:::i;:::-;44724:5;44721:34;44711:2;;44769:1;44766;44759:12;44711:2;44701:78;:::o;44785:122::-;44858:24;44876:5;44858:24;:::i;:::-;44851:5;44848:35;44838:2;;44897:1;44894;44887:12;44838:2;44828:79;:::o

Swarm Source

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