Token DarkPlanet_CrossChain

 

Overview ERC-721

Total Supply:
1 DP

Holders:
2 addresses
Balance
0 DP
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DarkPlanet_CrossChain

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

/**
 * @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);
}



/**
 * @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;
}




/**
 * @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);
    }
}




/*
 * @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;
    }
}



/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


/**
 * @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);
}



/**
 * @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);
}


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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



/**
 * @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;
    }
}


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}


interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}


interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}


/**
 * @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;
    string internal _planetsBaseURI;

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

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

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

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

    function setBaseURI(string memory pBaseURI)public virtual onlyOwner {
        _planetsBaseURI = pBaseURI;    
    }

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

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


abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), 
            "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");

        // handle incoming message
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}


contract DarkPlanet_CrossChain is ERC721Enumerable, ReentrancyGuard, Ownable, NonblockingReceiver {

    uint256 constant public maxPlanets = 1000;
    uint256 private _totalPlanets;
    //id -> bType 11 (Rarity extend)
    mapping(uint256 => uint256) public bTypes;
    //id -> sType 5 (Rarity extend)
    mapping(uint256 => uint256) public sTypes;
    //id -> rarity (Rarity extend)
    mapping(uint256 => uint256) public pRarity;


    uint256 public startID;
    uint256 public endID;

    uint gasForDestinationLzReceive = 350000;


    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

        //Input random data
    function randomGuard(uint256 _random) public pure returns(uint256){
        return ((_random + 6) * (_random + 6) * _random + 10000);
    }

    constructor(address _layerZeroEndpoint) ERC721("DarkPlanet_CrossChain", "DP") { 
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {

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

    //tokenID: startID - endID
    function claim(uint256 tokenID) public payable {
        require(getClaimFee() <= msg.value,"Error: fee ");
        require(_totalPlanets < maxPlanets, "Error: max planets");
        require(tokenID >= startID && tokenID < endID,"Error,tokenID invalid");
        _claim(tokenID,msg.sender);
    }


    function _claim(uint256 tokenID,address rec)internal {
        _safeMint(rec, tokenID);
        uint256 randomNum = random(toString(block.timestamp));
        uint256 btypetemp = randomNum % 11;
        bTypes[_totalPlanets] = btypetemp;
        uint256 s_randomNum = random(toString(randomNum));
        uint256 stypetemp = s_randomNum % 5;
        sTypes[_totalPlanets] = stypetemp;
        rarity(randomNum%10000);
        _totalPlanets++;
    }

    /*
        111
        88
        66
        33
        11
        0
    */
    function rarity(uint256 rare) internal {
        uint256 rnum = rare%1000;
        if((rnum%111) == 0){
            pRarity[_totalPlanets] = 6;
        }else if((rnum%88) == 0){
            pRarity[_totalPlanets] = 5;
        }else if((rnum%66) == 0){
            pRarity[_totalPlanets] = 4;
        }else if((rnum%33) == 0){
            pRarity[_totalPlanets] = 3;
        }else if((rnum%11) == 0){
            pRarity[_totalPlanets] = 2;
        }else{
            pRarity[_totalPlanets] = 1;
        }
    }

    function getClaimFee()public view returns(uint256){
        return ((120 + (totalSupply()/100) * 10) * 1e18);
    }

    function totalSupply() public override view returns (uint256 supply){
        return _totalPlanets;
    }
    
    function tokenURI(uint256 pID) public override view returns (string memory) {
        string memory show = string(abi.encodePacked(_planetsBaseURI,toString(randomGuard(pID+1)),".png"));
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "planet #', toString(pID), '", "description": "DarkPlanet is a strategy game with the main line of universe exploration. Inhabitants on the same planet can form a team. Planet inhabitants can bring benefits to the planet lords. the total number of planets is 1,000. ", "image":"',show, '"}'))));
        string memory output = string(abi.encodePacked('data:application/json;base64,', json));
        return output;
    }
    
    function withdraw(address rec)public onlyOwner{
        payable(rec).transfer(address(this).balance);
    }

    function setClaimTokenID(uint256 sID,uint256 eID)public onlyOwner{
        startID = sID;
        endID = eID;
    }


    // This function transfers the nft from your address on the 
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "You must own the token to traverse");
        require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel");

        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);
        _totalPlanets = _totalPlanets - 1;

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive);

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);
        
        require(msg.value >= messageFee, "GG: msg.value not enough to cover messageFee. Send gas for message fees");

        endpoint.send{value: msg.value}(
            _chainId,                           // destination chainId
            trustedRemoteLookup[_chainId],      // destination address of nft contract
            payload,                            // abi.encoded()'ed bytes
            payable(msg.sender),                // refund address
            address(0x0),                       // 'zroPaymentAddress' unused for this
            adapterParams                       // txParameters 
        );
    }  


    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }

    // ------------------
    // Internal Functions
    // ------------------
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) override internal {
        // decode
        (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint));
        // mint the tokens back into existence on destination chain
        _claim(tokenId,toAddr);
    }  
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bTypes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimFee","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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPlanets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_random","type":"uint256"}],"name":"randomGuard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sTypes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sID","type":"uint256"},{"internalType":"uint256","name":"eID","type":"uint256"}],"name":"setClaimTokenID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rec","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052620557306016553480156200001857600080fd5b5060405162003739380380620037398339810160408190526200003b91620001e1565b604080518082018252601581527f4461726b506c616e65745f43726f7373436861696e0000000000000000000000602080830191825283518085019094526002845261044560f41b9084015281519192916200009a916000916200013b565b508051620000b09060019060208401906200013b565b50506001600a5550620000c333620000e9565b600d80546001600160a01b0319166001600160a01b039290921691909117905562000250565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001499062000213565b90600052602060002090601f0160209004810192826200016d5760008555620001b8565b82601f106200018857805160ff1916838001178555620001b8565b82800160010185558215620001b8579182015b82811115620001b85782518255916020019190600101906200019b565b50620001c6929150620001ca565b5090565b5b80821115620001c65760008155600101620001cb565b600060208284031215620001f457600080fd5b81516001600160a01b03811681146200020c57600080fd5b9392505050565b600181811c908216806200022857607f821691505b602082108114156200024a57634e487b7160e01b600052602260045260246000fd5b50919050565b6134d980620002606000396000f3fe6080604052600436106102245760003560e01c8063689d9da711610123578063b88d4fde116100ab578063e5354c5b1161006f578063e5354c5b1461068b578063e985e9c5146106b8578063ea52e55b14610701578063eb8d72b714610717578063f2fde38b1461073757600080fd5b8063b88d4fde1461060f578063c87b56dd1461062f578063cf89fa031461064f578063d1deba1f14610662578063d24263a31461067557600080fd5b80638da5cb5b116100f25780638da5cb5b146105315780638ee749121461054f578063943fb872146105ba57806395d89b41146105da578063a22cb465146105ef57600080fd5b8063689d9da7146104b157806370a08231146104d15780637533d788146104f15780638419f19f1461051157600080fd5b80632f745c59116101b15780634f6ccce7116101755780634f6ccce71461040457806351cff8d91461042457806351f563451461044457806355f804b3146104715780636352211e1461049157600080fd5b80632f745c5914610386578063379607f5146103a657806342842e0e146103b95780634d3783a4146103d95780634f361c9a146103ef57600080fd5b8063095ea7b3116101f8578063095ea7b3146102da57806318160ddd146102fa5780631c37a8221461031957806323b872dd146103395780632e1689b91461035957600080fd5b80621d35671461022957806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2575b600080fd5b34801561023557600080fd5b50610249610244366004612bff565b610757565b005b34801561025757600080fd5b5061026b610266366004612a2f565b610951565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b5061029561097c565b6040516102779190613014565b3480156102ae57600080fd5b506102c26102bd366004612c93565b610a0e565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102496102f5366004612a03565b610aa3565b34801561030657600080fd5b506010545b604051908152602001610277565b34801561032557600080fd5b50610249610334366004612bff565b610bb9565b34801561034557600080fd5b50610249610354366004612924565b610c28565b34801561036557600080fd5b5061030b610374366004612c93565b60126020526000908152604090205481565b34801561039257600080fd5b5061030b6103a1366004612a03565b610c59565b6102496103b4366004612c93565b610cef565b3480156103c557600080fd5b506102496103d4366004612924565b610de0565b3480156103e557600080fd5b5061030b6103e881565b3480156103fb57600080fd5b5061030b610dfb565b34801561041057600080fd5b5061030b61041f366004612c93565b610e3f565b34801561043057600080fd5b5061024961043f3660046128a0565b610ed2565b34801561045057600080fd5b5061030b61045f366004612c93565b60136020526000908152604090205481565b34801561047d57600080fd5b5061024961048c366004612a69565b610f35565b34801561049d57600080fd5b506102c26104ac366004612c93565b610f72565b3480156104bd57600080fd5b5061030b6104cc366004612c93565b610fe9565b3480156104dd57600080fd5b5061030b6104ec3660046128a0565b611022565b3480156104fd57600080fd5b5061029561050c366004612ab1565b6110a9565b34801561051d57600080fd5b5061024961052c366004612cac565b611143565b34801561053d57600080fd5b50600b546001600160a01b03166102c2565b34801561055b57600080fd5b506105a561056a366004612b1e565b600e60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b60408051928352602083019190915201610277565b3480156105c657600080fd5b506102496105d5366004612c93565b611178565b3480156105e657600080fd5b506102956111a7565b3480156105fb57600080fd5b5061024961060a3660046129d0565b6111b6565b34801561061b57600080fd5b5061024961062a366004612965565b61127b565b34801561063b57600080fd5b5061029561064a366004612c93565b6112ad565b61024961065d366004612c77565b61134d565b610249610670366004612b74565b611640565b34801561068157600080fd5b5061030b60155481565b34801561069757600080fd5b5061030b6106a6366004612c93565b60116020526000908152604090205481565b3480156106c457600080fd5b5061026b6106d33660046128eb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561070d57600080fd5b5061030b60145481565b34801561072357600080fd5b50610249610732366004612acc565b6117cd565b34801561074357600080fd5b506102496107523660046128a0565b611815565b600d546001600160a01b0316331461076e57600080fd5b61ffff84166000908152600f60205260409020805461078c90613360565b905083511480156107cb575061ffff84166000908152600f60205260409081902090516107b99190612db9565b60405180910390208380519060200120145b6108395760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906108629087908790879087906004016131b4565b600060405180830381600087803b15801561087c57600080fd5b505af192505050801561088d575060015b61094b576040518060400160405280825181526020018280519060200120815250600e60008661ffff1661ffff168152602001908152602001600020846040516108d79190612d9d565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906109429086908690869086906131b4565b60405180910390a15b50505050565b60006001600160e01b0319821663780e9d6360e01b14806109765750610976826118ad565b92915050565b60606000805461098b90613360565b80601f01602080910402602001604051908101604052809291908181526020018280546109b790613360565b8015610a045780601f106109d957610100808354040283529160200191610a04565b820191906000526020600020905b8154815290600101906020018083116109e757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610830565b506000908152600460205260409020546001600160a01b031690565b6000610aae82610f72565b9050806001600160a01b0316836001600160a01b03161415610b1c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610830565b336001600160a01b0382161480610b385750610b3881336106d3565b610baa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610830565b610bb483836118fd565b505050565b333014610c1c5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610830565b61094b8484848461196b565b610c323382611998565b610c4e5760405162461bcd60e51b8152600401610830906130ae565b610bb4838383611a8f565b6000610c6483611022565b8210610cc65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610830565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b34610cf8610dfb565b1115610d345760405162461bcd60e51b815260206004820152600b60248201526a022b93937b91d103332b2960ad1b6044820152606401610830565b6103e860105410610d7c5760405162461bcd60e51b81526020600482015260126024820152714572726f723a206d617820706c616e65747360701b6044820152606401610830565b6014548110158015610d8f575060155481105b610dd35760405162461bcd60e51b8152602060048201526015602482015274115c9c9bdc8b1d1bdad95b9251081a5b9d985b1a59605a1b6044820152606401610830565b610ddd8133611c3a565b50565b610bb48383836040518060200160405280600081525061127b565b60006064610e0860105490565b610e1291906132ea565b610e1d90600a6132fe565b610e289060786132d2565b610e3a90670de0b6b3a76400006132fe565b905090565b6000610e4a60085490565b8210610ead5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610830565b60088281548110610ec057610ec061340c565b90600052602060002001549050919050565b600b546001600160a01b03163314610efc5760405162461bcd60e51b815260040161083090613079565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610f31573d6000803e3d6000fd5b5050565b600b546001600160a01b03163314610f5f5760405162461bcd60e51b815260040161083090613079565b8051610f3190600c906020840190612681565b6000818152600260205260408120546001600160a01b0316806109765760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610830565b600081610ff78160066132d2565b6110028460066132d2565b61100c91906132fe565b61101691906132fe565b610976906127106132d2565b60006001600160a01b03821661108d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610830565b506001600160a01b031660009081526003602052604090205490565b600f60205260009081526040902080546110c290613360565b80601f01602080910402602001604051908101604052809291908181526020018280546110ee90613360565b801561113b5780601f106111105761010080835404028352916020019161113b565b820191906000526020600020905b81548152906001019060200180831161111e57829003601f168201915b505050505081565b600b546001600160a01b0316331461116d5760405162461bcd60e51b815260040161083090613079565b601491909155601555565b600b546001600160a01b031633146111a25760405162461bcd60e51b815260040161083090613079565b601655565b60606001805461098b90613360565b6001600160a01b03821633141561120f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610830565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112853383611998565b6112a15760405162461bcd60e51b8152600401610830906130ae565b61094b84848484611cdf565b60606000600c6112c96112c46104cc8660016132d2565b611d12565b6040516020016112da929190612dc5565b6040516020818303038152906040529050600061131f6112f985611d12565b8360405160200161130b929190612df9565b604051602081830303815290604052611e0f565b90506000816040516020016113349190612f92565b60408051601f1981840301815291905295945050505050565b61135681610f72565b6001600160a01b0316336001600160a01b0316146113c15760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610830565b61ffff82166000908152600f6020526040812080546113df90613360565b9050116114455760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610830565b61144e81611f76565b600160105461145d919061331d565b60105560408051336020820152808201839052815180820383018152606082018352601654600160f01b60808401526082808401919091528351808403909101815260a2830193849052600d5463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb10906114e3908990309089908790899060a6016130ff565b604080518083038186803b1580156114fa57600080fd5b505afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190612cce565b509050803410156115bb5760405162461bcd60e51b815260206004820152604760248201527f47473a206d73672e76616c7565206e6f7420656e6f75676820746f20636f766560448201527f72206d6573736167654665652e2053656e642067617320666f72206d657373616064820152666765206665657360c81b608482015260a401610830565b600d5461ffff87166000908152600f6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611606928c928b913391908b906004016131f2565b6000604051808303818588803b15801561161f57600080fd5b505af1158015611633573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600e60205260408082209051611661908790612d9d565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506116e85760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610830565b805482148015611712575080600101548383604051611708929190612d8d565b6040518091039020145b61175e5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610830565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906117939089908990899089908990600401613153565b600060405180830381600087803b1580156117ad57600080fd5b505af11580156117c1573d6000803e3d6000fd5b50505050505050505050565b600b546001600160a01b031633146117f75760405162461bcd60e51b815260040161083090613079565b61ffff83166000908152600f6020526040902061094b908383612705565b600b546001600160a01b0316331461183f5760405162461bcd60e51b815260040161083090613079565b6001600160a01b0381166118a45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610830565b610ddd8161201d565b60006001600160e01b031982166380ac58cd60e01b14806118de57506001600160e01b03198216635b5e139f60e01b145b8061097657506301ffc9a760e01b6001600160e01b0319831614610976565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061193282610f72565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061198291906128bd565b915091506119908183611c3a565b505050505050565b6000818152600260205260408120546001600160a01b0316611a115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610830565b6000611a1c83610f72565b9050806001600160a01b0316846001600160a01b03161480611a575750836001600160a01b0316611a4c84610a0e565b6001600160a01b0316145b80611a8757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611aa282610f72565b6001600160a01b031614611b0a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610830565b6001600160a01b038216611b6c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610830565b611b7783838361206f565b611b826000826118fd565b6001600160a01b0383166000908152600360205260408120805460019290611bab90849061331d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bd99084906132d2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611c448183612127565b6000611c57611c5242611d12565b612141565b90506000611c66600b836133b6565b6010546000908152601160205260408120829055909150611c89611c5284611d12565b90506000611c986005836133b6565b60105460009081526012602052604090208190559050611cc2611cbd612710866133b6565b612172565b60108054906000611cd28361339b565b9190505550505050505050565b611cea848484611a8f565b611cf684848484612263565b61094b5760405162461bcd60e51b815260040161083090613027565b606081611d365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d605780611d4a8161339b565b9150611d599050600a836132ea565b9150611d3a565b6000816001600160401b03811115611d7a57611d7a613422565b6040519080825280601f01601f191660200182016040528015611da4576020820181803683370190505b5090505b8415611a8757611db960018361331d565b9150611dc6600a866133b6565b611dd19060306132d2565b60f81b818381518110611de657611de661340c565b60200101906001600160f81b031916908160001a905350611e08600a866132ea565b9450611da8565b6060815160001415611e2f57505060408051602081019091526000815290565b60006040518060600160405280604081526020016134646040913990506000600384516002611e5e91906132d2565b611e6891906132ea565b611e739060046132fe565b90506000611e828260206132d2565b6001600160401b03811115611e9957611e99613422565b6040519080825280601f01601f191660200182016040528015611ec3576020820181803683370190505b509050818152600183018586518101602084015b81831015611f315760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611ed7565b600389510660018114611f4b5760028114611f5c57611f68565b613d3d60f01b600119830152611f68565b603d60f81b6000198301525b509398975050505050505050565b6000611f8182610f72565b9050611f8f8160008461206f565b611f9a6000836118fd565b6001600160a01b0381166000908152600360205260408120805460019290611fc390849061331d565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166120ca576120c581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6120ed565b816001600160a01b0316836001600160a01b0316146120ed576120ed8382612370565b6001600160a01b03821661210457610bb48161240d565b826001600160a01b0316826001600160a01b031614610bb457610bb482826124bc565b610f31828260405180602001604052806000815250612500565b6000816040516020016121549190612d9d565b60408051601f19818403018152919052805160209091012092915050565b60006121806103e8836133b6565b905061218d606f826133b6565b6121aa576010546000908152601360205260409020600690555050565b6121b56058826133b6565b6121d2576010546000908152601360205260409020600590555050565b6121dd6042826133b6565b6121fa576010546000908152601360205260409020600490555050565b6122056021826133b6565b612222576010546000908152601360205260409020600390555050565b61222d600b826133b6565b61224a576010546000908152601360205260409020600290555050565b6010546000908152601360205260409020600190555050565b60006001600160a01b0384163b1561236557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a7903390899088908890600401612fd7565b602060405180830381600087803b1580156122c157600080fd5b505af19250505080156122f1575060408051601f3d908101601f191682019092526122ee91810190612a4c565b60015b61234b573d80801561231f576040519150601f19603f3d011682016040523d82523d6000602084013e612324565b606091505b5080516123435760405162461bcd60e51b815260040161083090613027565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a87565b506001949350505050565b6000600161237d84611022565b612387919061331d565b6000838152600760205260409020549091508082146123da576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061241f9060019061331d565b600083815260096020526040812054600880549394509092849081106124475761244761340c565b9060005260206000200154905080600883815481106124685761246861340c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124a0576124a06133f6565b6001900381819060005260206000200160009055905550505050565b60006124c783611022565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61250a8383612533565b6125176000848484612263565b610bb45760405162461bcd60e51b815260040161083090613027565b6001600160a01b0382166125895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610830565b6000818152600260205260409020546001600160a01b0316156125ee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610830565b6125fa6000838361206f565b6001600160a01b03821660009081526003602052604081208054600192906126239084906132d2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461268d90613360565b90600052602060002090601f0160209004810192826126af57600085556126f5565b82601f106126c857805160ff19168380011785556126f5565b828001600101855582156126f5579182015b828111156126f55782518255916020019190600101906126da565b50612701929150612779565b5090565b82805461271190613360565b90600052602060002090601f01602090048101928261273357600085556126f5565b82601f1061274c5782800160ff198235161785556126f5565b828001600101855582156126f5579182015b828111156126f557823582559160200191906001019061275e565b5b80821115612701576000815560010161277a565b60006001600160401b03808411156127a8576127a8613422565b604051601f8501601f19908116603f011681019082821181831017156127d0576127d0613422565b816040528093508581528686860111156127e957600080fd5b858560208301376000602087830101525050509392505050565b60008083601f84011261281557600080fd5b5081356001600160401b0381111561282c57600080fd5b60208301915083602082850101111561284457600080fd5b9250929050565b600082601f83011261285c57600080fd5b61286b8383356020850161278e565b9392505050565b803561ffff8116811461288457600080fd5b919050565b80356001600160401b038116811461288457600080fd5b6000602082840312156128b257600080fd5b813561286b81613438565b600080604083850312156128d057600080fd5b82516128db81613438565b6020939093015192949293505050565b600080604083850312156128fe57600080fd5b823561290981613438565b9150602083013561291981613438565b809150509250929050565b60008060006060848603121561293957600080fd5b833561294481613438565b9250602084013561295481613438565b929592945050506040919091013590565b6000806000806080858703121561297b57600080fd5b843561298681613438565b9350602085013561299681613438565b92506040850135915060608501356001600160401b038111156129b857600080fd5b6129c48782880161284b565b91505092959194509250565b600080604083850312156129e357600080fd5b82356129ee81613438565b91506020830135801515811461291957600080fd5b60008060408385031215612a1657600080fd5b8235612a2181613438565b946020939093013593505050565b600060208284031215612a4157600080fd5b813561286b8161344d565b600060208284031215612a5e57600080fd5b815161286b8161344d565b600060208284031215612a7b57600080fd5b81356001600160401b03811115612a9157600080fd5b8201601f81018413612aa257600080fd5b611a878482356020840161278e565b600060208284031215612ac357600080fd5b61286b82612872565b600080600060408486031215612ae157600080fd5b612aea84612872565b925060208401356001600160401b03811115612b0557600080fd5b612b1186828701612803565b9497909650939450505050565b600080600060608486031215612b3357600080fd5b612b3c84612872565b925060208401356001600160401b03811115612b5757600080fd5b612b638682870161284b565b925050604084013590509250925092565b600080600080600060808688031215612b8c57600080fd5b612b9586612872565b945060208601356001600160401b0380821115612bb157600080fd5b612bbd89838a0161284b565b9550612bcb60408901612889565b94506060880135915080821115612be157600080fd5b50612bee88828901612803565b969995985093965092949392505050565b60008060008060808587031215612c1557600080fd5b612c1e85612872565b935060208501356001600160401b0380821115612c3a57600080fd5b612c468883890161284b565b9450612c5460408801612889565b93506060870135915080821115612c6a57600080fd5b506129c48782880161284b565b60008060408385031215612c8a57600080fd5b612a2183612872565b600060208284031215612ca557600080fd5b5035919050565b60008060408385031215612cbf57600080fd5b50508035926020909101359150565b60008060408385031215612ce157600080fd5b505080516020909101519092909150565b60008151808452612d0a816020860160208601613334565b601f01601f19169290920160200192915050565b60008154612d2b81613360565b60018281168015612d435760018114612d5457612d83565b60ff19841687528287019450612d83565b8560005260208060002060005b85811015612d7a5781548a820152908401908201612d61565b50505082870194505b5050505092915050565b8183823760009101908152919050565b60008251612daf818460208701613334565b9190910192915050565b600061286b8284612d1e565b6000612dd18285612d1e565b8351612de1818360208801613334565b632e706e6760e01b9101908152600401949350505050565b717b226e616d65223a2022706c616e6574202360701b81528251600090612e27816012850160208801613334565b80830190507f222c20226465736372697074696f6e223a20224461726b506c616e657420697360128201527f20612073747261746567792067616d65207769746820746865206d61696e206c60328201527f696e65206f6620756e697665727365206578706c6f726174696f6e2e20496e6860528201527f61626974616e7473206f6e207468652073616d6520706c616e65742063616e2060728201527f666f726d2061207465616d2e20506c616e657420696e6861626974616e74732060928201527f63616e206272696e672062656e656669747320746f2074686520706c616e657460b28201527f206c6f7264732e2074686520746f74616c206e756d626572206f6620706c616e60d28201527f65747320697320312c3030302e20222c2022696d616765223a2200000000000060f282015261010c8451612f718183850160208901613334565b612f87828285010161227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612fca81601d850160208701613334565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061300a90830184612cf2565b9695505050505050565b60208152600061286b6020830184612cf2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061312d90830186612cf2565b841515606084015282810360808401526131478185612cf2565b98975050505050505050565b61ffff861681526080602082015260006131706080830187612cf2565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006131d16080830186612cf2565b6001600160401b03851660408401528281036060840152612f878185612cf2565b61ffff871681526000602060c0818401526000885461321081613360565b8060c087015260e0600180841660008114613232576001811461324757613275565b60ff1985168984015261010089019550613275565b8d6000528660002060005b8581101561326d5781548b8201860152908301908801613252565b8a0184019650505b5050505050838103604085015261328c8189612cf2565b9150506132a460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526132c58185612cf2565b9998505050505050505050565b600082198211156132e5576132e56133ca565b500190565b6000826132f9576132f96133e0565b500490565b6000816000190483118215151615613318576133186133ca565b500290565b60008282101561332f5761332f6133ca565b500390565b60005b8381101561334f578181015183820152602001613337565b8381111561094b5750506000910152565b600181811c9082168061337457607f821691505b6020821081141561339557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156133af576133af6133ca565b5060010190565b6000826133c5576133c56133e0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ddd57600080fd5b6001600160e01b031981168114610ddd57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205b3e83ed3990d2bfc5df88d7985721d570a293a7c609da966e6d96c0a20a8d0964736f6c63430008070033000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7

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

