ETH Price: $3,565.96 (-1.27%)

Forest Spirits (SPIRIT)
 

Overview

TokenID

6770

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Introducing the Forest Spirits: ancestral children of the forest and caretakers of the bonsai. Each spirit draws power from a universal element, inspiring its role in life. Forest Spirits are AR compatible, Metaverse-ready 3D avatars and the second major collection from ZENFT Studio.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ForestSpirits

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.2 https://hardhat.org
// SPDX-License-Identifier: MIT

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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


// File erc721a/contracts/[email protected]

// Creator: Chiru Labs

pragma solidity ^0.8.4;







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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}


// File hardhat/[email protected]

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File contracts/ForestSpirits.sol

pragma solidity 0.8.10;








contract ForestSpirits is ERC721A, Ownable {
    uint256 public immutable MAX_SUPPLY = 8888;

    // Contract URI.
    string public CONTRACT_URI;

    // Minting parameters.
    address public TREASURY;
    IERC20 public APE_TOKEN;
    uint256 public APE_PRICE = 32 ether;
    uint256 public PRICE = 0.1 ether;
    uint256 public PRICE_BONSAI = 0.08 ether;
    uint256 public WALLET_MINT_LIMIT = 8;
    bytes32 public BONSAI_MERKLE_ROOT;
    bytes32 public PARTNER_MERKLE_ROOT;
    bool public OPEN_BONSAI = false;
    bool public OPEN_PARTNER = false;
    bool public OPEN_PUBLIC = false;
    bool public didOwnerMint = false;

    // Token URI data.
    string public BASE_URI;
    mapping(uint256 => string) public tokenUriOverride;

    // Seedling data.
    IERC1155 public SEEDLING;
    IERC721 public BONSAI;
    IERC1155 public ROOTS;
    address public BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    event AncestralSeedlingMint(
        uint256 spiritId,
        address bonsaiType,
        uint256 bonsaiId
    );

    address CREATOR_1 = 0xfb9685393939c1D65400f2609e7a612b2dA08aB9;
    address CREATOR_2 = 0xC9E2e7F50409cAfdf87991f5DA203b09F71Cc3C1;
    address CREATOR_3 = 0xfb9685393939c1D65400f2609e7a612b2dA08aB9;

    modifier onlyCreators() {
        require(
            msg.sender == owner() ||
                msg.sender == CREATOR_1 ||
                msg.sender == CREATOR_2 ||
                msg.sender == CREATOR_3
        );
        _;
    }

    constructor(
        address treasury,
        address ape,
        address seedling,
        address bonsai,
        address roots,
        address contractOwner
    ) ERC721A("Forest Spirits", "SPIRIT") {
        TREASURY = treasury;
        APE_TOKEN = IERC20(ape);
        SEEDLING = IERC1155(seedling);
        BONSAI = IERC721(bonsai);
        ROOTS = IERC1155(roots);
        _safeMint(msg.sender, 1);
        transferOwnership(contractOwner);
    }

    // ===
    // Minting.
    // ===

    function ownerMint() external onlyOwner {
        require(!didOwnerMint);
        didOwnerMint = true;
        _safeMint(msg.sender, 72);
    }

    function mint(
        uint256 quantity,
        uint256 seedlings,
        uint256[] calldata bonsai,
        uint256 roots,
        uint256 reservedAmount,
        bytes32[] calldata proof,
        bool useApe,
        bool isBonsaiOwner
    ) external payable {
        require(OPEN_BONSAI, "Minting not allowed.");
        require(quantity > 0, "Must mint at least 1.");
        require(
            seedlings == bonsai.length + roots,
            "Invalid selection for Ancestral Seedlings."
        );

        uint256 allowed = getMintAllowance(
            msg.sender,
            reservedAmount,
            proof,
            isBonsaiOwner
        ) - _numberMinted(msg.sender);

        require(allowed > 0, "You can't mint any Forest Spirits.");

        // Limit buys
        if (quantity > allowed) {
            quantity = allowed;
        }

        // Limit buys that exceed MAX_SUPPLY
        if (quantity + _totalMinted() > MAX_SUPPLY) {
            quantity = MAX_SUPPLY - _totalMinted();
        }

        if (!useApe) {
            // Ensure enough ETH
            if (isBonsaiOwner) {
                require(
                    msg.value >= quantity * PRICE_BONSAI,
                    "Not enough ETH sent."
                );
            } else {
                require(msg.value >= quantity * PRICE, "Not enough ETH sent.");
            }
        } else {
            require(msg.value == 0, "Sent ETH but buying with APE.");
        }

        // Log data for Ancestral Seedlings
        handleAncestralSeedlings(quantity, seedlings, bonsai, roots);

        // Mint
        _safeMint(msg.sender, quantity);

        if (!useApe) {
            // Return any remaining ether after the buy
            uint256 remaining = msg.value -
                (
                    isBonsaiOwner
                        ? (quantity * PRICE_BONSAI)
                        : (quantity * PRICE)
                );
            if (remaining > 0) {
                (bool success, ) = msg.sender.call{value: remaining}("");
                require(success);
            }
        } else {
            APE_TOKEN.transferFrom(msg.sender, TREASURY, quantity * APE_PRICE);
        }
    }

    function getMintAllowance(
        address user,
        uint256 amount,
        bytes32[] calldata proof,
        bool isBonsaiOwner
    ) public view returns (uint256) {
        bytes32 leaf = keccak256(abi.encodePacked(user, amount));
        bool isValidLeaf = MerkleProof.verify(
            proof,
            !isBonsaiOwner && OPEN_PARTNER
                ? PARTNER_MERKLE_ROOT
                : BONSAI_MERKLE_ROOT,
            leaf
        );
        if (!isValidLeaf) {
            amount = 0;
        }
        if (!OPEN_PUBLIC) {
            console.log(amount);
            return amount;
        } else {
            return WALLET_MINT_LIMIT + amount;
        }
    }

    function getNumberMinted(address _address) external view returns (uint256) {
        return _numberMinted(_address);
    }

    function handleAncestralSeedlings(
        uint256 quantity,
        uint256 seedlings,
        uint256[] calldata bonsai,
        uint256 roots
    ) private {
        uint256 maxSeedlings = Math.min(quantity, seedlings);
        uint256 usedSeedlings = 0;
        if (maxSeedlings == 0) {
            return;
        }
        uint256 id = _currentIndex;
        roots = Math.min(roots, ROOTS.balanceOf(msg.sender, 1));
        for (uint256 i = 0; i < roots; ++i) {
            if (usedSeedlings >= maxSeedlings) {
                break;
            }
            emit AncestralSeedlingMint(id, address(ROOTS), 1);
            ++id;
            ++usedSeedlings;
        }
        for (uint256 i = 0; i < bonsai.length; ++i) {
            if (usedSeedlings >= maxSeedlings) {
                break;
            }
            if (BONSAI.ownerOf(bonsai[i]) != msg.sender) {
                continue;
            }
            emit AncestralSeedlingMint(id, address(BONSAI), bonsai[i]);
            ++id;
            ++usedSeedlings;
        }
        SEEDLING.safeTransferFrom(
            msg.sender,
            BURN_ADDRESS,
            1,
            usedSeedlings,
            ""
        );
    }

    function withdraw() external onlyCreators {
        uint256 bal = address(this).balance;
        payable(address(TREASURY)).call{value: bal}("");
    }

    function withdrawToken(address _address) external onlyCreators {
        IERC20 token = IERC20(_address);
        token.transferFrom(
            address(this),
            TREASURY,
            token.balanceOf(address(this))
        );
    }

    // ===
    // Token URI.
    // ===

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

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        string memory overrideTokenUri = tokenUriOverride[tokenId];
        if (bytes(overrideTokenUri).length == 0) {
            return super.tokenURI(tokenId);
        } else {
            return overrideTokenUri;
        }
    }

    // ===
    // Contract URI.
    // ===

    function contractURI() public view returns (string memory) {
        return CONTRACT_URI;
    }

    // ===
    // Setters.
    // ===

    function setTokenUri(uint256[] calldata ids, string[] calldata uris)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < ids.length; i++) {
            tokenUriOverride[ids[i]] = uris[i];
        }
    }

    function setBaseUri(string calldata _baseUri) public onlyOwner {
        BASE_URI = _baseUri;
    }

    function setBonsaiMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        BONSAI_MERKLE_ROOT = _merkleRoot;
    }

    function setPartnerMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        PARTNER_MERKLE_ROOT = _merkleRoot;
    }

    function setOpenBonsai(bool _open) public onlyOwner {
        OPEN_BONSAI = _open;
    }

    function setOpenPartner(bool _open) public onlyOwner {
        OPEN_PARTNER = _open;
    }

    function setOpenPublic(bool _open) public onlyOwner {
        OPEN_PUBLIC = _open;
    }

    function setPrice(uint256 _price) public onlyOwner {
        PRICE = _price;
    }

    function setPriceBonsai(uint256 _price) public onlyOwner {
        PRICE_BONSAI = _price;
    }

    function setWalletMintLimit(uint256 _walletMintLimit) public onlyOwner {
        WALLET_MINT_LIMIT = _walletMintLimit;
    }

    function setBurnAddress(address _burnAddress) public onlyOwner {
        BURN_ADDRESS = _burnAddress;
    }

    function setContractUri(string calldata _contractUri) public onlyOwner {
        CONTRACT_URI = _contractUri;
    }

    function setApePrice(uint256 _price) public onlyOwner {
        APE_PRICE = _price;
    }

    function setApeToken(address _address) public onlyOwner {
        APE_TOKEN = IERC20(_address);
    }

    function setTreasury(address _address) public onlyOwner {
        TREASURY = _address;
    }

    function setCreator(uint256 i, address _address) public onlyOwner {
        if (i == 0) {
            CREATOR_1 = _address;
        } else if (i == 1) {
            CREATOR_2 = _address;
        } else if (i == 2) {
            CREATOR_3 = _address;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"ape","type":"address"},{"internalType":"address","name":"seedling","type":"address"},{"internalType":"address","name":"bonsai","type":"address"},{"internalType":"address","name":"roots","type":"address"},{"internalType":"address","name":"contractOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"spiritId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bonsaiType","type":"address"},{"indexed":false,"internalType":"uint256","name":"bonsaiId","type":"uint256"}],"name":"AncestralSeedlingMint","type":"event"},{"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":"APE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"APE_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BONSAI","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BONSAI_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPEN_BONSAI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPEN_PARTNER","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPEN_PUBLIC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTNER_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_BONSAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOTS","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEEDLING","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"didOwnerMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bool","name":"isBonsaiOwner","type":"bool"}],"name":"getMintAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getNumberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"seedlings","type":"uint256"},{"internalType":"uint256[]","name":"bonsai","type":"uint256[]"},{"internalType":"uint256","name":"roots","type":"uint256"},{"internalType":"uint256","name":"reservedAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bool","name":"useApe","type":"bool"},{"internalType":"bool","name":"isBonsaiOwner","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setApePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setApeToken","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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setBonsaiMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnAddress","type":"address"}],"name":"setBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractUri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"setCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"setOpenBonsai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"setOpenPartner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"setOpenPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setPartnerMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceBonsai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletMintLimit","type":"uint256"}],"name":"setWalletMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenUriOverride","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526122b86080908152506801bc16d674ec800000600c5567016345785d8a0000600d5567011c37937e080000600e556008600f556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff0219169083151502179055506000601260036101000a81548160ff02191690831515021790555061dead601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fb9685393939c1d65400f2609e7a612b2da08ab9601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c9e2e7f50409cafdf87991f5da203b09f71cc3c1601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fb9685393939c1d65400f2609e7a612b2da08ab9601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001f257600080fd5b50604051620070f0380380620070f0833981810160405281019062000218919062000d5d565b6040518060400160405280600e81526020017f466f7265737420537069726974730000000000000000000000000000000000008152506040518060400160405280600681526020017f535049524954000000000000000000000000000000000000000000000000000081525081600290805190602001906200029c92919062000c43565b508060039080519060200190620002b592919062000c43565b50620002c66200046360201b60201c565b6000819055505050620002ee620002e26200046860201b60201c565b6200047060201b60201c565b85600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004463360016200053660201b60201c565b62000457816200055c60201b60201c565b5050505050506200112c565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005588282604051806020016040528060008152506200067260201b60201c565b5050565b6200056c6200046860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005926200068c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005e29062000e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200065e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006559062000ef2565b60405180910390fd5b6200066f816200047060201b60201c565b50565b620006878383836001620006b660201b60201c565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000724576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000760576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000775600086838762000ab260201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200094d57506200094c8773ffffffffffffffffffffffffffffffffffffffff1662000ab860201b620030951760201c565b5b1562000a20575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620009cb600088848060010195508862000adb60201b60201c565b62000a02576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156200095457826000541462000a1a57600080fd5b62000a8d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141562000a21575b81600081905550505062000aab600086838762000c3d60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000b096200046860201b60201c565b8786866040518563ffffffff1660e01b815260040162000b2d949392919062000fe4565b6020604051808303816000875af192505050801562000b6c57506040513d601f19601f8201168201806040525081019062000b69919062001095565b60015b62000bea573d806000811462000b9f576040519150601f19603f3d011682016040523d82523d6000602084013e62000ba4565b606091505b5060008151141562000be2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b82805462000c5190620010f6565b90600052602060002090601f01602090048101928262000c75576000855562000cc1565b82601f1062000c9057805160ff191683800117855562000cc1565b8280016001018555821562000cc1579182015b8281111562000cc057825182559160200191906001019062000ca3565b5b50905062000cd0919062000cd4565b5090565b5b8082111562000cef57600081600090555060010162000cd5565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d258262000cf8565b9050919050565b62000d378162000d18565b811462000d4357600080fd5b50565b60008151905062000d578162000d2c565b92915050565b60008060008060008060c0878903121562000d7d5762000d7c62000cf3565b5b600062000d8d89828a0162000d46565b965050602062000da089828a0162000d46565b955050604062000db389828a0162000d46565b945050606062000dc689828a0162000d46565b935050608062000dd989828a0162000d46565b92505060a062000dec89828a0162000d46565b9150509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000e4260208362000df9565b915062000e4f8262000e0a565b602082019050919050565b6000602082019050818103600083015262000e758162000e33565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000eda60268362000df9565b915062000ee78262000e7c565b604082019050919050565b6000602082019050818103600083015262000f0d8162000ecb565b9050919050565b62000f1f8162000d18565b82525050565b6000819050919050565b62000f3a8162000f25565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000f7c57808201518184015260208101905062000f5f565b8381111562000f8c576000848401525b50505050565b6000601f19601f8301169050919050565b600062000fb08262000f40565b62000fbc818562000f4b565b935062000fce81856020860162000f5c565b62000fd98162000f92565b840191505092915050565b600060808201905062000ffb600083018762000f14565b6200100a602083018662000f14565b62001019604083018562000f2f565b81810360608301526200102d818462000fa3565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200106f8162001038565b81146200107b57600080fd5b50565b6000815190506200108f8162001064565b92915050565b600060208284031215620010ae57620010ad62000cf3565b5b6000620010be848285016200107e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200110f57607f821691505b60208210811415620011265762001125620010c7565b5b50919050565b608051615f9a6200115660003960008181611362015281816113a401526116c70152615f9a6000f3fe6080604052600436106103975760003560e01c80638503758d116101dc578063b12dc99111610102578063d5bea5bc116100a0578063f0f442601161006f578063f0f4426014610d33578063f222af3314610d5c578063f2fde38b14610d85578063fccc281314610dae57610397565b8063d5bea5bc14610c77578063dbddb26a14610ca0578063e8a3d48514610ccb578063e985e9c514610cf657610397565b8063b88d4fde116100dc578063b88d4fde14610bbd578063c695f48214610be6578063c87b56dd14610c11578063ccb4807b14610c4e57610397565b8063b12dc99114610b52578063b295f6a914610b69578063b6d8f66214610b9457610397565b806391b7f5ed1161017a578063a1ee1eb511610149578063a1ee1eb514610aac578063a22cb46514610ad5578063a97140bd14610afe578063aee5d0ac14610b2957610397565b806391b7f5ed14610a0657806395d89b4114610a2f578063a0bcfc7f14610a5a578063a199e34614610a8357610397565b80638d859f3e116101b65780638d859f3e1461095c5780638da5cb5b146109875780638db9fa90146109b257806391686f53146109dd57610397565b80638503758d146108cb57806389476069146108f65780638a59a7fd1461091f57610397565b80633a15ae4d116102c1578063607c86fe1161025f57806370a082311161022e57806370a0823114610823578063715018a6146108605780637fad2d1214610877578063816fccc9146108a057610397565b8063607c86fe146107695780636352211e146107945780636911ad6d146107d157806370517ed4146107fa57610397565b80634b0e72161161029b5780634b0e7216146106c157806356b4f673146106ea578063575e2f8c146107155780635b487a4f1461073e57610397565b80633a15ae4d146106565780633ccfd60b1461068157806342842e0e1461069857610397565b806318160ddd116103395780632d2c5565116103085780632d2c5565146105985780633135c307146105c357806332cb6b0c146105ee5780633549c70d1461061957610397565b806318160ddd146104fd578063203b3a461461052857806323b872dd146105445780632afccd7e1461056d57610397565b8063095ea7b311610375578063095ea7b3146104415780630c49bb421461046a578063145a1a4d146104a7578063171a0320146104d257610397565b806301ffc9a71461039c57806306fdde03146103d9578063081812fc14610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be9190614949565b610dd9565b6040516103d09190614991565b60405180910390f35b3480156103e557600080fd5b506103ee610ebb565b6040516103fb9190614a45565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190614a9d565b610f4d565b6040516104389190614b0b565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190614b52565b610fc9565b005b34801561047657600080fd5b50610491600480360381019061048c9190614c23565b6110d4565b60405161049e9190614cba565b60405180910390f35b3480156104b357600080fd5b506104bc6111c8565b6040516104c99190614d34565b60405180910390f35b3480156104de57600080fd5b506104e76111ee565b6040516104f49190614d68565b60405180910390f35b34801561050957600080fd5b506105126111f4565b60405161051f9190614cba565b60405180910390f35b610542600480360381019061053d9190614dd9565b61120b565b005b34801561055057600080fd5b5061056b60048036038101906105669190614ed0565b611683565b005b34801561057957600080fd5b50610582611693565b60405161058f9190614cba565b60405180910390f35b3480156105a457600080fd5b506105ad611699565b6040516105ba9190614b0b565b60405180910390f35b3480156105cf57600080fd5b506105d86116bf565b6040516105e59190614cba565b60405180910390f35b3480156105fa57600080fd5b506106036116c5565b6040516106109190614cba565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190614a9d565b6116e9565b60405161064d9190614a45565b60405180910390f35b34801561066257600080fd5b5061066b611789565b6040516106789190614991565b60405180910390f35b34801561068d57600080fd5b5061069661179c565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190614ed0565b611976565b005b3480156106cd57600080fd5b506106e860048036038101906106e39190614f23565b611996565b005b3480156106f657600080fd5b506106ff611a56565b60405161070c9190614a45565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190614f23565b611ae4565b005b34801561074a57600080fd5b50610753611ba4565b6040516107609190614991565b60405180910390f35b34801561077557600080fd5b5061077e611bb7565b60405161078b9190614cba565b60405180910390f35b3480156107a057600080fd5b506107bb60048036038101906107b69190614a9d565b611bbd565b6040516107c89190614b0b565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190614f7c565b611bd3565b005b34801561080657600080fd5b50610821600480360381019061081c9190614a9d565b611c59565b005b34801561082f57600080fd5b5061084a60048036038101906108459190614f23565b611cdf565b6040516108579190614cba565b60405180910390f35b34801561086c57600080fd5b50610875611daf565b005b34801561088357600080fd5b5061089e60048036038101906108999190614fff565b611e37565b005b3480156108ac57600080fd5b506108b5611f3a565b6040516108c29190614991565b60405180910390f35b3480156108d757600080fd5b506108e0611f4d565b6040516108ed9190614d34565b60405180910390f35b34801561090257600080fd5b5061091d60048036038101906109189190614f23565b611f73565b005b34801561092b57600080fd5b5061094660048036038101906109419190614f23565b6121df565b6040516109539190614cba565b60405180910390f35b34801561096857600080fd5b506109716121f1565b60405161097e9190614cba565b60405180910390f35b34801561099357600080fd5b5061099c6121f7565b6040516109a99190614b0b565b60405180910390f35b3480156109be57600080fd5b506109c7612221565b6040516109d491906150a1565b60405180910390f35b3480156109e957600080fd5b50610a0460048036038101906109ff91906150bc565b612247565b005b348015610a1257600080fd5b50610a2d6004803603810190610a289190614a9d565b6123b2565b005b348015610a3b57600080fd5b50610a44612438565b604051610a519190614a45565b60405180910390f35b348015610a6657600080fd5b50610a816004803603810190610a7c9190615152565b6124ca565b005b348015610a8f57600080fd5b50610aaa6004803603810190610aa5919061519f565b61255c565b005b348015610ab857600080fd5b50610ad36004803603810190610ace919061519f565b6125f5565b005b348015610ae157600080fd5b50610afc6004803603810190610af791906151cc565b61268e565b005b348015610b0a57600080fd5b50610b13612806565b604051610b20919061522d565b60405180910390f35b348015610b3557600080fd5b50610b506004803603810190610b4b9190614a9d565b61282c565b005b348015610b5e57600080fd5b50610b676128b2565b005b348015610b7557600080fd5b50610b7e612970565b604051610b8b9190614991565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb69190614f7c565b612983565b005b348015610bc957600080fd5b50610be46004803603810190610bdf9190615378565b612a09565b005b348015610bf257600080fd5b50610bfb612a85565b604051610c089190614d68565b60405180910390f35b348015610c1d57600080fd5b50610c386004803603810190610c339190614a9d565b612a8b565b604051610c459190614a45565b60405180910390f35b348015610c5a57600080fd5b50610c756004803603810190610c709190615152565b612b52565b005b348015610c8357600080fd5b50610c9e6004803603810190610c999190614a9d565b612be4565b005b348015610cac57600080fd5b50610cb5612c6a565b604051610cc29190614a45565b60405180910390f35b348015610cd757600080fd5b50610ce0612cf8565b604051610ced9190614a45565b60405180910390f35b348015610d0257600080fd5b50610d1d6004803603810190610d1891906153fb565b612d8a565b604051610d2a9190614991565b60405180910390f35b348015610d3f57600080fd5b50610d5a6004803603810190610d559190614f23565b612e1e565b005b348015610d6857600080fd5b50610d836004803603810190610d7e919061519f565b612ede565b005b348015610d9157600080fd5b50610dac6004803603810190610da79190614f23565b612f77565b005b348015610dba57600080fd5b50610dc361306f565b604051610dd09190614b0b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ea457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610eb45750610eb3826130b8565b5b9050919050565b606060028054610eca9061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef69061546a565b8015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b5050505050905090565b6000610f5882613122565b610f8e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fd482611bbd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105b613170565b73ffffffffffffffffffffffffffffffffffffffff161415801561108d575061108b81611086613170565b612d8a565b155b156110c4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110cf838383613178565b505050565b60008086866040516020016110ea929190615505565b6040516020818303038152906040528051906020012090506000611179868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050851580156111635750601260019054906101000a900460ff165b61116f57601054611173565b6011545b8461322a565b90508061118557600096505b601260029054906101000a900460ff166111ac576111a287613241565b86925050506111bf565b86600f546111ba9190615560565b925050505b95945050505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b60006111fe6132da565b6001546000540303905090565b601260009054906101000a900460ff1661125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190615602565b60405180910390fd5b60008a1161129d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112949061566e565b60405180910390fd5b85888890506112ac9190615560565b89146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490615700565b60405180910390fd5b60006112f8336132df565b61130533888888876110d4565b61130f9190615720565b905060008111611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b906157c6565b60405180910390fd5b808b111561136057809a505b7f0000000000000000000000000000000000000000000000000000000000000000611389613349565b8c6113949190615560565b11156113d0576113a2613349565b7f00000000000000000000000000000000000000000000000000000000000000006113cd9190615720565b9a505b8261148657811561143057600e548b6113e991906157e6565b34101561142b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114229061588c565b60405180910390fd5b611481565b600d548b61143e91906157e6565b341015611480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114779061588c565b60405180910390fd5b5b6114ca565b600034146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906158f8565b60405180910390fd5b5b6114d78b8b8b8b8b61335c565b6114e1338c613731565b826115a35760008261150057600d548c6114fb91906157e6565b61150f565b600e548c61150e91906157e6565b5b3461151a9190615720565b9050600081111561159d5760003373ffffffffffffffffffffffffffffffffffffffff168260405161154b90615949565b60006040518083038185875af1925050503d8060008114611588576040519150601f19603f3d011682016040523d82523d6000602084013e61158d565b606091505b505090508061159b57600080fd5b505b50611676565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c548f61161391906157e6565b6040518463ffffffff1660e01b81526004016116319392919061595e565b6020604051808303816000875af1158015611650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167491906159aa565b505b5050505050505050505050565b61168e83838361374f565b505050565b600e5481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b601460205280600052604060002060009150905080546117089061546a565b80601f01602080910402602001604051908101604052809291908181526020018280546117349061546a565b80156117815780601f1061175657610100808354040283529160200191611781565b820191906000526020600020905b81548152906001019060200180831161176457829003601f168201915b505050505081565b601260029054906101000a900460ff1681565b6117a46121f7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061182a5750601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118825750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118da5750601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118e357600080fd5b6000479050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161192e90615949565b60006040518083038185875af1925050503d806000811461196b576040519150601f19603f3d011682016040523d82523d6000602084013e611970565b606091505b50505050565b61199183838360405180602001604052806000815250612a09565b505050565b61199e613170565b73ffffffffffffffffffffffffffffffffffffffff166119bc6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0990615a23565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098054611a639061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f9061546a565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b505050505081565b611aec613170565b73ffffffffffffffffffffffffffffffffffffffff16611b0a6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790615a23565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601260039054906101000a900460ff1681565b600c5481565b6000611bc882613c05565b600001519050919050565b611bdb613170565b73ffffffffffffffffffffffffffffffffffffffff16611bf96121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4690615a23565b60405180910390fd5b8060108190555050565b611c61613170565b73ffffffffffffffffffffffffffffffffffffffff16611c7f6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90615a23565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d47576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611db7613170565b73ffffffffffffffffffffffffffffffffffffffff16611dd56121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290615a23565b60405180910390fd5b611e356000613e94565b565b611e3f613170565b73ffffffffffffffffffffffffffffffffffffffff16611e5d6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90615a23565b60405180910390fd5b60005b84849050811015611f3357828282818110611ed457611ed3615a43565b5b9050602002810190611ee69190615a81565b60146000888886818110611efd57611efc615a43565b5b9050602002013581526020019081526020016000209190611f1f9291906147f7565b508080611f2b90615ae4565b915050611eb6565b5050505050565b601260009054906101000a900460ff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f7b6121f7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806120015750601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806120595750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806120b15750601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120ba57600080fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff166323b872dd30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121389190614b0b565b602060405180830381865afa158015612155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121799190615b42565b6040518463ffffffff1660e01b81526004016121979392919061595e565b6020604051808303816000875af11580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da91906159aa565b505050565b60006121ea826132df565b9050919050565b600d5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61224f613170565b73ffffffffffffffffffffffffffffffffffffffff1661226d6121f7565b73ffffffffffffffffffffffffffffffffffffffff16146122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba90615a23565b60405180910390fd5b60008214156123125780601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123ae565b60018214156123615780601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123ad565b60028214156123ac5780601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b5050565b6123ba613170565b73ffffffffffffffffffffffffffffffffffffffff166123d86121f7565b73ffffffffffffffffffffffffffffffffffffffff161461242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590615a23565b60405180910390fd5b80600d8190555050565b6060600380546124479061546a565b80601f01602080910402602001604051908101604052809291908181526020018280546124739061546a565b80156124c05780601f10612495576101008083540402835291602001916124c0565b820191906000526020600020905b8154815290600101906020018083116124a357829003601f168201915b5050505050905090565b6124d2613170565b73ffffffffffffffffffffffffffffffffffffffff166124f06121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90615a23565b60405180910390fd5b8181601391906125579291906147f7565b505050565b612564613170565b73ffffffffffffffffffffffffffffffffffffffff166125826121f7565b73ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cf90615a23565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b6125fd613170565b73ffffffffffffffffffffffffffffffffffffffff1661261b6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266890615a23565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b612696613170565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612708613170565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166127b5613170565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127fa9190614991565b60405180910390a35050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612834613170565b73ffffffffffffffffffffffffffffffffffffffff166128526121f7565b73ffffffffffffffffffffffffffffffffffffffff16146128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90615a23565b60405180910390fd5b80600c8190555050565b6128ba613170565b73ffffffffffffffffffffffffffffffffffffffff166128d86121f7565b73ffffffffffffffffffffffffffffffffffffffff161461292e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292590615a23565b60405180910390fd5b601260039054906101000a900460ff161561294857600080fd5b6001601260036101000a81548160ff02191690831515021790555061296e336048613731565b565b601260019054906101000a900460ff1681565b61298b613170565b73ffffffffffffffffffffffffffffffffffffffff166129a96121f7565b73ffffffffffffffffffffffffffffffffffffffff16146129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f690615a23565b60405180910390fd5b8060118190555050565b612a1484848461374f565b612a338373ffffffffffffffffffffffffffffffffffffffff16613095565b8015612a485750612a4684848484613f5a565b155b15612a7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60115481565b60606000601460008481526020019081526020016000208054612aad9061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054612ad99061546a565b8015612b265780601f10612afb57610100808354040283529160200191612b26565b820191906000526020600020905b815481529060010190602001808311612b0957829003601f168201915b50505050509050600081511415612b4857612b40836140ab565b915050612b4d565b809150505b919050565b612b5a613170565b73ffffffffffffffffffffffffffffffffffffffff16612b786121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc590615a23565b60405180910390fd5b818160099190612bdf9291906147f7565b505050565b612bec613170565b73ffffffffffffffffffffffffffffffffffffffff16612c0a6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5790615a23565b60405180910390fd5b80600e8190555050565b60138054612c779061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca39061546a565b8015612cf05780601f10612cc557610100808354040283529160200191612cf0565b820191906000526020600020905b815481529060010190602001808311612cd357829003601f168201915b505050505081565b606060098054612d079061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d339061546a565b8015612d805780601f10612d5557610100808354040283529160200191612d80565b820191906000526020600020905b815481529060010190602001808311612d6357829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612e26613170565b73ffffffffffffffffffffffffffffffffffffffff16612e446121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9190615a23565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612ee6613170565b73ffffffffffffffffffffffffffffffffffffffff16612f046121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5190615a23565b60405180910390fd5b80601260026101000a81548160ff02191690831515021790555050565b612f7f613170565b73ffffffffffffffffffffffffffffffffffffffff16612f9d6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fea90615a23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305a90615be1565b60405180910390fd5b61306c81613e94565b50565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161312d6132da565b1115801561313c575060005482105b8015613169575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600082613237858461414a565b1490509392505050565b6132d7816040516024016132559190614cba565b6040516020818303038152906040527ff5b1bba9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506141bf565b50565b600090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60006133536132da565b60005403905090565b600061336886866141e8565b905060008082141561337b57505061372a565b60008054905061342884601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360016040518363ffffffff1660e01b81526004016133e2929190615c3c565b602060405180830381865afa1580156133ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134239190615b42565b6141e8565b935060005b848110156134c857838310613441576134c8565b7f30aff2455f1df1da47bc4c6371d802953a8fb91d0f62dd85c566c3828108f17982601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160405161349793929190615c65565b60405180910390a1816134a990615ae4565b9150826134b590615ae4565b9250806134c190615ae4565b905061342d565b5060005b8686905081101561366f578383106134e35761366f565b3373ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e89898581811061354b5761354a615a43565b5b905060200201356040518263ffffffff1660e01b815260040161356e9190614cba565b602060405180830381865afa15801561358b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135af9190615cb1565b73ffffffffffffffffffffffffffffffffffffffff16146135cf5761365e565b7f30aff2455f1df1da47bc4c6371d802953a8fb91d0f62dd85c566c3828108f17982601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689898581811061362757613626615a43565b5b9050602002013560405161363d93929190615cde565b60405180910390a18161364f90615ae4565b91508261365b90615ae4565b92505b8061366890615ae4565b90506134cc565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a33601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001866040518563ffffffff1660e01b81526004016136f49493929190615d49565b600060405180830381600087803b15801561370e57600080fd5b505af1158015613722573d6000803e3d6000fd5b505050505050505b5050505050565b61374b828260405180602001604052806000815250614201565b5050565b600061375a82613c05565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146137c5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166137e6613170565b73ffffffffffffffffffffffffffffffffffffffff16148061381557506138148561380f613170565b612d8a565b5b8061385a5750613823613170565b73ffffffffffffffffffffffffffffffffffffffff1661384284610f4d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613893576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156138fa576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139078585856001614213565b61391360008487613178565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b93576000548214613b9257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bfe8585856001614219565b5050505050565b613c0d61487d565b600082905080613c1b6132da565b11158015613c2a575060005481105b15613e5d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613e5b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613d3f578092505050613e8f565b5b600115613e5a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613e55578092505050613e8f565b613d40565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613f80613170565b8786866040518563ffffffff1660e01b8152600401613fa29493929190615de5565b6020604051808303816000875af1925050508015613fde57506040513d601f19601f82011682018060405250810190613fdb9190615e46565b60015b614058573d806000811461400e576040519150601f19603f3d011682016040523d82523d6000602084013e614013565b606091505b50600081511415614050576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606140b682613122565b6140ec576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006140f661421f565b90506000815114156141175760405180602001604052806000815250614142565b80614121846142b1565b604051602001614132929190615eaf565b6040516020818303038152906040525b915050919050565b60008082905060005b84518110156141b457600085828151811061417157614170615a43565b5b602002602001015190508083116141935761418c8382614412565b92506141a0565b61419d8184614412565b92505b5080806141ac90615ae4565b915050614153565b508091505092915050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b60008183106141f757816141f9565b825b905092915050565b61420e8383836001614429565b505050565b50505050565b50505050565b60606013805461422e9061546a565b80601f016020809104026020016040519081016040528092919081815260200182805461425a9061546a565b80156142a75780601f1061427c576101008083540402835291602001916142a7565b820191906000526020600020905b81548152906001019060200180831161428a57829003601f168201915b5050505050905090565b606060008214156142f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061440d565b600082905060005b6000821461432b57808061431490615ae4565b915050600a826143249190615f02565b9150614301565b60008167ffffffffffffffff8111156143475761434661524d565b5b6040519080825280601f01601f1916602001820160405280156143795781602001600182028036833780820191505090505b5090505b60008514614406576001826143929190615720565b9150600a856143a19190615f33565b60306143ad9190615560565b60f81b8183815181106143c3576143c2615a43565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856143ff9190615f02565b945061437d565b8093505050505b919050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614496576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156144d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6144de6000868387614213565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156146a857506146a78773ffffffffffffffffffffffffffffffffffffffff16613095565b5b1561476e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461471d6000888480600101955088613f5a565b614753576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156146ae57826000541461476957600080fd5b6147da565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561476f575b8160008190555050506147f06000868387614219565b5050505050565b8280546148039061546a565b90600052602060002090601f016020900481019282614825576000855561486c565b82601f1061483e57803560ff191683800117855561486c565b8280016001018555821561486c579182015b8281111561486b578235825591602001919060010190614850565b5b50905061487991906148c0565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156148d95760008160009055506001016148c1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614926816148f1565b811461493157600080fd5b50565b6000813590506149438161491d565b92915050565b60006020828403121561495f5761495e6148e7565b5b600061496d84828501614934565b91505092915050565b60008115159050919050565b61498b81614976565b82525050565b60006020820190506149a66000830184614982565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149e65780820151818401526020810190506149cb565b838111156149f5576000848401525b50505050565b6000601f19601f8301169050919050565b6000614a17826149ac565b614a2181856149b7565b9350614a318185602086016149c8565b614a3a816149fb565b840191505092915050565b60006020820190508181036000830152614a5f8184614a0c565b905092915050565b6000819050919050565b614a7a81614a67565b8114614a8557600080fd5b50565b600081359050614a9781614a71565b92915050565b600060208284031215614ab357614ab26148e7565b5b6000614ac184828501614a88565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614af582614aca565b9050919050565b614b0581614aea565b82525050565b6000602082019050614b206000830184614afc565b92915050565b614b2f81614aea565b8114614b3a57600080fd5b50565b600081359050614b4c81614b26565b92915050565b60008060408385031215614b6957614b686148e7565b5b6000614b7785828601614b3d565b9250506020614b8885828601614a88565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112614bb757614bb6614b92565b5b8235905067ffffffffffffffff811115614bd457614bd3614b97565b5b602083019150836020820283011115614bf057614bef614b9c565b5b9250929050565b614c0081614976565b8114614c0b57600080fd5b50565b600081359050614c1d81614bf7565b92915050565b600080600080600060808688031215614c3f57614c3e6148e7565b5b6000614c4d88828901614b3d565b9550506020614c5e88828901614a88565b945050604086013567ffffffffffffffff811115614c7f57614c7e6148ec565b5b614c8b88828901614ba1565b93509350506060614c9e88828901614c0e565b9150509295509295909350565b614cb481614a67565b82525050565b6000602082019050614ccf6000830184614cab565b92915050565b6000819050919050565b6000614cfa614cf5614cf084614aca565b614cd5565b614aca565b9050919050565b6000614d0c82614cdf565b9050919050565b6000614d1e82614d01565b9050919050565b614d2e81614d13565b82525050565b6000602082019050614d496000830184614d25565b92915050565b6000819050919050565b614d6281614d4f565b82525050565b6000602082019050614d7d6000830184614d59565b92915050565b60008083601f840112614d9957614d98614b92565b5b8235905067ffffffffffffffff811115614db657614db5614b97565b5b602083019150836020820283011115614dd257614dd1614b9c565b5b9250929050565b6000806000806000806000806000806101008b8d031215614dfd57614dfc6148e7565b5b6000614e0b8d828e01614a88565b9a50506020614e1c8d828e01614a88565b99505060408b013567ffffffffffffffff811115614e3d57614e3c6148ec565b5b614e498d828e01614d83565b98509850506060614e5c8d828e01614a88565b9650506080614e6d8d828e01614a88565b95505060a08b013567ffffffffffffffff811115614e8e57614e8d6148ec565b5b614e9a8d828e01614ba1565b945094505060c0614ead8d828e01614c0e565b92505060e0614ebe8d828e01614c0e565b9150509295989b9194979a5092959850565b600080600060608486031215614ee957614ee86148e7565b5b6000614ef786828701614b3d565b9350506020614f0886828701614b3d565b9250506040614f1986828701614a88565b9150509250925092565b600060208284031215614f3957614f386148e7565b5b6000614f4784828501614b3d565b91505092915050565b614f5981614d4f565b8114614f6457600080fd5b50565b600081359050614f7681614f50565b92915050565b600060208284031215614f9257614f916148e7565b5b6000614fa084828501614f67565b91505092915050565b60008083601f840112614fbf57614fbe614b92565b5b8235905067ffffffffffffffff811115614fdc57614fdb614b97565b5b602083019150836020820283011115614ff857614ff7614b9c565b5b9250929050565b60008060008060408587031215615019576150186148e7565b5b600085013567ffffffffffffffff811115615037576150366148ec565b5b61504387828801614d83565b9450945050602085013567ffffffffffffffff811115615066576150656148ec565b5b61507287828801614fa9565b925092505092959194509250565b600061508b82614d01565b9050919050565b61509b81615080565b82525050565b60006020820190506150b66000830184615092565b92915050565b600080604083850312156150d3576150d26148e7565b5b60006150e185828601614a88565b92505060206150f285828601614b3d565b9150509250929050565b60008083601f84011261511257615111614b92565b5b8235905067ffffffffffffffff81111561512f5761512e614b97565b5b60208301915083600182028301111561514b5761514a614b9c565b5b9250929050565b60008060208385031215615169576151686148e7565b5b600083013567ffffffffffffffff811115615187576151866148ec565b5b615193858286016150fc565b92509250509250929050565b6000602082840312156151b5576151b46148e7565b5b60006151c384828501614c0e565b91505092915050565b600080604083850312156151e3576151e26148e7565b5b60006151f185828601614b3d565b925050602061520285828601614c0e565b9150509250929050565b600061521782614d01565b9050919050565b6152278161520c565b82525050565b6000602082019050615242600083018461521e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615285826149fb565b810181811067ffffffffffffffff821117156152a4576152a361524d565b5b80604052505050565b60006152b76148dd565b90506152c3828261527c565b919050565b600067ffffffffffffffff8211156152e3576152e261524d565b5b6152ec826149fb565b9050602081019050919050565b82818337600083830152505050565b600061531b615316846152c8565b6152ad565b90508281526020810184848401111561533757615336615248565b5b6153428482856152f9565b509392505050565b600082601f83011261535f5761535e614b92565b5b813561536f848260208601615308565b91505092915050565b60008060008060808587031215615392576153916148e7565b5b60006153a087828801614b3d565b94505060206153b187828801614b3d565b93505060406153c287828801614a88565b925050606085013567ffffffffffffffff8111156153e3576153e26148ec565b5b6153ef8782880161534a565b91505092959194509250565b60008060408385031215615412576154116148e7565b5b600061542085828601614b3d565b925050602061543185828601614b3d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061548257607f821691505b602082108114156154965761549561543b565b5b50919050565b60008160601b9050919050565b60006154b48261549c565b9050919050565b60006154c6826154a9565b9050919050565b6154de6154d982614aea565b6154bb565b82525050565b6000819050919050565b6154ff6154fa82614a67565b6154e4565b82525050565b600061551182856154cd565b60148201915061552182846154ee565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061556b82614a67565b915061557683614a67565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155ab576155aa615531565b5b828201905092915050565b7f4d696e74696e67206e6f7420616c6c6f7765642e000000000000000000000000600082015250565b60006155ec6014836149b7565b91506155f7826155b6565b602082019050919050565b6000602082019050818103600083015261561b816155df565b9050919050565b7f4d757374206d696e74206174206c6561737420312e0000000000000000000000600082015250565b60006156586015836149b7565b915061566382615622565b602082019050919050565b600060208201905081810360008301526156878161564b565b9050919050565b7f496e76616c69642073656c656374696f6e20666f7220416e6365737472616c2060008201527f536565646c696e67732e00000000000000000000000000000000000000000000602082015250565b60006156ea602a836149b7565b91506156f58261568e565b604082019050919050565b60006020820190508181036000830152615719816156dd565b9050919050565b600061572b82614a67565b915061573683614a67565b92508282101561574957615748615531565b5b828203905092915050565b7f596f752063616e2774206d696e7420616e7920466f726573742053706972697460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b60006157b06022836149b7565b91506157bb82615754565b604082019050919050565b600060208201905081810360008301526157df816157a3565b9050919050565b60006157f182614a67565b91506157fc83614a67565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561583557615834615531565b5b828202905092915050565b7f4e6f7420656e6f756768204554482073656e742e000000000000000000000000600082015250565b60006158766014836149b7565b915061588182615840565b602082019050919050565b600060208201905081810360008301526158a581615869565b9050919050565b7f53656e74204554482062757420627579696e672077697468204150452e000000600082015250565b60006158e2601d836149b7565b91506158ed826158ac565b602082019050919050565b60006020820190508181036000830152615911816158d5565b9050919050565b600081905092915050565b50565b6000615933600083615918565b915061593e82615923565b600082019050919050565b600061595482615926565b9150819050919050565b60006060820190506159736000830186614afc565b6159806020830185614afc565b61598d6040830184614cab565b949350505050565b6000815190506159a481614bf7565b92915050565b6000602082840312156159c0576159bf6148e7565b5b60006159ce84828501615995565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615a0d6020836149b7565b9150615a18826159d7565b602082019050919050565b60006020820190508181036000830152615a3c81615a00565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112615a9e57615a9d615a72565b5b80840192508235915067ffffffffffffffff821115615ac057615abf615a77565b5b602083019250600182023603831315615adc57615adb615a7c565b5b509250929050565b6000615aef82614a67565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b2257615b21615531565b5b600182019050919050565b600081519050615b3c81614a71565b92915050565b600060208284031215615b5857615b576148e7565b5b6000615b6684828501615b2d565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615bcb6026836149b7565b9150615bd682615b6f565b604082019050919050565b60006020820190508181036000830152615bfa81615bbe565b9050919050565b6000819050919050565b6000615c26615c21615c1c84615c01565b614cd5565b614a67565b9050919050565b615c3681615c0b565b82525050565b6000604082019050615c516000830185614afc565b615c5e6020830184615c2d565b9392505050565b6000606082019050615c7a6000830186614cab565b615c876020830185614afc565b615c946040830184615c2d565b949350505050565b600081519050615cab81614b26565b92915050565b600060208284031215615cc757615cc66148e7565b5b6000615cd584828501615c9c565b91505092915050565b6000606082019050615cf36000830186614cab565b615d006020830185614afc565b615d0d6040830184614cab565b949350505050565b600082825260208201905092915050565b6000615d33600083615d15565b9150615d3e82615923565b600082019050919050565b600060a082019050615d5e6000830187614afc565b615d6b6020830186614afc565b615d786040830185615c2d565b615d856060830184614cab565b8181036080830152615d9681615d26565b905095945050505050565b600081519050919050565b6000615db782615da1565b615dc18185615d15565b9350615dd18185602086016149c8565b615dda816149fb565b840191505092915050565b6000608082019050615dfa6000830187614afc565b615e076020830186614afc565b615e146040830185614cab565b8181036060830152615e268184615dac565b905095945050505050565b600081519050615e408161491d565b92915050565b600060208284031215615e5c57615e5b6148e7565b5b6000615e6a84828501615e31565b91505092915050565b600081905092915050565b6000615e89826149ac565b615e938185615e73565b9350615ea38185602086016149c8565b80840191505092915050565b6000615ebb8285615e7e565b9150615ec78284615e7e565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615f0d82614a67565b9150615f1883614a67565b925082615f2857615f27615ed3565b5b828204905092915050565b6000615f3e82614a67565b9150615f4983614a67565b925082615f5957615f58615ed3565b5b82820690509291505056fea2646970667358221220fe5049e4f6f7f9ad2987ed94ac9ebbfb1938328ed2518047be76244d2a567e1a64736f6c634300080a003300000000000000000000000063b8bee4e46b5dfd7367c14b6c10280e08f603f50000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000442ee5043b0d8b12c1eb4d222fbb81cb232a2add000000000000000000000000ec9c519d49856fd2f8133a0741b4dbe002ce211b000000000000000000000000b798a123fe75292c3873768d01d7f5fc79e05efc000000000000000000000000680dbe06793efc7678bc9a32acad039b3059666b

