ETH Price: $3,002.96 (+3.01%)
Gas: 2 Gwei

Token

Omega Droids (OMEGA)
 

Overview

Max Total Supply

9 OMEGA

Holders

6

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Omega Droids: Deployer
Balance
1 OMEGA
0x410832aa86be79a33fd61262884ccd64c036eb02
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
OmegaDroids

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-29
*/

// SPDX-License-Identifier: MIT

/**
Omega Droids - collection belongs to the 0xd38 Universe.
Official website - www.0xd38.xyz
*/

pragma solidity ^0.8.0;

library Counters {
    struct Counter {

        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter:decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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


pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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


pragma solidity ^0.8.0;

/**
 * @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 {
        _setApprovalForAll(_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);

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

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.4;

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

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


interface IERC721A {
    function ownerOf(uint256 tokenId) external view returns (address);
    function totalSupply() external view returns (uint256);
}


pragma solidity ^0.8.4;

contract OmegaDroids is ERC721A, Ownable {
    using Strings for uint256;

    string private baseURI;

    string public hiddenMetadataUri;

    uint256 public price = 0.02 ether;

    uint256 public maxPerTx = 10;

    uint256 public maxSupply = 10000;

    bool public mintEnabled = false;

    bool public revealed = true;

    uint public ownerMintAmount = 300;
    uint internal countOwnerMint;
    mapping(uint => bool) private mintedFree;
    IERC721A public collection1;

    constructor() ERC721A("Omega Droids", "OMEGA") {
        setHiddenMetadataUri("https://api2.0xd38.xyz/");
        setBaseURI("https://api2.0xd38.xyz/");
        collection1 = IERC721A(0x34B09150783499056B2E04a94c25814FE6AC1C7B);
    }

    function mintForOwner(uint256 count, address _address) external onlyOwner {
      require(mintEnabled, "Minting is not live yet");
      require(countOwnerMint <= ownerMintAmount, "No more NFT for Owner");
      require(count <= maxPerTx, "Max per TX reached.");
      _safeMint(_address, count);
      countOwnerMint = countOwnerMint + count;
    }

    function mint(uint256 count) external payable {
      require(mintEnabled, "Minting is not live yet");

      uint256 cost = price;
      uint currentSuply = collection1.totalSupply();

      uint i = 1;
      while (i <= currentSuply) {
        address ownerCurentNFT = collection1.ownerOf(i);
        if (ownerCurentNFT == msg.sender) {
            if (mintedFree[i] == false) {
                cost = 0;
                mintedFree[i] = true;
            } else {
                cost = 1;
            }
            break;
        } else {
            i++;
        }
      }

      if (cost == 0) {
        require(totalSupply() + 1 <= maxSupply, "No more Droids");
        _safeMint(msg.sender, 1);
      } else {
        require(totalSupply() + count <= maxSupply, "No more Droids");
        require(count <= maxPerTx, "Max per TX reached.");
        if (cost == 1) {
            require(msg.value >= count * price / 2, "Please send the exact amount.");
            _safeMint(msg.sender, count);
        } else {
            require(msg.value >= count * price, "Please send the exact amount.");
            _safeMint(msg.sender, count);
        }
      }
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
         return string(abi.encodePacked(hiddenMetadataUri));
        }
    
        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
     hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setMaxSupply(uint _newMaxSupply) external onlyOwner {
        maxSupply = _newMaxSupply;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setRevealed() external onlyOwner {
     revealed = !revealed;
    }

    function flipSale() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function changeOwnerMintAmount(uint _ownerMintAmount) external onlyOwner {
        ownerMintAmount = _ownerMintAmount;
    }

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

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

    function WhitelistMint(address to, uint256 quantity)public onlyOwner{
        require(totalSupply() + quantity <= maxSupply, "reached max supply");
        _safeMint(to, quantity);
  }

    function checkaddress() external view returns(uint){
        uint256 cost = price;
        uint currentSuply = collection1.totalSupply();
        uint i = 1;
        while (i <= currentSuply) {
            address ownerCurentNFT = collection1.ownerOf(i);
            if (ownerCurentNFT == msg.sender) {
                if (mintedFree[i] == false) {
                    cost = 0;
                } else {
                    cost = 1;
                }
                break;
            } else {
                i++;
            }
        }
        return cost;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ownerMintAmount","type":"uint256"}],"name":"changeOwnerMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkaddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collection1","outputs":[{"internalType":"contract IERC721A","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266470de4df820000600b55600a600c55612710600d556000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff02191690831515021790555061012c600f553480156200006357600080fd5b506040518060400160405280600c81526020017f4f6d6567612044726f69647300000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f4d4547410000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e892919062000478565b5080600390805190602001906200010192919062000478565b50620001126200022160201b60201c565b60008190555050506200013a6200012e6200022a60201b60201c565b6200023260201b60201c565b620001806040518060400160405280601781526020017f68747470733a2f2f617069322e30786433382e78797a2f000000000000000000815250620002f860201b60201c565b620001c66040518060400160405280601781526020017f68747470733a2f2f617069322e30786433382e78797a2f000000000000000000815250620003a360201b60201c565b7334b09150783499056b2e04a94c25814fe6ac1c7b601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000610565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003086200022a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200032e6200044e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000387576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037e906200054f565b60405180910390fd5b80600a90805190602001906200039f92919062000478565b5050565b620003b36200022a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003d96200044e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000429906200054f565b60405180910390fd5b80600990805190602001906200044a92919062000478565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004869062000582565b90600052602060002090601f016020900481019282620004aa5760008555620004f6565b82601f10620004c557805160ff1916838001178555620004f6565b82800160010185558215620004f6579182015b82811115620004f5578251825591602001919060010190620004d8565b5b50905062000505919062000509565b5090565b5b80821115620005245760008160009055506001016200050a565b5090565b60006200053760208362000571565b91506200054482620005e7565b602082019050919050565b600060208201905081810360008301526200056a8162000528565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200059b57607f821691505b60208210811415620005b257620005b1620005b8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6143b280620006206000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063a45ba8e7116100ab578063d12397301161006f578063d123973014610762578063d5abeb011461078d578063e985e9c5146107b8578063f2fde38b146107f5578063f968adbe1461081e5761021a565b8063a45ba8e71461067b578063b88d4fde146106a6578063bac7bb9f146106cf578063bb00c8f9146106fa578063c87b56dd146107255761021a565b806391b7f5ed116100f257806391b7f5ed146105b757806395d89b41146105e0578063a035b1fe1461060b578063a0712d6814610636578063a22cb465146106525761021a565b8063715018a6146105335780637ba5e6211461054a5780638069182d146105615780638da5cb5b1461058c5761021a565b80633ccfd60b116101a65780635183022711610175578063518302271461043c57806355f804b3146104675780636352211e146104905780636f8b44b0146104cd57806370a08231146104f65761021a565b80633ccfd60b146103aa5780633fcf79dc146103c157806342842e0e146103ea5780634fdd43cb146104135761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806318160ddd1461031657806323b872dd146103415780633175668c1461036a5780633bd64968146103935761021a565b806301ffc9a71461021f578063064f0db41461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613582565b610849565b6040516102539190613a83565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e9190613625565b61092b565b005b34801561029157600080fd5b5061029a6109b1565b6040516102a79190613ab9565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190613625565b610a43565b6040516102e49190613a1c565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613542565b610abf565b005b34801561032257600080fd5b5061032b610bca565b6040516103389190613c1b565b60405180910390f35b34801561034d57600080fd5b506103686004803603810190610363919061342c565b610be1565b005b34801561037657600080fd5b50610391600480360381019061038c9190613542565b610bf1565b005b34801561039f57600080fd5b506103a8610cd2565b005b3480156103b657600080fd5b506103bf610d7a565b005b3480156103cd57600080fd5b506103e860048036038101906103e3919061367f565b610ea5565b005b3480156103f657600080fd5b50610411600480360381019061040c919061342c565b61101e565b005b34801561041f57600080fd5b5061043a600480360381019061043591906135dc565b61103e565b005b34801561044857600080fd5b506104516110d4565b60405161045e9190613a83565b60405180910390f35b34801561047357600080fd5b5061048e600480360381019061048991906135dc565b6110e7565b005b34801561049c57600080fd5b506104b760048036038101906104b29190613625565b61117d565b6040516104c49190613a1c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613625565b611193565b005b34801561050257600080fd5b5061051d60048036038101906105189190613392565b611219565b60405161052a9190613c1b565b60405180910390f35b34801561053f57600080fd5b506105486112e9565b005b34801561055657600080fd5b5061055f611371565b005b34801561056d57600080fd5b50610576611419565b6040516105839190613a9e565b60405180910390f35b34801561059857600080fd5b506105a161143f565b6040516105ae9190613a1c565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613625565b611469565b005b3480156105ec57600080fd5b506105f56114ef565b6040516106029190613ab9565b60405180910390f35b34801561061757600080fd5b50610620611581565b60405161062d9190613c1b565b60405180910390f35b610650600480360381019061064b9190613625565b611587565b005b34801561065e57600080fd5b5061067960048036038101906106749190613502565b6119d6565b005b34801561068757600080fd5b50610690611b4e565b60405161069d9190613ab9565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c8919061347f565b611bdc565b005b3480156106db57600080fd5b506106e4611c58565b6040516106f19190613c1b565b60405180910390f35b34801561070657600080fd5b5061070f611e53565b60405161071c9190613c1b565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613625565b611e59565b6040516107599190613ab9565b60405180910390f35b34801561076e57600080fd5b50610777611f1a565b6040516107849190613a83565b60405180910390f35b34801561079957600080fd5b506107a2611f2d565b6040516107af9190613c1b565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da91906133ec565b611f33565b6040516107ec9190613a83565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190613392565b611fc7565b005b34801561082a57600080fd5b506108336120bf565b6040516108409190613c1b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109245750610923826120c5565b5b9050919050565b61093361212f565b73ffffffffffffffffffffffffffffffffffffffff1661095161143f565b73ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90613b7b565b60405180910390fd5b80600f8190555050565b6060600280546109c090613f21565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90613f21565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a4e82612137565b610a84576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aca8261117d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b32576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5161212f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b835750610b8181610b7c61212f565b611f33565b155b15610bba576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc5838383612185565b505050565b6000610bd4612237565b6001546000540303905090565b610bec838383612240565b505050565b610bf961212f565b73ffffffffffffffffffffffffffffffffffffffff16610c1761143f565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490613b7b565b60405180910390fd5b600d5481610c79610bca565b610c839190613d20565b1115610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90613b5b565b60405180910390fd5b610cce82826126f6565b5050565b610cda61212f565b73ffffffffffffffffffffffffffffffffffffffff16610cf861143f565b73ffffffffffffffffffffffffffffffffffffffff1614610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590613b7b565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b610d8261212f565b73ffffffffffffffffffffffffffffffffffffffff16610da061143f565b73ffffffffffffffffffffffffffffffffffffffff1614610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90613b7b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610e1c90613a07565b60006040518083038185875af1925050503d8060008114610e59576040519150601f19603f3d011682016040523d82523d6000602084013e610e5e565b606091505b5050905080610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990613bdb565b60405180910390fd5b50565b610ead61212f565b73ffffffffffffffffffffffffffffffffffffffff16610ecb61143f565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613b7b565b60405180910390fd5b600e60009054906101000a900460ff16610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790613adb565b60405180910390fd5b600f546010541115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90613b3b565b60405180910390fd5b600c54821115610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390613bfb565b60405180910390fd5b61100681836126f6565b816010546110149190613d20565b6010819055505050565b61103983838360405180602001604052806000815250611bdc565b505050565b61104661212f565b73ffffffffffffffffffffffffffffffffffffffff1661106461143f565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190613b7b565b60405180910390fd5b80600a90805190602001906110d0929190613139565b5050565b600e60019054906101000a900460ff1681565b6110ef61212f565b73ffffffffffffffffffffffffffffffffffffffff1661110d61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90613b7b565b60405180910390fd5b8060099080519060200190611179929190613139565b5050565b600061118882612714565b600001519050919050565b61119b61212f565b73ffffffffffffffffffffffffffffffffffffffff166111b961143f565b73ffffffffffffffffffffffffffffffffffffffff161461120f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120690613b7b565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611281576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6112f161212f565b73ffffffffffffffffffffffffffffffffffffffff1661130f61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613b7b565b60405180910390fd5b61136f60006129a3565b565b61137961212f565b73ffffffffffffffffffffffffffffffffffffffff1661139761143f565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490613b7b565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61147161212f565b73ffffffffffffffffffffffffffffffffffffffff1661148f61143f565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90613b7b565b60405180910390fd5b80600b8190555050565b6060600380546114fe90613f21565b80601f016020809104026020016040519081016040528092919081815260200182805461152a90613f21565b80156115775780601f1061154c57610100808354040283529160200191611577565b820191906000526020600020905b81548152906001019060200180831161155a57829003601f168201915b5050505050905090565b600b5481565b600e60009054906101000a900460ff166115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90613adb565b60405180910390fd5b6000600b5490506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164757600080fd5b505afa15801561165b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167f9190613652565b90506000600190505b8181116117f3576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116ec9190613c1b565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906133bf565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117df57600015156011600084815260200190815260200160002060009054906101000a900460ff16151514156117d4576000935060016011600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506117d9565b600193505b506117f3565b81806117ea90613f84565b92505050611688565b600083141561186457600d546001611809610bca565b6118139190613d20565b1115611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90613b1b565b60405180910390fd5b61185f3360016126f6565b6119d0565b600d5484611870610bca565b61187a9190613d20565b11156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613b1b565b60405180910390fd5b600c54841115611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613bfb565b60405180910390fd5b6001831415611974576002600b54856119199190613da7565b6119239190613d76565b341015611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613bbb565b60405180910390fd5b61196f33856126f6565b6119cf565b600b54846119829190613da7565b3410156119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb90613bbb565b60405180910390fd5b6119ce33856126f6565b5b5b50505050565b6119de61212f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a43576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a5061212f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd61212f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b429190613a83565b60405180910390a35050565b600a8054611b5b90613f21565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8790613f21565b8015611bd45780601f10611ba957610100808354040283529160200191611bd4565b820191906000526020600020905b815481529060010190602001808311611bb757829003601f168201915b505050505081565b611be7848484612240565b611c068373ffffffffffffffffffffffffffffffffffffffff16612a69565b8015611c1b5750611c1984848484612a8c565b155b15611c52576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600080600b5490506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611cca57600080fd5b505afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190613652565b90506000600190505b818111611e4a576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611d6f9190613c1b565b60206040518083038186803b158015611d8757600080fd5b505afa158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf91906133bf565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e3657600015156011600084815260200190815260200160002060009054906101000a900460ff1615151415611e2b5760009350611e30565b600193505b50611e4a565b8180611e4190613f84565b92505050611d0b565b82935050505090565b600f5481565b6060611e6482612137565b611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90613b9b565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611ee757600a604051602001611ed191906139c1565b6040516020818303038152906040529050611f15565b6009611ef283612bec565b604051602001611f039291906139d8565b60405160208183030381529060405290505b919050565b600e60009054906101000a900460ff1681565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fcf61212f565b73ffffffffffffffffffffffffffffffffffffffff16611fed61143f565b73ffffffffffffffffffffffffffffffffffffffff1614612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a90613b7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120aa90613afb565b60405180910390fd5b6120bc816129a3565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612142612237565b11158015612151575060005482105b801561217e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061224b82612714565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122b6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122d761212f565b73ffffffffffffffffffffffffffffffffffffffff16148061230657506123058561230061212f565b611f33565b5b8061234b575061231461212f565b73ffffffffffffffffffffffffffffffffffffffff1661233384610a43565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612384576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123eb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123f88585856001612d4d565b61240460008487612185565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561268457600054821461268357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ef8585856001612d53565b5050505050565b612710828260405180602001604052806000815250612d59565b5050565b61271c6131bf565b60008290508061272a612237565b11158015612739575060005481105b1561296c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161296a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461284e57809250505061299e565b5b60011561296957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461296457809250505061299e565b61284f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ab261212f565b8786866040518563ffffffff1660e01b8152600401612ad49493929190613a37565b602060405180830381600087803b158015612aee57600080fd5b505af1925050508015612b1f57506040513d601f19601f82011682018060405250810190612b1c91906135af565b60015b612b99573d8060008114612b4f576040519150601f19603f3d011682016040523d82523d6000602084013e612b54565b606091505b50600081511415612b91576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612c34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d48565b600082905060005b60008214612c66578080612c4f90613f84565b915050600a82612c5f9190613d76565b9150612c3c565b60008167ffffffffffffffff811115612c8257612c816140ba565b5b6040519080825280601f01601f191660200182016040528015612cb45781602001600182028036833780820191505090505b5090505b60008514612d4157600182612ccd9190613e01565b9150600a85612cdc9190613fcd565b6030612ce89190613d20565b60f81b818381518110612cfe57612cfd61408b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d3a9190613d76565b9450612cb8565b8093505050505b919050565b50505050565b50505050565b612d668383836001612d6b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612dd8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612e13576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e206000868387612d4d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612fea5750612fe98773ffffffffffffffffffffffffffffffffffffffff16612a69565b5b156130b0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461305f6000888480600101955088612a8c565b613095576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612ff05782600054146130ab57600080fd5b61311c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156130b1575b8160008190555050506131326000868387612d53565b5050505050565b82805461314590613f21565b90600052602060002090601f01602090048101928261316757600085556131ae565b82601f1061318057805160ff19168380011785556131ae565b828001600101855582156131ae579182015b828111156131ad578251825591602001919060010190613192565b5b5090506131bb9190613202565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561321b576000816000905550600101613203565b5090565b600061323261322d84613c5b565b613c36565b90508281526020810184848401111561324e5761324d6140ee565b5b613259848285613edf565b509392505050565b600061327461326f84613c8c565b613c36565b9050828152602081018484840111156132905761328f6140ee565b5b61329b848285613edf565b509392505050565b6000813590506132b281614320565b92915050565b6000815190506132c781614320565b92915050565b6000813590506132dc81614337565b92915050565b6000813590506132f18161434e565b92915050565b6000815190506133068161434e565b92915050565b600082601f830112613321576133206140e9565b5b813561333184826020860161321f565b91505092915050565b600082601f83011261334f5761334e6140e9565b5b813561335f848260208601613261565b91505092915050565b60008135905061337781614365565b92915050565b60008151905061338c81614365565b92915050565b6000602082840312156133a8576133a76140f8565b5b60006133b6848285016132a3565b91505092915050565b6000602082840312156133d5576133d46140f8565b5b60006133e3848285016132b8565b91505092915050565b60008060408385031215613403576134026140f8565b5b6000613411858286016132a3565b9250506020613422858286016132a3565b9150509250929050565b600080600060608486031215613445576134446140f8565b5b6000613453868287016132a3565b9350506020613464868287016132a3565b925050604061347586828701613368565b9150509250925092565b60008060008060808587031215613499576134986140f8565b5b60006134a7878288016132a3565b94505060206134b8878288016132a3565b93505060406134c987828801613368565b925050606085013567ffffffffffffffff8111156134ea576134e96140f3565b5b6134f68782880161330c565b91505092959194509250565b60008060408385031215613519576135186140f8565b5b6000613527858286016132a3565b9250506020613538858286016132cd565b9150509250929050565b60008060408385031215613559576135586140f8565b5b6000613567858286016132a3565b925050602061357885828601613368565b9150509250929050565b600060208284031215613598576135976140f8565b5b60006135a6848285016132e2565b91505092915050565b6000602082840312156135c5576135c46140f8565b5b60006135d3848285016132f7565b91505092915050565b6000602082840312156135f2576135f16140f8565b5b600082013567ffffffffffffffff8111156136105761360f6140f3565b5b61361c8482850161333a565b91505092915050565b60006020828403121561363b5761363a6140f8565b5b600061364984828501613368565b91505092915050565b600060208284031215613668576136676140f8565b5b60006136768482850161337d565b91505092915050565b60008060408385031215613696576136956140f8565b5b60006136a485828601613368565b92505060206136b5858286016132a3565b9150509250929050565b6136c881613e35565b82525050565b6136d781613e47565b82525050565b60006136e882613cd2565b6136f28185613ce8565b9350613702818560208601613eee565b61370b816140fd565b840191505092915050565b61371f81613ea9565b82525050565b600061373082613cdd565b61373a8185613d04565b935061374a818560208601613eee565b613753816140fd565b840191505092915050565b600061376982613cdd565b6137738185613d15565b9350613783818560208601613eee565b80840191505092915050565b6000815461379c81613f21565b6137a68186613d15565b945060018216600081146137c157600181146137d257613805565b60ff19831686528186019350613805565b6137db85613cbd565b60005b838110156137fd578154818901526001820191506020810190506137de565b838801955050505b50505092915050565b600061381b601783613d04565b91506138268261410e565b602082019050919050565b600061383e602683613d04565b915061384982614137565b604082019050919050565b6000613861600e83613d04565b915061386c82614186565b602082019050919050565b6000613884601583613d04565b915061388f826141af565b602082019050919050565b60006138a7601283613d04565b91506138b2826141d8565b602082019050919050565b60006138ca600583613d15565b91506138d582614201565b600582019050919050565b60006138ed602083613d04565b91506138f88261422a565b602082019050919050565b6000613910602f83613d04565b915061391b82614253565b604082019050919050565b6000613933601d83613d04565b915061393e826142a2565b602082019050919050565b6000613956600083613cf9565b9150613961826142cb565b600082019050919050565b6000613979601083613d04565b9150613984826142ce565b602082019050919050565b600061399c601383613d04565b91506139a7826142f7565b602082019050919050565b6139bb81613e9f565b82525050565b60006139cd828461378f565b915081905092915050565b60006139e4828561378f565b91506139f0828461375e565b91506139fb826138bd565b91508190509392505050565b6000613a1282613949565b9150819050919050565b6000602082019050613a3160008301846136bf565b92915050565b6000608082019050613a4c60008301876136bf565b613a5960208301866136bf565b613a6660408301856139b2565b8181036060830152613a7881846136dd565b905095945050505050565b6000602082019050613a9860008301846136ce565b92915050565b6000602082019050613ab36000830184613716565b92915050565b60006020820190508181036000830152613ad38184613725565b905092915050565b60006020820190508181036000830152613af48161380e565b9050919050565b60006020820190508181036000830152613b1481613831565b9050919050565b60006020820190508181036000830152613b3481613854565b9050919050565b60006020820190508181036000830152613b5481613877565b9050919050565b60006020820190508181036000830152613b748161389a565b9050919050565b60006020820190508181036000830152613b94816138e0565b9050919050565b60006020820190508181036000830152613bb481613903565b9050919050565b60006020820190508181036000830152613bd481613926565b9050919050565b60006020820190508181036000830152613bf48161396c565b9050919050565b60006020820190508181036000830152613c148161398f565b9050919050565b6000602082019050613c3060008301846139b2565b92915050565b6000613c40613c51565b9050613c4c8282613f53565b919050565b6000604051905090565b600067ffffffffffffffff821115613c7657613c756140ba565b5b613c7f826140fd565b9050602081019050919050565b600067ffffffffffffffff821115613ca757613ca66140ba565b5b613cb0826140fd565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d2b82613e9f565b9150613d3683613e9f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6b57613d6a613ffe565b5b828201905092915050565b6000613d8182613e9f565b9150613d8c83613e9f565b925082613d9c57613d9b61402d565b5b828204905092915050565b6000613db282613e9f565b9150613dbd83613e9f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df657613df5613ffe565b5b828202905092915050565b6000613e0c82613e9f565b9150613e1783613e9f565b925082821015613e2a57613e29613ffe565b5b828203905092915050565b6000613e4082613e7f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613eb482613ebb565b9050919050565b6000613ec682613ecd565b9050919050565b6000613ed882613e7f565b9050919050565b82818337600083830152505050565b60005b83811015613f0c578082015181840152602081019050613ef1565b83811115613f1b576000848401525b50505050565b60006002820490506001821680613f3957607f821691505b60208210811415613f4d57613f4c61405c565b5b50919050565b613f5c826140fd565b810181811067ffffffffffffffff82111715613f7b57613f7a6140ba565b5b80604052505050565b6000613f8f82613e9f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fc257613fc1613ffe565b5b600182019050919050565b6000613fd882613e9f565b9150613fe383613e9f565b925082613ff357613ff261402d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74696e67206973206e6f74206c69766520796574000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f72652044726f696473000000000000000000000000000000000000600082015250565b7f4e6f206d6f7265204e465420666f72204f776e65720000000000000000000000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b61432981613e35565b811461433457600080fd5b50565b61434081613e47565b811461434b57600080fd5b50565b61435781613e53565b811461436257600080fd5b50565b61436e81613e9f565b811461437957600080fd5b5056fea2646970667358221220bc43446fd43c5ad8deea48aa87e226a84024b2a51a6877dd8ef972837e19431364736f6c63430008070033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063a45ba8e7116100ab578063d12397301161006f578063d123973014610762578063d5abeb011461078d578063e985e9c5146107b8578063f2fde38b146107f5578063f968adbe1461081e5761021a565b8063a45ba8e71461067b578063b88d4fde146106a6578063bac7bb9f146106cf578063bb00c8f9146106fa578063c87b56dd146107255761021a565b806391b7f5ed116100f257806391b7f5ed146105b757806395d89b41146105e0578063a035b1fe1461060b578063a0712d6814610636578063a22cb465146106525761021a565b8063715018a6146105335780637ba5e6211461054a5780638069182d146105615780638da5cb5b1461058c5761021a565b80633ccfd60b116101a65780635183022711610175578063518302271461043c57806355f804b3146104675780636352211e146104905780636f8b44b0146104cd57806370a08231146104f65761021a565b80633ccfd60b146103aa5780633fcf79dc146103c157806342842e0e146103ea5780634fdd43cb146104135761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806318160ddd1461031657806323b872dd146103415780633175668c1461036a5780633bd64968146103935761021a565b806301ffc9a71461021f578063064f0db41461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613582565b610849565b6040516102539190613a83565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e9190613625565b61092b565b005b34801561029157600080fd5b5061029a6109b1565b6040516102a79190613ab9565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190613625565b610a43565b6040516102e49190613a1c565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613542565b610abf565b005b34801561032257600080fd5b5061032b610bca565b6040516103389190613c1b565b60405180910390f35b34801561034d57600080fd5b506103686004803603810190610363919061342c565b610be1565b005b34801561037657600080fd5b50610391600480360381019061038c9190613542565b610bf1565b005b34801561039f57600080fd5b506103a8610cd2565b005b3480156103b657600080fd5b506103bf610d7a565b005b3480156103cd57600080fd5b506103e860048036038101906103e3919061367f565b610ea5565b005b3480156103f657600080fd5b50610411600480360381019061040c919061342c565b61101e565b005b34801561041f57600080fd5b5061043a600480360381019061043591906135dc565b61103e565b005b34801561044857600080fd5b506104516110d4565b60405161045e9190613a83565b60405180910390f35b34801561047357600080fd5b5061048e600480360381019061048991906135dc565b6110e7565b005b34801561049c57600080fd5b506104b760048036038101906104b29190613625565b61117d565b6040516104c49190613a1c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613625565b611193565b005b34801561050257600080fd5b5061051d60048036038101906105189190613392565b611219565b60405161052a9190613c1b565b60405180910390f35b34801561053f57600080fd5b506105486112e9565b005b34801561055657600080fd5b5061055f611371565b005b34801561056d57600080fd5b50610576611419565b6040516105839190613a9e565b60405180910390f35b34801561059857600080fd5b506105a161143f565b6040516105ae9190613a1c565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613625565b611469565b005b3480156105ec57600080fd5b506105f56114ef565b6040516106029190613ab9565b60405180910390f35b34801561061757600080fd5b50610620611581565b60405161062d9190613c1b565b60405180910390f35b610650600480360381019061064b9190613625565b611587565b005b34801561065e57600080fd5b5061067960048036038101906106749190613502565b6119d6565b005b34801561068757600080fd5b50610690611b4e565b60405161069d9190613ab9565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c8919061347f565b611bdc565b005b3480156106db57600080fd5b506106e4611c58565b6040516106f19190613c1b565b60405180910390f35b34801561070657600080fd5b5061070f611e53565b60405161071c9190613c1b565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613625565b611e59565b6040516107599190613ab9565b60405180910390f35b34801561076e57600080fd5b50610777611f1a565b6040516107849190613a83565b60405180910390f35b34801561079957600080fd5b506107a2611f2d565b6040516107af9190613c1b565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da91906133ec565b611f33565b6040516107ec9190613a83565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190613392565b611fc7565b005b34801561082a57600080fd5b506108336120bf565b6040516108409190613c1b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109245750610923826120c5565b5b9050919050565b61093361212f565b73ffffffffffffffffffffffffffffffffffffffff1661095161143f565b73ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90613b7b565b60405180910390fd5b80600f8190555050565b6060600280546109c090613f21565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90613f21565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a4e82612137565b610a84576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aca8261117d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b32576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5161212f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b835750610b8181610b7c61212f565b611f33565b155b15610bba576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc5838383612185565b505050565b6000610bd4612237565b6001546000540303905090565b610bec838383612240565b505050565b610bf961212f565b73ffffffffffffffffffffffffffffffffffffffff16610c1761143f565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490613b7b565b60405180910390fd5b600d5481610c79610bca565b610c839190613d20565b1115610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90613b5b565b60405180910390fd5b610cce82826126f6565b5050565b610cda61212f565b73ffffffffffffffffffffffffffffffffffffffff16610cf861143f565b73ffffffffffffffffffffffffffffffffffffffff1614610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590613b7b565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b610d8261212f565b73ffffffffffffffffffffffffffffffffffffffff16610da061143f565b73ffffffffffffffffffffffffffffffffffffffff1614610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90613b7b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610e1c90613a07565b60006040518083038185875af1925050503d8060008114610e59576040519150601f19603f3d011682016040523d82523d6000602084013e610e5e565b606091505b5050905080610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990613bdb565b60405180910390fd5b50565b610ead61212f565b73ffffffffffffffffffffffffffffffffffffffff16610ecb61143f565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613b7b565b60405180910390fd5b600e60009054906101000a900460ff16610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790613adb565b60405180910390fd5b600f546010541115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90613b3b565b60405180910390fd5b600c54821115610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390613bfb565b60405180910390fd5b61100681836126f6565b816010546110149190613d20565b6010819055505050565b61103983838360405180602001604052806000815250611bdc565b505050565b61104661212f565b73ffffffffffffffffffffffffffffffffffffffff1661106461143f565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190613b7b565b60405180910390fd5b80600a90805190602001906110d0929190613139565b5050565b600e60019054906101000a900460ff1681565b6110ef61212f565b73ffffffffffffffffffffffffffffffffffffffff1661110d61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90613b7b565b60405180910390fd5b8060099080519060200190611179929190613139565b5050565b600061118882612714565b600001519050919050565b61119b61212f565b73ffffffffffffffffffffffffffffffffffffffff166111b961143f565b73ffffffffffffffffffffffffffffffffffffffff161461120f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120690613b7b565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611281576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6112f161212f565b73ffffffffffffffffffffffffffffffffffffffff1661130f61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613b7b565b60405180910390fd5b61136f60006129a3565b565b61137961212f565b73ffffffffffffffffffffffffffffffffffffffff1661139761143f565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490613b7b565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61147161212f565b73ffffffffffffffffffffffffffffffffffffffff1661148f61143f565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90613b7b565b60405180910390fd5b80600b8190555050565b6060600380546114fe90613f21565b80601f016020809104026020016040519081016040528092919081815260200182805461152a90613f21565b80156115775780601f1061154c57610100808354040283529160200191611577565b820191906000526020600020905b81548152906001019060200180831161155a57829003601f168201915b5050505050905090565b600b5481565b600e60009054906101000a900460ff166115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90613adb565b60405180910390fd5b6000600b5490506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164757600080fd5b505afa15801561165b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167f9190613652565b90506000600190505b8181116117f3576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116ec9190613c1b565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906133bf565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117df57600015156011600084815260200190815260200160002060009054906101000a900460ff16151514156117d4576000935060016011600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506117d9565b600193505b506117f3565b81806117ea90613f84565b92505050611688565b600083141561186457600d546001611809610bca565b6118139190613d20565b1115611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90613b1b565b60405180910390fd5b61185f3360016126f6565b6119d0565b600d5484611870610bca565b61187a9190613d20565b11156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613b1b565b60405180910390fd5b600c54841115611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613bfb565b60405180910390fd5b6001831415611974576002600b54856119199190613da7565b6119239190613d76565b341015611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613bbb565b60405180910390fd5b61196f33856126f6565b6119cf565b600b54846119829190613da7565b3410156119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb90613bbb565b60405180910390fd5b6119ce33856126f6565b5b5b50505050565b6119de61212f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a43576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a5061212f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd61212f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b429190613a83565b60405180910390a35050565b600a8054611b5b90613f21565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8790613f21565b8015611bd45780601f10611ba957610100808354040283529160200191611bd4565b820191906000526020600020905b815481529060010190602001808311611bb757829003601f168201915b505050505081565b611be7848484612240565b611c068373ffffffffffffffffffffffffffffffffffffffff16612a69565b8015611c1b5750611c1984848484612a8c565b155b15611c52576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600080600b5490506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611cca57600080fd5b505afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190613652565b90506000600190505b818111611e4a576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611d6f9190613c1b565b60206040518083038186803b158015611d8757600080fd5b505afa158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf91906133bf565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e3657600015156011600084815260200190815260200160002060009054906101000a900460ff1615151415611e2b5760009350611e30565b600193505b50611e4a565b8180611e4190613f84565b92505050611d0b565b82935050505090565b600f5481565b6060611e6482612137565b611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90613b9b565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611ee757600a604051602001611ed191906139c1565b6040516020818303038152906040529050611f15565b6009611ef283612bec565b604051602001611f039291906139d8565b60405160208183030381529060405290505b919050565b600e60009054906101000a900460ff1681565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fcf61212f565b73ffffffffffffffffffffffffffffffffffffffff16611fed61143f565b73ffffffffffffffffffffffffffffffffffffffff1614612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a90613b7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120aa90613afb565b60405180910390fd5b6120bc816129a3565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612142612237565b11158015612151575060005482105b801561217e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061224b82612714565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122b6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122d761212f565b73ffffffffffffffffffffffffffffffffffffffff16148061230657506123058561230061212f565b611f33565b5b8061234b575061231461212f565b73ffffffffffffffffffffffffffffffffffffffff1661233384610a43565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612384576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123eb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123f88585856001612d4d565b61240460008487612185565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561268457600054821461268357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ef8585856001612d53565b5050505050565b612710828260405180602001604052806000815250612d59565b5050565b61271c6131bf565b60008290508061272a612237565b11158015612739575060005481105b1561296c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161296a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461284e57809250505061299e565b5b60011561296957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461296457809250505061299e565b61284f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ab261212f565b8786866040518563ffffffff1660e01b8152600401612ad49493929190613a37565b602060405180830381600087803b158015612aee57600080fd5b505af1925050508015612b1f57506040513d601f19601f82011682018060405250810190612b1c91906135af565b60015b612b99573d8060008114612b4f576040519150601f19603f3d011682016040523d82523d6000602084013e612b54565b606091505b50600081511415612b91576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612c34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d48565b600082905060005b60008214612c66578080612c4f90613f84565b915050600a82612c5f9190613d76565b9150612c3c565b60008167ffffffffffffffff811115612c8257612c816140ba565b5b6040519080825280601f01601f191660200182016040528015612cb45781602001600182028036833780820191505090505b5090505b60008514612d4157600182612ccd9190613e01565b9150600a85612cdc9190613fcd565b6030612ce89190613d20565b60f81b818381518110612cfe57612cfd61408b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d3a9190613d76565b9450612cb8565b8093505050505b919050565b50505050565b50505050565b612d668383836001612d6b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612dd8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612e13576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e206000868387612d4d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612fea5750612fe98773ffffffffffffffffffffffffffffffffffffffff16612a69565b5b156130b0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461305f6000888480600101955088612a8c565b613095576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612ff05782600054146130ab57600080fd5b61311c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156130b1575b8160008190555050506131326000868387612d53565b5050505050565b82805461314590613f21565b90600052602060002090601f01602090048101928261316757600085556131ae565b82601f1061318057805160ff19168380011785556131ae565b828001600101855582156131ae579182015b828111156131ad578251825591602001919060010190613192565b5b5090506131bb9190613202565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561321b576000816000905550600101613203565b5090565b600061323261322d84613c5b565b613c36565b90508281526020810184848401111561324e5761324d6140ee565b5b613259848285613edf565b509392505050565b600061327461326f84613c8c565b613c36565b9050828152602081018484840111156132905761328f6140ee565b5b61329b848285613edf565b509392505050565b6000813590506132b281614320565b92915050565b6000815190506132c781614320565b92915050565b6000813590506132dc81614337565b92915050565b6000813590506132f18161434e565b92915050565b6000815190506133068161434e565b92915050565b600082601f830112613321576133206140e9565b5b813561333184826020860161321f565b91505092915050565b600082601f83011261334f5761334e6140e9565b5b813561335f848260208601613261565b91505092915050565b60008135905061337781614365565b92915050565b60008151905061338c81614365565b92915050565b6000602082840312156133a8576133a76140f8565b5b60006133b6848285016132a3565b91505092915050565b6000602082840312156133d5576133d46140f8565b5b60006133e3848285016132b8565b91505092915050565b60008060408385031215613403576134026140f8565b5b6000613411858286016132a3565b9250506020613422858286016132a3565b9150509250929050565b600080600060608486031215613445576134446140f8565b5b6000613453868287016132a3565b9350506020613464868287016132a3565b925050604061347586828701613368565b9150509250925092565b60008060008060808587031215613499576134986140f8565b5b60006134a7878288016132a3565b94505060206134b8878288016132a3565b93505060406134c987828801613368565b925050606085013567ffffffffffffffff8111156134ea576134e96140f3565b5b6134f68782880161330c565b91505092959194509250565b60008060408385031215613519576135186140f8565b5b6000613527858286016132a3565b9250506020613538858286016132cd565b9150509250929050565b60008060408385031215613559576135586140f8565b5b6000613567858286016132a3565b925050602061357885828601613368565b9150509250929050565b600060208284031215613598576135976140f8565b5b60006135a6848285016132e2565b91505092915050565b6000602082840312156135c5576135c46140f8565b5b60006135d3848285016132f7565b91505092915050565b6000602082840312156135f2576135f16140f8565b5b600082013567ffffffffffffffff8111156136105761360f6140f3565b5b61361c8482850161333a565b91505092915050565b60006020828403121561363b5761363a6140f8565b5b600061364984828501613368565b91505092915050565b600060208284031215613668576136676140f8565b5b60006136768482850161337d565b91505092915050565b60008060408385031215613696576136956140f8565b5b60006136a485828601613368565b92505060206136b5858286016132a3565b9150509250929050565b6136c881613e35565b82525050565b6136d781613e47565b82525050565b60006136e882613cd2565b6136f28185613ce8565b9350613702818560208601613eee565b61370b816140fd565b840191505092915050565b61371f81613ea9565b82525050565b600061373082613cdd565b61373a8185613d04565b935061374a818560208601613eee565b613753816140fd565b840191505092915050565b600061376982613cdd565b6137738185613d15565b9350613783818560208601613eee565b80840191505092915050565b6000815461379c81613f21565b6137a68186613d15565b945060018216600081146137c157600181146137d257613805565b60ff19831686528186019350613805565b6137db85613cbd565b60005b838110156137fd578154818901526001820191506020810190506137de565b838801955050505b50505092915050565b600061381b601783613d04565b91506138268261410e565b602082019050919050565b600061383e602683613d04565b915061384982614137565b604082019050919050565b6000613861600e83613d04565b915061386c82614186565b602082019050919050565b6000613884601583613d04565b915061388f826141af565b602082019050919050565b60006138a7601283613d04565b91506138b2826141d8565b602082019050919050565b60006138ca600583613d15565b91506138d582614201565b600582019050919050565b60006138ed602083613d04565b91506138f88261422a565b602082019050919050565b6000613910602f83613d04565b915061391b82614253565b604082019050919050565b6000613933601d83613d04565b915061393e826142a2565b602082019050919050565b6000613956600083613cf9565b9150613961826142cb565b600082019050919050565b6000613979601083613d04565b9150613984826142ce565b602082019050919050565b600061399c601383613d04565b91506139a7826142f7565b602082019050919050565b6139bb81613e9f565b82525050565b60006139cd828461378f565b915081905092915050565b60006139e4828561378f565b91506139f0828461375e565b91506139fb826138bd565b91508190509392505050565b6000613a1282613949565b9150819050919050565b6000602082019050613a3160008301846136bf565b92915050565b6000608082019050613a4c60008301876136bf565b613a5960208301866136bf565b613a6660408301856139b2565b8181036060830152613a7881846136dd565b905095945050505050565b6000602082019050613a9860008301846136ce565b92915050565b6000602082019050613ab36000830184613716565b92915050565b60006020820190508181036000830152613ad38184613725565b905092915050565b60006020820190508181036000830152613af48161380e565b9050919050565b60006020820190508181036000830152613b1481613831565b9050919050565b60006020820190508181036000830152613b3481613854565b9050919050565b60006020820190508181036000830152613b5481613877565b9050919050565b60006020820190508181036000830152613b748161389a565b9050919050565b60006020820190508181036000830152613b94816138e0565b9050919050565b60006020820190508181036000830152613bb481613903565b9050919050565b60006020820190508181036000830152613bd481613926565b9050919050565b60006020820190508181036000830152613bf48161396c565b9050919050565b60006020820190508181036000830152613c148161398f565b9050919050565b6000602082019050613c3060008301846139b2565b92915050565b6000613c40613c51565b9050613c4c8282613f53565b919050565b6000604051905090565b600067ffffffffffffffff821115613c7657613c756140ba565b5b613c7f826140fd565b9050602081019050919050565b600067ffffffffffffffff821115613ca757613ca66140ba565b5b613cb0826140fd565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d2b82613e9f565b9150613d3683613e9f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6b57613d6a613ffe565b5b828201905092915050565b6000613d8182613e9f565b9150613d8c83613e9f565b925082613d9c57613d9b61402d565b5b828204905092915050565b6000613db282613e9f565b9150613dbd83613e9f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df657613df5613ffe565b5b828202905092915050565b6000613e0c82613e9f565b9150613e1783613e9f565b925082821015613e2a57613e29613ffe565b5b828203905092915050565b6000613e4082613e7f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613eb482613ebb565b9050919050565b6000613ec682613ecd565b9050919050565b6000613ed882613e7f565b9050919050565b82818337600083830152505050565b60005b83811015613f0c578082015181840152602081019050613ef1565b83811115613f1b576000848401525b50505050565b60006002820490506001821680613f3957607f821691505b60208210811415613f4d57613f4c61405c565b5b50919050565b613f5c826140fd565b810181811067ffffffffffffffff82111715613f7b57613f7a6140ba565b5b80604052505050565b6000613f8f82613e9f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fc257613fc1613ffe565b5b600182019050919050565b6000613fd882613e9f565b9150613fe383613e9f565b925082613ff357613ff261402d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74696e67206973206e6f74206c69766520796574000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f72652044726f696473000000000000000000000000000000000000600082015250565b7f4e6f206d6f7265204e465420666f72204f776e65720000000000000000000000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b61432981613e35565b811461433457600080fd5b50565b61434081613e47565b811461434b57600080fd5b50565b61435781613e53565b811461436257600080fd5b50565b61436e81613e9f565b811461437957600080fd5b5056fea2646970667358221220bc43446fd43c5ad8deea48aa87e226a84024b2a51a6877dd8ef972837e19431364736f6c63430008070033

Deployed Bytecode Sourcemap

60024:4777:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43625:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63567:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46738:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48241:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47804:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42874:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49106:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64016:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63389:78;;;;;;;;;;;;;:::i;:::-;;63802:206;;;;;;;;;;;;;:::i;:::-;;60777:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49347:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63033:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60337:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62937:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46546:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63176:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43994:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4740:103;;;;;;;;;;;;;:::i;:::-;;63475:84;;;;;;;;;;;;;:::i;:::-;;60495:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4089:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63289:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46907:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60177:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61140:1200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48517:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60137:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49603:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64211:585;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60373:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62464:465;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60297:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60256:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48875:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4998:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60219:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43625:305;43727:4;43779:25;43764:40;;;:11;:40;;;;:105;;;;43836:33;43821:48;;;:11;:48;;;;43764:105;:158;;;;43886:36;43910:11;43886:23;:36::i;:::-;43764:158;43744:178;;43625:305;;;:::o;63567:126::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63669:16:::1;63651:15;:34;;;;63567:126:::0;:::o;46738:100::-;46792:13;46825:5;46818:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46738:100;:::o;48241:204::-;48309:7;48334:16;48342:7;48334;:16::i;:::-;48329:64;;48359:34;;;;;;;;;;;;;;48329:64;48413:15;:24;48429:7;48413:24;;;;;;;;;;;;;;;;;;;;;48406:31;;48241:204;;;:::o;47804:371::-;47877:13;47893:24;47909:7;47893:15;:24::i;:::-;47877:40;;47938:5;47932:11;;:2;:11;;;47928:48;;;47952:24;;;;;;;;;;;;;;47928:48;48009:5;47993:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;48019:37;48036:5;48043:12;:10;:12::i;:::-;48019:16;:37::i;:::-;48018:38;47993:63;47989:138;;;48080:35;;;;;;;;;;;;;;47989:138;48139:28;48148:2;48152:7;48161:5;48139:8;:28::i;:::-;47866:309;47804:371;;:::o;42874:303::-;42918:7;43143:15;:13;:15::i;:::-;43128:12;;43112:13;;:28;:46;43105:53;;42874:303;:::o;49106:170::-;49240:28;49250:4;49256:2;49260:7;49240:9;:28::i;:::-;49106:170;;;:::o;64016:187::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64131:9:::1;;64119:8;64103:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;64095:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64174:23;64184:2;64188:8;64174:9;:23::i;:::-;64016:187:::0;;:::o;63389:78::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63451:8:::1;;;;;;;;;;;63450:9;63439:8;;:20;;;;;;;;;;;;;;;;;;63389:78::o:0;63802:206::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63853:12:::1;63879:10;63871:24;;63917:21;63871:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63852:101;;;63972:7;63964:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;63841:167;63802:206::o:0;60777:355::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60868:11:::1;;;;;;;;;;;60860:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60942:15;;60924:14;;:33;;60916:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;61009:8;;61000:5;:17;;60992:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61050:26;61060:8;61070:5;61050:9;:26::i;:::-;61119:5;61102:14;;:22;;;;:::i;:::-;61085:14;:39;;;;60777:355:::0;;:::o;49347:185::-;49485:39;49502:4;49508:2;49512:7;49485:39;;;;;;;;;;;;:16;:39::i;:::-;49347:185;;;:::o;63033:135::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63142:18:::1;63122:17;:38;;;;;;;;;;;;:::i;:::-;;63033:135:::0;:::o;60337:27::-;;;;;;;;;;;;;:::o;62937:88::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63014:3:::1;63004:7;:13;;;;;;;;;;;;:::i;:::-;;62937:88:::0;:::o;46546:125::-;46610:7;46637:21;46650:7;46637:12;:21::i;:::-;:26;;;46630:33;;46546:125;;;:::o;63176:105::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63260:13:::1;63248:9;:25;;;;63176:105:::0;:::o;43994:206::-;44058:7;44099:1;44082:19;;:5;:19;;;44078:60;;;44110:28;;;;;;;;;;;;;;44078:60;44164:12;:19;44177:5;44164:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;44156:36;;44149:43;;43994:206;;;:::o;4740:103::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4805:30:::1;4832:1;4805:18;:30::i;:::-;4740:103::o:0;63475:84::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63540:11:::1;;;;;;;;;;;63539:12;63525:11;;:26;;;;;;;;;;;;;;;;;;63475:84::o:0;60495:27::-;;;;;;;;;;;;;:::o;4089:87::-;4135:7;4162:6;;;;;;;;;;;4155:13;;4089:87;:::o;63289:92::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63364:9:::1;63356:5;:17;;;;63289:92:::0;:::o;46907:104::-;46963:13;46996:7;46989:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46907:104;:::o;60177:33::-;;;;:::o;61140:1200::-;61203:11;;;;;;;;;;;61195:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;61253:12;61268:5;;61253:20;;61282:17;61302:11;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61282:45;;61338:6;61347:1;61338:10;;61357:379;61369:12;61364:1;:17;61357:379;;61394:22;61419:11;;;;;;;;;;;:19;;;61439:1;61419:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61394:47;;61474:10;61456:28;;:14;:28;;;61452:275;;;61522:5;61505:22;;:10;:13;61516:1;61505:13;;;;;;;;;;;;;;;;;;;;;:22;;;61501:159;;;61555:1;61548:8;;61591:4;61575:10;:13;61586:1;61575:13;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;61501:159;;;61643:1;61636:8;;61501:159;61674:5;;;61452:275;61712:3;;;;;:::i;:::-;;;;61383:353;61357:379;;;61758:1;61750:4;:9;61746:587;;;61801:9;;61796:1;61780:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;61772:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61840:24;61850:10;61862:1;61840:9;:24::i;:::-;61746:587;;;61924:9;;61915:5;61899:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;61891:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61980:8;;61971:5;:17;;61963:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;62035:1;62027:4;:9;62023:301;;;62090:1;62082:5;;62074;:13;;;;:::i;:::-;:17;;;;:::i;:::-;62061:9;:30;;62053:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;62140:28;62150:10;62162:5;62140:9;:28::i;:::-;62023:301;;;62230:5;;62222;:13;;;;:::i;:::-;62209:9;:26;;62201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62284:28;62294:10;62306:5;62284:9;:28::i;:::-;62023:301;61746:587;61186:1154;;;61140:1200;:::o;48517:287::-;48628:12;:10;:12::i;:::-;48616:24;;:8;:24;;;48612:54;;;48649:17;;;;;;;;;;;;;;48612:54;48724:8;48679:18;:32;48698:12;:10;:12::i;:::-;48679:32;;;;;;;;;;;;;;;:42;48712:8;48679:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48777:8;48748:48;;48763:12;:10;:12::i;:::-;48748:48;;;48787:8;48748:48;;;;;;:::i;:::-;;;;;;;;48517:287;;:::o;60137:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49603:369::-;49770:28;49780:4;49786:2;49790:7;49770:9;:28::i;:::-;49813:15;:2;:13;;;:15::i;:::-;:76;;;;;49833:56;49864:4;49870:2;49874:7;49883:5;49833:30;:56::i;:::-;49832:57;49813:76;49809:156;;;49913:40;;;;;;;;;;;;;;49809:156;49603:369;;;;:::o;64211:585::-;64257:4;64273:12;64288:5;;64273:20;;64304:17;64324:11;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64304:45;;64360:6;64369:1;64360:10;;64381:386;64393:12;64388:1;:17;64381:386;;64422:22;64447:11;;;;;;;;;;;:19;;;64467:1;64447:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64422:47;;64506:10;64488:28;;:14;:28;;;64484:272;;;64558:5;64541:22;;:10;:13;64552:1;64541:13;;;;;;;;;;;;;;;;;;;;;:22;;;64537:136;;;64595:1;64588:8;;64537:136;;;64652:1;64645:8;;64537:136;64691:5;;;64484:272;64737:3;;;;;:::i;:::-;;;;64407:360;64381:386;;;64784:4;64777:11;;;;;64211:585;:::o;60373:33::-;;;;:::o;62464:465::-;62582:13;62635:16;62643:7;62635;:16::i;:::-;62613:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;62755:5;62743:17;;:8;;;;;;;;;;;:17;;;62739:97;;;62805:17;62788:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;62774:50;;;;62739:97;62883:7;62892:18;:7;:16;:18::i;:::-;62866:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62852:69;;62464:465;;;;:::o;60297:31::-;;;;;;;;;;;;;:::o;60256:32::-;;;;:::o;48875:164::-;48972:4;48996:18;:25;49015:5;48996:25;;;;;;;;;;;;;;;:35;49022:8;48996:35;;;;;;;;;;;;;;;;;;;;;;;;;48989:42;;48875:164;;;;:::o;4998:201::-;4320:12;:10;:12::i;:::-;4309:23;;:7;:5;:7::i;:::-;:23;;;4301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5107:1:::1;5087:22;;:8;:22;;;;5079:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5163:28;5182:8;5163:18;:28::i;:::-;4998:201:::0;:::o;60219:28::-;;;;:::o;15733:157::-;15818:4;15857:25;15842:40;;;:11;:40;;;;15835:47;;15733:157;;;:::o;3434:98::-;3487:7;3514:10;3507:17;;3434:98;:::o;50227:174::-;50284:4;50327:7;50308:15;:13;:15::i;:::-;:26;;:53;;;;;50348:13;;50338:7;:23;50308:53;:85;;;;;50366:11;:20;50378:7;50366:20;;;;;;;;;;;:27;;;;;;;;;;;;50365:28;50308:85;50301:92;;50227:174;;;:::o;58138:196::-;58280:2;58253:15;:24;58269:7;58253:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58318:7;58314:2;58298:28;;58307:5;58298:28;;;;;;;;;;;;58138:196;;;:::o;63701:93::-;63758:7;63785:1;63778:8;;63701:93;:::o;53081:2130::-;53196:35;53234:21;53247:7;53234:12;:21::i;:::-;53196:59;;53294:4;53272:26;;:13;:18;;;:26;;;53268:67;;53307:28;;;;;;;;;;;;;;53268:67;53348:22;53390:4;53374:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;53411:36;53428:4;53434:12;:10;:12::i;:::-;53411:16;:36::i;:::-;53374:73;:126;;;;53488:12;:10;:12::i;:::-;53464:36;;:20;53476:7;53464:11;:20::i;:::-;:36;;;53374:126;53348:153;;53519:17;53514:66;;53545:35;;;;;;;;;;;;;;53514:66;53609:1;53595:16;;:2;:16;;;53591:52;;;53620:23;;;;;;;;;;;;;;53591:52;53656:43;53678:4;53684:2;53688:7;53697:1;53656:21;:43::i;:::-;53764:35;53781:1;53785:7;53794:4;53764:8;:35::i;:::-;54125:1;54095:12;:18;54108:4;54095:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54169:1;54141:12;:16;54154:2;54141:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54187:31;54221:11;:20;54233:7;54221:20;;;;;;;;;;;54187:54;;54272:2;54256:8;:13;;;:18;;;;;;;;;;;;;;;;;;54322:15;54289:8;:23;;;:49;;;;;;;;;;;;;;;;;;54590:19;54622:1;54612:7;:11;54590:33;;54638:31;54672:11;:24;54684:11;54672:24;;;;;;;;;;;54638:58;;54740:1;54715:27;;:8;:13;;;;;;;;;;;;:27;;;54711:384;;;54925:13;;54910:11;:28;54906:174;;54979:4;54963:8;:13;;;:20;;;;;;;;;;;;;;;;;;55032:13;:28;;;55006:8;:23;;;:54;;;;;;;;;;;;;;;;;;54906:174;54711:384;54070:1036;;;55142:7;55138:2;55123:27;;55132:4;55123:27;;;;;;;;;;;;55161:42;55182:4;55188:2;55192:7;55201:1;55161:20;:42::i;:::-;53185:2026;;53081:2130;;;:::o;50409:104::-;50478:27;50488:2;50492:8;50478:27;;;;;;;;;;;;:9;:27::i;:::-;50409:104;;:::o;45375:1109::-;45437:21;;:::i;:::-;45471:12;45486:7;45471:22;;45554:4;45535:15;:13;:15::i;:::-;:23;;:47;;;;;45569:13;;45562:4;:20;45535:47;45531:886;;;45603:31;45637:11;:17;45649:4;45637:17;;;;;;;;;;;45603:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45678:9;:16;;;45673:729;;45749:1;45723:28;;:9;:14;;;:28;;;45719:101;;45787:9;45780:16;;;;;;45719:101;46122:261;46129:4;46122:261;;;46162:6;;;;;;;;46207:11;:17;46219:4;46207:17;;;;;;;;;;;46195:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46281:1;46255:28;;:9;:14;;;:28;;;46251:109;;46323:9;46316:16;;;;;;46251:109;46122:261;;;45673:729;45584:833;45531:886;46445:31;;;;;;;;;;;;;;45375:1109;;;;:::o;5359:191::-;5433:16;5452:6;;;;;;;;;;;5433:25;;5478:8;5469:6;;:17;;;;;;;;;;;;;;;;;;5533:8;5502:40;;5523:8;5502:40;;;;;;;;;;;;5422:128;5359:191;:::o;6663:326::-;6723:4;6980:1;6958:7;:19;;;:23;6951:30;;6663:326;;;:::o;58826:667::-;58989:4;59026:2;59010:36;;;59047:12;:10;:12::i;:::-;59061:4;59067:7;59076:5;59010:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59006:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59261:1;59244:6;:13;:18;59240:235;;;59290:40;;;;;;;;;;;;;;59240:235;59433:6;59427:13;59418:6;59414:2;59410:15;59403:38;59006:480;59139:45;;;59129:55;;;:6;:55;;;;59122:62;;;58826:667;;;;;;:::o;1108:723::-;1164:13;1394:1;1385:5;:10;1381:53;;;1412:10;;;;;;;;;;;;;;;;;;;;;1381:53;1444:12;1459:5;1444:20;;1475:14;1500:78;1515:1;1507:4;:9;1500:78;;1533:8;;;;;:::i;:::-;;;;1564:2;1556:10;;;;;:::i;:::-;;;1500:78;;;1588:19;1620:6;1610:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1588:39;;1638:154;1654:1;1645:5;:10;1638:154;;1682:1;1672:11;;;;;:::i;:::-;;;1749:2;1741:5;:10;;;;:::i;:::-;1728:2;:24;;;;:::i;:::-;1715:39;;1698:6;1705;1698:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1778:2;1769:11;;;;;:::i;:::-;;;1638:154;;;1816:6;1802:21;;;;;1108:723;;;;:::o;59501:159::-;;;;;:::o;59668:158::-;;;;;:::o;50876:163::-;50999:32;51005:2;51009:8;51019:5;51026:4;50999:5;:32::i;:::-;50876:163;;;:::o;51298:1775::-;51437:20;51460:13;;51437:36;;51502:1;51488:16;;:2;:16;;;51484:48;;;51513:19;;;;;;;;;;;;;;51484:48;51559:1;51547:8;:13;51543:44;;;51569:18;;;;;;;;;;;;;;51543:44;51600:61;51630:1;51634:2;51638:12;51652:8;51600:21;:61::i;:::-;51973:8;51938:12;:16;51951:2;51938:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52037:8;51997:12;:16;52010:2;51997:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52096:2;52063:11;:25;52075:12;52063:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52163:15;52113:11;:25;52125:12;52113:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;52196:20;52219:12;52196:35;;52246:11;52275:8;52260:12;:23;52246:37;;52304:4;:23;;;;;52312:15;:2;:13;;;:15::i;:::-;52304:23;52300:641;;;52348:314;52404:12;52400:2;52379:38;;52396:1;52379:38;;;;;;;;;;;;52445:69;52484:1;52488:2;52492:14;;;;;;52508:5;52445:30;:69::i;:::-;52440:174;;52550:40;;;;;;;;;;;;;;52440:174;52657:3;52641:12;:19;;52348:314;;52743:12;52726:13;;:29;52722:43;;52757:8;;;52722:43;52300:641;;;52806:120;52862:14;;;;;;52858:2;52837:40;;52854:1;52837:40;;;;;;;;;;;;52921:3;52905:12;:19;;52806:120;;52300:641;52971:12;52955:13;:28;;;;51913:1082;;53005:60;53034:1;53038:2;53042:12;53056:8;53005:20;:60::i;:::-;51426:1647;51298:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1135:133;;;;:::o;1274:137::-;1319:5;1357:6;1344:20;1335:29;;1373:32;1399:5;1373:32;:::i;:::-;1274:137;;;;:::o;1417:141::-;1473:5;1504:6;1498:13;1489:22;;1520:32;1546:5;1520:32;:::i;:::-;1417:141;;;;:::o;1577:338::-;1632:5;1681:3;1674:4;1666:6;1662:17;1658:27;1648:122;;1689:79;;:::i;:::-;1648:122;1806:6;1793:20;1831:78;1905:3;1897:6;1890:4;1882:6;1878:17;1831:78;:::i;:::-;1822:87;;1638:277;1577:338;;;;:::o;1935:340::-;1991:5;2040:3;2033:4;2025:6;2021:17;2017:27;2007:122;;2048:79;;:::i;:::-;2007:122;2165:6;2152:20;2190:79;2265:3;2257:6;2250:4;2242:6;2238:17;2190:79;:::i;:::-;2181:88;;1997:278;1935:340;;;;:::o;2281:139::-;2327:5;2365:6;2352:20;2343:29;;2381:33;2408:5;2381:33;:::i;:::-;2281:139;;;;:::o;2426:143::-;2483:5;2514:6;2508:13;2499:22;;2530:33;2557:5;2530:33;:::i;:::-;2426:143;;;;:::o;2575:329::-;2634:6;2683:2;2671:9;2662:7;2658:23;2654:32;2651:119;;;2689:79;;:::i;:::-;2651:119;2809:1;2834:53;2879:7;2870:6;2859:9;2855:22;2834:53;:::i;:::-;2824:63;;2780:117;2575:329;;;;:::o;2910:351::-;2980:6;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:64;3236:7;3227:6;3216:9;3212:22;3180:64;:::i;:::-;3170:74;;3126:128;2910:351;;;;:::o;3267:474::-;3335:6;3343;3392:2;3380:9;3371:7;3367:23;3363:32;3360:119;;;3398:79;;:::i;:::-;3360:119;3518:1;3543:53;3588:7;3579:6;3568:9;3564:22;3543:53;:::i;:::-;3533:63;;3489:117;3645:2;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3616:118;3267:474;;;;;:::o;3747:619::-;3824:6;3832;3840;3889:2;3877:9;3868:7;3864:23;3860:32;3857:119;;;3895:79;;:::i;:::-;3857:119;4015:1;4040:53;4085:7;4076:6;4065:9;4061:22;4040:53;:::i;:::-;4030:63;;3986:117;4142:2;4168:53;4213:7;4204:6;4193:9;4189:22;4168:53;:::i;:::-;4158:63;;4113:118;4270:2;4296:53;4341:7;4332:6;4321:9;4317:22;4296:53;:::i;:::-;4286:63;;4241:118;3747:619;;;;;:::o;4372:943::-;4467:6;4475;4483;4491;4540:3;4528:9;4519:7;4515:23;4511:33;4508:120;;;4547:79;;:::i;:::-;4508:120;4667:1;4692:53;4737:7;4728:6;4717:9;4713:22;4692:53;:::i;:::-;4682:63;;4638:117;4794:2;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4765:118;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;5078:2;5067:9;5063:18;5050:32;5109:18;5101:6;5098:30;5095:117;;;5131:79;;:::i;:::-;5095:117;5236:62;5290:7;5281:6;5270:9;5266:22;5236:62;:::i;:::-;5226:72;;5021:287;4372:943;;;;;;;:::o;5321:468::-;5386:6;5394;5443:2;5431:9;5422:7;5418:23;5414:32;5411:119;;;5449:79;;:::i;:::-;5411:119;5569:1;5594:53;5639:7;5630:6;5619:9;5615:22;5594:53;:::i;:::-;5584:63;;5540:117;5696:2;5722:50;5764:7;5755:6;5744:9;5740:22;5722:50;:::i;:::-;5712:60;;5667:115;5321:468;;;;;:::o;5795:474::-;5863:6;5871;5920:2;5908:9;5899:7;5895:23;5891:32;5888:119;;;5926:79;;:::i;:::-;5888:119;6046:1;6071:53;6116:7;6107:6;6096:9;6092:22;6071:53;:::i;:::-;6061:63;;6017:117;6173:2;6199:53;6244:7;6235:6;6224:9;6220:22;6199:53;:::i;:::-;6189:63;;6144:118;5795:474;;;;;:::o;6275:327::-;6333:6;6382:2;6370:9;6361:7;6357:23;6353:32;6350:119;;;6388:79;;:::i;:::-;6350:119;6508:1;6533:52;6577:7;6568:6;6557:9;6553:22;6533:52;:::i;:::-;6523:62;;6479:116;6275:327;;;;:::o;6608:349::-;6677:6;6726:2;6714:9;6705:7;6701:23;6697:32;6694:119;;;6732:79;;:::i;:::-;6694:119;6852:1;6877:63;6932:7;6923:6;6912:9;6908:22;6877:63;:::i;:::-;6867:73;;6823:127;6608:349;;;;:::o;6963:509::-;7032:6;7081:2;7069:9;7060:7;7056:23;7052:32;7049:119;;;7087:79;;:::i;:::-;7049:119;7235:1;7224:9;7220:17;7207:31;7265:18;7257:6;7254:30;7251:117;;;7287:79;;:::i;:::-;7251:117;7392:63;7447:7;7438:6;7427:9;7423:22;7392:63;:::i;:::-;7382:73;;7178:287;6963:509;;;;:::o;7478:329::-;7537:6;7586:2;7574:9;7565:7;7561:23;7557:32;7554:119;;;7592:79;;:::i;:::-;7554:119;7712:1;7737:53;7782:7;7773:6;7762:9;7758:22;7737:53;:::i;:::-;7727:63;;7683:117;7478:329;;;;:::o;7813:351::-;7883:6;7932:2;7920:9;7911:7;7907:23;7903:32;7900:119;;;7938:79;;:::i;:::-;7900:119;8058:1;8083:64;8139:7;8130:6;8119:9;8115:22;8083:64;:::i;:::-;8073:74;;8029:128;7813:351;;;;:::o;8170:474::-;8238:6;8246;8295:2;8283:9;8274:7;8270:23;8266:32;8263:119;;;8301:79;;:::i;:::-;8263:119;8421:1;8446:53;8491:7;8482:6;8471:9;8467:22;8446:53;:::i;:::-;8436:63;;8392:117;8548:2;8574:53;8619:7;8610:6;8599:9;8595:22;8574:53;:::i;:::-;8564:63;;8519:118;8170:474;;;;;:::o;8650:118::-;8737:24;8755:5;8737:24;:::i;:::-;8732:3;8725:37;8650:118;;:::o;8774:109::-;8855:21;8870:5;8855:21;:::i;:::-;8850:3;8843:34;8774:109;;:::o;8889:360::-;8975:3;9003:38;9035:5;9003:38;:::i;:::-;9057:70;9120:6;9115:3;9057:70;:::i;:::-;9050:77;;9136:52;9181:6;9176:3;9169:4;9162:5;9158:16;9136:52;:::i;:::-;9213:29;9235:6;9213:29;:::i;:::-;9208:3;9204:39;9197:46;;8979:270;8889:360;;;;:::o;9255:165::-;9359:54;9407:5;9359:54;:::i;:::-;9354:3;9347:67;9255:165;;:::o;9426:364::-;9514:3;9542:39;9575:5;9542:39;:::i;:::-;9597:71;9661:6;9656:3;9597:71;:::i;:::-;9590:78;;9677:52;9722:6;9717:3;9710:4;9703:5;9699:16;9677:52;:::i;:::-;9754:29;9776:6;9754:29;:::i;:::-;9749:3;9745:39;9738:46;;9518:272;9426:364;;;;:::o;9796:377::-;9902:3;9930:39;9963:5;9930:39;:::i;:::-;9985:89;10067:6;10062:3;9985:89;:::i;:::-;9978:96;;10083:52;10128:6;10123:3;10116:4;10109:5;10105:16;10083:52;:::i;:::-;10160:6;10155:3;10151:16;10144:23;;9906:267;9796:377;;;;:::o;10203:845::-;10306:3;10343:5;10337:12;10372:36;10398:9;10372:36;:::i;:::-;10424:89;10506:6;10501:3;10424:89;:::i;:::-;10417:96;;10544:1;10533:9;10529:17;10560:1;10555:137;;;;10706:1;10701:341;;;;10522:520;;10555:137;10639:4;10635:9;10624;10620:25;10615:3;10608:38;10675:6;10670:3;10666:16;10659:23;;10555:137;;10701:341;10768:38;10800:5;10768:38;:::i;:::-;10828:1;10842:154;10856:6;10853:1;10850:13;10842:154;;;10930:7;10924:14;10920:1;10915:3;10911:11;10904:35;10980:1;10971:7;10967:15;10956:26;;10878:4;10875:1;10871:12;10866:17;;10842:154;;;11025:6;11020:3;11016:16;11009:23;;10708:334;;10522:520;;10310:738;;10203:845;;;;:::o;11054:366::-;11196:3;11217:67;11281:2;11276:3;11217:67;:::i;:::-;11210:74;;11293:93;11382:3;11293:93;:::i;:::-;11411:2;11406:3;11402:12;11395:19;;11054:366;;;:::o;11426:::-;11568:3;11589:67;11653:2;11648:3;11589:67;:::i;:::-;11582:74;;11665:93;11754:3;11665:93;:::i;:::-;11783:2;11778:3;11774:12;11767:19;;11426:366;;;:::o;11798:::-;11940:3;11961:67;12025:2;12020:3;11961:67;:::i;:::-;11954:74;;12037:93;12126:3;12037:93;:::i;:::-;12155:2;12150:3;12146:12;12139:19;;11798:366;;;:::o;12170:::-;12312:3;12333:67;12397:2;12392:3;12333:67;:::i;:::-;12326:74;;12409:93;12498:3;12409:93;:::i;:::-;12527:2;12522:3;12518:12;12511:19;;12170:366;;;:::o;12542:::-;12684:3;12705:67;12769:2;12764:3;12705:67;:::i;:::-;12698:74;;12781:93;12870:3;12781:93;:::i;:::-;12899:2;12894:3;12890:12;12883:19;;12542:366;;;:::o;12914:400::-;13074:3;13095:84;13177:1;13172:3;13095:84;:::i;:::-;13088:91;;13188:93;13277:3;13188:93;:::i;:::-;13306:1;13301:3;13297:11;13290:18;;12914:400;;;:::o;13320:366::-;13462:3;13483:67;13547:2;13542:3;13483:67;:::i;:::-;13476:74;;13559:93;13648:3;13559:93;:::i;:::-;13677:2;13672:3;13668:12;13661:19;;13320:366;;;:::o;13692:::-;13834:3;13855:67;13919:2;13914:3;13855:67;:::i;:::-;13848:74;;13931:93;14020:3;13931:93;:::i;:::-;14049:2;14044:3;14040:12;14033:19;;13692:366;;;:::o;14064:::-;14206:3;14227:67;14291:2;14286:3;14227:67;:::i;:::-;14220:74;;14303:93;14392:3;14303:93;:::i;:::-;14421:2;14416:3;14412:12;14405:19;;14064:366;;;:::o;14436:398::-;14595:3;14616:83;14697:1;14692:3;14616:83;:::i;:::-;14609:90;;14708:93;14797:3;14708:93;:::i;:::-;14826:1;14821:3;14817:11;14810:18;;14436:398;;;:::o;14840:366::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:118::-;15671:24;15689:5;15671:24;:::i;:::-;15666:3;15659:37;15584:118;;:::o;15708:269::-;15837:3;15859:92;15947:3;15938:6;15859:92;:::i;:::-;15852:99;;15968:3;15961:10;;15708:269;;;;:::o;15983:695::-;16261:3;16283:92;16371:3;16362:6;16283:92;:::i;:::-;16276:99;;16392:95;16483:3;16474:6;16392:95;:::i;:::-;16385:102;;16504:148;16648:3;16504:148;:::i;:::-;16497:155;;16669:3;16662:10;;15983:695;;;;;:::o;16684:379::-;16868:3;16890:147;17033:3;16890:147;:::i;:::-;16883:154;;17054:3;17047:10;;16684:379;;;:::o;17069:222::-;17162:4;17200:2;17189:9;17185:18;17177:26;;17213:71;17281:1;17270:9;17266:17;17257:6;17213:71;:::i;:::-;17069:222;;;;:::o;17297:640::-;17492:4;17530:3;17519:9;17515:19;17507:27;;17544:71;17612:1;17601:9;17597:17;17588:6;17544:71;:::i;:::-;17625:72;17693:2;17682:9;17678:18;17669:6;17625:72;:::i;:::-;17707;17775:2;17764:9;17760:18;17751:6;17707:72;:::i;:::-;17826:9;17820:4;17816:20;17811:2;17800:9;17796:18;17789:48;17854:76;17925:4;17916:6;17854:76;:::i;:::-;17846:84;;17297:640;;;;;;;:::o;17943:210::-;18030:4;18068:2;18057:9;18053:18;18045:26;;18081:65;18143:1;18132:9;18128:17;18119:6;18081:65;:::i;:::-;17943:210;;;;:::o;18159:256::-;18269:4;18307:2;18296:9;18292:18;18284:26;;18320:88;18405:1;18394:9;18390:17;18381:6;18320:88;:::i;:::-;18159:256;;;;:::o;18421:313::-;18534:4;18572:2;18561:9;18557:18;18549:26;;18621:9;18615:4;18611:20;18607:1;18596:9;18592:17;18585:47;18649:78;18722:4;18713:6;18649:78;:::i;:::-;18641:86;;18421:313;;;;:::o;18740:419::-;18906:4;18944:2;18933:9;18929:18;18921:26;;18993:9;18987:4;18983:20;18979:1;18968:9;18964:17;18957:47;19021:131;19147:4;19021:131;:::i;:::-;19013:139;;18740:419;;;:::o;19165:::-;19331:4;19369:2;19358:9;19354:18;19346:26;;19418:9;19412:4;19408:20;19404:1;19393:9;19389:17;19382:47;19446:131;19572:4;19446:131;:::i;:::-;19438:139;;19165:419;;;:::o;19590:::-;19756:4;19794:2;19783:9;19779:18;19771:26;;19843:9;19837:4;19833:20;19829:1;19818:9;19814:17;19807:47;19871:131;19997:4;19871:131;:::i;:::-;19863:139;;19590:419;;;:::o;20015:::-;20181:4;20219:2;20208:9;20204:18;20196:26;;20268:9;20262:4;20258:20;20254:1;20243:9;20239:17;20232:47;20296:131;20422:4;20296:131;:::i;:::-;20288:139;;20015:419;;;:::o;20440:::-;20606:4;20644:2;20633:9;20629:18;20621:26;;20693:9;20687:4;20683:20;20679:1;20668:9;20664:17;20657:47;20721:131;20847:4;20721:131;:::i;:::-;20713:139;;20440:419;;;:::o;20865:::-;21031:4;21069:2;21058:9;21054:18;21046:26;;21118:9;21112:4;21108:20;21104:1;21093:9;21089:17;21082:47;21146:131;21272:4;21146:131;:::i;:::-;21138:139;;20865:419;;;:::o;21290:::-;21456:4;21494:2;21483:9;21479:18;21471:26;;21543:9;21537:4;21533:20;21529:1;21518:9;21514:17;21507:47;21571:131;21697:4;21571:131;:::i;:::-;21563:139;;21290:419;;;:::o;21715:::-;21881:4;21919:2;21908:9;21904:18;21896:26;;21968:9;21962:4;21958:20;21954:1;21943:9;21939:17;21932:47;21996:131;22122:4;21996:131;:::i;:::-;21988:139;;21715:419;;;:::o;22140:::-;22306:4;22344:2;22333:9;22329:18;22321:26;;22393:9;22387:4;22383:20;22379:1;22368:9;22364:17;22357:47;22421:131;22547:4;22421:131;:::i;:::-;22413:139;;22140:419;;;:::o;22565:::-;22731:4;22769:2;22758:9;22754:18;22746:26;;22818:9;22812:4;22808:20;22804:1;22793:9;22789:17;22782:47;22846:131;22972:4;22846:131;:::i;:::-;22838:139;;22565:419;;;:::o;22990:222::-;23083:4;23121:2;23110:9;23106:18;23098:26;;23134:71;23202:1;23191:9;23187:17;23178:6;23134:71;:::i;:::-;22990:222;;;;:::o;23218:129::-;23252:6;23279:20;;:::i;:::-;23269:30;;23308:33;23336:4;23328:6;23308:33;:::i;:::-;23218:129;;;:::o;23353:75::-;23386:6;23419:2;23413:9;23403:19;;23353:75;:::o;23434:307::-;23495:4;23585:18;23577:6;23574:30;23571:56;;;23607:18;;:::i;:::-;23571:56;23645:29;23667:6;23645:29;:::i;:::-;23637:37;;23729:4;23723;23719:15;23711:23;;23434:307;;;:::o;23747:308::-;23809:4;23899:18;23891:6;23888:30;23885:56;;;23921:18;;:::i;:::-;23885:56;23959:29;23981:6;23959:29;:::i;:::-;23951:37;;24043:4;24037;24033:15;24025:23;;23747:308;;;:::o;24061:141::-;24110:4;24133:3;24125:11;;24156:3;24153:1;24146:14;24190:4;24187:1;24177:18;24169:26;;24061:141;;;:::o;24208:98::-;24259:6;24293:5;24287:12;24277:22;;24208:98;;;:::o;24312:99::-;24364:6;24398:5;24392:12;24382:22;;24312:99;;;:::o;24417:168::-;24500:11;24534:6;24529:3;24522:19;24574:4;24569:3;24565:14;24550:29;;24417:168;;;;:::o;24591:147::-;24692:11;24729:3;24714:18;;24591:147;;;;:::o;24744:169::-;24828:11;24862:6;24857:3;24850:19;24902:4;24897:3;24893:14;24878:29;;24744:169;;;;:::o;24919:148::-;25021:11;25058:3;25043:18;;24919:148;;;;:::o;25073:305::-;25113:3;25132:20;25150:1;25132:20;:::i;:::-;25127:25;;25166:20;25184:1;25166:20;:::i;:::-;25161:25;;25320:1;25252:66;25248:74;25245:1;25242:81;25239:107;;;25326:18;;:::i;:::-;25239:107;25370:1;25367;25363:9;25356:16;;25073:305;;;;:::o;25384:185::-;25424:1;25441:20;25459:1;25441:20;:::i;:::-;25436:25;;25475:20;25493:1;25475:20;:::i;:::-;25470:25;;25514:1;25504:35;;25519:18;;:::i;:::-;25504:35;25561:1;25558;25554:9;25549:14;;25384:185;;;;:::o;25575:348::-;25615:7;25638:20;25656:1;25638:20;:::i;:::-;25633:25;;25672:20;25690:1;25672:20;:::i;:::-;25667:25;;25860:1;25792:66;25788:74;25785:1;25782:81;25777:1;25770:9;25763:17;25759:105;25756:131;;;25867:18;;:::i;:::-;25756:131;25915:1;25912;25908:9;25897:20;;25575:348;;;;:::o;25929:191::-;25969:4;25989:20;26007:1;25989:20;:::i;:::-;25984:25;;26023:20;26041:1;26023:20;:::i;:::-;26018:25;;26062:1;26059;26056:8;26053:34;;;26067:18;;:::i;:::-;26053:34;26112:1;26109;26105:9;26097:17;;25929:191;;;;:::o;26126:96::-;26163:7;26192:24;26210:5;26192:24;:::i;:::-;26181:35;;26126:96;;;:::o;26228:90::-;26262:7;26305:5;26298:13;26291:21;26280:32;;26228:90;;;:::o;26324:149::-;26360:7;26400:66;26393:5;26389:78;26378:89;;26324:149;;;:::o;26479:126::-;26516:7;26556:42;26549:5;26545:54;26534:65;;26479:126;;;:::o;26611:77::-;26648:7;26677:5;26666:16;;26611:77;;;:::o;26694:143::-;26761:9;26794:37;26825:5;26794:37;:::i;:::-;26781:50;;26694:143;;;:::o;26843:126::-;26893:9;26926:37;26957:5;26926:37;:::i;:::-;26913:50;;26843:126;;;:::o;26975:113::-;27025:9;27058:24;27076:5;27058:24;:::i;:::-;27045:37;;26975:113;;;:::o;27094:154::-;27178:6;27173:3;27168;27155:30;27240:1;27231:6;27226:3;27222:16;27215:27;27094:154;;;:::o;27254:307::-;27322:1;27332:113;27346:6;27343:1;27340:13;27332:113;;;27431:1;27426:3;27422:11;27416:18;27412:1;27407:3;27403:11;27396:39;27368:2;27365:1;27361:10;27356:15;;27332:113;;;27463:6;27460:1;27457:13;27454:101;;;27543:1;27534:6;27529:3;27525:16;27518:27;27454:101;27303:258;27254:307;;;:::o;27567:320::-;27611:6;27648:1;27642:4;27638:12;27628:22;;27695:1;27689:4;27685:12;27716:18;27706:81;;27772:4;27764:6;27760:17;27750:27;;27706:81;27834:2;27826:6;27823:14;27803:18;27800:38;27797:84;;;27853:18;;:::i;:::-;27797:84;27618:269;27567:320;;;:::o;27893:281::-;27976:27;27998:4;27976:27;:::i;:::-;27968:6;27964:40;28106:6;28094:10;28091:22;28070:18;28058:10;28055:34;28052:62;28049:88;;;28117:18;;:::i;:::-;28049:88;28157:10;28153:2;28146:22;27936:238;27893:281;;:::o;28180:233::-;28219:3;28242:24;28260:5;28242:24;:::i;:::-;28233:33;;28288:66;28281:5;28278:77;28275:103;;;28358:18;;:::i;:::-;28275:103;28405:1;28398:5;28394:13;28387:20;;28180:233;;;:::o;28419:176::-;28451:1;28468:20;28486:1;28468:20;:::i;:::-;28463:25;;28502:20;28520:1;28502:20;:::i;:::-;28497:25;;28541:1;28531:35;;28546:18;;:::i;:::-;28531:35;28587:1;28584;28580:9;28575:14;;28419:176;;;;:::o;28601:180::-;28649:77;28646:1;28639:88;28746:4;28743:1;28736:15;28770:4;28767:1;28760:15;28787:180;28835:77;28832:1;28825:88;28932:4;28929:1;28922:15;28956:4;28953:1;28946:15;28973:180;29021:77;29018:1;29011:88;29118:4;29115:1;29108:15;29142:4;29139:1;29132:15;29159:180;29207:77;29204:1;29197:88;29304:4;29301:1;29294:15;29328:4;29325:1;29318:15;29345:180;29393:77;29390:1;29383:88;29490:4;29487:1;29480:15;29514:4;29511:1;29504:15;29531:117;29640:1;29637;29630:12;29654:117;29763:1;29760;29753:12;29777:117;29886:1;29883;29876:12;29900:117;30009:1;30006;29999:12;30023:102;30064:6;30115:2;30111:7;30106:2;30099:5;30095:14;30091:28;30081:38;;30023:102;;;:::o;30131:173::-;30271:25;30267:1;30259:6;30255:14;30248:49;30131:173;:::o;30310:225::-;30450:34;30446:1;30438:6;30434:14;30427:58;30519:8;30514:2;30506:6;30502:15;30495:33;30310:225;:::o;30541:164::-;30681:16;30677:1;30669:6;30665:14;30658:40;30541:164;:::o;30711:171::-;30851:23;30847:1;30839:6;30835:14;30828:47;30711:171;:::o;30888:168::-;31028:20;31024:1;31016:6;31012:14;31005:44;30888:168;:::o;31062:155::-;31202:7;31198:1;31190:6;31186:14;31179:31;31062:155;:::o;31223:182::-;31363:34;31359:1;31351:6;31347:14;31340:58;31223:182;:::o;31411:234::-;31551:34;31547:1;31539:6;31535:14;31528:58;31620:17;31615:2;31607:6;31603:15;31596:42;31411:234;:::o;31651:179::-;31791:31;31787:1;31779:6;31775:14;31768:55;31651:179;:::o;31836:114::-;;:::o;31956:166::-;32096:18;32092:1;32084:6;32080:14;32073:42;31956:166;:::o;32128:169::-;32268:21;32264:1;32256:6;32252:14;32245:45;32128:169;:::o;32303:122::-;32376:24;32394:5;32376:24;:::i;:::-;32369:5;32366:35;32356:63;;32415:1;32412;32405:12;32356:63;32303:122;:::o;32431:116::-;32501:21;32516:5;32501:21;:::i;:::-;32494:5;32491:32;32481:60;;32537:1;32534;32527:12;32481:60;32431:116;:::o;32553:120::-;32625:23;32642:5;32625:23;:::i;:::-;32618:5;32615:34;32605:62;;32663:1;32660;32653:12;32605:62;32553:120;:::o;32679:122::-;32752:24;32770:5;32752:24;:::i;:::-;32745:5;32742:35;32732:63;;32791:1;32788;32781:12;32732:63;32679:122;:::o

Swarm Source

ipfs://bc43446fd43c5ad8deea48aa87e226a84024b2a51a6877dd8ef972837e194313
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.