000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7

-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0xb6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7


Deployed ByteCode Sourcemap

57185:6614:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52153:949;;;;;;;;;;-1:-1:-1;52153:949:0;;;;;:::i;:::-;;:::i;:::-;;36076:224;;;;;;;;;;-1:-1:-1;36076:224:0;;;;;:::i;:::-;;:::i;:::-;;;15086:14:1;;15079:22;15061:41;;15049:2;15034:18;36076:224:0;;;;;;;;23198:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24757:221::-;;;;;;;;;;-1:-1:-1;24757:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;14105:32:1;;;14087:51;;14075:2;14060:18;24757:221:0;13941:203:1;24280:411:0;;;;;;;;;;-1:-1:-1;24280:411:0;;;;;:::i;:::-;;:::i;60325:107::-;;;;;;;;;;-1:-1:-1;60411:13:0;;60325:107;;;29856:25:1;;;29844:2;29829:18;60325:107:0;29710:177:1;53110:356:0;;;;;;;;;;-1:-1:-1;53110:356:0;;;;;:::i;:::-;;:::i;25647:339::-;;;;;;;;;;-1:-1:-1;25647:339:0;;;;;:::i;:::-;;:::i;57499:41::-;;;;;;;;;;-1:-1:-1;57499:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;36384:256;;;;;;;;;;-1:-1:-1;36384:256:0;;;;;:::i;:::-;;:::i;58802:301::-;;;;;;:::i;:::-;;:::i;26057:185::-;;;;;;;;;;-1:-1:-1;26057:185:0;;;;;:::i;:::-;;:::i;57292:41::-;;;;;;;;;;;;57329:4;57292:41;;60200:117;;;;;;;;;;;;;:::i;36906:233::-;;;;;;;;;;-1:-1:-1;36906:233:0;;;;;:::i;:::-;;:::i;61150:109::-;;;;;;;;;;-1:-1:-1;61150:109:0;;;;;:::i;:::-;;:::i;57583:42::-;;;;;;;;;;-1:-1:-1;57583:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;51024:117;;;;;;;;;;-1:-1:-1;51024:117:0;;;;;:::i;:::-;;:::i;22892:239::-;;;;;;;;;;-1:-1:-1;22892:239:0;;;;;:::i;:::-;;:::i;57920:141::-;;;;;;;;;;-1:-1:-1;57920:141:0;;;;;:::i;:::-;;:::i;22622:208::-;;;;;;;;;;-1:-1:-1;22622:208:0;;;;;:::i;:::-;;:::i;51995:51::-;;;;;;;;;;-1:-1:-1;51995:51:0;;;;;:::i;:::-;;:::i;61267:119::-;;;;;;;;;;-1:-1:-1;61267:119:0;;;;;:::i;:::-;;:::i;50716:87::-;;;;;;;;;;-1:-1:-1;50789:6:0;;-1:-1:-1;;;;;50789:6:0;50716:87;;51898:90;;;;;;;;;;-1:-1:-1;51898:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30066:25:1;;;30122:2;30107:18;;30100:34;;;;30039:18;51898:90:0;29892:248:1;63248:125:0;;;;;;;;;;-1:-1:-1;63248:125:0;;;;;:::i;:::-;;:::i;23367:104::-;;;;;;;;;;;;;:::i;25050:295::-;;;;;;;;;;-1:-1:-1;25050:295:0;;;;;:::i;:::-;;:::i;26313:328::-;;;;;;;;;;-1:-1:-1;26313:328:0;;;;;:::i;:::-;;:::i;60444:694::-;;;;;;;;;;-1:-1:-1;60444:694:0;;;;;:::i;:::-;;:::i;61528:1632::-;;;;;;:::i;:::-;;:::i;53942:758::-;;;;;;:::i;:::-;;:::i;57665:20::-;;;;;;;;;;;;;;;;57414:41;;;;;;;;;;-1:-1:-1;57414:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;25416:164;;;;;;;;;;-1:-1:-1;25416:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25537:25:0;;;25513:4;25537:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25416:164;57636:22;;;;;;;;;;;;;;;;54708:158;;;;;;;;;;-1:-1:-1;54708:158:0;;;;;:::i;:::-;;:::i;51296:192::-;;;;;;;;;;-1:-1:-1;51296:192:0;;;;;:::i;:::-;;:::i;52153:949::-;52315:8;;-1:-1:-1;;;;;52315:8:0;52293:10;:31;52285:40;;;;;;52436:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;52414:11;:18;:61;:134;;;;-1:-1:-1;52515:32:0;;;;;;;:19;:32;;;;;;;52505:43;;;;52515:32;52505:43;:::i;:::-;;;;;;;;52489:11;52479:22;;;;;;:69;52414:134;52406:213;;;;-1:-1:-1;;;52406:213:0;;24011:2:1;52406:213:0;;;23993:21:1;24050:2;24030:18;;;24023:30;24089:34;24069:18;;;24062:62;-1:-1:-1;;;24140:18:1;;;24133:50;24200:19;;52406:213:0;;;;;;;;;52747:60;;-1:-1:-1;;;52747:60:0;;:4;;:16;;:60;;52764:11;;52777;;52790:6;;52798:8;;52747:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52743:352;;52954:52;;;;;;;;52969:8;:15;52954:52;;;;52996:8;52986:19;;;;;;52954:52;;;52903:14;:27;52918:11;52903:27;;;;;;;;;;;;;;;52931:11;52903:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52903:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;53026:57;;;;53040:11;;53053;;52944:6;;53074:8;;53026:57;:::i;:::-;;;;;;;;52743:352;52153:949;;;;:::o;36076:224::-;36178:4;-1:-1:-1;;;;;;36202:50:0;;-1:-1:-1;;;36202:50:0;;:90;;;36256:36;36280:11;36256:23;:36::i;:::-;36195:97;36076:224;-1:-1:-1;;36076:224:0:o;23198:100::-;23252:13;23285:5;23278:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23198:100;:::o;24757:221::-;24833:7;28240:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28240:16:0;24853:73;;;;-1:-1:-1;;;24853:73:0;;23237:2:1;24853:73:0;;;23219:21:1;23276:2;23256:18;;;23249:30;23315:34;23295:18;;;23288:62;-1:-1:-1;;;23366:18:1;;;23359:42;23418:19;;24853:73:0;23035:408:1;24853:73:0;-1:-1:-1;24946:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24946:24:0;;24757:221::o;24280:411::-;24361:13;24377:23;24392:7;24377:14;:23::i;:::-;24361:39;;24425:5;-1:-1:-1;;;;;24419:11:0;:2;-1:-1:-1;;;;;24419:11:0;;;24411:57;;;;-1:-1:-1;;;24411:57:0;;24842:2:1;24411:57:0;;;24824:21:1;24881:2;24861:18;;;24854:30;24920:34;24900:18;;;24893:62;-1:-1:-1;;;24971:18:1;;;24964:31;25012:19;;24411:57:0;24640:397:1;24411:57:0;8139:10;-1:-1:-1;;;;;24503:21:0;;;;:62;;-1:-1:-1;24528:37:0;24545:5;8139:10;25416:164;:::i;24528:37::-;24481:168;;;;-1:-1:-1;;;24481:168:0;;20521:2:1;24481:168:0;;;20503:21:1;20560:2;20540:18;;;20533:30;20599:34;20579:18;;;20572:62;20670:26;20650:18;;;20643:54;20714:19;;24481:168:0;20319:420:1;24481:168:0;24662:21;24671:2;24675:7;24662:8;:21::i;:::-;24350:341;24280:411;;:::o;53110:356::-;53279:10;53301:4;53279:27;53271:83;;;;-1:-1:-1;;;53271:83:0;;21767:2:1;53271:83:0;;;21749:21:1;21806:2;21786:18;;;21779:30;21845:34;21825:18;;;21818:62;-1:-1:-1;;;21896:18:1;;;21889:41;21947:19;;53271:83:0;21565:407:1;53271:83:0;53403:55;53415:11;53428;53441:6;53449:8;53403:10;:55::i;25647:339::-;25842:41;8139:10;25875:7;25842:18;:41::i;:::-;25834:103;;;;-1:-1:-1;;;25834:103:0;;;;;;;:::i;:::-;25950:28;25960:4;25966:2;25970:7;25950:9;:28::i;36384:256::-;36481:7;36517:23;36534:5;36517:16;:23::i;:::-;36509:5;:31;36501:87;;;;-1:-1:-1;;;36501:87:0;;16241:2:1;36501:87:0;;;16223:21:1;16280:2;16260:18;;;16253:30;16319:34;16299:18;;;16292:62;-1:-1:-1;;;16370:18:1;;;16363:41;16421:19;;36501:87:0;16039:407:1;36501:87:0;-1:-1:-1;;;;;;36606:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36384:256::o;58802:301::-;58885:9;58868:13;:11;:13::i;:::-;:26;;58860:49;;;;-1:-1:-1;;;58860:49:0;;17836:2:1;58860:49:0;;;17818:21:1;17875:2;17855:18;;;17848:30;-1:-1:-1;;;17894:18:1;;;17887:41;17945:18;;58860:49:0;17634:335:1;58860:49:0;57329:4;58928:13;;:26;58920:57;;;;-1:-1:-1;;;58920:57:0;;22529:2:1;58920:57:0;;;22511:21:1;22568:2;22548:18;;;22541:30;-1:-1:-1;;;22587:18:1;;;22580:48;22645:18;;58920:57:0;22327:342:1;58920:57:0;59007:7;;58996;:18;;:37;;;;;59028:5;;59018:7;:15;58996:37;58988:70;;;;-1:-1:-1;;;58988:70:0;;22179:2:1;58988:70:0;;;22161:21:1;22218:2;22198:18;;;22191:30;-1:-1:-1;;;22237:18:1;;;22230:51;22298:18;;58988:70:0;21977:345:1;58988:70:0;59069:26;59076:7;59084:10;59069:6;:26::i;:::-;58802:301;:::o;26057:185::-;26195:39;26212:4;26218:2;26222:7;26195:39;;;;;;;;;;;;:16;:39::i;60200:117::-;60242:7;60291:3;60277:13;60411;;;60325:107;60277:13;:17;;;;:::i;:::-;60276:24;;60298:2;60276:24;:::i;:::-;60270:30;;:3;:30;:::i;:::-;60269:39;;60304:4;60269:39;:::i;:::-;60261:48;;60200:117;:::o;36906:233::-;36981:7;37017:30;36804:10;:17;;36716:113;37017:30;37009:5;:38;37001:95;;;;-1:-1:-1;;;37001:95:0;;25662:2:1;37001:95:0;;;25644:21:1;25701:2;25681:18;;;25674:30;25740:34;25720:18;;;25713:62;-1:-1:-1;;;25791:18:1;;;25784:42;25843:19;;37001:95:0;25460:408:1;37001:95:0;37114:10;37125:5;37114:17;;;;;;;;:::i;:::-;;;;;;;;;37107:24;;36906:233;;;:::o;61150:109::-;50789:6;;-1:-1:-1;;;;;50789:6:0;8139:10;50936:23;50928:68;;;;-1:-1:-1;;;50928:68:0;;;;;;;:::i;:::-;61207:44:::1;::::0;-1:-1:-1;;;;;61207:21:0;::::1;::::0;61229::::1;61207:44:::0;::::1;;;::::0;::::1;::::0;;;61229:21;61207;:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;61150:109:::0;:::o;51024:117::-;50789:6;;-1:-1:-1;;;;;50789:6:0;8139:10;50936:23;50928:68;;;;-1:-1:-1;;;50928:68:0;;;;;;;:::i;:::-;51103:26;;::::1;::::0;:15:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;22892:239::-:0;22964:7;23000:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23000:16:0;23035:19;23027:73;;;;-1:-1:-1;;;23027:73:0;;21357:2:1;23027:73:0;;;21339:21:1;21396:2;21376:18;;;21369:30;21435:34;21415:18;;;21408:62;-1:-1:-1;;;21486:18:1;;;21479:39;21535:19;;23027:73:0;21155:405:1;57920:141:0;57978:7;58037;58022:11;58037:7;58032:1;58022:11;:::i;:::-;58006;:7;58016:1;58006:11;:::i;:::-;58005:29;;;;:::i;:::-;:39;;;;:::i;:::-;:47;;58047:5;58005:47;:::i;22622:208::-;22694:7;-1:-1:-1;;;;;22722:19:0;;22714:74;;;;-1:-1:-1;;;22714:74:0;;20946:2:1;22714:74:0;;;20928:21:1;20985:2;20965:18;;;20958:30;21024:34;21004:18;;;20997:62;-1:-1:-1;;;21075:18:1;;;21068:40;21125:19;;22714:74:0;20744:406:1;22714:74:0;-1:-1:-1;;;;;;22806:16:0;;;;;:9;:16;;;;;;;22622:208::o;51995:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61267:119::-;50789:6;;-1:-1:-1;;;;;50789:6:0;8139:10;50936:23;50928:68;;;;-1:-1:-1;;;50928:68:0;;;;;;;:::i;:::-;61343:7:::1;:13:::0;;;;61367:5:::1;:11:::0;61267:119::o;63248:125::-;50789:6;;-1:-1:-1;;;;;50789:6:0;8139:10;50936:23;50928:68;;;;-1:-1:-1;;;50928:68:0;;;;;;;:::i;:::-;63330:26:::1;:35:::0;63248:125::o;23367:104::-;23423:13;23456:7;23449:14;;;;;:::i;25050:295::-;-1:-1:-1;;;;;25153:24:0;;8139:10;25153:24;;25145:62;;;;-1:-1:-1;;;25145:62:0;;18581:2:1;25145:62:0;;;18563:21:1;18620:2;18600:18;;;18593:30;18659:27;18639:18;;;18632:55;18704:18;;25145:62:0;18379:349:1;25145:62:0;8139:10;25220:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25220:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25220:53:0;;;;;;;;;;25289:48;;15061:41:1;;;25220:42:0;;8139:10;25289:48;;15034:18:1;25289:48:0;;;;;;;25050:295;;:::o;26313:328::-;26488:41;8139:10;26521:7;26488:18;:41::i;:::-;26480:103;;;;-1:-1:-1;;;26480:103:0;;;;;;;:::i;:::-;26594:39;26608:4;26614:2;26618:7;26627:5;26594:13;:39::i;60444:694::-;60505:13;60531:18;60576:15;60592:28;60601:18;60613:5;:3;60617:1;60613:5;:::i;60601:18::-;60592:8;:28::i;:::-;60559:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60531:98;;60640:18;60661:348;60727:13;60736:3;60727:8;:13::i;:::-;60995:4;60688:318;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60661:13;:348::i;:::-;60640:369;;61020:20;61100:4;61050:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61050:55:0;;;;;;;;;;60444:694;-1:-1:-1;;;;;60444:694:0:o;61528:1632::-;61631:16;61639:7;61631;:16::i;:::-;-1:-1:-1;;;;;61617:30:0;:10;-1:-1:-1;;;;;61617:30:0;;61609:77;;;;-1:-1:-1;;;61609:77:0;;19705:2:1;61609:77:0;;;19687:21:1;19744:2;19724:18;;;19717:30;19783:34;19763:18;;;19756:62;-1:-1:-1;;;19834:18:1;;;19827:32;19876:19;;61609:77:0;19503:398:1;61609:77:0;61705:29;;;61744:1;61705:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;61697:99;;;;-1:-1:-1;;;61697:99:0;;18935:2:1;61697:99:0;;;18917:21:1;18974:2;18954:18;;;18947:30;19013:34;18993:18;;;18986:62;-1:-1:-1;;;19064:18:1;;;19057:44;19118:19;;61697:99:0;18733:410:1;61697:99:0;61876:14;61882:7;61876:5;:14::i;:::-;61933:1;61917:13;;:17;;;;:::i;:::-;61901:13;:33;62031:31;;;62042:10;62031:31;;;14816:51:1;14883:18;;;14876:34;;;62031:31:0;;;;;;;;;14789:18:1;;;62031:31:0;;62232:26;;-1:-1:-1;;;62206:53:0;;;13815:51:1;13882:11;;;;13875:27;;;;62206:53:0;;;;;;;;;;13918:12:1;;;62206:53:0;;;;62435:8;;-1:-1:-1;;;62435:77:0;;;62031:31;;62165:1;;-1:-1:-1;;;;;;;62435:8:0;;:21;;:77;;62457:8;;62475:4;;62031:31;;-1:-1:-1;;62206:53:0;;62435:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62413:99;;;62554:10;62541:9;:23;;62533:107;;;;-1:-1:-1;;;62533:107:0;;15761:2:1;62533:107:0;;;15743:21:1;15800:2;15780:18;;;15773:30;15839:34;15819:18;;;15812:62;15910:34;15890:18;;;15883:62;-1:-1:-1;;;15961:19:1;;;15954:38;16009:19;;62533:107:0;15559:475:1;62533:107:0;62653:8;;62771:29;;;62653:8;62771:29;;;:19;:29;;;;;;62653:499;;-1:-1:-1;;;62653:499:0;;-1:-1:-1;;;;;62653:8:0;;;;:13;;62674:9;;62653:499;;62699:8;;62859:7;;62942:10;;62653:8;63089:13;;62653:499;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61598:1562;;;;61528:1632;;:::o;53942:758::-;54158:27;;;54123:32;54158:27;;;:14;:27;;;;;;:40;;;;54186:11;;54158:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54158:48:0;;;;;;;;;;54225:21;;;;54158:48;;-1:-1:-1;54217:86:0;;;;-1:-1:-1;;;54217:86:0;;26075:2:1;54217:86:0;;;26057:21:1;26114:2;26094:18;;;26087:30;26153:34;26133:18;;;26126:62;-1:-1:-1;;;26204:18:1;;;26197:36;26250:19;;54217:86:0;25873:402:1;54217:86:0;54341:23;;54322:42;;:90;;;;;54391:9;:21;;;54378:8;;54368:19;;;;;;;:::i;:::-;;;;;;;;:44;54322:90;54314:129;;;;-1:-1:-1;;;54314:129:0;;19350:2:1;54314:129:0;;;19332:21:1;19389:2;19369:18;;;19362:30;19428:28;19408:18;;;19401:56;19474:18;;54314:129:0;19148:350:1;54314:129:0;54517:1;54491:27;;;54529:21;;;:34;54632:60;;-1:-1:-1;;;54632:60:0;;:4;;:16;;:60;;54649:11;;54662;;54675:6;;54683:8;;;;54632:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54067:633;53942:758;;;;;:::o;54708:158::-;50789:6;;-1:-1:-1;;;;;50789:6:0;8139:10;50936:23;50928:68;;;;-1:-1:-1;;;50928:68:0;;;;;;;:::i;:::-;54812:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;54844:14;;54812:46:::1;:::i;51296:192::-:0;50789:6;;-1:-1:-1;;;;;50789:6:0;8139:10;50936:23;50928:68;;;;-1:-1:-1;;;50928:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51385:22:0;::::1;51377:73;;;::::0;-1:-1:-1;;;51377:73:0;;17072:2:1;51377:73:0::1;::::0;::::1;17054:21:1::0;17111:2;17091:18;;;17084:30;17150:34;17130:18;;;17123:62;-1:-1:-1;;;17201:18:1;;;17194:36;17247:19;;51377:73:0::1;16870:402:1::0;51377:73:0::1;51461:19;51471:8;51461:9;:19::i;22253:305::-:0;22355:4;-1:-1:-1;;;;;;22392:40:0;;-1:-1:-1;;;22392:40:0;;:105;;-1:-1:-1;;;;;;;22449:48:0;;-1:-1:-1;;;22449:48:0;22392:105;:158;;;-1:-1:-1;;;;;;;;;;20969:40:0;;;22514:36;20860:157;32133:174;32208:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32208:29:0;-1:-1:-1;;;;;32208:29:0;;;;;;;;:24;;32262:23;32208:24;32262:14;:23::i;:::-;-1:-1:-1;;;;;32253:46:0;;;;;;;;;;;32133:174;;:::o;63462:332::-;63615:14;63631:12;63658:8;63647:37;;;;;;;;;;;;:::i;:::-;63614:70;;;;63764:22;63771:7;63779:6;63764;:22::i;:::-;63584:210;;63462:332;;;;:::o;28445:348::-;28538:4;28240:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28240:16:0;28555:73;;;;-1:-1:-1;;;28555:73:0;;20108:2:1;28555:73:0;;;20090:21:1;20147:2;20127:18;;;20120:30;20186:34;20166:18;;;20159:62;-1:-1:-1;;;20237:18:1;;;20230:42;20289:19;;28555:73:0;19906:408:1;28555:73:0;28639:13;28655:23;28670:7;28655:14;:23::i;:::-;28639:39;;28708:5;-1:-1:-1;;;;;28697:16:0;:7;-1:-1:-1;;;;;28697:16:0;;:51;;;;28741:7;-1:-1:-1;;;;;28717:31:0;:20;28729:7;28717:11;:20::i;:::-;-1:-1:-1;;;;;28717:31:0;;28697:51;:87;;;-1:-1:-1;;;;;;25537:25:0;;;25513:4;25537:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28752:32;28689:96;28445:348;-1:-1:-1;;;;28445:348:0:o;31437:578::-;31596:4;-1:-1:-1;;;;;31569:31:0;:23;31584:7;31569:14;:23::i;:::-;-1:-1:-1;;;;;31569:31:0;;31561:85;;;;-1:-1:-1;;;31561:85:0;;24432:2:1;31561:85:0;;;24414:21:1;24471:2;24451:18;;;24444:30;24510:34;24490:18;;;24483:62;-1:-1:-1;;;24561:18:1;;;24554:39;24610:19;;31561:85:0;24230:405:1;31561:85:0;-1:-1:-1;;;;;31665:16:0;;31657:65;;;;-1:-1:-1;;;31657:65:0;;18176:2:1;31657:65:0;;;18158:21:1;18215:2;18195:18;;;18188:30;18254:34;18234:18;;;18227:62;-1:-1:-1;;;18305:18:1;;;18298:34;18349:19;;31657:65:0;17974:400:1;31657:65:0;31735:39;31756:4;31762:2;31766:7;31735:20;:39::i;:::-;31839:29;31856:1;31860:7;31839:8;:29::i;:::-;-1:-1:-1;;;;;31881:15:0;;;;;;:9;:15;;;;;:20;;31900:1;;31881:15;:20;;31900:1;;31881:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31912:13:0;;;;;;:9;:13;;;;;:18;;31929:1;;31912:13;:18;;31929:1;;31912:18;:::i;:::-;;;;-1:-1:-1;;31941:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31941:21:0;-1:-1:-1;;;;;31941:21:0;;;;;;;;;31980:27;;31941:16;;31980:27;;;;;;;31437:578;;;:::o;59113:458::-;59177:23;59187:3;59192:7;59177:9;:23::i;:::-;59211:17;59231:33;59238:25;59247:15;59238:8;:25::i;:::-;59231:6;:33::i;:::-;59211:53;-1:-1:-1;59275:17:0;59295:14;59307:2;59211:53;59295:14;:::i;:::-;59327:13;;59320:21;;;;:6;:21;;;;;:33;;;59275:34;;-1:-1:-1;59386:27:0;59393:19;59402:9;59393:8;:19::i;59386:27::-;59364:49;-1:-1:-1;59424:17:0;59444:15;59458:1;59364:49;59444:15;:::i;:::-;59477:13;;59470:21;;;;:6;:21;;;;;:33;;;59424:35;-1:-1:-1;59514:23:0;59521:15;59531:5;59521:9;:15;:::i;:::-;59514:6;:23::i;:::-;59548:13;:15;;;:13;:15;;;:::i;:::-;;;;;;59166:405;;;;59113:458;;:::o;27523:315::-;27680:28;27690:4;27696:2;27700:7;27680:9;:28::i;:::-;27727:48;27750:4;27756:2;27760:7;27769:5;27727:22;:48::i;:::-;27719:111;;;;-1:-1:-1;;;27719:111:0;;;;;;;:::i;58228:534::-;58284:13;58316:10;58312:53;;-1:-1:-1;;58343:10:0;;;;;;;;;;;;-1:-1:-1;;;58343:10:0;;;;;58228:534::o;58312:53::-;58390:5;58375:12;58431:78;58438:9;;58431:78;;58464:8;;;;:::i;:::-;;-1:-1:-1;58487:10:0;;-1:-1:-1;58495:2:0;58487:10;;:::i;:::-;;;58431:78;;;58519:19;58551:6;-1:-1:-1;;;;;58541:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58541:17:0;;58519:39;;58569:154;58576:10;;58569:154;;58603:11;58613:1;58603:11;;:::i;:::-;;-1:-1:-1;58672:10:0;58680:2;58672:5;:10;:::i;:::-;58659:24;;:2;:24;:::i;:::-;58646:39;;58629:6;58636;58629:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;58629:56:0;;;;;;;;-1:-1:-1;58700:11:0;58709:2;58700:11;;:::i;:::-;;;58569:154;;55139:2037;55197:13;55227:4;:11;55242:1;55227:16;55223:31;;;-1:-1:-1;;55245:9:0;;;;;;;;;-1:-1:-1;55245:9:0;;;55139:2037::o;55223:31::-;55314:19;55336:5;;;;;;;;;;;;;;;;;55314:27;;55393:18;55439:1;55420:4;:11;55434:1;55420:15;;;;:::i;:::-;55419:21;;;;:::i;:::-;55414:27;;:1;:27;:::i;:::-;55393:48;-1:-1:-1;55524:20:0;55558:15;55393:48;55571:2;55558:15;:::i;:::-;-1:-1:-1;;;;;55547:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55547:27:0;;55524:50;;55671:10;55663:6;55656:26;55778:1;55771:5;55767:13;55849:4;55900;55894:11;55885:7;55881:25;56008:2;56000:6;55996:15;56093:810;56112:6;56103:7;56100:19;56093:810;;;56178:1;56165:15;;;56259:14;;56412:4;56400:2;56396:14;;;56392:25;;56378:40;;56372:47;56367:3;56363:57;;;56345:76;;56540:2;56536:14;;;56532:25;;56518:40;;56512:47;56503:57;;56466:1;56451:17;;56485:76;56681:1;56676:14;;;56672:25;;56658:40;;56652:47;56643:57;;56591:17;;;56625:76;56812:25;;56798:40;;56792:47;56783:57;;56731:17;;;56765:76;;;;56871:17;;56093:810;;;56988:1;56981:4;56975:11;56971:19;57009:1;57004:54;;;;57077:1;57072:52;;;;56964:160;;57004:54;-1:-1:-1;;;;;57020:17:0;;57013:43;57004:54;;57072:52;-1:-1:-1;;;;;57088:17:0;;57081:41;56964:160;-1:-1:-1;57162:6:0;;55139:2037;-1:-1:-1;;;;;;;;55139:2037:0:o;30740:360::-;30800:13;30816:23;30831:7;30816:14;:23::i;:::-;30800:39;;30852:48;30873:5;30888:1;30892:7;30852:20;:48::i;:::-;30941:29;30958:1;30962:7;30941:8;:29::i;:::-;-1:-1:-1;;;;;30983:16:0;;;;;;:9;:16;;;;;:21;;31003:1;;30983:16;:21;;31003:1;;30983:21;:::i;:::-;;;;-1:-1:-1;;31022:16:0;;;;:7;:16;;;;;;31015:23;;-1:-1:-1;;;;;;31015:23:0;;;31056:36;31030:7;;31022:16;-1:-1:-1;;;;;31056:36:0;;;;;31022:16;;31056:36;30789:311;30740:360;:::o;51496:173::-;51571:6;;;-1:-1:-1;;;;;51588:17:0;;;-1:-1:-1;;;;;;51588:17:0;;;;;;;51621:40;;51571:6;;;51588:17;51571:6;;51621:40;;51552:16;;51621:40;51541:128;51496:173;:::o;37752:589::-;-1:-1:-1;;;;;37958:18:0;;37954:187;;37993:40;38025:7;39168:10;:17;;39141:24;;;;:15;:24;;;;;:44;;;39196:24;;;;;;;;;;;;39064:164;37993:40;37954:187;;;38063:2;-1:-1:-1;;;;;38055:10:0;:4;-1:-1:-1;;;;;38055:10:0;;38051:90;;38082:47;38115:4;38121:7;38082:32;:47::i;:::-;-1:-1:-1;;;;;38155:16:0;;38151:183;;38188:45;38225:7;38188:36;:45::i;38151:183::-;38261:4;-1:-1:-1;;;;;38255:10:0;:2;-1:-1:-1;;;;;38255:10:0;;38251:83;;38282:40;38310:2;38314:7;38282:27;:40::i;29135:110::-;29211:26;29221:2;29225:7;29211:26;;;;;;;;;;;;:9;:26::i;57745:138::-;57805:7;57867:5;57850:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57850:23:0;;;;;;;;;57840:34;;57850:23;57840:34;;;;;57745:138;-1:-1:-1;;57745:138:0:o;59667:525::-;59717:12;59732:9;59737:4;59732;:9;:::i;:::-;59717:24;-1:-1:-1;59756:8:0;59761:3;59717:24;59756:8;:::i;:::-;59752:433;;59794:13;;59786:22;;;;:7;:22;;;;;59811:1;59786:26;;61207:44:::1;61150:109:::0;:::o;59752:433::-;59833:7;59838:2;59833:4;:7;:::i;:::-;59829:356;;59870:13;;59862:22;;;;:7;:22;;;;;59887:1;59862:26;;61207:44:::1;61150:109:::0;:::o;59829:356::-;59909:7;59914:2;59909:4;:7;:::i;:::-;59905:280;;59946:13;;59938:22;;;;:7;:22;;;;;59963:1;59938:26;;61207:44:::1;61150:109:::0;:::o;59905:280::-;59985:7;59990:2;59985:4;:7;:::i;:::-;59981:204;;60022:13;;60014:22;;;;:7;:22;;;;;60039:1;60014:26;;61207:44:::1;61150:109:::0;:::o;59981:204::-;60061:7;60066:2;60061:4;:7;:::i;:::-;60057:128;;60098:13;;60090:22;;;;:7;:22;;;;;60115:1;60090:26;;61207:44:::1;61150:109:::0;:::o;60057:128::-;60155:13;;60147:22;;;;:7;:22;;;;;60172:1;60147:26;;59706:486;59667:525;:::o;32872:803::-;33027:4;-1:-1:-1;;;;;33048:13:0;;13367:20;13415:8;33044:624;;33084:72;;-1:-1:-1;;;33084:72:0;;-1:-1:-1;;;;;33084:36:0;;;;;:72;;8139:10;;33135:4;;33141:7;;33150:5;;33084:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33084:72:0;;;;;;;;-1:-1:-1;;33084:72:0;;;;;;;;;;;;:::i;:::-;;;33080:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33330:13:0;;33326:272;;33373:60;;-1:-1:-1;;;33373:60:0;;;;;;;:::i;33326:272::-;33548:6;33542:13;33533:6;33529:2;33525:15;33518:38;33080:533;-1:-1:-1;;;;;;33207:55:0;-1:-1:-1;;;33207:55:0;;-1:-1:-1;33200:62:0;;33044:624;-1:-1:-1;33652:4:0;32872:803;;;;;;:::o;39855:988::-;40121:22;40171:1;40146:22;40163:4;40146:16;:22::i;:::-;:26;;;;:::i;:::-;40183:18;40204:26;;;:17;:26;;;;;;40121:51;;-1:-1:-1;40337:28:0;;;40333:328;;-1:-1:-1;;;;;40404:18:0;;40382:19;40404:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40455:30;;;;;;:44;;;40572:30;;:17;:30;;;;;:43;;;40333:328;-1:-1:-1;40757:26:0;;;;:17;:26;;;;;;;;40750:33;;;-1:-1:-1;;;;;40801:18:0;;;;;:12;:18;;;;;:34;;;;;;;40794:41;39855:988::o;41138:1079::-;41416:10;:17;41391:22;;41416:21;;41436:1;;41416:21;:::i;:::-;41448:18;41469:24;;;:15;:24;;;;;;41842:10;:26;;41391:46;;-1:-1:-1;41469:24:0;;41391:46;;41842:26;;;;;;:::i;:::-;;;;;;;;;41820:48;;41906:11;41881:10;41892;41881:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41986:28;;;:15;:28;;;;;;;:41;;;42158:24;;;;;42151:31;42193:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41209:1008;;;41138:1079;:::o;38642:221::-;38727:14;38744:20;38761:2;38744:16;:20::i;:::-;-1:-1:-1;;;;;38775:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38820:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38642:221:0:o;29472:321::-;29602:18;29608:2;29612:7;29602:5;:18::i;:::-;29653:54;29684:1;29688:2;29692:7;29701:5;29653:22;:54::i;:::-;29631:154;;;;-1:-1:-1;;;29631:154:0;;;;;;;:::i;30129:382::-;-1:-1:-1;;;;;30209:16:0;;30201:61;;;;-1:-1:-1;;;30201:61:0;;22876:2:1;30201:61:0;;;22858:21:1;;;22895:18;;;22888:30;22954:34;22934:18;;;22927:62;23006:18;;30201:61:0;22674:356:1;30201:61:0;28216:4;28240:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28240:16:0;:30;30273:58;;;;-1:-1:-1;;;30273:58:0;;17479:2:1;30273:58:0;;;17461:21:1;17518:2;17498:18;;;17491:30;17557;17537:18;;;17530:58;17605:18;;30273:58:0;17277:352:1;30273:58:0;30344:45;30373:1;30377:2;30381:7;30344:20;:45::i;:::-;-1:-1:-1;;;;;30402:13:0;;;;;;:9;:13;;;;;:18;;30419:1;;30402:13;:18;;30419:1;;30402:18;:::i;:::-;;;;-1:-1:-1;;30431:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30431:21:0;-1:-1:-1;;;;;30431:21:0;;;;;;;;30470:33;;30431:16;;;30470:33;;30431:16;;30470:33;30129:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:347::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:55;;783:1;780;773:12;732:55;-1:-1:-1;806:20:1;;-1:-1:-1;;;;;838:30:1;;835:50;;;881:1;878;871:12;835:50;918:4;910:6;906:17;894:29;;970:3;963:4;954:6;946;942:19;938:30;935:39;932:59;;;987:1;984;977:12;932:59;650:347;;;;;:::o;1002:220::-;1044:5;1097:3;1090:4;1082:6;1078:17;1074:27;1064:55;;1115:1;1112;1105:12;1064:55;1137:79;1212:3;1203:6;1190:20;1183:4;1175:6;1171:17;1137:79;:::i;:::-;1128:88;1002:220;-1:-1:-1;;;1002:220:1:o;1227:159::-;1294:20;;1354:6;1343:18;;1333:29;;1323:57;;1376:1;1373;1366:12;1323:57;1227:159;;;:::o;1391:171::-;1458:20;;-1:-1:-1;;;;;1507:30:1;;1497:41;;1487:69;;1552:1;1549;1542:12;1567:247;1626:6;1679:2;1667:9;1658:7;1654:23;1650:32;1647:52;;;1695:1;1692;1685:12;1647:52;1734:9;1721:23;1753:31;1778:5;1753:31;:::i;1819:320::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2015:9;2009:16;2034:31;2059:5;2034:31;:::i;:::-;2129:2;2114:18;;;;2108:25;2084:5;;2108:25;;-1:-1:-1;;;1819:320:1:o;2144:388::-;2212:6;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2328:9;2315:23;2347:31;2372:5;2347:31;:::i;:::-;2397:5;-1:-1:-1;2454:2:1;2439:18;;2426:32;2467:33;2426:32;2467:33;:::i;:::-;2519:7;2509:17;;;2144:388;;;;;:::o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:1;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:1;2968:18;;;;2955:32;;2537:456::o;2998:665::-;3093:6;3101;3109;3117;3170:3;3158:9;3149:7;3145:23;3141:33;3138:53;;;3187:1;3184;3177:12;3138:53;3226:9;3213:23;3245:31;3270:5;3245:31;:::i;:::-;3295:5;-1:-1:-1;3352:2:1;3337:18;;3324:32;3365:33;3324:32;3365:33;:::i;:::-;3417:7;-1:-1:-1;3471:2:1;3456:18;;3443:32;;-1:-1:-1;3526:2:1;3511:18;;3498:32;-1:-1:-1;;;;;3542:30:1;;3539:50;;;3585:1;3582;3575:12;3539:50;3608:49;3649:7;3640:6;3629:9;3625:22;3608:49;:::i;:::-;3598:59;;;2998:665;;;;;;;:::o;3668:416::-;3733:6;3741;3794:2;3782:9;3773:7;3769:23;3765:32;3762:52;;;3810:1;3807;3800:12;3762:52;3849:9;3836:23;3868:31;3893:5;3868:31;:::i;:::-;3918:5;-1:-1:-1;3975:2:1;3960:18;;3947:32;4017:15;;4010:23;3998:36;;3988:64;;4048:1;4045;4038:12;4089:315;4157:6;4165;4218:2;4206:9;4197:7;4193:23;4189:32;4186:52;;;4234:1;4231;4224:12;4186:52;4273:9;4260:23;4292:31;4317:5;4292:31;:::i;:::-;4342:5;4394:2;4379:18;;;;4366:32;;-1:-1:-1;;;4089:315:1:o;4409:245::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;4575:9;4562:23;4594:30;4618:5;4594:30;:::i;4659:249::-;4728:6;4781:2;4769:9;4760:7;4756:23;4752:32;4749:52;;;4797:1;4794;4787:12;4749:52;4829:9;4823:16;4848:30;4872:5;4848:30;:::i;4913:450::-;4982:6;5035:2;5023:9;5014:7;5010:23;5006:32;5003:52;;;5051:1;5048;5041:12;5003:52;5091:9;5078:23;-1:-1:-1;;;;;5116:6:1;5113:30;5110:50;;;5156:1;5153;5146:12;5110:50;5179:22;;5232:4;5224:13;;5220:27;-1:-1:-1;5210:55:1;;5261:1;5258;5251:12;5210:55;5284:73;5349:7;5344:2;5331:16;5326:2;5322;5318:11;5284:73;:::i;5368:184::-;5426:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:52;;;5495:1;5492;5485:12;5447:52;5518:28;5536:9;5518:28;:::i;5557:481::-;5635:6;5643;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5743:28;5761:9;5743:28;:::i;:::-;5733:38;;5822:2;5811:9;5807:18;5794:32;-1:-1:-1;;;;;5841:6:1;5838:30;5835:50;;;5881:1;5878;5871:12;5835:50;5920:58;5970:7;5961:6;5950:9;5946:22;5920:58;:::i;:::-;5557:481;;5997:8;;-1:-1:-1;5894:84:1;;-1:-1:-1;;;;5557:481:1:o;6043:460::-;6128:6;6136;6144;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;6236:28;6254:9;6236:28;:::i;:::-;6226:38;;6315:2;6304:9;6300:18;6287:32;-1:-1:-1;;;;;6334:6:1;6331:30;6328:50;;;6374:1;6371;6364:12;6328:50;6397:49;6438:7;6429:6;6418:9;6414:22;6397:49;:::i;:::-;6387:59;;;6493:2;6482:9;6478:18;6465:32;6455:42;;6043:460;;;;;:::o;6508:773::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6737:28;6755:9;6737:28;:::i;:::-;6727:38;;6816:2;6805:9;6801:18;6788:32;-1:-1:-1;;;;;6880:2:1;6872:6;6869:14;6866:34;;;6896:1;6893;6886:12;6866:34;6919:49;6960:7;6951:6;6940:9;6936:22;6919:49;:::i;:::-;6909:59;;6987:37;7020:2;7009:9;7005:18;6987:37;:::i;:::-;6977:47;;7077:2;7066:9;7062:18;7049:32;7033:48;;7106:2;7096:8;7093:16;7090:36;;;7122:1;7119;7112:12;7090:36;;7161:60;7213:7;7202:8;7191:9;7187:24;7161:60;:::i;:::-;6508:773;;;;-1:-1:-1;6508:773:1;;-1:-1:-1;7240:8:1;;7135:86;6508:773;-1:-1:-1;;;6508:773:1:o;7286:684::-;7388:6;7396;7404;7412;7465:3;7453:9;7444:7;7440:23;7436:33;7433:53;;;7482:1;7479;7472:12;7433:53;7505:28;7523:9;7505:28;:::i;:::-;7495:38;;7584:2;7573:9;7569:18;7556:32;-1:-1:-1;;;;;7648:2:1;7640:6;7637:14;7634:34;;;7664:1;7661;7654:12;7634:34;7687:49;7728:7;7719:6;7708:9;7704:22;7687:49;:::i;:::-;7677:59;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7845:2;7834:9;7830:18;7817:32;7801:48;;7874:2;7864:8;7861:16;7858:36;;;7890:1;7887;7880:12;7858:36;;7913:51;7956:7;7945:8;7934:9;7930:24;7913:51;:::i;7975:252::-;8042:6;8050;8103:2;8091:9;8082:7;8078:23;8074:32;8071:52;;;8119:1;8116;8109:12;8071:52;8142:28;8160:9;8142:28;:::i;8232:180::-;8291:6;8344:2;8332:9;8323:7;8319:23;8315:32;8312:52;;;8360:1;8357;8350:12;8312:52;-1:-1:-1;8383:23:1;;8232:180;-1:-1:-1;8232:180:1:o;8417:248::-;8485:6;8493;8546:2;8534:9;8525:7;8521:23;8517:32;8514:52;;;8562:1;8559;8552:12;8514:52;-1:-1:-1;;8585:23:1;;;8655:2;8640:18;;;8627:32;;-1:-1:-1;8417:248:1:o;8670:245::-;8749:6;8757;8810:2;8798:9;8789:7;8785:23;8781:32;8778:52;;;8826:1;8823;8816:12;8778:52;-1:-1:-1;;8849:16:1;;8905:2;8890:18;;;8884:25;8849:16;;8884:25;;-1:-1:-1;8670:245:1:o;9037:257::-;9078:3;9116:5;9110:12;9143:6;9138:3;9131:19;9159:63;9215:6;9208:4;9203:3;9199:14;9192:4;9185:5;9181:16;9159:63;:::i;:::-;9276:2;9255:15;-1:-1:-1;;9251:29:1;9242:39;;;;9283:4;9238:50;;9037:257;-1:-1:-1;;9037:257:1:o;9299:692::-;9348:3;9389:5;9383:12;9418:36;9444:9;9418:36;:::i;:::-;9473:1;9490:18;;;9517:104;;;;9635:1;9630:355;;;;9483:502;;9517:104;-1:-1:-1;;9550:24:1;;9538:37;;9595:16;;;;-1:-1:-1;9517:104:1;;9630:355;9661:5;9658:1;9651:16;9690:4;9735:2;9732:1;9722:16;9760:1;9774:165;9788:6;9785:1;9782:13;9774:165;;;9866:14;;9853:11;;;9846:35;9909:16;;;;9803:10;;9774:165;;;9778:3;;;9968:6;9963:3;9959:16;9952:23;;9483:502;;;;;9299:692;;;;:::o;10126:271::-;10309:6;10301;10296:3;10283:33;10265:3;10335:16;;10360:13;;;10335:16;10126:271;-1:-1:-1;10126:271:1:o;10402:274::-;10531:3;10569:6;10563:13;10585:53;10631:6;10626:3;10619:4;10611:6;10607:17;10585:53;:::i;:::-;10654:16;;;;;10402:274;-1:-1:-1;;10402:274:1:o;10681:194::-;10807:3;10832:37;10865:3;10857:6;10832:37;:::i;11161:541::-;11438:3;11466:37;11499:3;11491:6;11466:37;:::i;:::-;11532:6;11526:13;11548:52;11593:6;11589:2;11582:4;11574:6;11570:17;11548:52;:::i;:::-;-1:-1:-1;;;11622:15:1;;11646:21;;;11694:1;11683:13;;11161:541;-1:-1:-1;;;;11161:541:1:o;11707:1495::-;-1:-1:-1;;;12207:61:1;;12291:13;;12189:3;;12313:62;12291:13;12363:2;12354:12;;12347:4;12335:17;;12313:62;:::i;:::-;12403:6;12398:3;12394:16;12384:26;;12439:66;12434:2;12430;12426:11;12419:87;12535:34;12530:2;12526;12522:11;12515:55;12599:34;12594:2;12590;12586:11;12579:55;12664:34;12658:3;12654:2;12650:12;12643:56;12729:34;12723:3;12719:2;12715:12;12708:56;12794:34;12788:3;12784:2;12780:12;12773:56;12859:34;12853:3;12849:2;12845:12;12838:56;12924:66;12918:3;12914:2;12910:12;12903:88;13010:3;13044:6;13038:13;13060:63;13114:8;13109:2;13105;13101:11;13094:4;13086:6;13082:17;13060:63;:::i;:::-;13139:57;13192:2;13181:8;13177:2;13173:17;13169:26;-1:-1:-1;;;10061:27:1;;10113:1;10104:11;;9996:125;13139:57;13132:64;11707:1495;-1:-1:-1;;;;;;;11707:1495:1:o;13207:448::-;13469:31;13464:3;13457:44;13439:3;13530:6;13524:13;13546:62;13601:6;13596:2;13591:3;13587:12;13580:4;13572:6;13568:17;13546:62;:::i;:::-;13628:16;;;;13646:2;13624:25;;13207:448;-1:-1:-1;;13207:448:1:o;14149:488::-;-1:-1:-1;;;;;14418:15:1;;;14400:34;;14470:15;;14465:2;14450:18;;14443:43;14517:2;14502:18;;14495:34;;;14565:3;14560:2;14545:18;;14538:31;;;14343:4;;14586:45;;14611:19;;14603:6;14586:45;:::i;:::-;14578:53;14149:488;-1:-1:-1;;;;;;14149:488:1:o;15113:217::-;15260:2;15249:9;15242:21;15223:4;15280:44;15320:2;15309:9;15305:18;15297:6;15280:44;:::i;16451:414::-;16653:2;16635:21;;;16692:2;16672:18;;;16665:30;16731:34;16726:2;16711:18;;16704:62;-1:-1:-1;;;16797:2:1;16782:18;;16775:48;16855:3;16840:19;;16451:414::o;23448:356::-;23650:2;23632:21;;;23669:18;;;23662:30;23728:34;23723:2;23708:18;;23701:62;23795:2;23780:18;;23448:356::o;25042:413::-;25244:2;25226:21;;;25283:2;25263:18;;;25256:30;25322:34;25317:2;25302:18;;25295:62;-1:-1:-1;;;25388:2:1;25373:18;;25366:47;25445:3;25430:19;;25042:413::o;26280:640::-;26561:6;26549:19;;26531:38;;-1:-1:-1;;;;;26605:32:1;;26600:2;26585:18;;26578:60;26625:3;26669:2;26654:18;;26647:31;;;-1:-1:-1;;26701:45:1;;26726:19;;26718:6;26701:45;:::i;:::-;26796:6;26789:14;26782:22;26777:2;26766:9;26762:18;26755:50;26854:9;26846:6;26842:22;26836:3;26825:9;26821:19;26814:51;26882:32;26907:6;26899;26882:32;:::i;:::-;26874:40;26280:640;-1:-1:-1;;;;;;;;26280:640:1:o;26925:717::-;27192:6;27184;27180:19;27169:9;27162:38;27236:3;27231:2;27220:9;27216:18;27209:31;27143:4;27263:45;27303:3;27292:9;27288:19;27280:6;27263:45;:::i;:::-;-1:-1:-1;;;;;27348:6:1;27344:31;27339:2;27328:9;27324:18;27317:59;27424:9;27416:6;27412:22;27407:2;27396:9;27392:18;27385:50;27459:6;27451;27444:22;27513:6;27505;27500:2;27492:6;27488:15;27475:45;27566:1;27561:2;27552:6;27544;27540:19;27536:28;27529:39;27633:2;27626;27622:7;27617:2;27609:6;27605:15;27601:29;27593:6;27589:42;27585:51;27577:59;;;26925:717;;;;;;;;:::o;27647:555::-;27904:6;27896;27892:19;27881:9;27874:38;27948:3;27943:2;27932:9;27928:18;27921:31;27855:4;27975:45;28015:3;28004:9;28000:19;27992:6;27975:45;:::i;:::-;-1:-1:-1;;;;;28060:6:1;28056:31;28051:2;28040:9;28036:18;28029:59;28136:9;28128:6;28124:22;28119:2;28108:9;28104:18;28097:50;28164:32;28189:6;28181;28164:32;:::i;28207:1498::-;28553:6;28545;28541:19;28530:9;28523:38;28504:4;28580:2;28618:3;28613:2;28602:9;28598:18;28591:31;28642:1;28675:6;28669:13;28705:36;28731:9;28705:36;:::i;:::-;28778:6;28772:3;28761:9;28757:19;28750:35;28804:3;28826:1;28858:2;28847:9;28843:18;28875:1;28870:122;;;;29006:1;29001:354;;;;28836:519;;28870:122;-1:-1:-1;;28918:24:1;;28898:18;;;28891:52;28978:3;28963:19;;;-1:-1:-1;28870:122:1;;29001:354;29032:6;29029:1;29022:17;29080:2;29077:1;29067:16;29105:1;29119:180;29133:6;29130:1;29127:13;29119:180;;;29226:14;;29202:17;;;29198:26;;29191:50;29269:16;;;;29148:10;;29119:180;;;29323:17;;29319:26;;;-1:-1:-1;;28836:519:1;;;;;;29400:9;29395:3;29391:19;29386:2;29375:9;29371:18;29364:47;29434:29;29459:3;29451:6;29434:29;:::i;:::-;29420:43;;;29472:54;29522:2;29511:9;29507:18;29499:6;-1:-1:-1;;;;;8994:31:1;8982:44;;8920:112;29472:54;-1:-1:-1;;;;;8994:31:1;;29585:3;29570:19;;8982:44;29639:9;29631:6;29627:22;29621:3;29610:9;29606:19;29599:51;29667:32;29692:6;29684;29667:32;:::i;:::-;29659:40;28207:1498;-1:-1:-1;;;;;;;;;28207:1498:1:o;30145:128::-;30185:3;30216:1;30212:6;30209:1;30206:13;30203:39;;;30222:18;;:::i;:::-;-1:-1:-1;30258:9:1;;30145:128::o;30278:120::-;30318:1;30344;30334:35;;30349:18;;:::i;:::-;-1:-1:-1;30383:9:1;;30278:120::o;30403:168::-;30443:7;30509:1;30505;30501:6;30497:14;30494:1;30491:21;30486:1;30479:9;30472:17;30468:45;30465:71;;;30516:18;;:::i;:::-;-1:-1:-1;30556:9:1;;30403:168::o;30576:125::-;30616:4;30644:1;30641;30638:8;30635:34;;;30649:18;;:::i;:::-;-1:-1:-1;30686:9:1;;30576:125::o;30706:258::-;30778:1;30788:113;30802:6;30799:1;30796:13;30788:113;;;30878:11;;;30872:18;30859:11;;;30852:39;30824:2;30817:10;30788:113;;;30919:6;30916:1;30913:13;30910:48;;;-1:-1:-1;;30954:1:1;30936:16;;30929:27;30706:258::o;30969:380::-;31048:1;31044:12;;;;31091;;;31112:61;;31166:4;31158:6;31154:17;31144:27;;31112:61;31219:2;31211:6;31208:14;31188:18;31185:38;31182:161;;;31265:10;31260:3;31256:20;31253:1;31246:31;31300:4;31297:1;31290:15;31328:4;31325:1;31318:15;31182:161;;30969:380;;;:::o;31354:135::-;31393:3;-1:-1:-1;;31414:17:1;;31411:43;;;31434:18;;:::i;:::-;-1:-1:-1;31481:1:1;31470:13;;31354:135::o;31494:112::-;31526:1;31552;31542:35;;31557:18;;:::i;:::-;-1:-1:-1;31591:9:1;;31494:112::o;31611:127::-;31672:10;31667:3;31663:20;31660:1;31653:31;31703:4;31700:1;31693:15;31727:4;31724:1;31717:15;31743:127;31804:10;31799:3;31795:20;31792:1;31785:31;31835:4;31832:1;31825:15;31859:4;31856:1;31849:15;31875:127;31936:10;31931:3;31927:20;31924:1;31917:31;31967:4;31964:1;31957:15;31991:4;31988:1;31981:15;32007:127;32068:10;32063:3;32059:20;32056:1;32049:31;32099:4;32096:1;32089:15;32123:4;32120:1;32113:15;32139:127;32200:10;32195:3;32191:20;32188:1;32181:31;32231:4;32228:1;32221:15;32255:4;32252:1;32245:15;32271:131;-1:-1:-1;;;;;32346:31:1;;32336:42;;32326:70;;32392:1;32389;32382:12;32407:131;-1:-1:-1;;;;;;32481:32:1;;32471:43;;32461:71;;32528:1;32525;32518:12

Swarm Source

ipfs://5b3e83ed3990d2bfc5df88d7985721d570a293a7c609da966e6d96c0a20a8d09
Loading