Deployed Bytecode

0x6080604052600436106103975760003560e01c80638503758d116101dc578063b12dc99111610102578063d5bea5bc116100a0578063f0f442601161006f578063f0f4426014610d33578063f222af3314610d5c578063f2fde38b14610d85578063fccc281314610dae57610397565b8063d5bea5bc14610c77578063dbddb26a14610ca0578063e8a3d48514610ccb578063e985e9c514610cf657610397565b8063b88d4fde116100dc578063b88d4fde14610bbd578063c695f48214610be6578063c87b56dd14610c11578063ccb4807b14610c4e57610397565b8063b12dc99114610b52578063b295f6a914610b69578063b6d8f66214610b9457610397565b806391b7f5ed1161017a578063a1ee1eb511610149578063a1ee1eb514610aac578063a22cb46514610ad5578063a97140bd14610afe578063aee5d0ac14610b2957610397565b806391b7f5ed14610a0657806395d89b4114610a2f578063a0bcfc7f14610a5a578063a199e34614610a8357610397565b80638d859f3e116101b65780638d859f3e1461095c5780638da5cb5b146109875780638db9fa90146109b257806391686f53146109dd57610397565b80638503758d146108cb57806389476069146108f65780638a59a7fd1461091f57610397565b80633a15ae4d116102c1578063607c86fe1161025f57806370a082311161022e57806370a0823114610823578063715018a6146108605780637fad2d1214610877578063816fccc9146108a057610397565b8063607c86fe146107695780636352211e146107945780636911ad6d146107d157806370517ed4146107fa57610397565b80634b0e72161161029b5780634b0e7216146106c157806356b4f673146106ea578063575e2f8c146107155780635b487a4f1461073e57610397565b80633a15ae4d146106565780633ccfd60b1461068157806342842e0e1461069857610397565b806318160ddd116103395780632d2c5565116103085780632d2c5565146105985780633135c307146105c357806332cb6b0c146105ee5780633549c70d1461061957610397565b806318160ddd146104fd578063203b3a461461052857806323b872dd146105445780632afccd7e1461056d57610397565b8063095ea7b311610375578063095ea7b3146104415780630c49bb421461046a578063145a1a4d146104a7578063171a0320146104d257610397565b806301ffc9a71461039c57806306fdde03146103d9578063081812fc14610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be9190614949565b610dd9565b6040516103d09190614991565b60405180910390f35b3480156103e557600080fd5b506103ee610ebb565b6040516103fb9190614a45565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190614a9d565b610f4d565b6040516104389190614b0b565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190614b52565b610fc9565b005b34801561047657600080fd5b50610491600480360381019061048c9190614c23565b6110d4565b60405161049e9190614cba565b60405180910390f35b3480156104b357600080fd5b506104bc6111c8565b6040516104c99190614d34565b60405180910390f35b3480156104de57600080fd5b506104e76111ee565b6040516104f49190614d68565b60405180910390f35b34801561050957600080fd5b506105126111f4565b60405161051f9190614cba565b60405180910390f35b610542600480360381019061053d9190614dd9565b61120b565b005b34801561055057600080fd5b5061056b60048036038101906105669190614ed0565b611683565b005b34801561057957600080fd5b50610582611693565b60405161058f9190614cba565b60405180910390f35b3480156105a457600080fd5b506105ad611699565b6040516105ba9190614b0b565b60405180910390f35b3480156105cf57600080fd5b506105d86116bf565b6040516105e59190614cba565b60405180910390f35b3480156105fa57600080fd5b506106036116c5565b6040516106109190614cba565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190614a9d565b6116e9565b60405161064d9190614a45565b60405180910390f35b34801561066257600080fd5b5061066b611789565b6040516106789190614991565b60405180910390f35b34801561068d57600080fd5b5061069661179c565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190614ed0565b611976565b005b3480156106cd57600080fd5b506106e860048036038101906106e39190614f23565b611996565b005b3480156106f657600080fd5b506106ff611a56565b60405161070c9190614a45565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190614f23565b611ae4565b005b34801561074a57600080fd5b50610753611ba4565b6040516107609190614991565b60405180910390f35b34801561077557600080fd5b5061077e611bb7565b60405161078b9190614cba565b60405180910390f35b3480156107a057600080fd5b506107bb60048036038101906107b69190614a9d565b611bbd565b6040516107c89190614b0b565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190614f7c565b611bd3565b005b34801561080657600080fd5b50610821600480360381019061081c9190614a9d565b611c59565b005b34801561082f57600080fd5b5061084a60048036038101906108459190614f23565b611cdf565b6040516108579190614cba565b60405180910390f35b34801561086c57600080fd5b50610875611daf565b005b34801561088357600080fd5b5061089e60048036038101906108999190614fff565b611e37565b005b3480156108ac57600080fd5b506108b5611f3a565b6040516108c29190614991565b60405180910390f35b3480156108d757600080fd5b506108e0611f4d565b6040516108ed9190614d34565b60405180910390f35b34801561090257600080fd5b5061091d60048036038101906109189190614f23565b611f73565b005b34801561092b57600080fd5b5061094660048036038101906109419190614f23565b6121df565b6040516109539190614cba565b60405180910390f35b34801561096857600080fd5b506109716121f1565b60405161097e9190614cba565b60405180910390f35b34801561099357600080fd5b5061099c6121f7565b6040516109a99190614b0b565b60405180910390f35b3480156109be57600080fd5b506109c7612221565b6040516109d491906150a1565b60405180910390f35b3480156109e957600080fd5b50610a0460048036038101906109ff91906150bc565b612247565b005b348015610a1257600080fd5b50610a2d6004803603810190610a289190614a9d565b6123b2565b005b348015610a3b57600080fd5b50610a44612438565b604051610a519190614a45565b60405180910390f35b348015610a6657600080fd5b50610a816004803603810190610a7c9190615152565b6124ca565b005b348015610a8f57600080fd5b50610aaa6004803603810190610aa5919061519f565b61255c565b005b348015610ab857600080fd5b50610ad36004803603810190610ace919061519f565b6125f5565b005b348015610ae157600080fd5b50610afc6004803603810190610af791906151cc565b61268e565b005b348015610b0a57600080fd5b50610b13612806565b604051610b20919061522d565b60405180910390f35b348015610b3557600080fd5b50610b506004803603810190610b4b9190614a9d565b61282c565b005b348015610b5e57600080fd5b50610b676128b2565b005b348015610b7557600080fd5b50610b7e612970565b604051610b8b9190614991565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb69190614f7c565b612983565b005b348015610bc957600080fd5b50610be46004803603810190610bdf9190615378565b612a09565b005b348015610bf257600080fd5b50610bfb612a85565b604051610c089190614d68565b60405180910390f35b348015610c1d57600080fd5b50610c386004803603810190610c339190614a9d565b612a8b565b604051610c459190614a45565b60405180910390f35b348015610c5a57600080fd5b50610c756004803603810190610c709190615152565b612b52565b005b348015610c8357600080fd5b50610c9e6004803603810190610c999190614a9d565b612be4565b005b348015610cac57600080fd5b50610cb5612c6a565b604051610cc29190614a45565b60405180910390f35b348015610cd757600080fd5b50610ce0612cf8565b604051610ced9190614a45565b60405180910390f35b348015610d0257600080fd5b50610d1d6004803603810190610d1891906153fb565b612d8a565b604051610d2a9190614991565b60405180910390f35b348015610d3f57600080fd5b50610d5a6004803603810190610d559190614f23565b612e1e565b005b348015610d6857600080fd5b50610d836004803603810190610d7e919061519f565b612ede565b005b348015610d9157600080fd5b50610dac6004803603810190610da79190614f23565b612f77565b005b348015610dba57600080fd5b50610dc361306f565b604051610dd09190614b0b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ea457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610eb45750610eb3826130b8565b5b9050919050565b606060028054610eca9061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef69061546a565b8015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b5050505050905090565b6000610f5882613122565b610f8e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fd482611bbd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105b613170565b73ffffffffffffffffffffffffffffffffffffffff161415801561108d575061108b81611086613170565b612d8a565b155b156110c4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110cf838383613178565b505050565b60008086866040516020016110ea929190615505565b6040516020818303038152906040528051906020012090506000611179868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050851580156111635750601260019054906101000a900460ff165b61116f57601054611173565b6011545b8461322a565b90508061118557600096505b601260029054906101000a900460ff166111ac576111a287613241565b86925050506111bf565b86600f546111ba9190615560565b925050505b95945050505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b60006111fe6132da565b6001546000540303905090565b601260009054906101000a900460ff1661125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190615602565b60405180910390fd5b60008a1161129d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112949061566e565b60405180910390fd5b85888890506112ac9190615560565b89146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490615700565b60405180910390fd5b60006112f8336132df565b61130533888888876110d4565b61130f9190615720565b905060008111611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b906157c6565b60405180910390fd5b808b111561136057809a505b7f00000000000000000000000000000000000000000000000000000000000022b8611389613349565b8c6113949190615560565b11156113d0576113a2613349565b7f00000000000000000000000000000000000000000000000000000000000022b86113cd9190615720565b9a505b8261148657811561143057600e548b6113e991906157e6565b34101561142b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114229061588c565b60405180910390fd5b611481565b600d548b61143e91906157e6565b341015611480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114779061588c565b60405180910390fd5b5b6114ca565b600034146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906158f8565b60405180910390fd5b5b6114d78b8b8b8b8b61335c565b6114e1338c613731565b826115a35760008261150057600d548c6114fb91906157e6565b61150f565b600e548c61150e91906157e6565b5b3461151a9190615720565b9050600081111561159d5760003373ffffffffffffffffffffffffffffffffffffffff168260405161154b90615949565b60006040518083038185875af1925050503d8060008114611588576040519150601f19603f3d011682016040523d82523d6000602084013e61158d565b606091505b505090508061159b57600080fd5b505b50611676565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c548f61161391906157e6565b6040518463ffffffff1660e01b81526004016116319392919061595e565b6020604051808303816000875af1158015611650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167491906159aa565b505b5050505050505050505050565b61168e83838361374f565b505050565b600e5481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b7f00000000000000000000000000000000000000000000000000000000000022b881565b601460205280600052604060002060009150905080546117089061546a565b80601f01602080910402602001604051908101604052809291908181526020018280546117349061546a565b80156117815780601f1061175657610100808354040283529160200191611781565b820191906000526020600020905b81548152906001019060200180831161176457829003601f168201915b505050505081565b601260029054906101000a900460ff1681565b6117a46121f7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061182a5750601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118825750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118da5750601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118e357600080fd5b6000479050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161192e90615949565b60006040518083038185875af1925050503d806000811461196b576040519150601f19603f3d011682016040523d82523d6000602084013e611970565b606091505b50505050565b61199183838360405180602001604052806000815250612a09565b505050565b61199e613170565b73ffffffffffffffffffffffffffffffffffffffff166119bc6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0990615a23565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098054611a639061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f9061546a565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b505050505081565b611aec613170565b73ffffffffffffffffffffffffffffffffffffffff16611b0a6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790615a23565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601260039054906101000a900460ff1681565b600c5481565b6000611bc882613c05565b600001519050919050565b611bdb613170565b73ffffffffffffffffffffffffffffffffffffffff16611bf96121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4690615a23565b60405180910390fd5b8060108190555050565b611c61613170565b73ffffffffffffffffffffffffffffffffffffffff16611c7f6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90615a23565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d47576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611db7613170565b73ffffffffffffffffffffffffffffffffffffffff16611dd56121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290615a23565b60405180910390fd5b611e356000613e94565b565b611e3f613170565b73ffffffffffffffffffffffffffffffffffffffff16611e5d6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90615a23565b60405180910390fd5b60005b84849050811015611f3357828282818110611ed457611ed3615a43565b5b9050602002810190611ee69190615a81565b60146000888886818110611efd57611efc615a43565b5b9050602002013581526020019081526020016000209190611f1f9291906147f7565b508080611f2b90615ae4565b915050611eb6565b5050505050565b601260009054906101000a900460ff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f7b6121f7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806120015750601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806120595750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806120b15750601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120ba57600080fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff166323b872dd30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121389190614b0b565b602060405180830381865afa158015612155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121799190615b42565b6040518463ffffffff1660e01b81526004016121979392919061595e565b6020604051808303816000875af11580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da91906159aa565b505050565b60006121ea826132df565b9050919050565b600d5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61224f613170565b73ffffffffffffffffffffffffffffffffffffffff1661226d6121f7565b73ffffffffffffffffffffffffffffffffffffffff16146122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba90615a23565b60405180910390fd5b60008214156123125780601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123ae565b60018214156123615780601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123ad565b60028214156123ac5780601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b5050565b6123ba613170565b73ffffffffffffffffffffffffffffffffffffffff166123d86121f7565b73ffffffffffffffffffffffffffffffffffffffff161461242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590615a23565b60405180910390fd5b80600d8190555050565b6060600380546124479061546a565b80601f01602080910402602001604051908101604052809291908181526020018280546124739061546a565b80156124c05780601f10612495576101008083540402835291602001916124c0565b820191906000526020600020905b8154815290600101906020018083116124a357829003601f168201915b5050505050905090565b6124d2613170565b73ffffffffffffffffffffffffffffffffffffffff166124f06121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90615a23565b60405180910390fd5b8181601391906125579291906147f7565b505050565b612564613170565b73ffffffffffffffffffffffffffffffffffffffff166125826121f7565b73ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cf90615a23565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b6125fd613170565b73ffffffffffffffffffffffffffffffffffffffff1661261b6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266890615a23565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b612696613170565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612708613170565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166127b5613170565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127fa9190614991565b60405180910390a35050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612834613170565b73ffffffffffffffffffffffffffffffffffffffff166128526121f7565b73ffffffffffffffffffffffffffffffffffffffff16146128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90615a23565b60405180910390fd5b80600c8190555050565b6128ba613170565b73ffffffffffffffffffffffffffffffffffffffff166128d86121f7565b73ffffffffffffffffffffffffffffffffffffffff161461292e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292590615a23565b60405180910390fd5b601260039054906101000a900460ff161561294857600080fd5b6001601260036101000a81548160ff02191690831515021790555061296e336048613731565b565b601260019054906101000a900460ff1681565b61298b613170565b73ffffffffffffffffffffffffffffffffffffffff166129a96121f7565b73ffffffffffffffffffffffffffffffffffffffff16146129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f690615a23565b60405180910390fd5b8060118190555050565b612a1484848461374f565b612a338373ffffffffffffffffffffffffffffffffffffffff16613095565b8015612a485750612a4684848484613f5a565b155b15612a7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60115481565b60606000601460008481526020019081526020016000208054612aad9061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054612ad99061546a565b8015612b265780601f10612afb57610100808354040283529160200191612b26565b820191906000526020600020905b815481529060010190602001808311612b0957829003601f168201915b50505050509050600081511415612b4857612b40836140ab565b915050612b4d565b809150505b919050565b612b5a613170565b73ffffffffffffffffffffffffffffffffffffffff16612b786121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc590615a23565b60405180910390fd5b818160099190612bdf9291906147f7565b505050565b612bec613170565b73ffffffffffffffffffffffffffffffffffffffff16612c0a6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5790615a23565b60405180910390fd5b80600e8190555050565b60138054612c779061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca39061546a565b8015612cf05780601f10612cc557610100808354040283529160200191612cf0565b820191906000526020600020905b815481529060010190602001808311612cd357829003601f168201915b505050505081565b606060098054612d079061546a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d339061546a565b8015612d805780601f10612d5557610100808354040283529160200191612d80565b820191906000526020600020905b815481529060010190602001808311612d6357829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612e26613170565b73ffffffffffffffffffffffffffffffffffffffff16612e446121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9190615a23565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612ee6613170565b73ffffffffffffffffffffffffffffffffffffffff16612f046121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5190615a23565b60405180910390fd5b80601260026101000a81548160ff02191690831515021790555050565b612f7f613170565b73ffffffffffffffffffffffffffffffffffffffff16612f9d6121f7565b73ffffffffffffffffffffffffffffffffffffffff1614612ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fea90615a23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305a90615be1565b60405180910390fd5b61306c81613e94565b50565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161312d6132da565b1115801561313c575060005482105b8015613169575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600082613237858461414a565b1490509392505050565b6132d7816040516024016132559190614cba565b6040516020818303038152906040527ff5b1bba9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506141bf565b50565b600090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60006133536132da565b60005403905090565b600061336886866141e8565b905060008082141561337b57505061372a565b60008054905061342884601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360016040518363ffffffff1660e01b81526004016133e2929190615c3c565b602060405180830381865afa1580156133ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134239190615b42565b6141e8565b935060005b848110156134c857838310613441576134c8565b7f30aff2455f1df1da47bc4c6371d802953a8fb91d0f62dd85c566c3828108f17982601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160405161349793929190615c65565b60405180910390a1816134a990615ae4565b9150826134b590615ae4565b9250806134c190615ae4565b905061342d565b5060005b8686905081101561366f578383106134e35761366f565b3373ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e89898581811061354b5761354a615a43565b5b905060200201356040518263ffffffff1660e01b815260040161356e9190614cba565b602060405180830381865afa15801561358b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135af9190615cb1565b73ffffffffffffffffffffffffffffffffffffffff16146135cf5761365e565b7f30aff2455f1df1da47bc4c6371d802953a8fb91d0f62dd85c566c3828108f17982601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689898581811061362757613626615a43565b5b9050602002013560405161363d93929190615cde565b60405180910390a18161364f90615ae4565b91508261365b90615ae4565b92505b8061366890615ae4565b90506134cc565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a33601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001866040518563ffffffff1660e01b81526004016136f49493929190615d49565b600060405180830381600087803b15801561370e57600080fd5b505af1158015613722573d6000803e3d6000fd5b505050505050505b5050505050565b61374b828260405180602001604052806000815250614201565b5050565b600061375a82613c05565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146137c5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166137e6613170565b73ffffffffffffffffffffffffffffffffffffffff16148061381557506138148561380f613170565b612d8a565b5b8061385a5750613823613170565b73ffffffffffffffffffffffffffffffffffffffff1661384284610f4d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613893576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156138fa576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139078585856001614213565b61391360008487613178565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b93576000548214613b9257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bfe8585856001614219565b5050505050565b613c0d61487d565b600082905080613c1b6132da565b11158015613c2a575060005481105b15613e5d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613e5b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613d3f578092505050613e8f565b5b600115613e5a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613e55578092505050613e8f565b613d40565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613f80613170565b8786866040518563ffffffff1660e01b8152600401613fa29493929190615de5565b6020604051808303816000875af1925050508015613fde57506040513d601f19601f82011682018060405250810190613fdb9190615e46565b60015b614058573d806000811461400e576040519150601f19603f3d011682016040523d82523d6000602084013e614013565b606091505b50600081511415614050576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606140b682613122565b6140ec576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006140f661421f565b90506000815114156141175760405180602001604052806000815250614142565b80614121846142b1565b604051602001614132929190615eaf565b6040516020818303038152906040525b915050919050565b60008082905060005b84518110156141b457600085828151811061417157614170615a43565b5b602002602001015190508083116141935761418c8382614412565b92506141a0565b61419d8184614412565b92505b5080806141ac90615ae4565b915050614153565b508091505092915050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b60008183106141f757816141f9565b825b905092915050565b61420e8383836001614429565b505050565b50505050565b50505050565b60606013805461422e9061546a565b80601f016020809104026020016040519081016040528092919081815260200182805461425a9061546a565b80156142a75780601f1061427c576101008083540402835291602001916142a7565b820191906000526020600020905b81548152906001019060200180831161428a57829003601f168201915b5050505050905090565b606060008214156142f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061440d565b600082905060005b6000821461432b57808061431490615ae4565b915050600a826143249190615f02565b9150614301565b60008167ffffffffffffffff8111156143475761434661524d565b5b6040519080825280601f01601f1916602001820160405280156143795781602001600182028036833780820191505090505b5090505b60008514614406576001826143929190615720565b9150600a856143a19190615f33565b60306143ad9190615560565b60f81b8183815181106143c3576143c2615a43565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856143ff9190615f02565b945061437d565b8093505050505b919050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614496576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156144d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6144de6000868387614213565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156146a857506146a78773ffffffffffffffffffffffffffffffffffffffff16613095565b5b1561476e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461471d6000888480600101955088613f5a565b614753576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156146ae57826000541461476957600080fd5b6147da565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561476f575b8160008190555050506147f06000868387614219565b5050505050565b8280546148039061546a565b90600052602060002090601f016020900481019282614825576000855561486c565b82601f1061483e57803560ff191683800117855561486c565b8280016001018555821561486c579182015b8281111561486b578235825591602001919060010190614850565b5b50905061487991906148c0565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156148d95760008160009055506001016148c1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614926816148f1565b811461493157600080fd5b50565b6000813590506149438161491d565b92915050565b60006020828403121561495f5761495e6148e7565b5b600061496d84828501614934565b91505092915050565b60008115159050919050565b61498b81614976565b82525050565b60006020820190506149a66000830184614982565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149e65780820151818401526020810190506149cb565b838111156149f5576000848401525b50505050565b6000601f19601f8301169050919050565b6000614a17826149ac565b614a2181856149b7565b9350614a318185602086016149c8565b614a3a816149fb565b840191505092915050565b60006020820190508181036000830152614a5f8184614a0c565b905092915050565b6000819050919050565b614a7a81614a67565b8114614a8557600080fd5b50565b600081359050614a9781614a71565b92915050565b600060208284031215614ab357614ab26148e7565b5b6000614ac184828501614a88565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614af582614aca565b9050919050565b614b0581614aea565b82525050565b6000602082019050614b206000830184614afc565b92915050565b614b2f81614aea565b8114614b3a57600080fd5b50565b600081359050614b4c81614b26565b92915050565b60008060408385031215614b6957614b686148e7565b5b6000614b7785828601614b3d565b9250506020614b8885828601614a88565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112614bb757614bb6614b92565b5b8235905067ffffffffffffffff811115614bd457614bd3614b97565b5b602083019150836020820283011115614bf057614bef614b9c565b5b9250929050565b614c0081614976565b8114614c0b57600080fd5b50565b600081359050614c1d81614bf7565b92915050565b600080600080600060808688031215614c3f57614c3e6148e7565b5b6000614c4d88828901614b3d565b9550506020614c5e88828901614a88565b945050604086013567ffffffffffffffff811115614c7f57614c7e6148ec565b5b614c8b88828901614ba1565b93509350506060614c9e88828901614c0e565b9150509295509295909350565b614cb481614a67565b82525050565b6000602082019050614ccf6000830184614cab565b92915050565b6000819050919050565b6000614cfa614cf5614cf084614aca565b614cd5565b614aca565b9050919050565b6000614d0c82614cdf565b9050919050565b6000614d1e82614d01565b9050919050565b614d2e81614d13565b82525050565b6000602082019050614d496000830184614d25565b92915050565b6000819050919050565b614d6281614d4f565b82525050565b6000602082019050614d7d6000830184614d59565b92915050565b60008083601f840112614d9957614d98614b92565b5b8235905067ffffffffffffffff811115614db657614db5614b97565b5b602083019150836020820283011115614dd257614dd1614b9c565b5b9250929050565b6000806000806000806000806000806101008b8d031215614dfd57614dfc6148e7565b5b6000614e0b8d828e01614a88565b9a50506020614e1c8d828e01614a88565b99505060408b013567ffffffffffffffff811115614e3d57614e3c6148ec565b5b614e498d828e01614d83565b98509850506060614e5c8d828e01614a88565b9650506080614e6d8d828e01614a88565b95505060a08b013567ffffffffffffffff811115614e8e57614e8d6148ec565b5b614e9a8d828e01614ba1565b945094505060c0614ead8d828e01614c0e565b92505060e0614ebe8d828e01614c0e565b9150509295989b9194979a5092959850565b600080600060608486031215614ee957614ee86148e7565b5b6000614ef786828701614b3d565b9350506020614f0886828701614b3d565b9250506040614f1986828701614a88565b9150509250925092565b600060208284031215614f3957614f386148e7565b5b6000614f4784828501614b3d565b91505092915050565b614f5981614d4f565b8114614f6457600080fd5b50565b600081359050614f7681614f50565b92915050565b600060208284031215614f9257614f916148e7565b5b6000614fa084828501614f67565b91505092915050565b60008083601f840112614fbf57614fbe614b92565b5b8235905067ffffffffffffffff811115614fdc57614fdb614b97565b5b602083019150836020820283011115614ff857614ff7614b9c565b5b9250929050565b60008060008060408587031215615019576150186148e7565b5b600085013567ffffffffffffffff811115615037576150366148ec565b5b61504387828801614d83565b9450945050602085013567ffffffffffffffff811115615066576150656148ec565b5b61507287828801614fa9565b925092505092959194509250565b600061508b82614d01565b9050919050565b61509b81615080565b82525050565b60006020820190506150b66000830184615092565b92915050565b600080604083850312156150d3576150d26148e7565b5b60006150e185828601614a88565b92505060206150f285828601614b3d565b9150509250929050565b60008083601f84011261511257615111614b92565b5b8235905067ffffffffffffffff81111561512f5761512e614b97565b5b60208301915083600182028301111561514b5761514a614b9c565b5b9250929050565b60008060208385031215615169576151686148e7565b5b600083013567ffffffffffffffff811115615187576151866148ec565b5b615193858286016150fc565b92509250509250929050565b6000602082840312156151b5576151b46148e7565b5b60006151c384828501614c0e565b91505092915050565b600080604083850312156151e3576151e26148e7565b5b60006151f185828601614b3d565b925050602061520285828601614c0e565b9150509250929050565b600061521782614d01565b9050919050565b6152278161520c565b82525050565b6000602082019050615242600083018461521e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615285826149fb565b810181811067ffffffffffffffff821117156152a4576152a361524d565b5b80604052505050565b60006152b76148dd565b90506152c3828261527c565b919050565b600067ffffffffffffffff8211156152e3576152e261524d565b5b6152ec826149fb565b9050602081019050919050565b82818337600083830152505050565b600061531b615316846152c8565b6152ad565b90508281526020810184848401111561533757615336615248565b5b6153428482856152f9565b509392505050565b600082601f83011261535f5761535e614b92565b5b813561536f848260208601615308565b91505092915050565b60008060008060808587031215615392576153916148e7565b5b60006153a087828801614b3d565b94505060206153b187828801614b3d565b93505060406153c287828801614a88565b925050606085013567ffffffffffffffff8111156153e3576153e26148ec565b5b6153ef8782880161534a565b91505092959194509250565b60008060408385031215615412576154116148e7565b5b600061542085828601614b3d565b925050602061543185828601614b3d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061548257607f821691505b602082108114156154965761549561543b565b5b50919050565b60008160601b9050919050565b60006154b48261549c565b9050919050565b60006154c6826154a9565b9050919050565b6154de6154d982614aea565b6154bb565b82525050565b6000819050919050565b6154ff6154fa82614a67565b6154e4565b82525050565b600061551182856154cd565b60148201915061552182846154ee565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061556b82614a67565b915061557683614a67565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155ab576155aa615531565b5b828201905092915050565b7f4d696e74696e67206e6f7420616c6c6f7765642e000000000000000000000000600082015250565b60006155ec6014836149b7565b91506155f7826155b6565b602082019050919050565b6000602082019050818103600083015261561b816155df565b9050919050565b7f4d757374206d696e74206174206c6561737420312e0000000000000000000000600082015250565b60006156586015836149b7565b915061566382615622565b602082019050919050565b600060208201905081810360008301526156878161564b565b9050919050565b7f496e76616c69642073656c656374696f6e20666f7220416e6365737472616c2060008201527f536565646c696e67732e00000000000000000000000000000000000000000000602082015250565b60006156ea602a836149b7565b91506156f58261568e565b604082019050919050565b60006020820190508181036000830152615719816156dd565b9050919050565b600061572b82614a67565b915061573683614a67565b92508282101561574957615748615531565b5b828203905092915050565b7f596f752063616e2774206d696e7420616e7920466f726573742053706972697460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b60006157b06022836149b7565b91506157bb82615754565b604082019050919050565b600060208201905081810360008301526157df816157a3565b9050919050565b60006157f182614a67565b91506157fc83614a67565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561583557615834615531565b5b828202905092915050565b7f4e6f7420656e6f756768204554482073656e742e000000000000000000000000600082015250565b60006158766014836149b7565b915061588182615840565b602082019050919050565b600060208201905081810360008301526158a581615869565b9050919050565b7f53656e74204554482062757420627579696e672077697468204150452e000000600082015250565b60006158e2601d836149b7565b91506158ed826158ac565b602082019050919050565b60006020820190508181036000830152615911816158d5565b9050919050565b600081905092915050565b50565b6000615933600083615918565b915061593e82615923565b600082019050919050565b600061595482615926565b9150819050919050565b60006060820190506159736000830186614afc565b6159806020830185614afc565b61598d6040830184614cab565b949350505050565b6000815190506159a481614bf7565b92915050565b6000602082840312156159c0576159bf6148e7565b5b60006159ce84828501615995565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615a0d6020836149b7565b9150615a18826159d7565b602082019050919050565b60006020820190508181036000830152615a3c81615a00565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112615a9e57615a9d615a72565b5b80840192508235915067ffffffffffffffff821115615ac057615abf615a77565b5b602083019250600182023603831315615adc57615adb615a7c565b5b509250929050565b6000615aef82614a67565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b2257615b21615531565b5b600182019050919050565b600081519050615b3c81614a71565b92915050565b600060208284031215615b5857615b576148e7565b5b6000615b6684828501615b2d565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615bcb6026836149b7565b9150615bd682615b6f565b604082019050919050565b60006020820190508181036000830152615bfa81615bbe565b9050919050565b6000819050919050565b6000615c26615c21615c1c84615c01565b614cd5565b614a67565b9050919050565b615c3681615c0b565b82525050565b6000604082019050615c516000830185614afc565b615c5e6020830184615c2d565b9392505050565b6000606082019050615c7a6000830186614cab565b615c876020830185614afc565b615c946040830184615c2d565b949350505050565b600081519050615cab81614b26565b92915050565b600060208284031215615cc757615cc66148e7565b5b6000615cd584828501615c9c565b91505092915050565b6000606082019050615cf36000830186614cab565b615d006020830185614afc565b615d0d6040830184614cab565b949350505050565b600082825260208201905092915050565b6000615d33600083615d15565b9150615d3e82615923565b600082019050919050565b600060a082019050615d5e6000830187614afc565b615d6b6020830186614afc565b615d786040830185615c2d565b615d856060830184614cab565b8181036080830152615d9681615d26565b905095945050505050565b600081519050919050565b6000615db782615da1565b615dc18185615d15565b9350615dd18185602086016149c8565b615dda816149fb565b840191505092915050565b6000608082019050615dfa6000830187614afc565b615e076020830186614afc565b615e146040830185614cab565b8181036060830152615e268184615dac565b905095945050505050565b600081519050615e408161491d565b92915050565b600060208284031215615e5c57615e5b6148e7565b5b6000615e6a84828501615e31565b91505092915050565b600081905092915050565b6000615e89826149ac565b615e938185615e73565b9350615ea38185602086016149c8565b80840191505092915050565b6000615ebb8285615e7e565b9150615ec78284615e7e565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615f0d82614a67565b9150615f1883614a67565b925082615f2857615f27615ed3565b5b828204905092915050565b6000615f3e82614a67565b9150615f4983614a67565b925082615f5957615f58615ed3565b5b82820690509291505056fea2646970667358221220fe5049e4f6f7f9ad2987ed94ac9ebbfb1938328ed2518047be76244d2a567e1a64736f6c634300080a0033

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

00000000000000000000000063b8bee4e46b5dfd7367c14b6c10280e08f603f50000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000442ee5043b0d8b12c1eb4d222fbb81cb232a2add000000000000000000000000ec9c519d49856fd2f8133a0741b4dbe002ce211b000000000000000000000000b798a123fe75292c3873768d01d7f5fc79e05efc000000000000000000000000680dbe06793efc7678bc9a32acad039b3059666b

-----Decoded View---------------
Arg [0] : treasury (address): 0x63B8bEE4E46b5DfD7367C14B6C10280e08f603F5
Arg [1] : ape (address): 0x4d224452801ACEd8B2F0aebE155379bb5D594381
Arg [2] : seedling (address): 0x442eE5043B0d8B12C1Eb4D222Fbb81cB232a2AdD
Arg [3] : bonsai (address): 0xeC9C519D49856Fd2f8133A0741B4dbE002cE211b
Arg [4] : roots (address): 0xB798a123fe75292c3873768D01d7f5Fc79e05EfC
Arg [5] : contractOwner (address): 0x680DbE06793efc7678bC9A32Acad039b3059666b

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000063b8bee4e46b5dfd7367c14b6c10280e08f603f5
Arg [1] : 0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381
Arg [2] : 000000000000000000000000442ee5043b0d8b12c1eb4d222fbb81cb232a2add
Arg [3] : 000000000000000000000000ec9c519d49856fd2f8133a0741b4dbe002ce211b
Arg [4] : 000000000000000000000000b798a123fe75292c3873768d01d7f5fc79e05efc
Arg [5] : 000000000000000000000000680dbe06793efc7678bc9a32acad039b3059666b


Deployed Bytecode Sourcemap

119305:9781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24583:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27696:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29199:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28762:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;123800:703;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120153:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119722:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23832:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121523:2269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30064:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119632:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119491:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119679:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119355:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120012:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119880:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;125890:154;;;;;;;;;;;;;:::i;:::-;;30305:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;128256:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119428:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128597:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119918:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119551:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27504:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;127375:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;128122:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24952:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44058:103;;;;;;;;;;;;;:::i;:::-;;127029:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119803:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120094:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;126052:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;124511:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119593:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43407:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119521:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128810:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;127925:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27865:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;127266:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;127727:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;127629:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29475:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120125:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128498:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;121368:147;;;;;;;;;;;;;:::i;:::-;;119841:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;127501:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30561:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119762:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;126463:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128373:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;128017:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119983:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;126881:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29833:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128708:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;127827:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44316:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120181:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24583:305;24685:4;24737:25;24722:40;;;:11;:40;;;;:105;;;;24794:33;24779:48;;;:11;:48;;;;24722:105;:158;;;;24844:36;24868:11;24844:23;:36::i;:::-;24722:158;24702:178;;24583:305;;;:::o;27696:100::-;27750:13;27783:5;27776:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27696:100;:::o;29199:204::-;29267:7;29292:16;29300:7;29292;:16::i;:::-;29287:64;;29317:34;;;;;;;;;;;;;;29287:64;29371:15;:24;29387:7;29371:24;;;;;;;;;;;;;;;;;;;;;29364:31;;29199:204;;;:::o;28762:371::-;28835:13;28851:24;28867:7;28851:15;:24::i;:::-;28835:40;;28896:5;28890:11;;:2;:11;;;28886:48;;;28910:24;;;;;;;;;;;;;;28886:48;28967:5;28951:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28977:37;28994:5;29001:12;:10;:12::i;:::-;28977:16;:37::i;:::-;28976:38;28951:63;28947:138;;;29038:35;;;;;;;;;;;;;;28947:138;29097:28;29106:2;29110:7;29119:5;29097:8;:28::i;:::-;28824:309;28762:371;;:::o;123800:703::-;123966:7;123986:12;124028:4;124034:6;124011:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;124001:41;;;;;;123986:56;;124053:16;124072:190;124105:5;;124072:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124126:13;124125:14;:30;;;;;124143:12;;;;;;;;;;;124125:30;:107;;124214:18;;124125:107;;;124175:19;;124125:107;124247:4;124072:18;:190::i;:::-;124053:209;;124278:11;124273:55;;124315:1;124306:10;;124273:55;124343:11;;;;;;;;;;;124338:158;;124371:19;124383:6;124371:11;:19::i;:::-;124412:6;124405:13;;;;;;124338:158;124478:6;124458:17;;:26;;;;:::i;:::-;124451:33;;;;123800:703;;;;;;;;:::o;120153:21::-;;;;;;;;;;;;;:::o;119722:33::-;;;;:::o;23832:303::-;23876:7;24101:15;:13;:15::i;:::-;24086:12;;24070:13;;:28;:46;24063:53;;23832:303;:::o;121523:2269::-;121814:11;;;;;;;;;;;121806:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;121880:1;121869:8;:12;121861:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;121969:5;121953:6;;:13;;:21;;;;:::i;:::-;121940:9;:34;121918:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;122057:15;122207:25;122221:10;122207:13;:25::i;:::-;122075:129;122106:10;122131:14;122160:5;;122180:13;122075:16;:129::i;:::-;:157;;;;:::i;:::-;122057:175;;122263:1;122253:7;:11;122245:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;122354:7;122343:8;:18;122339:69;;;122389:7;122378:18;;122339:69;122498:10;122481:14;:12;:14::i;:::-;122470:8;:25;;;;:::i;:::-;:38;122466:109;;;122549:14;:12;:14::i;:::-;122536:10;:27;;;;:::i;:::-;122525:38;;122466:109;122592:6;122587:449;;122653:13;122649:287;;;122741:12;;122730:8;:23;;;;:::i;:::-;122717:9;:36;;122687:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;122649:287;;;122890:5;;122879:8;:16;;;;:::i;:::-;122866:9;:29;;122858:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;122649:287;122587:449;;;122989:1;122976:9;:14;122968:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;122587:449;123093:60;123118:8;123128:9;123139:6;;123147:5;123093:24;:60::i;:::-;123183:31;123193:10;123205:8;123183:9;:31::i;:::-;123232:6;123227:558;;123312:17;123384:13;:112;;123490:5;;123479:8;:16;;;;:::i;:::-;123384:112;;;123437:12;;123426:8;:23;;;;:::i;:::-;123384:112;123332:9;:183;;;;:::i;:::-;123312:203;;123546:1;123534:9;:13;123530:145;;;123569:12;123587:10;:15;;123610:9;123587:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123568:56;;;123651:7;123643:16;;;;;;123549:126;123530:145;123240:446;123227:558;;;123707:9;;;;;;;;;;;:22;;;123730:10;123742:8;;;;;;;;;;;123763:9;;123752:8;:20;;;;:::i;:::-;123707:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;123227:558;121795:1997;121523:2269;;;;;;;;;;:::o;30064:170::-;30198:28;30208:4;30214:2;30218:7;30198:9;:28::i;:::-;30064:170;;;:::o;119632:40::-;;;;:::o;119491:23::-;;;;;;;;;;;;;:::o;119679:36::-;;;;:::o;119355:42::-;;;:::o;120012:50::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;119880:31::-;;;;;;;;;;;;;:::o;125890:154::-;120668:7;:5;:7::i;:::-;120654:21;;:10;:21;;;:65;;;;120710:9;;;;;;;;;;;120696:23;;:10;:23;;;120654:65;:109;;;;120754:9;;;;;;;;;;;120740:23;;:10;:23;;;120654:109;:153;;;;120798:9;;;;;;;;;;;120784:23;;:10;:23;;;120654:153;120632:186;;;;;;125943:11:::1;125957:21;125943:35;;126005:8;;;;;;;;;;;125989:31;;126028:3;125989:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125932:112;125890:154::o:0;30305:185::-;30443:39;30460:4;30466:2;30470:7;30443:39;;;;;;;;;;;;:16;:39::i;:::-;30305:185;;;:::o;128256:109::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128345:12:::1;128330;;:27;;;;;;;;;;;;;;;;;;128256:109:::0;:::o;119428:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;128597:103::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128683:8:::1;128664:9;;:28;;;;;;;;;;;;;;;;;;128597:103:::0;:::o;119918:32::-;;;;;;;;;;;;;:::o;119551:35::-;;;;:::o;27504:125::-;27568:7;27595:21;27608:7;27595:12;:21::i;:::-;:26;;;27588:33;;27504:125;;;:::o;127375:118::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127474:11:::1;127453:18;:32;;;;127375:118:::0;:::o;128122:126::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128224:16:::1;128204:17;:36;;;;128122:126:::0;:::o;24952:206::-;25016:7;25057:1;25040:19;;:5;:19;;;25036:60;;;25068:28;;;;;;;;;;;;;;25036:60;25122:12;:19;25135:5;25122:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25114:36;;25107:43;;24952:206;;;:::o;44058:103::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44123:30:::1;44150:1;44123:18;:30::i;:::-;44058:103::o:0;127029:229::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127154:9:::1;127149:102;127173:3;;:10;;127169:1;:14;127149:102;;;127232:4;;127237:1;127232:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;127205:16;:24;127222:3;;127226:1;127222:6;;;;;;;:::i;:::-;;;;;;;;127205:24;;;;;;;;;;;:34;;;;;;;:::i;:::-;;127185:3;;;;;:::i;:::-;;;;127149:102;;;;127029:229:::0;;;;:::o;119803:31::-;;;;;;;;;;;;;:::o;120094:24::-;;;;;;;;;;;;;:::o;126052:249::-;120668:7;:5;:7::i;:::-;120654:21;;:10;:21;;;:65;;;;120710:9;;;;;;;;;;;120696:23;;:10;:23;;;120654:65;:109;;;;120754:9;;;;;;;;;;;120740:23;;:10;:23;;;120654:109;:153;;;;120798:9;;;;;;;;;;;120784:23;;:10;:23;;;120654:153;120632:186;;;;;;126126:12:::1;126148:8;126126:31;;126168:5;:18;;;126209:4;126229:8;;;;;;;;;;;126252:5;:15;;;126276:4;126252:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;126168:125;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;126115:186;126052:249:::0;:::o;124511:124::-;124577:7;124604:23;124618:8;124604:13;:23::i;:::-;124597:30;;124511:124;;;:::o;119593:32::-;;;;:::o;43407:87::-;43453:7;43480:6;;;;;;;;;;;43473:13;;43407:87;:::o;119521:23::-;;;;;;;;;;;;;:::o;128810:273::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128896:1:::1;128891;:6;128887:189;;;128926:8;128914:9;;:20;;;;;;;;;;;;;;;;;;128887:189;;;128961:1;128956;:6;128952:124;;;128991:8;128979:9;;:20;;;;;;;;;;;;;;;;;;128952:124;;;129026:1;129021;:6;129017:59;;;129056:8;129044:9;;:20;;;;;;;;;;;;;;;;;;129017:59;128952:124;128887:189;128810:273:::0;;:::o;127925:84::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127995:6:::1;127987:5;:14;;;;127925:84:::0;:::o;27865:104::-;27921:13;27954:7;27947:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27865:104;:::o;127266:101::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127351:8:::1;;127340;:19;;;;;;;:::i;:::-;;127266:101:::0;;:::o;127727:92::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127806:5:::1;127791:12;;:20;;;;;;;;;;;;;;;;;;127727:92:::0;:::o;127629:90::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127706:5:::1;127692:11;;:19;;;;;;;;;;;;;;;;;;127629:90:::0;:::o;29475:287::-;29586:12;:10;:12::i;:::-;29574:24;;:8;:24;;;29570:54;;;29607:17;;;;;;;;;;;;;;29570:54;29682:8;29637:18;:32;29656:12;:10;:12::i;:::-;29637:32;;;;;;;;;;;;;;;:42;29670:8;29637:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29735:8;29706:48;;29721:12;:10;:12::i;:::-;29706:48;;;29745:8;29706:48;;;;;;:::i;:::-;;;;;;;;29475:287;;:::o;120125:21::-;;;;;;;;;;;;;:::o;128498:91::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128575:6:::1;128563:9;:18;;;;128498:91:::0;:::o;121368:147::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121428:12:::1;;;;;;;;;;;121427:13;121419:22;;;::::0;::::1;;121467:4;121452:12;;:19;;;;;;;;;;;;;;;;;;121482:25;121492:10;121504:2;121482:9;:25::i;:::-;121368:147::o:0;119841:32::-;;;;;;;;;;;;;:::o;127501:120::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127602:11:::1;127580:19;:33;;;;127501:120:::0;:::o;30561:369::-;30728:28;30738:4;30744:2;30748:7;30728:9;:28::i;:::-;30771:15;:2;:13;;;:15::i;:::-;:76;;;;;30791:56;30822:4;30828:2;30832:7;30841:5;30791:30;:56::i;:::-;30790:57;30771:76;30767:156;;;30871:40;;;;;;;;;;;;;;30767:156;30561:369;;;;:::o;119762:34::-;;;;:::o;126463:362::-;126564:13;126595:30;126628:16;:25;126645:7;126628:25;;;;;;;;;;;126595:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126702:1;126674:16;126668:30;:35;126664:154;;;126727:23;126742:7;126727:14;:23::i;:::-;126720:30;;;;;126664:154;126790:16;126783:23;;;126463:362;;;;:::o;128373:117::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128470:12:::1;;128455;:27;;;;;;;:::i;:::-;;128373:117:::0;;:::o;128017:97::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128100:6:::1;128085:12;:21;;;;128017:97:::0;:::o;119983:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;126881:97::-;126925:13;126958:12;126951:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126881:97;:::o;29833:164::-;29930:4;29954:18;:25;29973:5;29954:25;;;;;;;;;;;;;;;:35;29980:8;29954:35;;;;;;;;;;;;;;;;;;;;;;;;;29947:42;;29833:164;;;;:::o;128708:94::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;128786:8:::1;128775;;:19;;;;;;;;;;;;;;;;;;128708:94:::0;:::o;127827:90::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;127904:5:::1;127890:11;;:19;;;;;;;;;;;;;;;;;;127827:90:::0;:::o;44316:201::-;43638:12;:10;:12::i;:::-;43627:23;;:7;:5;:7::i;:::-;:23;;;43619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44425:1:::1;44405:22;;:8;:22;;;;44397:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44481:28;44500:8;44481:18;:28::i;:::-;44316:201:::0;:::o;120181:72::-;;;;;;;;;;;;;:::o;8977:326::-;9037:4;9294:1;9272:7;:19;;;:23;9265:30;;8977:326;;;:::o;20145:157::-;20230:4;20269:25;20254:40;;;:11;:40;;;;20247:47;;20145:157;;;:::o;31185:187::-;31242:4;31285:7;31266:15;:13;:15::i;:::-;:26;;:53;;;;;31306:13;;31296:7;:23;31266:53;:98;;;;;31337:11;:20;31349:7;31337:20;;;;;;;;;;;:27;;;;;;;;;;;;31336:28;31266:98;31259:105;;31185:187;;;:::o;16932:98::-;16985:7;17012:10;17005:17;;16932:98;:::o;39355:196::-;39497:2;39470:15;:24;39486:7;39470:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39535:7;39531:2;39515:28;;39524:5;39515:28;;;;;;;;;;;;39355:196;;;:::o;52865:190::-;52990:4;53043;53014:25;53027:5;53034:4;53014:12;:25::i;:::-;:33;53007:40;;52865:190;;;;;:::o;60762:103::-;60803:57;60856:2;60819:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60803:15;:57::i;:::-;60762:103;:::o;23606:92::-;23662:7;23606:92;:::o;25240:137::-;25301:7;25336:12;:19;25349:5;25336:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;25328:41;;25321:48;;25240:137;;;:::o;24228:283::-;24275:7;24477:15;:13;:15::i;:::-;24461:13;;:31;24454:38;;24228:283;:::o;124643:1239::-;124818:20;124841:29;124850:8;124860:9;124841:8;:29::i;:::-;124818:52;;124881:21;124937:1;124921:12;:17;124917:56;;;124955:7;;;;124917:56;124983:10;124996:13;;124983:26;;125028:47;125037:5;125044;;;;;;;;;;;:15;;;125060:10;125072:1;125044:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;125028:8;:47::i;:::-;125020:55;;125091:9;125086:250;125110:5;125106:1;:9;125086:250;;;125158:12;125141:13;:29;125137:75;;125191:5;;125137:75;125231:44;125253:2;125265:5;;;;;;;;;;;125273:1;125231:44;;;;;;;;:::i;:::-;;;;;;;;125290:4;;;;:::i;:::-;;;125309:15;;;;:::i;:::-;;;125117:3;;;;:::i;:::-;;;125086:250;;;;125351:9;125346:369;125370:6;;:13;;125366:1;:17;125346:369;;;125426:12;125409:13;:29;125405:75;;125459:5;;125405:75;125527:10;125498:39;;:6;;;;;;;;;;;:14;;;125513:6;;125520:1;125513:9;;;;;;;:::i;:::-;;;;;;;;125498:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;125494:88;;125558:8;;125494:88;125601:53;125623:2;125635:6;;;;;;;;;;;125644;;125651:1;125644:9;;;;;;;:::i;:::-;;;;;;;;125601:53;;;;;;;;:::i;:::-;;;;;;;;125669:4;;;;:::i;:::-;;;125688:15;;;;:::i;:::-;;;125346:369;125385:3;;;;:::i;:::-;;;125346:369;;;;125725:8;;;;;;;;;;;:25;;;125765:10;125790:12;;;;;;;;;;;125817:1;125833:13;125725:149;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124807:1075;;;124643:1239;;;;;;:::o;31380:104::-;31449:27;31459:2;31463:8;31449:27;;;;;;;;;;;;:9;:27::i;:::-;31380:104;;:::o;34298:2130::-;34413:35;34451:21;34464:7;34451:12;:21::i;:::-;34413:59;;34511:4;34489:26;;:13;:18;;;:26;;;34485:67;;34524:28;;;;;;;;;;;;;;34485:67;34565:22;34607:4;34591:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34628:36;34645:4;34651:12;:10;:12::i;:::-;34628:16;:36::i;:::-;34591:73;:126;;;;34705:12;:10;:12::i;:::-;34681:36;;:20;34693:7;34681:11;:20::i;:::-;:36;;;34591:126;34565:153;;34736:17;34731:66;;34762:35;;;;;;;;;;;;;;34731:66;34826:1;34812:16;;:2;:16;;;34808:52;;;34837:23;;;;;;;;;;;;;;34808:52;34873:43;34895:4;34901:2;34905:7;34914:1;34873:21;:43::i;:::-;34981:35;34998:1;35002:7;35011:4;34981:8;:35::i;:::-;35342:1;35312:12;:18;35325:4;35312:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35386:1;35358:12;:16;35371:2;35358:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35404:31;35438:11;:20;35450:7;35438:20;;;;;;;;;;;35404:54;;35489:2;35473:8;:13;;;:18;;;;;;;;;;;;;;;;;;35539:15;35506:8;:23;;;:49;;;;;;;;;;;;;;;;;;35807:19;35839:1;35829:7;:11;35807:33;;35855:31;35889:11;:24;35901:11;35889:24;;;;;;;;;;;35855:58;;35957:1;35932:27;;:8;:13;;;;;;;;;;;;:27;;;35928:384;;;36142:13;;36127:11;:28;36123:174;;36196:4;36180:8;:13;;;:20;;;;;;;;;;;;;;;;;;36249:13;:28;;;36223:8;:23;;;:54;;;;;;;;;;;;;;;;;;36123:174;35928:384;35287:1036;;;36359:7;36355:2;36340:27;;36349:4;36340:27;;;;;;;;;;;;36378:42;36399:4;36405:2;36409:7;36418:1;36378:20;:42::i;:::-;34402:2026;;34298:2130;;;:::o;26333:1109::-;26395:21;;:::i;:::-;26429:12;26444:7;26429:22;;26512:4;26493:15;:13;:15::i;:::-;:23;;:47;;;;;26527:13;;26520:4;:20;26493:47;26489:886;;;26561:31;26595:11;:17;26607:4;26595:17;;;;;;;;;;;26561:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26636:9;:16;;;26631:729;;26707:1;26681:28;;:9;:14;;;:28;;;26677:101;;26745:9;26738:16;;;;;;26677:101;27080:261;27087:4;27080:261;;;27120:6;;;;;;;;27165:11;:17;27177:4;27165:17;;;;;;;;;;;27153:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27239:1;27213:28;;:9;:14;;;:28;;;27209:109;;27281:9;27274:16;;;;;;27209:109;27080:261;;;26631:729;26542:833;26489:886;27403:31;;;;;;;;;;;;;;26333:1109;;;;:::o;44677:191::-;44751:16;44770:6;;;;;;;;;;;44751:25;;44796:8;44787:6;;:17;;;;;;;;;;;;;;;;;;44851:8;44820:40;;44841:8;44820:40;;;;;;;;;;;;44740:128;44677:191;:::o;40043:667::-;40206:4;40243:2;40227:36;;;40264:12;:10;:12::i;:::-;40278:4;40284:7;40293:5;40227:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40223:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40478:1;40461:6;:13;:18;40457:235;;;40507:40;;;;;;;;;;;;;;40457:235;40650:6;40644:13;40635:6;40631:2;40627:15;40620:38;40223:480;40356:45;;;40346:55;;;:6;:55;;;;40339:62;;;40043:667;;;;;;:::o;28040:318::-;28113:13;28144:16;28152:7;28144;:16::i;:::-;28139:59;;28169:29;;;;;;;;;;;;;;28139:59;28211:21;28235:10;:8;:10::i;:::-;28211:34;;28288:1;28269:7;28263:21;:26;;:87;;;;;;;;;;;;;;;;;28316:7;28325:18;:7;:16;:18::i;:::-;28299:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28263:87;28256:94;;;28040:318;;;:::o;53417:675::-;53500:7;53520:20;53543:4;53520:27;;53563:9;53558:497;53582:5;:12;53578:1;:16;53558:497;;;53616:20;53639:5;53645:1;53639:8;;;;;;;;:::i;:::-;;;;;;;;53616:31;;53682:12;53666;:28;53662:382;;53809:42;53824:12;53838;53809:14;:42::i;:::-;53794:57;;53662:382;;;53986:42;54001:12;54015;53986:14;:42::i;:::-;53971:57;;53662:382;53601:454;53596:3;;;;;:::i;:::-;;;;53558:497;;;;54072:12;54065:19;;;53417:675;;;;:::o;55823:295::-;55888:21;55912:7;:14;55888:38;;55931:22;55774:42;55931:40;;56024:2;56015:7;56011:16;56107:1;56104;56089:13;56075:12;56059:14;56052:5;56041:68;55985:129;;;;55823:295;:::o;54842:106::-;54900:7;54931:1;54927;:5;:13;;54939:1;54927:13;;;54935:1;54927:13;54920:20;;54842:106;;;;:::o;31847:163::-;31970:32;31976:2;31980:8;31990:5;31997:4;31970:5;:32::i;:::-;31847:163;;;:::o;41358:159::-;;;;;:::o;42176:158::-;;;;;:::o;126354:101::-;126406:13;126439:8;126432:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126354:101;:::o;17517:723::-;17573:13;17803:1;17794:5;:10;17790:53;;;17821:10;;;;;;;;;;;;;;;;;;;;;17790:53;17853:12;17868:5;17853:20;;17884:14;17909:78;17924:1;17916:4;:9;17909:78;;17942:8;;;;;:::i;:::-;;;;17973:2;17965:10;;;;;:::i;:::-;;;17909:78;;;17997:19;18029:6;18019:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17997:39;;18047:154;18063:1;18054:5;:10;18047:154;;18091:1;18081:11;;;;;:::i;:::-;;;18158:2;18150:5;:10;;;;:::i;:::-;18137:2;:24;;;;:::i;:::-;18124:39;;18107:6;18114;18107:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18187:2;18178:11;;;;;:::i;:::-;;;18047:154;;;18225:6;18211:21;;;;;17517:723;;;;:::o;54100:224::-;54168:13;54231:1;54225:4;54218:15;54260:1;54254:4;54247:15;54301:4;54295;54285:21;54276:30;;54100:224;;;;:::o;32269:1775::-;32408:20;32431:13;;32408:36;;32473:1;32459:16;;:2;:16;;;32455:48;;;32484:19;;;;;;;;;;;;;;32455:48;32530:1;32518:8;:13;32514:44;;;32540:18;;;;;;;;;;;;;;32514:44;32571:61;32601:1;32605:2;32609:12;32623:8;32571:21;:61::i;:::-;32944:8;32909:12;:16;32922:2;32909:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33008:8;32968:12;:16;32981:2;32968:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33067:2;33034:11;:25;33046:12;33034:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33134:15;33084:11;:25;33096:12;33084:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33167:20;33190:12;33167:35;;33217:11;33246:8;33231:12;:23;33217:37;;33275:4;:23;;;;;33283:15;:2;:13;;;:15::i;:::-;33275:23;33271:641;;;33319:314;33375:12;33371:2;33350:38;;33367:1;33350:38;;;;;;;;;;;;33416:69;33455:1;33459:2;33463:14;;;;;;33479:5;33416:30;:69::i;:::-;33411:174;;33521:40;;;;;;;;;;;;;;33411:174;33628:3;33612:12;:19;;33319:314;;33714:12;33697:13;;:29;33693:43;;33728:8;;;33693:43;33271:641;;;33777:120;33833:14;;;;;;33829:2;33808:40;;33825:1;33808:40;;;;;;;;;;;;33892:3;33876:12;:19;;33777:120;;33271:641;33942:12;33926:13;:28;;;;32884:1082;;33976:60;34005:1;34009:2;34013:12;34027:8;33976:20;:60::i;:::-;32397:1647;32269:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5324:568;5397:8;5407:6;5457:3;5450:4;5442:6;5438:17;5434:27;5424:122;;5465:79;;:::i;:::-;5424:122;5578:6;5565:20;5555:30;;5608:18;5600:6;5597:30;5594:117;;;5630:79;;:::i;:::-;5594:117;5744:4;5736:6;5732:17;5720:29;;5798:3;5790:4;5782:6;5778:17;5768:8;5764:32;5761:41;5758:128;;;5805:79;;:::i;:::-;5758:128;5324:568;;;;;:::o;5898:116::-;5968:21;5983:5;5968:21;:::i;:::-;5961:5;5958:32;5948:60;;6004:1;6001;5994:12;5948:60;5898:116;:::o;6020:133::-;6063:5;6101:6;6088:20;6079:29;;6117:30;6141:5;6117:30;:::i;:::-;6020:133;;;;:::o;6159:989::-;6269:6;6277;6285;6293;6301;6350:3;6338:9;6329:7;6325:23;6321:33;6318:120;;;6357:79;;:::i;:::-;6318:120;6477:1;6502:53;6547:7;6538:6;6527:9;6523:22;6502:53;:::i;:::-;6492:63;;6448:117;6604:2;6630:53;6675:7;6666:6;6655:9;6651:22;6630:53;:::i;:::-;6620:63;;6575:118;6760:2;6749:9;6745:18;6732:32;6791:18;6783:6;6780:30;6777:117;;;6813:79;;:::i;:::-;6777:117;6926:80;6998:7;6989:6;6978:9;6974:22;6926:80;:::i;:::-;6908:98;;;;6703:313;7055:2;7081:50;7123:7;7114:6;7103:9;7099:22;7081:50;:::i;:::-;7071:60;;7026:115;6159:989;;;;;;;;:::o;7154:118::-;7241:24;7259:5;7241:24;:::i;:::-;7236:3;7229:37;7154:118;;:::o;7278:222::-;7371:4;7409:2;7398:9;7394:18;7386:26;;7422:71;7490:1;7479:9;7475:17;7466:6;7422:71;:::i;:::-;7278:222;;;;:::o;7506:60::-;7534:3;7555:5;7548:12;;7506:60;;;:::o;7572:142::-;7622:9;7655:53;7673:34;7682:24;7700:5;7682:24;:::i;:::-;7673:34;:::i;:::-;7655:53;:::i;:::-;7642:66;;7572:142;;;:::o;7720:126::-;7770:9;7803:37;7834:5;7803:37;:::i;:::-;7790:50;;7720:126;;;:::o;7852:143::-;7919:9;7952:37;7983:5;7952:37;:::i;:::-;7939:50;;7852:143;;;:::o;8001:165::-;8105:54;8153:5;8105:54;:::i;:::-;8100:3;8093:67;8001:165;;:::o;8172:256::-;8282:4;8320:2;8309:9;8305:18;8297:26;;8333:88;8418:1;8407:9;8403:17;8394:6;8333:88;:::i;:::-;8172:256;;;;:::o;8434:77::-;8471:7;8500:5;8489:16;;8434:77;;;:::o;8517:118::-;8604:24;8622:5;8604:24;:::i;:::-;8599:3;8592:37;8517:118;;:::o;8641:222::-;8734:4;8772:2;8761:9;8757:18;8749:26;;8785:71;8853:1;8842:9;8838:17;8829:6;8785:71;:::i;:::-;8641:222;;;;:::o;8886:568::-;8959:8;8969:6;9019:3;9012:4;9004:6;9000:17;8996:27;8986:122;;9027:79;;:::i;:::-;8986:122;9140:6;9127:20;9117:30;;9170:18;9162:6;9159:30;9156:117;;;9192:79;;:::i;:::-;9156:117;9306:4;9298:6;9294:17;9282:29;;9360:3;9352:4;9344:6;9340:17;9330:8;9326:32;9323:41;9320:128;;;9367:79;;:::i;:::-;9320:128;8886:568;;;;;:::o;9460:1797::-;9630:6;9638;9646;9654;9662;9670;9678;9686;9694;9702;9751:3;9739:9;9730:7;9726:23;9722:33;9719:120;;;9758:79;;:::i;:::-;9719:120;9878:1;9903:53;9948:7;9939:6;9928:9;9924:22;9903:53;:::i;:::-;9893:63;;9849:117;10005:2;10031:53;10076:7;10067:6;10056:9;10052:22;10031:53;:::i;:::-;10021:63;;9976:118;10161:2;10150:9;10146:18;10133:32;10192:18;10184:6;10181:30;10178:117;;;10214:79;;:::i;:::-;10178:117;10327:80;10399:7;10390:6;10379:9;10375:22;10327:80;:::i;:::-;10309:98;;;;10104:313;10456:2;10482:53;10527:7;10518:6;10507:9;10503:22;10482:53;:::i;:::-;10472:63;;10427:118;10584:3;10611:53;10656:7;10647:6;10636:9;10632:22;10611:53;:::i;:::-;10601:63;;10555:119;10741:3;10730:9;10726:19;10713:33;10773:18;10765:6;10762:30;10759:117;;;10795:79;;:::i;:::-;10759:117;10908:80;10980:7;10971:6;10960:9;10956:22;10908:80;:::i;:::-;10890:98;;;;10684:314;11037:3;11064:50;11106:7;11097:6;11086:9;11082:22;11064:50;:::i;:::-;11054:60;;11008:116;11163:3;11190:50;11232:7;11223:6;11212:9;11208:22;11190:50;:::i;:::-;11180:60;;11134:116;9460:1797;;;;;;;;;;;;;:::o;11263:619::-;11340:6;11348;11356;11405:2;11393:9;11384:7;11380:23;11376:32;11373:119;;;11411:79;;:::i;:::-;11373:119;11531:1;11556:53;11601:7;11592:6;11581:9;11577:22;11556:53;:::i;:::-;11546:63;;11502:117;11658:2;11684:53;11729:7;11720:6;11709:9;11705:22;11684:53;:::i;:::-;11674:63;;11629:118;11786:2;11812:53;11857:7;11848:6;11837:9;11833:22;11812:53;:::i;:::-;11802:63;;11757:118;11263:619;;;;;:::o;11888:329::-;11947:6;11996:2;11984:9;11975:7;11971:23;11967:32;11964:119;;;12002:79;;:::i;:::-;11964:119;12122:1;12147:53;12192:7;12183:6;12172:9;12168:22;12147:53;:::i;:::-;12137:63;;12093:117;11888:329;;;;:::o;12223:122::-;12296:24;12314:5;12296:24;:::i;:::-;12289:5;12286:35;12276:63;;12335:1;12332;12325:12;12276:63;12223:122;:::o;12351:139::-;12397:5;12435:6;12422:20;12413:29;;12451:33;12478:5;12451:33;:::i;:::-;12351:139;;;;:::o;12496:329::-;12555:6;12604:2;12592:9;12583:7;12579:23;12575:32;12572:119;;;12610:79;;:::i;:::-;12572:119;12730:1;12755:53;12800:7;12791:6;12780:9;12776:22;12755:53;:::i;:::-;12745:63;;12701:117;12496:329;;;;:::o;12847:580::-;12932:8;12942:6;12992:3;12985:4;12977:6;12973:17;12969:27;12959:122;;13000:79;;:::i;:::-;12959:122;13113:6;13100:20;13090:30;;13143:18;13135:6;13132:30;13129:117;;;13165:79;;:::i;:::-;13129:117;13279:4;13271:6;13267:17;13255:29;;13333:3;13325:4;13317:6;13313:17;13303:8;13299:32;13296:41;13293:128;;;13340:79;;:::i;:::-;13293:128;12847:580;;;;;:::o;13433:958::-;13567:6;13575;13583;13591;13640:2;13628:9;13619:7;13615:23;13611:32;13608:119;;;13646:79;;:::i;:::-;13608:119;13794:1;13783:9;13779:17;13766:31;13824:18;13816:6;13813:30;13810:117;;;13846:79;;:::i;:::-;13810:117;13959:80;14031:7;14022:6;14011:9;14007:22;13959:80;:::i;:::-;13941:98;;;;13737:312;14116:2;14105:9;14101:18;14088:32;14147:18;14139:6;14136:30;14133:117;;;14169:79;;:::i;:::-;14133:117;14282:92;14366:7;14357:6;14346:9;14342:22;14282:92;:::i;:::-;14264:110;;;;14059:325;13433:958;;;;;;;:::o;14397:141::-;14462:9;14495:37;14526:5;14495:37;:::i;:::-;14482:50;;14397:141;;;:::o;14544:161::-;14646:52;14692:5;14646:52;:::i;:::-;14641:3;14634:65;14544:161;;:::o;14711:252::-;14819:4;14857:2;14846:9;14842:18;14834:26;;14870:86;14953:1;14942:9;14938:17;14929:6;14870:86;:::i;:::-;14711:252;;;;:::o;14969:474::-;15037:6;15045;15094:2;15082:9;15073:7;15069:23;15065:32;15062:119;;;15100:79;;:::i;:::-;15062:119;15220:1;15245:53;15290:7;15281:6;15270:9;15266:22;15245:53;:::i;:::-;15235:63;;15191:117;15347:2;15373:53;15418:7;15409:6;15398:9;15394:22;15373:53;:::i;:::-;15363:63;;15318:118;14969:474;;;;;:::o;15463:553::-;15521:8;15531:6;15581:3;15574:4;15566:6;15562:17;15558:27;15548:122;;15589:79;;:::i;:::-;15548:122;15702:6;15689:20;15679:30;;15732:18;15724:6;15721:30;15718:117;;;15754:79;;:::i;:::-;15718:117;15868:4;15860:6;15856:17;15844:29;;15922:3;15914:4;15906:6;15902:17;15892:8;15888:32;15885:41;15882:128;;;15929:79;;:::i;:::-;15882:128;15463:553;;;;;:::o;16022:529::-;16093:6;16101;16150:2;16138:9;16129:7;16125:23;16121:32;16118:119;;;16156:79;;:::i;:::-;16118:119;16304:1;16293:9;16289:17;16276:31;16334:18;16326:6;16323:30;16320:117;;;16356:79;;:::i;:::-;16320:117;16469:65;16526:7;16517:6;16506:9;16502:22;16469:65;:::i;:::-;16451:83;;;;16247:297;16022:529;;;;;:::o;16557:323::-;16613:6;16662:2;16650:9;16641:7;16637:23;16633:32;16630:119;;;16668:79;;:::i;:::-;16630:119;16788:1;16813:50;16855:7;16846:6;16835:9;16831:22;16813:50;:::i;:::-;16803:60;;16759:114;16557:323;;;;:::o;16886:468::-;16951:6;16959;17008:2;16996:9;16987:7;16983:23;16979:32;16976:119;;;17014:79;;:::i;:::-;16976:119;17134:1;17159:53;17204:7;17195:6;17184:9;17180:22;17159:53;:::i;:::-;17149:63;;17105:117;17261:2;17287:50;17329:7;17320:6;17309:9;17305:22;17287:50;:::i;:::-;17277:60;;17232:115;16886:468;;;;;:::o;17360:141::-;17425:9;17458:37;17489:5;17458:37;:::i;:::-;17445:50;;17360:141;;;:::o;17507:161::-;17609:52;17655:5;17609:52;:::i;:::-;17604:3;17597:65;17507:161;;:::o;17674:252::-;17782:4;17820:2;17809:9;17805:18;17797:26;;17833:86;17916:1;17905:9;17901:17;17892:6;17833:86;:::i;:::-;17674:252;;;;:::o;17932:117::-;18041:1;18038;18031:12;18055:180;18103:77;18100:1;18093:88;18200:4;18197:1;18190:15;18224:4;18221:1;18214:15;18241:281;18324:27;18346:4;18324:27;:::i;:::-;18316:6;18312:40;18454:6;18442:10;18439:22;18418:18;18406:10;18403:34;18400:62;18397:88;;;18465:18;;:::i;:::-;18397:88;18505:10;18501:2;18494:22;18284:238;18241:281;;:::o;18528:129::-;18562:6;18589:20;;:::i;:::-;18579:30;;18618:33;18646:4;18638:6;18618:33;:::i;:::-;18528:129;;;:::o;18663:307::-;18724:4;18814:18;18806:6;18803:30;18800:56;;;18836:18;;:::i;:::-;18800:56;18874:29;18896:6;18874:29;:::i;:::-;18866:37;;18958:4;18952;18948:15;18940:23;;18663:307;;;:::o;18976:154::-;19060:6;19055:3;19050;19037:30;19122:1;19113:6;19108:3;19104:16;19097:27;18976:154;;;:::o;19136:410::-;19213:5;19238:65;19254:48;19295:6;19254:48;:::i;:::-;19238:65;:::i;:::-;19229:74;;19326:6;19319:5;19312:21;19364:4;19357:5;19353:16;19402:3;19393:6;19388:3;19384:16;19381:25;19378:112;;;19409:79;;:::i;:::-;19378:112;19499:41;19533:6;19528:3;19523;19499:41;:::i;:::-;19219:327;19136:410;;;;;:::o;19565:338::-;19620:5;19669:3;19662:4;19654:6;19650:17;19646:27;19636:122;;19677:79;;:::i;:::-;19636:122;19794:6;19781:20;19819:78;19893:3;19885:6;19878:4;19870:6;19866:17;19819:78;:::i;:::-;19810:87;;19626:277;19565:338;;;;:::o;19909:943::-;20004:6;20012;20020;20028;20077:3;20065:9;20056:7;20052:23;20048:33;20045:120;;;20084:79;;:::i;:::-;20045:120;20204:1;20229:53;20274:7;20265:6;20254:9;20250:22;20229:53;:::i;:::-;20219:63;;20175:117;20331:2;20357:53;20402:7;20393:6;20382:9;20378:22;20357:53;:::i;:::-;20347:63;;20302:118;20459:2;20485:53;20530:7;20521:6;20510:9;20506:22;20485:53;:::i;:::-;20475:63;;20430:118;20615:2;20604:9;20600:18;20587:32;20646:18;20638:6;20635:30;20632:117;;;20668:79;;:::i;:::-;20632:117;20773:62;20827:7;20818:6;20807:9;20803:22;20773:62;:::i;:::-;20763:72;;20558:287;19909:943;;;;;;;:::o;20858:474::-;20926:6;20934;20983:2;20971:9;20962:7;20958:23;20954:32;20951:119;;;20989:79;;:::i;:::-;20951:119;21109:1;21134:53;21179:7;21170:6;21159:9;21155:22;21134:53;:::i;:::-;21124:63;;21080:117;21236:2;21262:53;21307:7;21298:6;21287:9;21283:22;21262:53;:::i;:::-;21252:63;;21207:118;20858:474;;;;;:::o;21338:180::-;21386:77;21383:1;21376:88;21483:4;21480:1;21473:15;21507:4;21504:1;21497:15;21524:320;21568:6;21605:1;21599:4;21595:12;21585:22;;21652:1;21646:4;21642:12;21673:18;21663:81;;21729:4;21721:6;21717:17;21707:27;;21663:81;21791:2;21783:6;21780:14;21760:18;21757:38;21754:84;;;21810:18;;:::i;:::-;21754:84;21575:269;21524:320;;;:::o;21850:94::-;21883:8;21931:5;21927:2;21923:14;21902:35;;21850:94;;;:::o;21950:::-;21989:7;22018:20;22032:5;22018:20;:::i;:::-;22007:31;;21950:94;;;:::o;22050:100::-;22089:7;22118:26;22138:5;22118:26;:::i;:::-;22107:37;;22050:100;;;:::o;22156:157::-;22261:45;22281:24;22299:5;22281:24;:::i;:::-;22261:45;:::i;:::-;22256:3;22249:58;22156:157;;:::o;22319:79::-;22358:7;22387:5;22376:16;;22319:79;;;:::o;22404:157::-;22509:45;22529:24;22547:5;22529:24;:::i;:::-;22509:45;:::i;:::-;22504:3;22497:58;22404:157;;:::o;22567:397::-;22707:3;22722:75;22793:3;22784:6;22722:75;:::i;:::-;22822:2;22817:3;22813:12;22806:19;;22835:75;22906:3;22897:6;22835:75;:::i;:::-;22935:2;22930:3;22926:12;22919:19;;22955:3;22948:10;;22567:397;;;;;:::o;22970:180::-;23018:77;23015:1;23008:88;23115:4;23112:1;23105:15;23139:4;23136:1;23129:15;23156:305;23196:3;23215:20;23233:1;23215:20;:::i;:::-;23210:25;;23249:20;23267:1;23249:20;:::i;:::-;23244:25;;23403:1;23335:66;23331:74;23328:1;23325:81;23322:107;;;23409:18;;:::i;:::-;23322:107;23453:1;23450;23446:9;23439:16;;23156:305;;;;:::o;23467:170::-;23607:22;23603:1;23595:6;23591:14;23584:46;23467:170;:::o;23643:366::-;23785:3;23806:67;23870:2;23865:3;23806:67;:::i;:::-;23799:74;;23882:93;23971:3;23882:93;:::i;:::-;24000:2;23995:3;23991:12;23984:19;;23643:366;;;:::o;24015:419::-;24181:4;24219:2;24208:9;24204:18;24196:26;;24268:9;24262:4;24258:20;24254:1;24243:9;24239:17;24232:47;24296:131;24422:4;24296:131;:::i;:::-;24288:139;;24015:419;;;:::o;24440:171::-;24580:23;24576:1;24568:6;24564:14;24557:47;24440:171;:::o;24617:366::-;24759:3;24780:67;24844:2;24839:3;24780:67;:::i;:::-;24773:74;;24856:93;24945:3;24856:93;:::i;:::-;24974:2;24969:3;24965:12;24958:19;;24617:366;;;:::o;24989:419::-;25155:4;25193:2;25182:9;25178:18;25170:26;;25242:9;25236:4;25232:20;25228:1;25217:9;25213:17;25206:47;25270:131;25396:4;25270:131;:::i;:::-;25262:139;;24989:419;;;:::o;25414:229::-;25554:34;25550:1;25542:6;25538:14;25531:58;25623:12;25618:2;25610:6;25606:15;25599:37;25414:229;:::o;25649:366::-;25791:3;25812:67;25876:2;25871:3;25812:67;:::i;:::-;25805:74;;25888:93;25977:3;25888:93;:::i;:::-;26006:2;26001:3;25997:12;25990:19;;25649:366;;;:::o;26021:419::-;26187:4;26225:2;26214:9;26210:18;26202:26;;26274:9;26268:4;26264:20;26260:1;26249:9;26245:17;26238:47;26302:131;26428:4;26302:131;:::i;:::-;26294:139;;26021:419;;;:::o;26446:191::-;26486:4;26506:20;26524:1;26506:20;:::i;:::-;26501:25;;26540:20;26558:1;26540:20;:::i;:::-;26535:25;;26579:1;26576;26573:8;26570:34;;;26584:18;;:::i;:::-;26570:34;26629:1;26626;26622:9;26614:17;;26446:191;;;;:::o;26643:221::-;26783:34;26779:1;26771:6;26767:14;26760:58;26852:4;26847:2;26839:6;26835:15;26828:29;26643:221;:::o;26870:366::-;27012:3;27033:67;27097:2;27092:3;27033:67;:::i;:::-;27026:74;;27109:93;27198:3;27109:93;:::i;:::-;27227:2;27222:3;27218:12;27211:19;;26870:366;;;:::o;27242:419::-;27408:4;27446:2;27435:9;27431:18;27423:26;;27495:9;27489:4;27485:20;27481:1;27470:9;27466:17;27459:47;27523:131;27649:4;27523:131;:::i;:::-;27515:139;;27242:419;;;:::o;27667:348::-;27707:7;27730:20;27748:1;27730:20;:::i;:::-;27725:25;;27764:20;27782:1;27764:20;:::i;:::-;27759:25;;27952:1;27884:66;27880:74;27877:1;27874:81;27869:1;27862:9;27855:17;27851:105;27848:131;;;27959:18;;:::i;:::-;27848:131;28007:1;28004;28000:9;27989:20;;27667:348;;;;:::o;28021:170::-;28161:22;28157:1;28149:6;28145:14;28138:46;28021:170;:::o;28197:366::-;28339:3;28360:67;28424:2;28419:3;28360:67;:::i;:::-;28353:74;;28436:93;28525:3;28436:93;:::i;:::-;28554:2;28549:3;28545:12;28538:19;;28197:366;;;:::o;28569:419::-;28735:4;28773:2;28762:9;28758:18;28750:26;;28822:9;28816:4;28812:20;28808:1;28797:9;28793:17;28786:47;28850:131;28976:4;28850:131;:::i;:::-;28842:139;;28569:419;;;:::o;28994:179::-;29134:31;29130:1;29122:6;29118:14;29111:55;28994:179;:::o;29179:366::-;29321:3;29342:67;29406:2;29401:3;29342:67;:::i;:::-;29335:74;;29418:93;29507:3;29418:93;:::i;:::-;29536:2;29531:3;29527:12;29520:19;;29179:366;;;:::o;29551:419::-;29717:4;29755:2;29744:9;29740:18;29732:26;;29804:9;29798:4;29794:20;29790:1;29779:9;29775:17;29768:47;29832:131;29958:4;29832:131;:::i;:::-;29824:139;;29551:419;;;:::o;29976:147::-;30077:11;30114:3;30099:18;;29976:147;;;;:::o;30129:114::-;;:::o;30249:398::-;30408:3;30429:83;30510:1;30505:3;30429:83;:::i;:::-;30422:90;;30521:93;30610:3;30521:93;:::i;:::-;30639:1;30634:3;30630:11;30623:18;;30249:398;;;:::o;30653:379::-;30837:3;30859:147;31002:3;30859:147;:::i;:::-;30852:154;;31023:3;31016:10;;30653:379;;;:::o;31038:442::-;31187:4;31225:2;31214:9;31210:18;31202:26;;31238:71;31306:1;31295:9;31291:17;31282:6;31238:71;:::i;:::-;31319:72;31387:2;31376:9;31372:18;31363:6;31319:72;:::i;:::-;31401;31469:2;31458:9;31454:18;31445:6;31401:72;:::i;:::-;31038:442;;;;;;:::o;31486:137::-;31540:5;31571:6;31565:13;31556:22;;31587:30;31611:5;31587:30;:::i;:::-;31486:137;;;;:::o;31629:345::-;31696:6;31745:2;31733:9;31724:7;31720:23;31716:32;31713:119;;;31751:79;;:::i;:::-;31713:119;31871:1;31896:61;31949:7;31940:6;31929:9;31925:22;31896:61;:::i;:::-;31886:71;;31842:125;31629:345;;;;:::o;31980:182::-;32120:34;32116:1;32108:6;32104:14;32097:58;31980:182;:::o;32168:366::-;32310:3;32331:67;32395:2;32390:3;32331:67;:::i;:::-;32324:74;;32407:93;32496:3;32407:93;:::i;:::-;32525:2;32520:3;32516:12;32509:19;;32168:366;;;:::o;32540:419::-;32706:4;32744:2;32733:9;32729:18;32721:26;;32793:9;32787:4;32783:20;32779:1;32768:9;32764:17;32757:47;32821:131;32947:4;32821:131;:::i;:::-;32813:139;;32540:419;;;:::o;32965:180::-;33013:77;33010:1;33003:88;33110:4;33107:1;33100:15;33134:4;33131:1;33124:15;33151:117;33260:1;33257;33250:12;33274:117;33383:1;33380;33373:12;33397:117;33506:1;33503;33496:12;33520:725;33598:4;33604:6;33660:11;33647:25;33760:1;33754:4;33750:12;33739:8;33723:14;33719:29;33715:48;33695:18;33691:73;33681:168;;33768:79;;:::i;:::-;33681:168;33880:18;33870:8;33866:33;33858:41;;33932:4;33919:18;33909:28;;33960:18;33952:6;33949:30;33946:117;;;33982:79;;:::i;:::-;33946:117;34090:2;34084:4;34080:13;34072:21;;34147:4;34139:6;34135:17;34119:14;34115:38;34109:4;34105:49;34102:136;;;34157:79;;:::i;:::-;34102:136;33611:634;33520:725;;;;;:::o;34251:233::-;34290:3;34313:24;34331:5;34313:24;:::i;:::-;34304:33;;34359:66;34352:5;34349:77;34346:103;;;34429:18;;:::i;:::-;34346:103;34476:1;34469:5;34465:13;34458:20;;34251:233;;;:::o;34490:143::-;34547:5;34578:6;34572:13;34563:22;;34594:33;34621:5;34594:33;:::i;:::-;34490:143;;;;:::o;34639:351::-;34709:6;34758:2;34746:9;34737:7;34733:23;34729:32;34726:119;;;34764:79;;:::i;:::-;34726:119;34884:1;34909:64;34965:7;34956:6;34945:9;34941:22;34909:64;:::i;:::-;34899:74;;34855:128;34639:351;;;;:::o;34996:225::-;35136:34;35132:1;35124:6;35120:14;35113:58;35205:8;35200:2;35192:6;35188:15;35181:33;34996:225;:::o;35227:366::-;35369:3;35390:67;35454:2;35449:3;35390:67;:::i;:::-;35383:74;;35466:93;35555:3;35466:93;:::i;:::-;35584:2;35579:3;35575:12;35568:19;;35227:366;;;:::o;35599:419::-;35765:4;35803:2;35792:9;35788:18;35780:26;;35852:9;35846:4;35842:20;35838:1;35827:9;35823:17;35816:47;35880:131;36006:4;35880:131;:::i;:::-;35872:139;;35599:419;;;:::o;36024:85::-;36069:7;36098:5;36087:16;;36024:85;;;:::o;36115:158::-;36173:9;36206:61;36224:42;36233:32;36259:5;36233:32;:::i;:::-;36224:42;:::i;:::-;36206:61;:::i;:::-;36193:74;;36115:158;;;:::o;36279:147::-;36374:45;36413:5;36374:45;:::i;:::-;36369:3;36362:58;36279:147;;:::o;36432:348::-;36561:4;36599:2;36588:9;36584:18;36576:26;;36612:71;36680:1;36669:9;36665:17;36656:6;36612:71;:::i;:::-;36693:80;36769:2;36758:9;36754:18;36745:6;36693:80;:::i;:::-;36432:348;;;;;:::o;36786:458::-;36943:4;36981:2;36970:9;36966:18;36958:26;;36994:71;37062:1;37051:9;37047:17;37038:6;36994:71;:::i;:::-;37075:72;37143:2;37132:9;37128:18;37119:6;37075:72;:::i;:::-;37157:80;37233:2;37222:9;37218:18;37209:6;37157:80;:::i;:::-;36786:458;;;;;;:::o;37250:143::-;37307:5;37338:6;37332:13;37323:22;;37354:33;37381:5;37354:33;:::i;:::-;37250:143;;;;:::o;37399:351::-;37469:6;37518:2;37506:9;37497:7;37493:23;37489:32;37486:119;;;37524:79;;:::i;:::-;37486:119;37644:1;37669:64;37725:7;37716:6;37705:9;37701:22;37669:64;:::i;:::-;37659:74;;37615:128;37399:351;;;;:::o;37756:442::-;37905:4;37943:2;37932:9;37928:18;37920:26;;37956:71;38024:1;38013:9;38009:17;38000:6;37956:71;:::i;:::-;38037:72;38105:2;38094:9;38090:18;38081:6;38037:72;:::i;:::-;38119;38187:2;38176:9;38172:18;38163:6;38119:72;:::i;:::-;37756:442;;;;;;:::o;38204:168::-;38287:11;38321:6;38316:3;38309:19;38361:4;38356:3;38352:14;38337:29;;38204:168;;;;:::o;38378:362::-;38519:3;38540:65;38603:1;38598:3;38540:65;:::i;:::-;38533:72;;38614:93;38703:3;38614:93;:::i;:::-;38732:1;38727:3;38723:11;38716:18;;38378:362;;;:::o;38746:875::-;39031:4;39069:3;39058:9;39054:19;39046:27;;39083:71;39151:1;39140:9;39136:17;39127:6;39083:71;:::i;:::-;39164:72;39232:2;39221:9;39217:18;39208:6;39164:72;:::i;:::-;39246:80;39322:2;39311:9;39307:18;39298:6;39246:80;:::i;:::-;39336:72;39404:2;39393:9;39389:18;39380:6;39336:72;:::i;:::-;39456:9;39450:4;39446:20;39440:3;39429:9;39425:19;39418:49;39484:130;39609:4;39484:130;:::i;:::-;39476:138;;38746:875;;;;;;;:::o;39627:98::-;39678:6;39712:5;39706:12;39696:22;;39627:98;;;:::o;39731:360::-;39817:3;39845:38;39877:5;39845:38;:::i;:::-;39899:70;39962:6;39957:3;39899:70;:::i;:::-;39892:77;;39978:52;40023:6;40018:3;40011:4;40004:5;40000:16;39978:52;:::i;:::-;40055:29;40077:6;40055:29;:::i;:::-;40050:3;40046:39;40039:46;;39821:270;39731:360;;;;:::o;40097:640::-;40292:4;40330:3;40319:9;40315:19;40307:27;;40344:71;40412:1;40401:9;40397:17;40388:6;40344:71;:::i;:::-;40425:72;40493:2;40482:9;40478:18;40469:6;40425:72;:::i;:::-;40507;40575:2;40564:9;40560:18;40551:6;40507:72;:::i;:::-;40626:9;40620:4;40616:20;40611:2;40600:9;40596:18;40589:48;40654:76;40725:4;40716:6;40654:76;:::i;:::-;40646:84;;40097:640;;;;;;;:::o;40743:141::-;40799:5;40830:6;40824:13;40815:22;;40846:32;40872:5;40846:32;:::i;:::-;40743:141;;;;:::o;40890:349::-;40959:6;41008:2;40996:9;40987:7;40983:23;40979:32;40976:119;;;41014:79;;:::i;:::-;40976:119;41134:1;41159:63;41214:7;41205:6;41194:9;41190:22;41159:63;:::i;:::-;41149:73;;41105:127;40890:349;;;;:::o;41245:148::-;41347:11;41384:3;41369:18;;41245:148;;;;:::o;41399:377::-;41505:3;41533:39;41566:5;41533:39;:::i;:::-;41588:89;41670:6;41665:3;41588:89;:::i;:::-;41581:96;;41686:52;41731:6;41726:3;41719:4;41712:5;41708:16;41686:52;:::i;:::-;41763:6;41758:3;41754:16;41747:23;;41509:267;41399:377;;;;:::o;41782:435::-;41962:3;41984:95;42075:3;42066:6;41984:95;:::i;:::-;41977:102;;42096:95;42187:3;42178:6;42096:95;:::i;:::-;42089:102;;42208:3;42201:10;;41782:435;;;;;:::o;42223:180::-;42271:77;42268:1;42261:88;42368:4;42365:1;42358:15;42392:4;42389:1;42382:15;42409:185;42449:1;42466:20;42484:1;42466:20;:::i;:::-;42461:25;;42500:20;42518:1;42500:20;:::i;:::-;42495:25;;42539:1;42529:35;;42544:18;;:::i;:::-;42529:35;42586:1;42583;42579:9;42574:14;;42409:185;;;;:::o;42600:176::-;42632:1;42649:20;42667:1;42649:20;:::i;:::-;42644:25;;42683:20;42701:1;42683:20;:::i;:::-;42678:25;;42722:1;42712:35;;42727:18;;:::i;:::-;42712:35;42768:1;42765;42761:9;42756:14;;42600:176;;;;:::o

Swarm Source

ipfs://fe5049e4f6f7f9ad2987ed94ac9ebbfb1938328ed2518047be76244d2a567e1a
Loading...
Loading
Loading...
Loading
[ 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.