ETH Price: $2,283.95 (-3.38%)

Token

LovePandasOnChain (LPOC)
 

Overview

Max Total Supply

9 LPOC

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LPOC
0xb6aa5a1aa37a4195725cdf1576dc741d359b56bd
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:
LovePandasOnChain

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, OSL-3.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-13
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.7 <0.9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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: 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: 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) external view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: 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;
        }
    }

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

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

library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract LovePandasOnChain is ERC721Enumerable, ReentrancyGuard, Ownable { 
    using Strings for uint256;

    mapping(uint256 => Panda) public PandaToTokenId;
    uint8[] private t_c = [250, 200, 180, 152, 110, 76, 55, 43, 21, 7];
    uint8[] private s_c = [250, 100, 84, 51, 34, 22, 4];
    string[] private bg = ["ede2b7","f2dbdb","f2d6d6","f2d6eb","dfd6f2","d6e1f2","dbf2ee","dfedb7","b4c0ea","c4a4e8"];    
    string[] private furlight = ["ececec","cecece","d5e5d7","d5d6e2","e2d6d3","dec9e0","f5f5f5"];    
    string[] private furdark = ["000000","303030","404040","515151","a0a0a0","191919","250c19"];
    string[] private heart = ["ea0700","ec1c24","ea3879","e81767","e53D00","e8718f","dd8782","db06b4","d868a0","d66e5e"];
    string[] private tc = ["000000","404040","000166","482333","112D12","383412","0aada7"];    

    string[] private a = ['<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 380 380"><rect x="0" y="0" width="380" height="380" style="fill:#',    
    '"/><ellipse cx="136" cy="87" rx="23" ry="17" style="fill:#',
    '"/><ellipse cx="239" cy="83" rx="22" ry="16" style="fill:#',
    '"/><ellipse cx="217" cy="196" rx="28.6" ry="15.7" style="fill:#',
    '"/><ellipse cx="113" cy="197" rx="36" ry="11" style="fill:#',
    '"/><ellipse cx="89" cy="200" rx="14" ry="12" style="fill:#',
    '"/><ellipse cx="107" cy="211" rx="24" ry="6" style="fill:#',
    '"/><ellipse cx="267" cy="198" rx="36" ry="13" style="fill:#',
    '"/><ellipse cx="269" cy="203" rx="32" ry="14" style="fill:#',
    '"/><ellipse cx="142" cy="268" rx="42" ry="19" style="fill:#',
    '"/><ellipse cx="232" cy="267" rx="42" ry="19" style="fill:#',
    '"/><ellipse cx="263" cy="270" rx="22" ry="20" style="fill:#',
    '"/><ellipse cx="114" cy="271" rx="22" ry="20" style="fill:#',
    '"/><ellipse cx="190" cy="133" rx="78" ry="59" style="fill:#',
    '"/><ellipse cx="140" cy="191" rx="29" ry="17" transform="matrix(0.9,-0.44,0.12,1,0,0)" style="fill:#',
    '"/><ellipse cx="166" cy="232" rx="28" ry="21" transform="matrix(0.82,-0.57,0.08,1,0,0)" style="fill:#',
    '"/><ellipse cx="259" cy="-10" rx="28" ry="21" transform="matrix(0.89,0.46,-0.07,-1,0,0)" style="fill:#',
    '"/><ellipse cx="232" cy="-58" rx="28" ry="16" transform="matrix(0.94,0.34,-0.11,-1,0,0)" style="fill:#',
    '"/><ellipse cx="63" cy="-193" rx="19" ry="17" transform="matrix(0.89,-0.44,-0.44,-0.9,0,0)" style="fill:#',
    '"/><ellipse cx="127" cy="-197" rx="20" ry="17" transform="matrix(0.92,-0.39,-0.5,-0.86,0,0)" style="fill:#',
    '"/><ellipse cx="186" cy="151" rx="7" ry="5" style="fill:#',
    '"/><path style="fill:none;stroke:#',
    ';stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 169,159 c 4.6,4 4.6,4 4.6,4 l 6,0.78 4.9,-7.76 7,6 v 0 l 6.8,-0.03 2.78,-4.43"/><path style="fill:none;stroke:#',
    ';stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter" d="m 147.69,138.38 c 9.63,-9.95 9.63,-9.95 9.63,-9.95 l 7.7,6.42"/><path style="fill:none;stroke:#',
    ';stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter" d="m 209.01,136.77 7.06,-6.1 3.21,-1.28 9.63,8.99"/><ellipse cx="-12.04" cy="271.15" rx="29.58" ry="46.35" style="fill:#',
    '" transform="matrix(0.78260364,-0.62252031,0.61913399,0.78528536,0,0)"/><ellipse cx="309.93" cy="-84.24" rx="29.59" ry="46.35" style="fill:#',
    '" transform="matrix(0.48049707,0.87699633,-0.87906369,0.47670434,0,0)"/><ellipse cx="98.76" cy="220.61" rx="34.7" ry="32.06" style="fill:#',
    '" transform="matrix(1,-0.09503718,0.27585177,0.96120019,0,0)"/><ellipse cx="159.26" cy="244.63" rx="35.74" ry="31.37" style="fill:#',
    '" transform="matrix(1,-0.08988888,0.29047984,0.95688111,0,0)"/><path style="fill:#',
    ';stroke-linecap:butt;stroke-linejoin:miter" d="m 136.93,240.31 10,14.69 9.63,11.32 14.21,14.29 20.23,-6.1 22.31,-8.03 12.68,-4.33 -89.74,-21.35"/><text font-size="14" y="205" x="221" dominant-baseline="middle" text-anchor="middle" style="fill:#',
    '" transform="matrix(1.14,0.2,-0.27,0.83,0,0)">',
    '</text><text font-size="21" y="220" x="221" dominant-baseline="middle" text-anchor="middle" style="fill:#',
    '" transform="matrix(1.14,0.2,-0.27,0.83,0,0)">+</text><text font-size="14" y="235" x="221" dominant-baseline="middle" text-anchor="middle" style="fill:#',
    '" transform="matrix(1.14,0.2,-0.27,0.83,0,0)">',
    '</text><text font-size="3" y="389" x="60" dominant-baseline="middle" text-anchor="middle" style="fill:#ececec" transform="rotate(-35)">42</text></svg>'];

    string private tr1='", "attributes": [{"trait_type": "Background","value": "';
    string private tr2='"},{"trait_type": "Fur light","value": "';
    string private tr3='"},{"trait_type": "Fur dark","value": "';
    string private tr4='"},{"trait_type": "Heart","value": "';
    string private tr5='"},{"trait_type": "Text","value": "';
    string private tr6='"},{"trait_type": "Name1","value": "';
    string private tr7='"},{"trait_type": "Name2","value": "';    
    string private tr8='"}],"image": "data:image/svg+xml;base64,';

    struct Panda {
        uint8 bg;
        uint8 furlight;
        uint8 furdark;
        uint8 heart;
        uint8 tc;
        string name;
        string name1;
        string name2;
    }

    constructor() ERC721("LovePandasOnChain", "LPOC") Ownable() {}

    function usew(uint8[] memory w,uint256 i) internal pure returns (uint8) {
        uint8 ind=0;
        uint256 j=uint256(w[0]);
        while (j<=i) {
            ind++;
            j+=uint256(w[ind]);
        }
        return ind;
    }

    function mint(string memory _userText1, string memory _userText2) public payable nonReentrant{
        uint256 supply = totalSupply();
        require(supply < 4200, "no Pandas");
        require(bytes(_userText1).length <= 14 && bytes(_userText2).length <= 14, "toolong");

        if (_msgSender() != owner() && supply > 42) {
             require(msg.value >= 0.033 ether, "min Value");
        }

        Panda memory pa;
        pa.bg = usew(t_c,rand() % 1094);
        pa.furlight = usew(s_c,rand() % 545);       
        pa.furdark = usew(s_c,rand() % 545);
        pa.heart = usew(t_c,rand() % 1094);
        pa.tc = usew(s_c,rand() % 545);
        pa.name1 = _userText1;
        pa.name2 = _userText2;
        pa.name = string(abi.encodePacked(_userText1, "+", _userText2));

        //Add Panda to mapping
        PandaToTokenId[supply + 1] = pa; 

        _safeMint(_msgSender(), supply + 1);
    }

    function rand() internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(
            block.timestamp + block.difficulty +
            ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (block.timestamp)) +
            block.gaslimit + 
            ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (block.timestamp)) +
            block.number
        )));
    }

    function getTraits(Panda memory curPanda) internal view returns (string memory) {
        string memory o=string(abi.encodePacked(tr1,uint256(curPanda.bg).toString(),tr2,uint256(curPanda.furlight).toString()));
        o=string(abi.encodePacked(o,tr3,uint256(curPanda.furdark).toString(),tr4,uint256(curPanda.heart).toString()));
        return string(abi.encodePacked(o,tr5,uint256(curPanda.tc).toString(),tr6,curPanda.name1,tr7,curPanda.name2,tr8));
    }

    function buildMetadata(uint256 _tokenId) private view returns (string memory)
    {
        Panda memory curPanda = PandaToTokenId[_tokenId];
        string memory output = string(abi.encodePacked(a[0],bg[curPanda.bg],a[1],furdark[curPanda.furdark],a[2],furdark[curPanda.furdark]));
                output = string(abi.encodePacked(output,a[3],furdark[curPanda.furdark],a[4],furdark[curPanda.furdark],a[5],furdark[curPanda.furdark]));                
                output = string(abi.encodePacked(output,a[6],furdark[curPanda.furdark],a[7],furdark[curPanda.furdark],a[8],furdark[curPanda.furdark]));
                output = string(abi.encodePacked(output,a[9],furdark[curPanda.furdark],a[10],furdark[curPanda.furdark],a[11],furdark[curPanda.furdark]));
                output = string(abi.encodePacked(output,a[12],furdark[curPanda.furdark],a[13],furlight[curPanda.furlight],a[14],furdark[curPanda.furdark]));
                output = string(abi.encodePacked(output,a[15],furdark[curPanda.furdark],a[16],furdark[curPanda.furdark],a[17],furdark[curPanda.furdark]));
                output = string(abi.encodePacked(output,a[18],furdark[curPanda.furdark],a[19],furdark[curPanda.furdark],a[20],furdark[curPanda.furdark]));
                output = string(abi.encodePacked(output,a[21],furdark[curPanda.furdark],a[22],furlight[curPanda.furlight],a[23],furlight[curPanda.furlight]));
                output = string(abi.encodePacked(output,a[24],heart[curPanda.heart],a[25],heart[curPanda.heart],a[26],heart[curPanda.heart]));
                output = string(abi.encodePacked(output,a[27],heart[curPanda.heart],a[28],heart[curPanda.heart],a[29],tc[curPanda.tc]));
                output = string(abi.encodePacked(output,a[30],curPanda.name1,a[31],tc[curPanda.tc],a[32],tc[curPanda.tc],a[33]));
                output = string(abi.encodePacked(output,curPanda.name2,a[34]));

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        bytes(
                            abi.encodePacked(
                                '{"name":"Love Pandas On Chain #',
                                _tokenId.toString(),
                                getTraits(curPanda),
                                Base64.encode(bytes(output)), 
                                '"}'
                            )
                        )
                    )
                )
            );
    }

    function tokenURI(uint256 _tokenId) external view virtual override returns (string memory)
    {
        require(
            _exists(_tokenId),
            "noToken"
        );
        
        return buildMetadata(_tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PandaToTokenId","outputs":[{"internalType":"uint8","name":"bg","type":"uint8"},{"internalType":"uint8","name":"furlight","type":"uint8"},{"internalType":"uint8","name":"furdark","type":"uint8"},{"internalType":"uint8","name":"heart","type":"uint8"},{"internalType":"uint8","name":"tc","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"name1","type":"string"},{"internalType":"string","name":"name2","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_userText1","type":"string"},{"internalType":"string","name":"_userText2","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6101c060405260fa608090815260c860a05260b460c052609860e052606e61010052604c61012052603761014052602b6101605260156101805260076101a0526200004f90600d90600a62000cbb565b506040805160e08101825260fa8152606460208201526054918101919091526033606082015260226080820152601660a0820152600460c08201526200009a90600e90600762000cbb565b506040805161018081018252600661014082018181526565646532623760d01b6101608401528252825180840184528181526533193231323160d11b6020828101919091528084019190915283518085018552828152653319321b321b60d11b818301528385015283518085018552828152653319321b32b160d11b81830152606084015283518085018552828152653233321b331960d11b8183015260808401528351808501855282815265321b3298b31960d11b8183015260a0840152835180850185528281526564626632656560d01b8183015260c0840152835180850185528281526564666564623760d01b8183015260e0840152835180850185528281526562346330656160d01b818301526101008401528351808501909452908352650c668c268ca760d31b90830152610120810191909152620001e390600f90600a62000d68565b506040805161012081018252600660e082018181526565636563656360d01b6101008401528252825180840184528181526563656365636560d01b60208281019190915280840191909152835180850185528281526564356535643760d01b81830152838501528351808501855282815265321ab21b329960d11b818301526060840152835180850185528281526565326436643360d01b818301526080840152835180850185528281526506465633965360d41b8183015260a084015283518085019094529083526566356635663560d01b9083015260c0810191909152620002d290601090600762000dc8565b506040805161012081018252600660e082018181526503030303030360d41b6101008401528252825180840184528181526503330333033360d41b60208281019190915280840191909152835180850185528281526503430343034360d41b8183015283850152835180850185528281526535313531353160d01b818301526060840152835180850185528281526506130613061360d41b818301526080840152835180850185528281526531393139313960d01b8183015260a084015283518085019094529083526532353063313960d01b9083015260c0810191909152620003c190601190600762000dc8565b506040805161018081018252600661014082018181526506561303730360d41b610160840152825282518084018452818152651958cc58cc8d60d21b60208281019190915280840191909152835180850185528281526565613338373960d01b8183015283850152835180850185528281526565383137363760d01b818301526060840152835180850185528281526506535334430360d41b8183015260808401528351808501855282815265329c1b989c3360d11b8183015260a0840152835180850185528281526532321c1b9c1960d11b8183015260c0840152835180850185528281526519188c0d988d60d21b8183015260e0840152835180850185528281526506438363861360d41b8183015261010084015283518085019094529083526564363665356560d01b908301526101208101919091526200050a90601290600a62000d68565b506040805161012081018252600660e082018181526503030303030360d41b6101008401528252825180840184528181526503430343034360d41b602082810191909152808401919091528351808501855282815265181818189b1b60d11b8183015283850152835180850185528281526534383233333360d01b818301526060840152835180850185528281526518989922189960d11b8183015260808401528351808501855282815265199c199a189960d11b8183015260a084015283518085019094529083526530616164613760d01b9083015260c0810191909152620005f990601390600762000dc8565b50604080516105208101909152609a6104608201818152829162004c7f61048084013981526020016040518060600160405280603a8152602001620053a0603a913981526020016040518060600160405280603a815260200162004e0b603a913981526020016040518060600160405280603f8152602001620054a8603f913981526020016040518060600160405280603b81526020016200504e603b913981526020016040518060600160405280603a8152602001620054e7603a913981526020016040518060600160405280603a815260200162005543603a913981526020016040518060600160405280603b8152602001620047f5603b913981526020016040518060600160405280603b815260200162004f29603b913981526020016040518060600160405280603b815260200162004a4f603b913981526020016040518060600160405280603b8152602001620052bb603b913981526020016040518060600160405280603b815260200162005280603b913981526020016040518060600160405280603b81526020016200557d603b913981526020016040518060600160405280603b815260200162004924603b913981526020016040518060a0016040528060648152602001620053da6064913981526020016040518060a001604052806065815260200162004bc86065913981526020016040518060a001604052806066815260200162004d196066913981526020016040518060a001604052806066815260200162004b626066913981526020016040518060a0016040528060698152602001620055b86069913981526020016040518060a00160405280606a81526020016200543e606a9139815260200160405180606001604052806039815260200162004f886039913981526020016040518060600160405280602281526020016200552160229139815260200160405180610100016040528060c281526020016200508960c2913981526020016040518060c00160405280609f81526020016200514b609f913981526020016040518060e0016040528060b5815260200162004a8a60b5913981526020016040518060c00160405280608c815260200162004d7f608c913981526020016040518060c00160405280608a8152602001620049c5608a913981526020016040518060c00160405280608381526020016200531d60839139815260200160405180608001604052806052815260200162004c2d60529139815260200160405180610120016040528060f481526020016200483060f4913981526020016040518060600160405280602e81526020016200495f602e913981526020016040518060a001604052806069815260200162004fe56069913981526020016040518060c001604052806098815260200162004e916098913981526020016040518060600160405280602e81526020016200495f602e913981526020016040518060c0016040528060968152602001620051ea60969139905262000a4e90601490602362000e1a565b506040518060600160405280603881526020016200498d60389139805162000a7f9160159160209091019062000e6c565b5060405180606001604052806028815260200162004e6960289139805162000ab09160169160209091019062000e6c565b50604051806060016040528060278152602001620052f660279139805162000ae19160179160209091019062000e6c565b5060405180606001604052806024815260200162004fc160249139805162000b129160189160209091019062000e6c565b5060405180606001604052806023815260200162004b3f60239139805162000b439160199160209091019062000e6c565b5060405180606001604052806024815260200162004f6460249139805162000b7491601a9160209091019062000e6c565b5060405180606001604052806024815260200162004e4560249139805162000ba591601b9160209091019062000e6c565b50604051806060016040528060288152602001620047cd60289139805162000bd691601c9160209091019062000e6c565b5034801562000be457600080fd5b5060408051808201825260118152702637bb32a830b73230b9a7b721b430b4b760791b6020808301918252835180850190945260048452634c504f4360e01b90840152815191929162000c3a9160009162000e6c565b50805162000c5090600190602084019062000e6c565b50506001600a555062000c633362000c69565b62000fa0565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090601f0160209004810192821562000d565791602002820160005b8382111562000d2557835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000ce5565b801562000d545782816101000a81549060ff021916905560010160208160000104928301926001030262000d25565b505b5062000d6492915062000ee9565b5090565b82805482825590600052602060002090810192821562000dba579160200282015b8281111562000dba578251805162000da991849160209091019062000e6c565b509160200191906001019062000d89565b5062000d6492915062000f00565b82805482825590600052602060002090810192821562000dba579160200282015b8281111562000dba578251805162000e0991849160209091019062000e6c565b509160200191906001019062000de9565b82805482825590600052602060002090810192821562000dba579160200282015b8281111562000dba578251805162000e5b91849160209091019062000e6c565b509160200191906001019062000e3b565b82805462000e7a9062000f63565b90600052602060002090601f01602090048101928262000e9e576000855562000d56565b82601f1062000eb957805160ff191683800117855562000d56565b8280016001018555821562000d56579182015b8281111562000d5657825182559160200191906001019062000ecc565b5b8082111562000d64576000815560010162000eea565b8082111562000d6457600062000f17828262000f21565b5060010162000f00565b50805462000f2f9062000f63565b6000825580601f1062000f40575050565b601f01602090049060005260206000209081019062000f60919062000ee9565b50565b600181811c9082168062000f7857607f821691505b6020821081141562000f9a57634e487b7160e01b600052602260045260246000fd5b50919050565b61381d8062000fb06000396000f3fe6080604052600436106101055760003560e01c806301ffc9a71461010a57806306fdde031461013f578063081812fc14610161578063095ea7b31461019957806318160ddd146101bb57806323b872dd146101da5780632f745c59146101fa5780633ccfd60b1461021a57806342842e0e146102225780634f6ccce7146102425780636352211e1461026257806370a0823114610282578063715018a6146102a25780638aa0fdad146102b75780638da5cb5b146102ca57806395d89b41146102df578063a22cb465146102f4578063b88d4fde14610314578063c87b56dd14610334578063e985e9c514610354578063ee3c127514610374578063f2fde38b146103a8575b600080fd5b34801561011657600080fd5b5061012a610125366004612f67565b6103c8565b60405190151581526020015b60405180910390f35b34801561014b57600080fd5b506101546103f3565b6040516101369190613488565b34801561016d57600080fd5b5061018161017c366004613004565b610485565b6040516001600160a01b039091168152602001610136565b3480156101a557600080fd5b506101b96101b4366004612f3d565b610512565b005b3480156101c757600080fd5b506008545b604051908152602001610136565b3480156101e657600080fd5b506101b96101f5366004612e4a565b610623565b34801561020657600080fd5b506101cc610215366004612f3d565b610654565b6101b96106ea565b34801561022e57600080fd5b506101b961023d366004612e4a565b610771565b34801561024e57600080fd5b506101cc61025d366004613004565b61078c565b34801561026e57600080fd5b5061018161027d366004613004565b61081f565b34801561028e57600080fd5b506101cc61029d366004612dfc565b610880565b3480156102ae57600080fd5b506101b96108eb565b6101b96102c5366004612fa1565b610926565b3480156102d657600080fd5b50610181610e61565b3480156102eb57600080fd5b50610154610e70565b34801561030057600080fd5b506101b961030f366004612f01565b610e7f565b34801561032057600080fd5b506101b961032f366004612e86565b610e8e565b34801561034057600080fd5b5061015461034f366004613004565b610ec6565b34801561036057600080fd5b5061012a61036f366004612e17565b610f10565b34801561038057600080fd5b5061039461038f366004613004565b610f3e565b604051610136989796959493929190613573565b3480156103b457600080fd5b506101b96103c3366004612dfc565b61112a565b60006001600160e01b0319821663780e9d6360e01b14806103ed57506103ed826111c7565b92915050565b60606000805461040290613679565b80601f016020809104026020016040519081016040528092919081815260200182805461042e90613679565b801561047b5780601f106104505761010080835404028352916020019161047b565b820191906000526020600020905b81548152906001019060200180831161045e57829003601f168201915b5050505050905090565b600061049082611217565b6104f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061051d8261081f565b9050806001600160a01b0316836001600160a01b0316141561058b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104ed565b336001600160a01b03821614806105a757506105a78133610f10565b6106145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016104ed565b61061e8383611234565b505050565b61062d33826112a2565b6106495760405162461bcd60e51b81526004016104ed90613522565b61061e83838361136c565b600061065f83610880565b82106106c15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104ed565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b336106f3610e61565b6001600160a01b0316146107195760405162461bcd60e51b81526004016104ed906134ed565b604051600090339047908381818185875af1925050503d806000811461075b576040519150601f19603f3d011682016040523d82523d6000602084013e610760565b606091505b505090508061076e57600080fd5b50565b61061e83838360405180602001604052806000815250610e8e565b600061079760085490565b82106107fa5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104ed565b6008828154811061080d5761080d613745565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103ed5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d103737b732bc34b9ba32b73a103a37b5b2b760391b60448201526064016104ed565b60006001600160a01b0382166108cf5760405162461bcd60e51b81526020600482015260146024820152734552433732313a207a65726f206164647265737360601b60448201526064016104ed565b506001600160a01b031660009081526003602052604090205490565b336108f4610e61565b6001600160a01b03161461091a5760405162461bcd60e51b81526004016104ed906134ed565b6109246000611501565b565b6002600a5414156109795760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104ed565b6002600a55600061098960085490565b905061106881106109c85760405162461bcd60e51b81526020600482015260096024820152686e6f2050616e64617360b81b60448201526064016104ed565b600e8351111580156109dc5750600e825111155b610a125760405162461bcd60e51b8152602060048201526007602482015266746f6f6c6f6e6760c81b60448201526064016104ed565b610a1a610e61565b6001600160a01b0316336001600160a01b031614158015610a3b5750602a81115b15610a835766753d533d968000341015610a835760405162461bcd60e51b81526020600482015260096024820152686d696e2056616c756560b81b60448201526064016104ed565b60408051610100810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c0810182905260e0810191909152610b52600d805480602002602001604051908101604052809291908181526020018280548015610b3357602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b045790505b5050505050610446610b43611553565b610b4d91906136ef565b611623565b60ff168152600e805460408051602080840282018101909252828152610bd39390929091830182828015610bc357602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b945790505b5050505050610221610b43611553565b60ff16602080830191909152600e80546040805182850281018501909152818152610c3d9390929190830182828015610bc3576000918252602091829020805460ff168452908202830192909160019101808411610b945790505050505050610221610b43611553565b60ff16604080830191909152600d80548251602080830282018101909452818152610ca79390929190830182828015610b33576000918252602091829020805460ff168452908202830192909160019101808411610b045790505050505050610446610b43611553565b60ff166060820152600e805460408051602080840282018101909252828152610d0f9390929091830182828015610bc3576000918252602091829020805460ff168452908202830192909160019101808411610b945790505050505050610221610b43611553565b60ff16608082015260c0810184905260e08101839052604051610d3890859085906020016132d6565b60408051601f1981840301815291905260a082015280600c6000610d5d8560016135eb565b815260208082019290925260409081016000208351815485850151938601516060870151608088015160ff94851661ffff1990941693909317610100968516969096029590951763ffff00001916620100009184169190910263ff0000001916176301000000948316949094029390931760ff60201b1916600160201b919093160291909117815560a083015180519192610e0092600185019290910190612cab565b5060c08201518051610e1c916002840191602090910190612cab565b5060e08201518051610e38916003840191602090910190612cab565b50905050610e56610e463390565b610e518460016135eb565b61169b565b50506001600a555050565b600b546001600160a01b031690565b60606001805461040290613679565b610e8a3383836116b5565b5050565b610e9833836112a2565b610eb45760405162461bcd60e51b81526004016104ed90613522565b610ec084848484611780565b50505050565b6060610ed182611217565b610f075760405162461bcd60e51b81526020600482015260076024820152663737aa37b5b2b760c91b60448201526064016104ed565b6103ed826117b3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c602052600090815260409020805460018201805460ff80841694610100850482169462010000810483169463010000008204841694600160201b9092049093169290610f8b90613679565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb790613679565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b50505050509080600201805461101990613679565b80601f016020809104026020016040519081016040528092919081815260200182805461104590613679565b80156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b5050505050908060030180546110a790613679565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390613679565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b5050505050905088565b33611133610e61565b6001600160a01b0316146111595760405162461bcd60e51b81526004016104ed906134ed565b6001600160a01b0381166111be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ed565b61076e81611501565b60006001600160e01b031982166380ac58cd60e01b14806111f857506001600160e01b03198216635b5e139f60e01b145b806103ed57506301ffc9a760e01b6001600160e01b03198316146103ed565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112698261081f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112ad82611217565b61130e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104ed565b60006113198361081f565b9050806001600160a01b0316846001600160a01b031614806113545750836001600160a01b031661134984610485565b6001600160a01b0316145b8061136457506113648185610f10565b949350505050565b826001600160a01b031661137f8261081f565b6001600160a01b0316146113e35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104ed565b6001600160a01b0382166114455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ed565b6114508383836124c0565b61145b600082611234565b6001600160a01b0383166000908152600360205260408120805460019290611484908490613636565b90915550506001600160a01b03821660009081526003602052604081208054600192906114b29084906135eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206137c883398151915291a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600043423360405160200161156891906130e3565b6040516020818303038152906040528051906020012060001c61158b9190613603565b45424160405160200161159e91906130e3565b6040516020818303038152906040528051906020012060001c6115c19190613603565b6115cb44426135eb565b6115d591906135eb565b6115df91906135eb565b6115e991906135eb565b6115f391906135eb565b60405160200161160591815260200190565b6040516020818303038152906040528051906020012060001c905090565b6000806000905060008460008151811061163f5761163f613745565b602002602001015160ff1690505b838111611693578161165e816136cf565b925050848260ff168151811061167657611676613745565b602002602001015160ff168161168c91906135eb565b905061164d565b509392505050565b610e8a828260405180602001604052806000815250612578565b816001600160a01b0316836001600160a01b031614156117135760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104ed565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61178b84848461136c565b611797848484846125ab565b610ec05760405162461bcd60e51b81526004016104ed9061349b565b6000818152600c6020908152604080832081516101008082018452825460ff8082168452918104821695830195909552620100008504811693820193909352630100000084048316606082810191909152600160201b909404909216608083015260018101805493949360a08401919061182c90613679565b80601f016020809104026020016040519081016040528092919081815260200182805461185890613679565b80156118a55780601f1061187a576101008083540402835291602001916118a5565b820191906000526020600020905b81548152906001019060200180831161188857829003601f168201915b505050505081526020016002820180546118be90613679565b80601f01602080910402602001604051908101604052809291908181526020018280546118ea90613679565b80156119375780601f1061190c57610100808354040283529160200191611937565b820191906000526020600020905b81548152906001019060200180831161191a57829003601f168201915b5050505050815260200160038201805461195090613679565b80601f016020809104026020016040519081016040528092919081815260200182805461197c90613679565b80156119c95780601f1061199e576101008083540402835291602001916119c9565b820191906000526020600020905b8154815290600101906020018083116119ac57829003601f168201915b5050505050815250509050600060146000815481106119ea576119ea613745565b90600052602060002001600f836000015160ff1681548110611a0e57611a0e613745565b906000526020600020016014600181548110611a2c57611a2c613745565b906000526020600020016011856040015160ff1681548110611a5057611a50613745565b906000526020600020016014600281548110611a6e57611a6e613745565b906000526020600020016011876040015160ff1681548110611a9257611a92613745565b90600052602060002001604051602001611ab196959493929190613358565b6040516020818303038152906040529050806014600381548110611ad757611ad7613745565b906000526020600020016011846040015160ff1681548110611afb57611afb613745565b906000526020600020016014600481548110611b1957611b19613745565b906000526020600020016011866040015160ff1681548110611b3d57611b3d613745565b906000526020600020016014600581548110611b5b57611b5b613745565b906000526020600020016011886040015160ff1681548110611b7f57611b7f613745565b90600052602060002001604051602001611b9f979695949392919061327d565b6040516020818303038152906040529050806014600681548110611bc557611bc5613745565b906000526020600020016011846040015160ff1681548110611be957611be9613745565b906000526020600020016014600781548110611c0757611c07613745565b906000526020600020016011866040015160ff1681548110611c2b57611c2b613745565b906000526020600020016014600881548110611c4957611c49613745565b906000526020600020016011886040015160ff1681548110611c6d57611c6d613745565b90600052602060002001604051602001611c8d979695949392919061327d565b6040516020818303038152906040529050806014600981548110611cb357611cb3613745565b906000526020600020016011846040015160ff1681548110611cd757611cd7613745565b906000526020600020016014600a81548110611cf557611cf5613745565b906000526020600020016011866040015160ff1681548110611d1957611d19613745565b906000526020600020016014600b81548110611d3757611d37613745565b906000526020600020016011886040015160ff1681548110611d5b57611d5b613745565b90600052602060002001604051602001611d7b979695949392919061327d565b6040516020818303038152906040529050806014600c81548110611da157611da1613745565b906000526020600020016011846040015160ff1681548110611dc557611dc5613745565b906000526020600020016014600d81548110611de357611de3613745565b906000526020600020016010866020015160ff1681548110611e0757611e07613745565b906000526020600020016014600e81548110611e2557611e25613745565b906000526020600020016011886040015160ff1681548110611e4957611e49613745565b90600052602060002001604051602001611e69979695949392919061327d565b6040516020818303038152906040529050806014600f81548110611e8f57611e8f613745565b906000526020600020016011846040015160ff1681548110611eb357611eb3613745565b906000526020600020016014601081548110611ed157611ed1613745565b906000526020600020016011866040015160ff1681548110611ef557611ef5613745565b906000526020600020016014601181548110611f1357611f13613745565b906000526020600020016011886040015160ff1681548110611f3757611f37613745565b90600052602060002001604051602001611f57979695949392919061327d565b6040516020818303038152906040529050806014601281548110611f7d57611f7d613745565b906000526020600020016011846040015160ff1681548110611fa157611fa1613745565b906000526020600020016014601381548110611fbf57611fbf613745565b906000526020600020016011866040015160ff1681548110611fe357611fe3613745565b906000526020600020016014808154811061200057612000613745565b906000526020600020016011886040015160ff168154811061202457612024613745565b90600052602060002001604051602001612044979695949392919061327d565b604051602081830303815290604052905080601460158154811061206a5761206a613745565b906000526020600020016011846040015160ff168154811061208e5761208e613745565b9060005260206000200160146016815481106120ac576120ac613745565b906000526020600020016010866020015160ff16815481106120d0576120d0613745565b9060005260206000200160146017815481106120ee576120ee613745565b906000526020600020016010886020015160ff168154811061211257612112613745565b90600052602060002001604051602001612132979695949392919061327d565b604051602081830303815290604052905080601460188154811061215857612158613745565b906000526020600020016012846060015160ff168154811061217c5761217c613745565b90600052602060002001601460198154811061219a5761219a613745565b906000526020600020016012866060015160ff16815481106121be576121be613745565b906000526020600020016014601a815481106121dc576121dc613745565b906000526020600020016012886060015160ff168154811061220057612200613745565b90600052602060002001604051602001612220979695949392919061327d565b6040516020818303038152906040529050806014601b8154811061224657612246613745565b906000526020600020016012846060015160ff168154811061226a5761226a613745565b906000526020600020016014601c8154811061228857612288613745565b906000526020600020016012866060015160ff16815481106122ac576122ac613745565b906000526020600020016014601d815481106122ca576122ca613745565b906000526020600020016013886080015160ff16815481106122ee576122ee613745565b9060005260206000200160405160200161230e979695949392919061327d565b6040516020818303038152906040529050806014601e8154811061233457612334613745565b906000526020600020018360c001516014601f8154811061235757612357613745565b906000526020600020016013866080015160ff168154811061237b5761237b613745565b90600052602060002001601460208154811061239957612399613745565b906000526020600020016013886080015160ff16815481106123bd576123bd613745565b9060005260206000200160146021815481106123db576123db613745565b906000526020600020016040516020016123fc98979695949392919061321d565b6040516020818303038152906040529050808260e00151601460228154811061242757612427613745565b90600052602060002001604051602001612443939291906130fb565b6040516020818303038152906040529050612498612460856126b8565b612469846127b5565b6124728461289c565b60405160200161248493929190613385565b60405160208183030381529060405261289c565b6040516020016124a89190613406565b60405160208183030381529060405292505050919050565b6001600160a01b03831661251b5761251681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61253e565b816001600160a01b0316836001600160a01b03161461253e5761253e83826129ef565b6001600160a01b0382166125555761061e81612a8c565b826001600160a01b0316826001600160a01b03161461061e5761061e8282612b3b565b6125828383612b7f565b61258f60008484846125ab565b61061e5760405162461bcd60e51b81526004016104ed9061349b565b60006001600160a01b0384163b156126ad57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125ef90339089908890889060040161344b565b602060405180830381600087803b15801561260957600080fd5b505af1925050508015612639575060408051601f3d908101601f1916820190925261263691810190612f84565b60015b612693573d808015612667576040519150601f19603f3d011682016040523d82523d6000602084013e61266c565b606091505b50805161268b5760405162461bcd60e51b81526004016104ed9061349b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611364565b506001949350505050565b6060816126dc5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561270657806126f0816136b4565b91506126ff9050600a83613603565b91506126e0565b6000816001600160401b038111156127205761272061375b565b6040519080825280601f01601f19166020018201604052801561274a576020820181803683370190505b5090505b84156113645761275f600183613636565b915061276c600a866136ef565b6127779060306135eb565b60f81b81838151811061278c5761278c613745565b60200101906001600160f81b031916908160001a9053506127ae600a86613603565b945061274e565b6060600060156127cb846000015160ff166126b8565b60166127dd866020015160ff166126b8565b6040516020016127f09493929190613312565b6040516020818303038152906040529050806017612814856040015160ff166126b8565b6018612826876060015160ff166126b8565b60405160200161283a959493929190613138565b604051602081830303815290604052905080601961285e856080015160ff166126b8565b601a8660c00151601b8860e00151601c604051602001612885989796959493929190613193565b604051602081830303815290604052915050919050565b60608151600014156128bc57505060408051602081019091526000815290565b600060405180606001604052806040815260200161378860409139905060006003845160026128eb91906135eb565b6128f59190613603565b612900906004613617565b6001600160401b038111156129175761291761375b565b6040519080825280601f01601f191660200182016040528015612941576020820181803683370190505b509050600182016020820185865187015b808210156129ad576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612952565b50506003865106600181146129c957600281146129dc576129e4565b603d6001830353603d60028303536129e4565b603d60018303535b509195945050505050565b600060016129fc84610880565b612a069190613636565b600083815260076020526040902054909150808214612a59576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a9e90600190613636565b60008381526009602052604081205460088054939450909284908110612ac657612ac6613745565b906000526020600020015490508060088381548110612ae757612ae7613745565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b1f57612b1f61372f565b6001900381819060005260206000200160009055905550505050565b6000612b4683610880565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612bd55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ed565b612bde81611217565b15612c2a5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016104ed565b612c36600083836124c0565b6001600160a01b0382166000908152600360205260408120805460019290612c5f9084906135eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206137c8833981519152908290a45050565b828054612cb790613679565b90600052602060002090601f016020900481019282612cd95760008555612d1f565b82601f10612cf257805160ff1916838001178555612d1f565b82800160010185558215612d1f579182015b82811115612d1f578251825591602001919060010190612d04565b50612d2b929150612d2f565b5090565b5b80821115612d2b5760008155600101612d30565b60006001600160401b0380841115612d5e57612d5e61375b565b604051601f8501601f19908116603f01168101908282118183101715612d8657612d8661375b565b81604052809350858152868686011115612d9f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612dd057600080fd5b919050565b600082601f830112612de657600080fd5b612df583833560208501612d44565b9392505050565b600060208284031215612e0e57600080fd5b612df582612db9565b60008060408385031215612e2a57600080fd5b612e3383612db9565b9150612e4160208401612db9565b90509250929050565b600080600060608486031215612e5f57600080fd5b612e6884612db9565b9250612e7660208501612db9565b9150604084013590509250925092565b60008060008060808587031215612e9c57600080fd5b612ea585612db9565b9350612eb360208601612db9565b92506040850135915060608501356001600160401b03811115612ed557600080fd5b8501601f81018713612ee657600080fd5b612ef587823560208401612d44565b91505092959194509250565b60008060408385031215612f1457600080fd5b612f1d83612db9565b915060208301358015158114612f3257600080fd5b809150509250929050565b60008060408385031215612f5057600080fd5b612f5983612db9565b946020939093013593505050565b600060208284031215612f7957600080fd5b8135612df581613771565b600060208284031215612f9657600080fd5b8151612df581613771565b60008060408385031215612fb457600080fd5b82356001600160401b0380821115612fcb57600080fd5b612fd786838701612dd5565b93506020850135915080821115612fed57600080fd5b50612ffa85828601612dd5565b9150509250929050565b60006020828403121561301657600080fd5b5035919050565b6000815180845261303581602086016020860161364d565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061306357607f831692505b602080841082141561308557634e487b7160e01b600052602260045260246000fd5b81801561309957600181146130aa576130d7565b60ff198616895284890196506130d7565b60008881526020902060005b868110156130cf5781548b8201529085019083016130b6565b505084890196505b50505050505092915050565b60609190911b6001600160601b031916815260140190565b6000845161310d81846020890161364d565b84519083019061312181836020890161364d565b61312d81830186613049565b979650505050505050565b6000865161314a818460208b0161364d565b61315681840188613049565b90508551613168818360208a0161364d565b61317481830187613049565b915050835161318781836020880161364d565b01979650505050505050565b600089516131a5818460208e0161364d565b6131b18184018b613049565b905088516131c3818360208d0161364d565b6131cf8183018a613049565b91505086516131e2818360208b0161364d565b6131ee81830188613049565b915050845161320181836020890161364d565b61320d81830186613049565b9c9b505050505050505050505050565b6000895161322f818460208e0161364d565b61323b8184018b613049565b9050885161324d818360208d0161364d565b61320d61327761327161326b6132658587018e613049565b8c613049565b8a613049565b88613049565b86613049565b6000885161328f818460208d0161364d565b6132c86132c26132bc6132b66132b06132aa8689018f613049565b8d613049565b8b613049565b89613049565b87613049565b85613049565b9a9950505050505050505050565b600083516132e881846020880161364d565b602b60f81b908301908152835161330681600184016020880161364d565b01600101949350505050565b600061331e8287613049565b855161332e818360208a0161364d565b61333a81830187613049565b915050835161334d81836020880161364d565b019695505050505050565b600061337961337361327761327161326b613265878e613049565b84613049565b98975050505050505050565b7f7b226e616d65223a224c6f76652050616e646173204f6e20436861696e2023008152600084516133bd81601f85016020890161364d565b8451908301906133d481601f84016020890161364d565b84519101906133ea81601f84016020880161364d565b61227d60f01b601f929091019182015260210195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161343e81601d85016020870161364d565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347e9083018461301d565b9695505050505050565b602081526000612df5602083018461301d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061010060ff8b16835260ff8a16602084015260ff8916604084015260ff8816606084015260ff871660808401528060a08401526135b48184018761301d565b905082810360c08401526135c8818661301d565b905082810360e08401526135dc818561301d565b9b9a5050505050505050505050565b600082198211156135fe576135fe613703565b500190565b60008261361257613612613719565b500490565b600081600019048311821515161561363157613631613703565b500290565b60008282101561364857613648613703565b500390565b60005b83811015613668578181015183820152602001613650565b83811115610ec05750506000910152565b600181811c9082168061368d57607f821691505b602082108114156136ae57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136c8576136c8613703565b5060010190565b600060ff821660ff8114156136e6576136e6613703565b60010192915050565b6000826136fe576136fe613719565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461076e57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208c680d0a288996deb64ac5e524a9eb5110795846ecee50e4e1a5689c25463e0264736f6c63430008070033227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c222f3e3c656c6c697073652063783d22323637222063793d22313938222072783d223336222072793d22313322207374796c653d2266696c6c3a233b7374726f6b652d6c696e656361703a627574743b7374726f6b652d6c696e656a6f696e3a6d697465722220643d226d203133362e39332c3234302e33312031302c31342e363920392e36332c31312e33322031342e32312c31342e32392032302e32332c2d362e312032322e33312c2d382e30332031322e36382c2d342e3333202d38392e37342c2d32312e3335222f3e3c7465787420666f6e742d73697a653d2231342220793d223230352220783d223232312220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c6522207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313930222063793d22313333222072783d223738222072793d22353922207374796c653d2266696c6c3a2322207472616e73666f726d3d226d617472697828312e31342c302e322c2d302e32372c302e38332c302c3029223e222c202261747472696275746573223a205b7b2274726169745f74797065223a20224261636b67726f756e64222c2276616c7565223a202222207472616e73666f726d3d226d617472697828302e34383034393730372c302e38373639393633332c2d302e38373930363336392c302e34373637303433342c302c3029222f3e3c656c6c697073652063783d2239382e3736222063793d223232302e3631222072783d2233342e37222072793d2233322e303622207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313432222063793d22323638222072783d223432222072793d22313922207374796c653d2266696c6c3a233b7374726f6b652d77696474683a3170783b7374726f6b652d6c696e656361703a627574743b7374726f6b652d6c696e656a6f696e3a6d697465722220643d226d203230392e30312c3133362e373720372e30362c2d362e3120332e32312c2d312e323820392e36332c382e3939222f3e3c656c6c697073652063783d222d31322e3034222063793d223237312e3135222072783d2232392e3538222072793d2234362e333522207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a202254657874222c2276616c7565223a2022222f3e3c656c6c697073652063783d22323332222063793d222d3538222072783d223238222072793d22313622207472616e73666f726d3d226d617472697828302e39342c302e33342c2d302e31312c2d312c302c302922207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313636222063793d22323332222072783d223238222072793d22323122207472616e73666f726d3d226d617472697828302e38322c2d302e35372c302e30382c312c302c302922207374796c653d2266696c6c3a2322207472616e73666f726d3d226d617472697828312c2d302e30383938383838382c302e32393034373938342c302e39353638383131312c302c3029222f3e3c70617468207374796c653d2266696c6c3a233c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033383020333830223e3c7265637420783d22302220793d2230222077696474683d2233383022206865696768743d2233383022207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22323539222063793d222d3130222072783d223238222072793d22323122207472616e73666f726d3d226d617472697828302e38392c302e34362c2d302e30372c2d312c302c302922207374796c653d2266696c6c3a2322207472616e73666f726d3d226d617472697828302e37383236303336342c2d302e36323235323033312c302e36313931333339392c302e37383532383533362c302c3029222f3e3c656c6c697073652063783d223330392e3933222063793d222d38342e3234222072783d2232392e3539222072793d2234362e333522207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22323339222063793d223833222072783d223232222072793d22313622207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a20224e616d6532222c2276616c7565223a2022227d2c7b2274726169745f74797065223a2022467572206c69676874222c2276616c7565223a202222207472616e73666f726d3d226d617472697828312e31342c302e322c2d302e32372c302e38332c302c3029223e2b3c2f746578743e3c7465787420666f6e742d73697a653d2231342220793d223233352220783d223232312220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c6522207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22323639222063793d22323033222072783d223332222072793d22313422207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a20224e616d6531222c2276616c7565223a2022222f3e3c656c6c697073652063783d22313836222063793d22313531222072783d2237222072793d223522207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a20224865617274222c2276616c7565223a20223c2f746578743e3c7465787420666f6e742d73697a653d2232312220793d223232302220783d223232312220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c6522207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313133222063793d22313937222072783d223336222072793d22313122207374796c653d2266696c6c3a233b7374726f6b652d77696474683a3170783b7374726f6b652d6c696e656361703a627574743b7374726f6b652d6c696e656a6f696e3a6d697465723b7374726f6b652d6f7061636974793a312220643d226d203136392c313539206320342e362c3420342e362c3420342e362c34206c20362c302e373820342e392c2d372e373620372c3620762030206c20362e382c2d302e303320322e37382c2d342e3433222f3e3c70617468207374796c653d2266696c6c3a6e6f6e653b7374726f6b653a233b7374726f6b652d77696474683a3170783b7374726f6b652d6c696e656361703a627574743b7374726f6b652d6c696e656a6f696e3a6d697465722220643d226d203134372e36392c3133382e3338206320392e36332c2d392e393520392e36332c2d392e393520392e36332c2d392e3935206c20372e372c362e3432222f3e3c70617468207374796c653d2266696c6c3a6e6f6e653b7374726f6b653a233c2f746578743e3c7465787420666f6e742d73697a653d22332220793d223338392220783d2236302220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c6522207374796c653d2266696c6c3a2365636563656322207472616e73666f726d3d22726f74617465282d333529223e34323c2f746578743e3c2f7376673e222f3e3c656c6c697073652063783d22323633222063793d22323730222072783d223232222072793d22323022207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22323332222063793d22323637222072783d223432222072793d22313922207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a2022467572206461726b222c2276616c7565223a202222207472616e73666f726d3d226d617472697828312c2d302e30393530333731382c302e32373538353137372c302e39363132303031392c302c3029222f3e3c656c6c697073652063783d223135392e3236222063793d223234342e3633222072783d2233352e3734222072793d2233312e333722207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313336222063793d223837222072783d223233222072793d22313722207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313430222063793d22313931222072783d223239222072793d22313722207472616e73666f726d3d226d617472697828302e392c2d302e34342c302e31322c312c302c302922207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313237222063793d222d313937222072783d223230222072793d22313722207472616e73666f726d3d226d617472697828302e39322c2d302e33392c2d302e352c2d302e38362c302c302922207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22323137222063793d22313936222072783d2232382e36222072793d2231352e3722207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d223839222063793d22323030222072783d223134222072793d22313222207374796c653d2266696c6c3a23222f3e3c70617468207374796c653d2266696c6c3a6e6f6e653b7374726f6b653a23222f3e3c656c6c697073652063783d22313037222063793d22323131222072783d223234222072793d223622207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d22313134222063793d22323731222072783d223232222072793d22323022207374796c653d2266696c6c3a23222f3e3c656c6c697073652063783d223633222063793d222d313933222072783d223139222072793d22313722207472616e73666f726d3d226d617472697828302e38392c2d302e34342c2d302e34342c2d302e392c302c302922207374796c653d2266696c6c3a23

Deployed Bytecode

0x6080604052600436106101055760003560e01c806301ffc9a71461010a57806306fdde031461013f578063081812fc14610161578063095ea7b31461019957806318160ddd146101bb57806323b872dd146101da5780632f745c59146101fa5780633ccfd60b1461021a57806342842e0e146102225780634f6ccce7146102425780636352211e1461026257806370a0823114610282578063715018a6146102a25780638aa0fdad146102b75780638da5cb5b146102ca57806395d89b41146102df578063a22cb465146102f4578063b88d4fde14610314578063c87b56dd14610334578063e985e9c514610354578063ee3c127514610374578063f2fde38b146103a8575b600080fd5b34801561011657600080fd5b5061012a610125366004612f67565b6103c8565b60405190151581526020015b60405180910390f35b34801561014b57600080fd5b506101546103f3565b6040516101369190613488565b34801561016d57600080fd5b5061018161017c366004613004565b610485565b6040516001600160a01b039091168152602001610136565b3480156101a557600080fd5b506101b96101b4366004612f3d565b610512565b005b3480156101c757600080fd5b506008545b604051908152602001610136565b3480156101e657600080fd5b506101b96101f5366004612e4a565b610623565b34801561020657600080fd5b506101cc610215366004612f3d565b610654565b6101b96106ea565b34801561022e57600080fd5b506101b961023d366004612e4a565b610771565b34801561024e57600080fd5b506101cc61025d366004613004565b61078c565b34801561026e57600080fd5b5061018161027d366004613004565b61081f565b34801561028e57600080fd5b506101cc61029d366004612dfc565b610880565b3480156102ae57600080fd5b506101b96108eb565b6101b96102c5366004612fa1565b610926565b3480156102d657600080fd5b50610181610e61565b3480156102eb57600080fd5b50610154610e70565b34801561030057600080fd5b506101b961030f366004612f01565b610e7f565b34801561032057600080fd5b506101b961032f366004612e86565b610e8e565b34801561034057600080fd5b5061015461034f366004613004565b610ec6565b34801561036057600080fd5b5061012a61036f366004612e17565b610f10565b34801561038057600080fd5b5061039461038f366004613004565b610f3e565b604051610136989796959493929190613573565b3480156103b457600080fd5b506101b96103c3366004612dfc565b61112a565b60006001600160e01b0319821663780e9d6360e01b14806103ed57506103ed826111c7565b92915050565b60606000805461040290613679565b80601f016020809104026020016040519081016040528092919081815260200182805461042e90613679565b801561047b5780601f106104505761010080835404028352916020019161047b565b820191906000526020600020905b81548152906001019060200180831161045e57829003601f168201915b5050505050905090565b600061049082611217565b6104f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061051d8261081f565b9050806001600160a01b0316836001600160a01b0316141561058b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104ed565b336001600160a01b03821614806105a757506105a78133610f10565b6106145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016104ed565b61061e8383611234565b505050565b61062d33826112a2565b6106495760405162461bcd60e51b81526004016104ed90613522565b61061e83838361136c565b600061065f83610880565b82106106c15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104ed565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b336106f3610e61565b6001600160a01b0316146107195760405162461bcd60e51b81526004016104ed906134ed565b604051600090339047908381818185875af1925050503d806000811461075b576040519150601f19603f3d011682016040523d82523d6000602084013e610760565b606091505b505090508061076e57600080fd5b50565b61061e83838360405180602001604052806000815250610e8e565b600061079760085490565b82106107fa5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104ed565b6008828154811061080d5761080d613745565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103ed5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d103737b732bc34b9ba32b73a103a37b5b2b760391b60448201526064016104ed565b60006001600160a01b0382166108cf5760405162461bcd60e51b81526020600482015260146024820152734552433732313a207a65726f206164647265737360601b60448201526064016104ed565b506001600160a01b031660009081526003602052604090205490565b336108f4610e61565b6001600160a01b03161461091a5760405162461bcd60e51b81526004016104ed906134ed565b6109246000611501565b565b6002600a5414156109795760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104ed565b6002600a55600061098960085490565b905061106881106109c85760405162461bcd60e51b81526020600482015260096024820152686e6f2050616e64617360b81b60448201526064016104ed565b600e8351111580156109dc5750600e825111155b610a125760405162461bcd60e51b8152602060048201526007602482015266746f6f6c6f6e6760c81b60448201526064016104ed565b610a1a610e61565b6001600160a01b0316336001600160a01b031614158015610a3b5750602a81115b15610a835766753d533d968000341015610a835760405162461bcd60e51b81526020600482015260096024820152686d696e2056616c756560b81b60448201526064016104ed565b60408051610100810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c0810182905260e0810191909152610b52600d805480602002602001604051908101604052809291908181526020018280548015610b3357602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b045790505b5050505050610446610b43611553565b610b4d91906136ef565b611623565b60ff168152600e805460408051602080840282018101909252828152610bd39390929091830182828015610bc357602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b945790505b5050505050610221610b43611553565b60ff16602080830191909152600e80546040805182850281018501909152818152610c3d9390929190830182828015610bc3576000918252602091829020805460ff168452908202830192909160019101808411610b945790505050505050610221610b43611553565b60ff16604080830191909152600d80548251602080830282018101909452818152610ca79390929190830182828015610b33576000918252602091829020805460ff168452908202830192909160019101808411610b045790505050505050610446610b43611553565b60ff166060820152600e805460408051602080840282018101909252828152610d0f9390929091830182828015610bc3576000918252602091829020805460ff168452908202830192909160019101808411610b945790505050505050610221610b43611553565b60ff16608082015260c0810184905260e08101839052604051610d3890859085906020016132d6565b60408051601f1981840301815291905260a082015280600c6000610d5d8560016135eb565b815260208082019290925260409081016000208351815485850151938601516060870151608088015160ff94851661ffff1990941693909317610100968516969096029590951763ffff00001916620100009184169190910263ff0000001916176301000000948316949094029390931760ff60201b1916600160201b919093160291909117815560a083015180519192610e0092600185019290910190612cab565b5060c08201518051610e1c916002840191602090910190612cab565b5060e08201518051610e38916003840191602090910190612cab565b50905050610e56610e463390565b610e518460016135eb565b61169b565b50506001600a555050565b600b546001600160a01b031690565b60606001805461040290613679565b610e8a3383836116b5565b5050565b610e9833836112a2565b610eb45760405162461bcd60e51b81526004016104ed90613522565b610ec084848484611780565b50505050565b6060610ed182611217565b610f075760405162461bcd60e51b81526020600482015260076024820152663737aa37b5b2b760c91b60448201526064016104ed565b6103ed826117b3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c602052600090815260409020805460018201805460ff80841694610100850482169462010000810483169463010000008204841694600160201b9092049093169290610f8b90613679565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb790613679565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b50505050509080600201805461101990613679565b80601f016020809104026020016040519081016040528092919081815260200182805461104590613679565b80156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b5050505050908060030180546110a790613679565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390613679565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b5050505050905088565b33611133610e61565b6001600160a01b0316146111595760405162461bcd60e51b81526004016104ed906134ed565b6001600160a01b0381166111be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ed565b61076e81611501565b60006001600160e01b031982166380ac58cd60e01b14806111f857506001600160e01b03198216635b5e139f60e01b145b806103ed57506301ffc9a760e01b6001600160e01b03198316146103ed565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112698261081f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112ad82611217565b61130e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104ed565b60006113198361081f565b9050806001600160a01b0316846001600160a01b031614806113545750836001600160a01b031661134984610485565b6001600160a01b0316145b8061136457506113648185610f10565b949350505050565b826001600160a01b031661137f8261081f565b6001600160a01b0316146113e35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104ed565b6001600160a01b0382166114455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ed565b6114508383836124c0565b61145b600082611234565b6001600160a01b0383166000908152600360205260408120805460019290611484908490613636565b90915550506001600160a01b03821660009081526003602052604081208054600192906114b29084906135eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206137c883398151915291a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600043423360405160200161156891906130e3565b6040516020818303038152906040528051906020012060001c61158b9190613603565b45424160405160200161159e91906130e3565b6040516020818303038152906040528051906020012060001c6115c19190613603565b6115cb44426135eb565b6115d591906135eb565b6115df91906135eb565b6115e991906135eb565b6115f391906135eb565b60405160200161160591815260200190565b6040516020818303038152906040528051906020012060001c905090565b6000806000905060008460008151811061163f5761163f613745565b602002602001015160ff1690505b838111611693578161165e816136cf565b925050848260ff168151811061167657611676613745565b602002602001015160ff168161168c91906135eb565b905061164d565b509392505050565b610e8a828260405180602001604052806000815250612578565b816001600160a01b0316836001600160a01b031614156117135760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104ed565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61178b84848461136c565b611797848484846125ab565b610ec05760405162461bcd60e51b81526004016104ed9061349b565b6000818152600c6020908152604080832081516101008082018452825460ff8082168452918104821695830195909552620100008504811693820193909352630100000084048316606082810191909152600160201b909404909216608083015260018101805493949360a08401919061182c90613679565b80601f016020809104026020016040519081016040528092919081815260200182805461185890613679565b80156118a55780601f1061187a576101008083540402835291602001916118a5565b820191906000526020600020905b81548152906001019060200180831161188857829003601f168201915b505050505081526020016002820180546118be90613679565b80601f01602080910402602001604051908101604052809291908181526020018280546118ea90613679565b80156119375780601f1061190c57610100808354040283529160200191611937565b820191906000526020600020905b81548152906001019060200180831161191a57829003601f168201915b5050505050815260200160038201805461195090613679565b80601f016020809104026020016040519081016040528092919081815260200182805461197c90613679565b80156119c95780601f1061199e576101008083540402835291602001916119c9565b820191906000526020600020905b8154815290600101906020018083116119ac57829003601f168201915b5050505050815250509050600060146000815481106119ea576119ea613745565b90600052602060002001600f836000015160ff1681548110611a0e57611a0e613745565b906000526020600020016014600181548110611a2c57611a2c613745565b906000526020600020016011856040015160ff1681548110611a5057611a50613745565b906000526020600020016014600281548110611a6e57611a6e613745565b906000526020600020016011876040015160ff1681548110611a9257611a92613745565b90600052602060002001604051602001611ab196959493929190613358565b6040516020818303038152906040529050806014600381548110611ad757611ad7613745565b906000526020600020016011846040015160ff1681548110611afb57611afb613745565b906000526020600020016014600481548110611b1957611b19613745565b906000526020600020016011866040015160ff1681548110611b3d57611b3d613745565b906000526020600020016014600581548110611b5b57611b5b613745565b906000526020600020016011886040015160ff1681548110611b7f57611b7f613745565b90600052602060002001604051602001611b9f979695949392919061327d565b6040516020818303038152906040529050806014600681548110611bc557611bc5613745565b906000526020600020016011846040015160ff1681548110611be957611be9613745565b906000526020600020016014600781548110611c0757611c07613745565b906000526020600020016011866040015160ff1681548110611c2b57611c2b613745565b906000526020600020016014600881548110611c4957611c49613745565b906000526020600020016011886040015160ff1681548110611c6d57611c6d613745565b90600052602060002001604051602001611c8d979695949392919061327d565b6040516020818303038152906040529050806014600981548110611cb357611cb3613745565b906000526020600020016011846040015160ff1681548110611cd757611cd7613745565b906000526020600020016014600a81548110611cf557611cf5613745565b906000526020600020016011866040015160ff1681548110611d1957611d19613745565b906000526020600020016014600b81548110611d3757611d37613745565b906000526020600020016011886040015160ff1681548110611d5b57611d5b613745565b90600052602060002001604051602001611d7b979695949392919061327d565b6040516020818303038152906040529050806014600c81548110611da157611da1613745565b906000526020600020016011846040015160ff1681548110611dc557611dc5613745565b906000526020600020016014600d81548110611de357611de3613745565b906000526020600020016010866020015160ff1681548110611e0757611e07613745565b906000526020600020016014600e81548110611e2557611e25613745565b906000526020600020016011886040015160ff1681548110611e4957611e49613745565b90600052602060002001604051602001611e69979695949392919061327d565b6040516020818303038152906040529050806014600f81548110611e8f57611e8f613745565b906000526020600020016011846040015160ff1681548110611eb357611eb3613745565b906000526020600020016014601081548110611ed157611ed1613745565b906000526020600020016011866040015160ff1681548110611ef557611ef5613745565b906000526020600020016014601181548110611f1357611f13613745565b906000526020600020016011886040015160ff1681548110611f3757611f37613745565b90600052602060002001604051602001611f57979695949392919061327d565b6040516020818303038152906040529050806014601281548110611f7d57611f7d613745565b906000526020600020016011846040015160ff1681548110611fa157611fa1613745565b906000526020600020016014601381548110611fbf57611fbf613745565b906000526020600020016011866040015160ff1681548110611fe357611fe3613745565b906000526020600020016014808154811061200057612000613745565b906000526020600020016011886040015160ff168154811061202457612024613745565b90600052602060002001604051602001612044979695949392919061327d565b604051602081830303815290604052905080601460158154811061206a5761206a613745565b906000526020600020016011846040015160ff168154811061208e5761208e613745565b9060005260206000200160146016815481106120ac576120ac613745565b906000526020600020016010866020015160ff16815481106120d0576120d0613745565b9060005260206000200160146017815481106120ee576120ee613745565b906000526020600020016010886020015160ff168154811061211257612112613745565b90600052602060002001604051602001612132979695949392919061327d565b604051602081830303815290604052905080601460188154811061215857612158613745565b906000526020600020016012846060015160ff168154811061217c5761217c613745565b90600052602060002001601460198154811061219a5761219a613745565b906000526020600020016012866060015160ff16815481106121be576121be613745565b906000526020600020016014601a815481106121dc576121dc613745565b906000526020600020016012886060015160ff168154811061220057612200613745565b90600052602060002001604051602001612220979695949392919061327d565b6040516020818303038152906040529050806014601b8154811061224657612246613745565b906000526020600020016012846060015160ff168154811061226a5761226a613745565b906000526020600020016014601c8154811061228857612288613745565b906000526020600020016012866060015160ff16815481106122ac576122ac613745565b906000526020600020016014601d815481106122ca576122ca613745565b906000526020600020016013886080015160ff16815481106122ee576122ee613745565b9060005260206000200160405160200161230e979695949392919061327d565b6040516020818303038152906040529050806014601e8154811061233457612334613745565b906000526020600020018360c001516014601f8154811061235757612357613745565b906000526020600020016013866080015160ff168154811061237b5761237b613745565b90600052602060002001601460208154811061239957612399613745565b906000526020600020016013886080015160ff16815481106123bd576123bd613745565b9060005260206000200160146021815481106123db576123db613745565b906000526020600020016040516020016123fc98979695949392919061321d565b6040516020818303038152906040529050808260e00151601460228154811061242757612427613745565b90600052602060002001604051602001612443939291906130fb565b6040516020818303038152906040529050612498612460856126b8565b612469846127b5565b6124728461289c565b60405160200161248493929190613385565b60405160208183030381529060405261289c565b6040516020016124a89190613406565b60405160208183030381529060405292505050919050565b6001600160a01b03831661251b5761251681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61253e565b816001600160a01b0316836001600160a01b03161461253e5761253e83826129ef565b6001600160a01b0382166125555761061e81612a8c565b826001600160a01b0316826001600160a01b03161461061e5761061e8282612b3b565b6125828383612b7f565b61258f60008484846125ab565b61061e5760405162461bcd60e51b81526004016104ed9061349b565b60006001600160a01b0384163b156126ad57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125ef90339089908890889060040161344b565b602060405180830381600087803b15801561260957600080fd5b505af1925050508015612639575060408051601f3d908101601f1916820190925261263691810190612f84565b60015b612693573d808015612667576040519150601f19603f3d011682016040523d82523d6000602084013e61266c565b606091505b50805161268b5760405162461bcd60e51b81526004016104ed9061349b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611364565b506001949350505050565b6060816126dc5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561270657806126f0816136b4565b91506126ff9050600a83613603565b91506126e0565b6000816001600160401b038111156127205761272061375b565b6040519080825280601f01601f19166020018201604052801561274a576020820181803683370190505b5090505b84156113645761275f600183613636565b915061276c600a866136ef565b6127779060306135eb565b60f81b81838151811061278c5761278c613745565b60200101906001600160f81b031916908160001a9053506127ae600a86613603565b945061274e565b6060600060156127cb846000015160ff166126b8565b60166127dd866020015160ff166126b8565b6040516020016127f09493929190613312565b6040516020818303038152906040529050806017612814856040015160ff166126b8565b6018612826876060015160ff166126b8565b60405160200161283a959493929190613138565b604051602081830303815290604052905080601961285e856080015160ff166126b8565b601a8660c00151601b8860e00151601c604051602001612885989796959493929190613193565b604051602081830303815290604052915050919050565b60608151600014156128bc57505060408051602081019091526000815290565b600060405180606001604052806040815260200161378860409139905060006003845160026128eb91906135eb565b6128f59190613603565b612900906004613617565b6001600160401b038111156129175761291761375b565b6040519080825280601f01601f191660200182016040528015612941576020820181803683370190505b509050600182016020820185865187015b808210156129ad576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612952565b50506003865106600181146129c957600281146129dc576129e4565b603d6001830353603d60028303536129e4565b603d60018303535b509195945050505050565b600060016129fc84610880565b612a069190613636565b600083815260076020526040902054909150808214612a59576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a9e90600190613636565b60008381526009602052604081205460088054939450909284908110612ac657612ac6613745565b906000526020600020015490508060088381548110612ae757612ae7613745565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b1f57612b1f61372f565b6001900381819060005260206000200160009055905550505050565b6000612b4683610880565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612bd55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ed565b612bde81611217565b15612c2a5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016104ed565b612c36600083836124c0565b6001600160a01b0382166000908152600360205260408120805460019290612c5f9084906135eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206137c8833981519152908290a45050565b828054612cb790613679565b90600052602060002090601f016020900481019282612cd95760008555612d1f565b82601f10612cf257805160ff1916838001178555612d1f565b82800160010185558215612d1f579182015b82811115612d1f578251825591602001919060010190612d04565b50612d2b929150612d2f565b5090565b5b80821115612d2b5760008155600101612d30565b60006001600160401b0380841115612d5e57612d5e61375b565b604051601f8501601f19908116603f01168101908282118183101715612d8657612d8661375b565b81604052809350858152868686011115612d9f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612dd057600080fd5b919050565b600082601f830112612de657600080fd5b612df583833560208501612d44565b9392505050565b600060208284031215612e0e57600080fd5b612df582612db9565b60008060408385031215612e2a57600080fd5b612e3383612db9565b9150612e4160208401612db9565b90509250929050565b600080600060608486031215612e5f57600080fd5b612e6884612db9565b9250612e7660208501612db9565b9150604084013590509250925092565b60008060008060808587031215612e9c57600080fd5b612ea585612db9565b9350612eb360208601612db9565b92506040850135915060608501356001600160401b03811115612ed557600080fd5b8501601f81018713612ee657600080fd5b612ef587823560208401612d44565b91505092959194509250565b60008060408385031215612f1457600080fd5b612f1d83612db9565b915060208301358015158114612f3257600080fd5b809150509250929050565b60008060408385031215612f5057600080fd5b612f5983612db9565b946020939093013593505050565b600060208284031215612f7957600080fd5b8135612df581613771565b600060208284031215612f9657600080fd5b8151612df581613771565b60008060408385031215612fb457600080fd5b82356001600160401b0380821115612fcb57600080fd5b612fd786838701612dd5565b93506020850135915080821115612fed57600080fd5b50612ffa85828601612dd5565b9150509250929050565b60006020828403121561301657600080fd5b5035919050565b6000815180845261303581602086016020860161364d565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061306357607f831692505b602080841082141561308557634e487b7160e01b600052602260045260246000fd5b81801561309957600181146130aa576130d7565b60ff198616895284890196506130d7565b60008881526020902060005b868110156130cf5781548b8201529085019083016130b6565b505084890196505b50505050505092915050565b60609190911b6001600160601b031916815260140190565b6000845161310d81846020890161364d565b84519083019061312181836020890161364d565b61312d81830186613049565b979650505050505050565b6000865161314a818460208b0161364d565b61315681840188613049565b90508551613168818360208a0161364d565b61317481830187613049565b915050835161318781836020880161364d565b01979650505050505050565b600089516131a5818460208e0161364d565b6131b18184018b613049565b905088516131c3818360208d0161364d565b6131cf8183018a613049565b91505086516131e2818360208b0161364d565b6131ee81830188613049565b915050845161320181836020890161364d565b61320d81830186613049565b9c9b505050505050505050505050565b6000895161322f818460208e0161364d565b61323b8184018b613049565b9050885161324d818360208d0161364d565b61320d61327761327161326b6132658587018e613049565b8c613049565b8a613049565b88613049565b86613049565b6000885161328f818460208d0161364d565b6132c86132c26132bc6132b66132b06132aa8689018f613049565b8d613049565b8b613049565b89613049565b87613049565b85613049565b9a9950505050505050505050565b600083516132e881846020880161364d565b602b60f81b908301908152835161330681600184016020880161364d565b01600101949350505050565b600061331e8287613049565b855161332e818360208a0161364d565b61333a81830187613049565b915050835161334d81836020880161364d565b019695505050505050565b600061337961337361327761327161326b613265878e613049565b84613049565b98975050505050505050565b7f7b226e616d65223a224c6f76652050616e646173204f6e20436861696e2023008152600084516133bd81601f85016020890161364d565b8451908301906133d481601f84016020890161364d565b84519101906133ea81601f84016020880161364d565b61227d60f01b601f929091019182015260210195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161343e81601d85016020870161364d565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347e9083018461301d565b9695505050505050565b602081526000612df5602083018461301d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061010060ff8b16835260ff8a16602084015260ff8916604084015260ff8816606084015260ff871660808401528060a08401526135b48184018761301d565b905082810360c08401526135c8818661301d565b905082810360e08401526135dc818561301d565b9b9a5050505050505050505050565b600082198211156135fe576135fe613703565b500190565b60008261361257613612613719565b500490565b600081600019048311821515161561363157613631613703565b500290565b60008282101561364857613648613703565b500390565b60005b83811015613668578181015183820152602001613650565b83811115610ec05750506000910152565b600181811c9082168061368d57607f821691505b602082108114156136ae57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136c8576136c8613703565b5060010190565b600060ff821660ff8114156136e6576136e6613703565b60010192915050565b6000826136fe576136fe613719565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461076e57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208c680d0a288996deb64ac5e524a9eb5110795846ecee50e4e1a5689c25463e0264736f6c63430008070033

Deployed Bytecode Sourcemap

49491:10438:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43343:224;;;;;;;;;;-1:-1:-1;43343:224:0;;;;;:::i;:::-;;:::i;:::-;;;14924:14:1;;14917:22;14899:41;;14887:2;14872:18;43343:224:0;;;;;;;;21174:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22721:221::-;;;;;;;;;;-1:-1:-1;22721:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;14222:32:1;;;14204:51;;14192:2;14177:18;22721:221:0;14058:203:1;22244:411:0;;;;;;;;;;-1:-1:-1;22244:411:0;;;;;:::i;:::-;;:::i;:::-;;43983:113;;;;;;;;;;-1:-1:-1;44071:10:0;:17;43983:113;;;23694:25:1;;;23682:2;23667:18;43983:113:0;23548:177:1;23471:339:0;;;;;;;;;;-1:-1:-1;23471:339:0;;;;;:::i;:::-;;:::i;43651:256::-;;;;;;;;;;-1:-1:-1;43651:256:0;;;;;:::i;:::-;;:::i;59767:159::-;;;:::i;23881:185::-;;;;;;;;;;-1:-1:-1;23881:185:0;;;;;:::i;:::-;;:::i;44173:233::-;;;;;;;;;;-1:-1:-1;44173:233:0;;;;;:::i;:::-;;:::i;20884:223::-;;;;;;;;;;-1:-1:-1;20884:223:0;;;;;:::i;:::-;;:::i;20636:186::-;;;;;;;;;;-1:-1:-1;20636:186:0;;;;;:::i;:::-;;:::i;38244:103::-;;;;;;;;;;;;;:::i;55155:932::-;;;;;;:::i;:::-;;:::i;37593:87::-;;;;;;;;;;;;;:::i;21343:104::-;;;;;;;;;;;;;:::i;23014:155::-;;;;;;;;;;-1:-1:-1;23014:155:0;;;;;:::i;:::-;;:::i;24137:328::-;;;;;;;;;;-1:-1:-1;24137:328:0;;;;;:::i;:::-;;:::i;59519:240::-;;;;;;;;;;-1:-1:-1;59519:240:0;;;;;:::i;:::-;;:::i;23240:164::-;;;;;;;;;;-1:-1:-1;23240:164:0;;;;;:::i;:::-;;:::i;49606:47::-;;;;;;;;;;-1:-1:-1;49606:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;38502:201::-;;;;;;;;;;-1:-1:-1;38502:201:0;;;;;:::i;:::-;;:::i;43343:224::-;43445:4;-1:-1:-1;;;;;;43469:50:0;;-1:-1:-1;;;43469:50:0;;:90;;;43523:36;43547:11;43523:23;:36::i;:::-;43462:97;43343:224;-1:-1:-1;;43343:224:0:o;21174:100::-;21228:13;21261:5;21254:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21174:100;:::o;22721:221::-;22797:7;22825:16;22833:7;22825;:16::i;:::-;22817:73;;;;-1:-1:-1;;;22817:73:0;;20010:2:1;22817:73:0;;;19992:21:1;20049:2;20029:18;;;20022:30;20088:34;20068:18;;;20061:62;-1:-1:-1;;;20139:18:1;;;20132:42;20191:19;;22817:73:0;;;;;;;;;-1:-1:-1;22910:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22910:24:0;;22721:221::o;22244:411::-;22325:13;22341:23;22356:7;22341:14;:23::i;:::-;22325:39;;22389:5;-1:-1:-1;;;;;22383:11:0;:2;-1:-1:-1;;;;;22383:11:0;;;22375:57;;;;-1:-1:-1;;;22375:57:0;;21138:2:1;22375:57:0;;;21120:21:1;21177:2;21157:18;;;21150:30;21216:34;21196:18;;;21189:62;-1:-1:-1;;;21267:18:1;;;21260:31;21308:19;;22375:57:0;20936:397:1;22375:57:0;8485:10;-1:-1:-1;;;;;22467:21:0;;;;:62;;-1:-1:-1;22492:37:0;22509:5;8485:10;23240:164;:::i;22492:37::-;22445:168;;;;-1:-1:-1;;;22445:168:0;;19224:2:1;22445:168:0;;;19206:21:1;19263:2;19243:18;;;19236:30;19302:34;19282:18;;;19275:62;-1:-1:-1;;;19353:18:1;;;19346:54;19417:19;;22445:168:0;19022:420:1;22445:168:0;22626:21;22635:2;22639:7;22626:8;:21::i;:::-;22314:341;22244:411;;:::o;23471:339::-;23666:41;8485:10;23699:7;23666:18;:41::i;:::-;23658:103;;;;-1:-1:-1;;;23658:103:0;;;;;;;:::i;:::-;23774:28;23784:4;23790:2;23794:7;23774:9;:28::i;43651:256::-;43748:7;43784:23;43801:5;43784:16;:23::i;:::-;43776:5;:31;43768:87;;;;-1:-1:-1;;;43768:87:0;;15714:2:1;43768:87:0;;;15696:21:1;15753:2;15733:18;;;15726:30;15792:34;15772:18;;;15765:62;-1:-1:-1;;;15843:18:1;;;15836:41;15894:19;;43768:87:0;15512:407:1;43768:87:0;-1:-1:-1;;;;;;43873:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;43651:256::o;59767:159::-;8485:10;37813:7;:5;:7::i;:::-;-1:-1:-1;;;;;37813:23:0;;37805:68;;;;-1:-1:-1;;;37805:68:0;;;;;;;:::i;:::-;59839:58:::1;::::0;59821:12:::1;::::0;59847:10:::1;::::0;59871:21:::1;::::0;59821:12;59839:58;59821:12;59839:58;59871:21;59847:10;59839:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59820:77;;;59913:7;59905:16;;;::::0;::::1;;59812:114;59767:159::o:0;23881:185::-;24019:39;24036:4;24042:2;24046:7;24019:39;;;;;;;;;;;;:16;:39::i;44173:233::-;44248:7;44284:30;44071:10;:17;;43983:113;44284:30;44276:5;:38;44268:95;;;;-1:-1:-1;;;44268:95:0;;22977:2:1;44268:95:0;;;22959:21:1;23016:2;22996:18;;;22989:30;23055:34;23035:18;;;23028:62;-1:-1:-1;;;23106:18:1;;;23099:42;23158:19;;44268:95:0;22775:408:1;44268:95:0;44381:10;44392:5;44381:17;;;;;;;;:::i;:::-;;;;;;;;;44374:24;;44173:233;;;:::o;20884:223::-;20956:7;20992:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20992:16:0;21027:19;21019:57;;;;-1:-1:-1;;;21019:57:0;;20784:2:1;21019:57:0;;;20766:21:1;20823:2;20803:18;;;20796:30;-1:-1:-1;;;20842:18:1;;;20835:55;20907:18;;21019:57:0;20582:349:1;20636:186:0;20708:7;-1:-1:-1;;;;;20736:19:0;;20728:52;;;;-1:-1:-1;;;20728:52:0;;22628:2:1;20728:52:0;;;22610:21:1;22667:2;22647:18;;;22640:30;-1:-1:-1;;;22686:18:1;;;22679:50;22746:18;;20728:52:0;22426:344:1;20728:52:0;-1:-1:-1;;;;;;20798:16:0;;;;;:9;:16;;;;;;;20636:186::o;38244:103::-;8485:10;37813:7;:5;:7::i;:::-;-1:-1:-1;;;;;37813:23:0;;37805:68;;;;-1:-1:-1;;;37805:68:0;;;;;;;:::i;:::-;38309:30:::1;38336:1;38309:18;:30::i;:::-;38244:103::o:0;55155:932::-;40712:1;41310:7;;:19;;41302:63;;;;-1:-1:-1;;;41302:63:0;;23390:2:1;41302:63:0;;;23372:21:1;23429:2;23409:18;;;23402:30;23468:33;23448:18;;;23441:61;23519:18;;41302:63:0;23188:355:1;41302:63:0;40712:1;41443:7;:18;55259:14:::1;55276:13;44071:10:::0;:17;;43983:113;55276:13:::1;55259:30;;55317:4;55308:6;:13;55300:35;;;::::0;-1:-1:-1;;;55300:35:0;;15377:2:1;55300:35:0::1;::::0;::::1;15359:21:1::0;15416:1;15396:18;;;15389:29;-1:-1:-1;;;15434:18:1;;;15427:39;15483:18;;55300:35:0::1;15175:332:1::0;55300:35:0::1;55382:2;55360:10;55354:24;:30;;:64;;;;;55416:2;55394:10;55388:24;:30;;55354:64;55346:84;;;::::0;-1:-1:-1;;;55346:84:0;;21540:2:1;55346:84:0::1;::::0;::::1;21522:21:1::0;21579:1;21559:18;;;21552:29;-1:-1:-1;;;21597:18:1;;;21590:37;21644:18;;55346:84:0::1;21338:330:1::0;55346:84:0::1;55463:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;55447:23:0::1;8485:10:::0;-1:-1:-1;;;;;55447:23:0::1;;;:38;;;;;55483:2;55474:6;:11;55447:38;55443:118;;;55524:11;55511:9;:24;;55503:46;;;::::0;-1:-1:-1;;;55503:46:0;;17715:2:1;55503:46:0::1;::::0;::::1;17697:21:1::0;17754:1;17734:18;;;17727:29;-1:-1:-1;;;17772:18:1;;;17765:39;17821:18;;55503:46:0::1;17513:332:1::0;55503:46:0::1;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55607:23:0::1;55612:3;55607:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;55625:4;55616:6;:4;:6::i;:::-;:13;;;;:::i;:::-;55607:4;:23::i;:::-;55599:31;;::::0;;55660:3:::1;55655:22:::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;55660:3;;55655:22;::::1;55660:3:::0;55655:22;;::::1;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;55673:3;55664:6;:4;:6::i;55655:22::-;55641:36;;:11;::::0;;::::1;:36:::0;;;;55713:3:::1;55708:22:::0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;;55713:3;55708:22;;::::1;55713:3:::0;55708:22;;::::1;;;;::::0;;;::::1;::::0;;;;;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;;;;;;;;;;55726:3;55717:6;:4;:6::i;55708:22::-;55695:35;;:10;::::0;;::::1;:35:::0;;;;55757:3:::1;55752:23:::0;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;55757:3;55752:23;;::::1;55757:3:::0;55752:23;;::::1;;;;::::0;;;::::1;::::0;;;;;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;;;;;;;;;;55770:4;55761:6;:4;:6::i;55752:23::-;55741:34;;:8;::::0;::::1;:34:::0;55799:3:::1;55794:22:::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;55799:3;;55794:22;::::1;55799:3:::0;55794:22;;::::1;;;;::::0;;;::::1;::::0;;;;;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;;;;;;;;;;55812:3;55803:6;:4;:6::i;55794:22::-;55786:30;;:5;::::0;::::1;:30:::0;55827:8:::1;::::0;::::1;:21:::0;;;55859:8:::1;::::0;::::1;:21:::0;;;55908:45:::1;::::0;::::1;::::0;55838:10;;55870;;55908:45:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;55908:45:0;;::::1;::::0;;;;;;55891:7:::1;::::0;::::1;:63:::0;:2;55999:14:::1;:26;56014:10;:6:::0;56023:1:::1;56014:10;:::i;:::-;55999:26:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;55999:26:0;:31;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;55999:31:0;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;55999:31:0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;55999:31:0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;55999:31:0::1;-1:-1:-1::0;;;55999:31:0;;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;:26;;:31:::1;::::0;-1:-1:-1;55999:31:0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;55999:31:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;55999:31:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;56044:35;56054:12;8485:10:::0;;8405:98;56054:12:::1;56068:10;:6:::0;56077:1:::1;56068:10;:::i;:::-;56044:9;:35::i;:::-;-1:-1:-1::0;;40668:1:0;41622:7;:22;-1:-1:-1;;55155:932:0:o;37593:87::-;37666:6;;-1:-1:-1;;;;;37666:6:0;;37593:87::o;21343:104::-;21399:13;21432:7;21425:14;;;;;:::i;23014:155::-;23109:52;8485:10;23142:8;23152;23109:18;:52::i;:::-;23014:155;;:::o;24137:328::-;24312:41;8485:10;24345:7;24312:18;:41::i;:::-;24304:103;;;;-1:-1:-1;;;24304:103:0;;;;;;;:::i;:::-;24418:39;24432:4;24438:2;24442:7;24451:5;24418:13;:39::i;:::-;24137:328;;;;:::o;59519:240::-;59595:13;59648:17;59656:8;59648:7;:17::i;:::-;59626:74;;;;-1:-1:-1;;;59626:74:0;;21875:2:1;59626:74:0;;;21857:21:1;21914:1;21894:18;;;21887:29;-1:-1:-1;;;21932:18:1;;;21925:37;21979:18;;59626:74:0;21673:330:1;59626:74:0;59728:23;59742:8;59728:13;:23::i;23240:164::-;-1:-1:-1;;;;;23361:25:0;;;23337:4;23361:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23240:164::o;49606:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49606:47:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38502:201::-;8485:10;37813:7;:5;:7::i;:::-;-1:-1:-1;;;;;37813:23:0;;37805:68;;;;-1:-1:-1;;;37805:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38591:22:0;::::1;38583:73;;;::::0;-1:-1:-1;;;38583:73:0;;16545:2:1;38583:73:0::1;::::0;::::1;16527:21:1::0;16584:2;16564:18;;;16557:30;16623:34;16603:18;;;16596:62;-1:-1:-1;;;16674:18:1;;;16667:36;16720:19;;38583:73:0::1;16343:402:1::0;38583:73:0::1;38667:28;38686:8;38667:18;:28::i;20267:305::-:0;20369:4;-1:-1:-1;;;;;;20406:40:0;;-1:-1:-1;;;20406:40:0;;:105;;-1:-1:-1;;;;;;;20463:48:0;;-1:-1:-1;;;20463:48:0;20406:105;:158;;;-1:-1:-1;;;;;;;;;;6328:40:0;;;20528:36;6219:157;25975:127;26040:4;26064:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26064:16:0;:30;;;25975:127::o;30121:174::-;30196:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30196:29:0;-1:-1:-1;;;;;30196:29:0;;;;;;;;:24;;30250:23;30196:24;30250:14;:23::i;:::-;-1:-1:-1;;;;;30241:46:0;;;;;;;;;;;30121:174;;:::o;26269:348::-;26362:4;26387:16;26395:7;26387;:16::i;:::-;26379:73;;;;-1:-1:-1;;;26379:73:0;;18811:2:1;26379:73:0;;;18793:21:1;18850:2;18830:18;;;18823:30;18889:34;18869:18;;;18862:62;-1:-1:-1;;;18940:18:1;;;18933:42;18992:19;;26379:73:0;18609:408:1;26379:73:0;26463:13;26479:23;26494:7;26479:14;:23::i;:::-;26463:39;;26532:5;-1:-1:-1;;;;;26521:16:0;:7;-1:-1:-1;;;;;26521:16:0;;:51;;;;26565:7;-1:-1:-1;;;;;26541:31:0;:20;26553:7;26541:11;:20::i;:::-;-1:-1:-1;;;;;26541:31:0;;26521:51;:87;;;;26576:32;26593:5;26600:7;26576:16;:32::i;:::-;26513:96;26269:348;-1:-1:-1;;;;26269:348:0:o;29378:625::-;29537:4;-1:-1:-1;;;;;29510:31:0;:23;29525:7;29510:14;:23::i;:::-;-1:-1:-1;;;;;29510:31:0;;29502:81;;;;-1:-1:-1;;;29502:81:0;;16952:2:1;29502:81:0;;;16934:21:1;16991:2;16971:18;;;16964:30;17030:34;17010:18;;;17003:62;-1:-1:-1;;;17081:18:1;;;17074:35;17126:19;;29502:81:0;16750:401:1;29502:81:0;-1:-1:-1;;;;;29602:16:0;;29594:65;;;;-1:-1:-1;;;29594:65:0;;18052:2:1;29594:65:0;;;18034:21:1;18091:2;18071:18;;;18064:30;18130:34;18110:18;;;18103:62;-1:-1:-1;;;18181:18:1;;;18174:34;18225:19;;29594:65:0;17850:400:1;29594:65:0;29672:39;29693:4;29699:2;29703:7;29672:20;:39::i;:::-;29776:29;29793:1;29797:7;29776:8;:29::i;:::-;-1:-1:-1;;;;;29818:15:0;;;;;;:9;:15;;;;;:20;;29837:1;;29818:15;:20;;29837:1;;29818:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29849:13:0;;;;;;:9;:13;;;;;:18;;29866:1;;29849:13;:18;;29866:1;;29849:18;:::i;:::-;;;;-1:-1:-1;;29878:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29878:21:0;-1:-1:-1;;;;;29878:21:0;;;;;;;;;29917:27;;29878:16;;29917:27;;;;-1:-1:-1;;;;;;;;;;;29917:27:0;;22314:341;22244:411;;:::o;38863:191::-;38956:6;;;-1:-1:-1;;;;;38973:17:0;;;-1:-1:-1;;;;;;38973:17:0;;;;;;;39006:40;;38956:6;;;38973:17;38956:6;;39006:40;;38937:16;;39006:40;38926:128;38863:191;:::o;56095:409::-;56134:7;56471:12;56438:15;56420:10;56403:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56393:39;;;;;;56385:48;;56384:70;;;;:::i;:::-;56352:14;56319:15;56297:14;56280:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;56270:43;;;;;;56262:52;;56261:74;;;;:::i;:::-;56210:34;56228:16;56210:15;:34;:::i;:::-;:126;;;;:::i;:::-;:156;;;;:::i;:::-;:245;;;;:::i;:::-;:273;;;;:::i;:::-;56179:315;;;;;;14000:19:1;;14044:2;14035:12;;13871:182;56179:315:0;;;;;;;;;;;;;56169:326;;;;;;56161:335;;56154:342;;56095:409;:::o;54902:245::-;54967:5;54985:9;54995:1;54985:11;;55007:9;55025:1;55027;55025:4;;;;;;;;:::i;:::-;;;;;;;55017:13;;55007:23;;55041:78;55051:1;55048;:4;55041:78;;55069:5;;;;:::i;:::-;;;;55100:1;55102:3;55100:6;;;;;;;;;;:::i;:::-;;;;;;;55092:15;;55089:18;;;;;:::i;:::-;;;55041:78;;;-1:-1:-1;55136:3:0;54902:245;-1:-1:-1;;;54902:245:0:o;26959:110::-;27035:26;27045:2;27049:7;27035:26;;;;;;;;;;;;:9;:26::i;30437:315::-;30592:8;-1:-1:-1;;;;;30583:17:0;:5;-1:-1:-1;;;;;30583:17:0;;;30575:55;;;;-1:-1:-1;;;30575:55:0;;18457:2:1;30575:55:0;;;18439:21:1;18496:2;18476:18;;;18469:30;-1:-1:-1;;;18515:18:1;;;18508:55;18580:18;;30575:55:0;18255:349:1;30575:55:0;-1:-1:-1;;;;;30641:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30641:46:0;;;;;;;;;;30703:41;;14899::1;;;30703::0;;14872:18:1;30703:41:0;;;;;;;30437:315;;;:::o;25347:::-;25504:28;25514:4;25520:2;25524:7;25504:9;:28::i;:::-;25551:48;25574:4;25580:2;25584:7;25593:5;25551:22;:48::i;:::-;25543:111;;;;-1:-1:-1;;;25543:111:0;;;;;;;:::i;56981:2530::-;57075:21;57099:24;;;:14;:24;;;;;;;;57075:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57044:13;57075:48;;;;;;;-1:-1:-1;;;57075:48:0;;;;;;;;;;;;;;;57044:13;;57075:21;:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57134:20;57181:1;57183;57181:4;;;;;;;;:::i;:::-;;;;;;;;57186:2;57189:8;:11;;;57186:15;;;;;;;;;;:::i;:::-;;;;;;;;57202:1;57204;57202:4;;;;;;;;:::i;:::-;;;;;;;;57207:7;57215:8;:16;;;57207:25;;;;;;;;;;:::i;:::-;;;;;;;;57233:1;57235;57233:4;;;;;;;;:::i;:::-;;;;;;;;57238:7;57246:8;:16;;;57238:25;;;;;;;;;;:::i;:::-;;;;;;;;57164:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57134:131;;57317:6;57324:1;57326;57324:4;;;;;;;;:::i;:::-;;;;;;;;57329:7;57337:8;:16;;;57329:25;;;;;;;;;;:::i;:::-;;;;;;;;57355:1;57357;57355:4;;;;;;;;:::i;:::-;;;;;;;;57360:7;57368:8;:16;;;57360:25;;;;;;;;;;:::i;:::-;;;;;;;;57386:1;57388;57386:4;;;;;;;;:::i;:::-;;;;;;;;57391:7;57399:8;:16;;;57391:25;;;;;;;;;;:::i;:::-;;;;;;;;57300:117;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57284:134;;57486:6;57493:1;57495;57493:4;;;;;;;;:::i;:::-;;;;;;;;57498:7;57506:8;:16;;;57498:25;;;;;;;;;;:::i;:::-;;;;;;;;57524:1;57526;57524:4;;;;;;;;:::i;:::-;;;;;;;;57529:7;57537:8;:16;;;57529:25;;;;;;;;;;:::i;:::-;;;;;;;;57555:1;57557;57555:4;;;;;;;;:::i;:::-;;;;;;;;57560:7;57568:8;:16;;;57560:25;;;;;;;;;;:::i;:::-;;;;;;;;57469:117;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57453:134;;57639:6;57646:1;57648;57646:4;;;;;;;;:::i;:::-;;;;;;;;57651:7;57659:8;:16;;;57651:25;;;;;;;;;;:::i;:::-;;;;;;;;57677:1;57679:2;57677:5;;;;;;;;:::i;:::-;;;;;;;;57683:7;57691:8;:16;;;57683:25;;;;;;;;;;:::i;:::-;;;;;;;;57709:1;57711:2;57709:5;;;;;;;;:::i;:::-;;;;;;;;57715:7;57723:8;:16;;;57715:25;;;;;;;;;;:::i;:::-;;;;;;;;57622:119;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57606:136;;57794:6;57801:1;57803:2;57801:5;;;;;;;;:::i;:::-;;;;;;;;57807:7;57815:8;:16;;;57807:25;;;;;;;;;;:::i;:::-;;;;;;;;57833:1;57835:2;57833:5;;;;;;;;:::i;:::-;;;;;;;;57839:8;57848;:17;;;57839:27;;;;;;;;;;:::i;:::-;;;;;;;;57867:1;57869:2;57867:5;;;;;;;;:::i;:::-;;;;;;;;57873:7;57881:8;:16;;;57873:25;;;;;;;;;;:::i;:::-;;;;;;;;57777:122;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57761:139;;57952:6;57959:1;57961:2;57959:5;;;;;;;;:::i;:::-;;;;;;;;57965:7;57973:8;:16;;;57965:25;;;;;;;;;;:::i;:::-;;;;;;;;57991:1;57993:2;57991:5;;;;;;;;:::i;:::-;;;;;;;;57997:7;58005:8;:16;;;57997:25;;;;;;;;;;:::i;:::-;;;;;;;;58023:1;58025:2;58023:5;;;;;;;;:::i;:::-;;;;;;;;58029:7;58037:8;:16;;;58029:25;;;;;;;;;;:::i;:::-;;;;;;;;57935:120;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57919:137;;58108:6;58115:1;58117:2;58115:5;;;;;;;;:::i;:::-;;;;;;;;58121:7;58129:8;:16;;;58121:25;;;;;;;;;;:::i;:::-;;;;;;;;58147:1;58149:2;58147:5;;;;;;;;:::i;:::-;;;;;;;;58153:7;58161:8;:16;;;58153:25;;;;;;;;;;:::i;:::-;;;;;;;;58179:1;58181:2;58179:5;;;;;;;;:::i;:::-;;;;;;;;58185:7;58193:8;:16;;;58185:25;;;;;;;;;;:::i;:::-;;;;;;;;58091:120;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58075:137;;58264:6;58271:1;58273:2;58271:5;;;;;;;;:::i;:::-;;;;;;;;58277:7;58285:8;:16;;;58277:25;;;;;;;;;;:::i;:::-;;;;;;;;58303:1;58305:2;58303:5;;;;;;;;:::i;:::-;;;;;;;;58309:8;58318;:17;;;58309:27;;;;;;;;;;:::i;:::-;;;;;;;;58337:1;58339:2;58337:5;;;;;;;;:::i;:::-;;;;;;;;58343:8;58352;:17;;;58343:27;;;;;;;;;;:::i;:::-;;;;;;;;58247:124;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58231:141;;58424:6;58431:1;58433:2;58431:5;;;;;;;;:::i;:::-;;;;;;;;58437;58443:8;:14;;;58437:21;;;;;;;;;;:::i;:::-;;;;;;;;58459:1;58461:2;58459:5;;;;;;;;:::i;:::-;;;;;;;;58465;58471:8;:14;;;58465:21;;;;;;;;;;:::i;:::-;;;;;;;;58487:1;58489:2;58487:5;;;;;;;;:::i;:::-;;;;;;;;58493;58499:8;:14;;;58493:21;;;;;;;;;;:::i;:::-;;;;;;;;58407:108;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58391:125;;58568:6;58575:1;58577:2;58575:5;;;;;;;;:::i;:::-;;;;;;;;58581;58587:8;:14;;;58581:21;;;;;;;;;;:::i;:::-;;;;;;;;58603:1;58605:2;58603:5;;;;;;;;:::i;:::-;;;;;;;;58609;58615:8;:14;;;58609:21;;;;;;;;;;:::i;:::-;;;;;;;;58631:1;58633:2;58631:5;;;;;;;;:::i;:::-;;;;;;;;58637:2;58640:8;:11;;;58637:15;;;;;;;;;;:::i;:::-;;;;;;;;58551:102;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58535:119;;58706:6;58713:1;58715:2;58713:5;;;;;;;;:::i;:::-;;;;;;;;58719:8;:14;;;58734:1;58736:2;58734:5;;;;;;;;:::i;:::-;;;;;;;;58740:2;58743:8;:11;;;58740:15;;;;;;;;;;:::i;:::-;;;;;;;;58756:1;58758:2;58756:5;;;;;;;;:::i;:::-;;;;;;;;58762:2;58765:8;:11;;;58762:15;;;;;;;;;;:::i;:::-;;;;;;;;58778:1;58780:2;58778:5;;;;;;;;:::i;:::-;;;;;;;;58689:95;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58673:112;;58837:6;58844:8;:14;;;58859:1;58861:2;58859:5;;;;;;;;:::i;:::-;;;;;;;;58820:45;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58804:62;;59017:452;59212:19;:8;:17;:19::i;:::-;59266;59276:8;59266:9;:19::i;:::-;59320:28;59340:6;59320:13;:28::i;:::-;59093:326;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59017:13;:452::i;:::-;58924:564;;;;;;;;:::i;:::-;;;;;;;;;;;;;58879:624;;;;56981:2530;;;:::o;45019:589::-;-1:-1:-1;;;;;45225:18:0;;45221:187;;45260:40;45292:7;46435:10;:17;;46408:24;;;;:15;:24;;;;;:44;;;46463:24;;;;;;;;;;;;46331:164;45260:40;45221:187;;;45330:2;-1:-1:-1;;;;;45322:10:0;:4;-1:-1:-1;;;;;45322:10:0;;45318:90;;45349:47;45382:4;45388:7;45349:32;:47::i;:::-;-1:-1:-1;;;;;45422:16:0;;45418:183;;45455:45;45492:7;45455:36;:45::i;45418:183::-;45528:4;-1:-1:-1;;;;;45522:10:0;:2;-1:-1:-1;;;;;45522:10:0;;45518:83;;45549:40;45577:2;45581:7;45549:27;:40::i;27296:321::-;27426:18;27432:2;27436:7;27426:5;:18::i;:::-;27477:54;27508:1;27512:2;27516:7;27525:5;27477:22;:54::i;:::-;27455:154;;;;-1:-1:-1;;;27455:154:0;;;;;;;:::i;31317:799::-;31472:4;-1:-1:-1;;;;;31493:13:0;;12065:19;:23;31489:620;;31529:72;;-1:-1:-1;;;31529:72:0;;-1:-1:-1;;;;;31529:36:0;;;;;:72;;8485:10;;31580:4;;31586:7;;31595:5;;31529:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31529:72:0;;;;;;;;-1:-1:-1;;31529:72:0;;;;;;;;;;;;:::i;:::-;;;31525:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31771:13:0;;31767:272;;31814:60;;-1:-1:-1;;;31814:60:0;;;;;;;:::i;31767:272::-;31989:6;31983:13;31974:6;31970:2;31966:15;31959:38;31525:529;-1:-1:-1;;;;;;31652:51:0;-1:-1:-1;;;31652:51:0;;-1:-1:-1;31645:58:0;;31489:620;-1:-1:-1;32093:4:0;31317:799;;;;;;:::o;8845:723::-;8901:13;9122:10;9118:53;;-1:-1:-1;;9149:10:0;;;;;;;;;;;;-1:-1:-1;;;9149:10:0;;;;;8845:723::o;9118:53::-;9196:5;9181:12;9237:78;9244:9;;9237:78;;9270:8;;;;:::i;:::-;;-1:-1:-1;9293:10:0;;-1:-1:-1;9301:2:0;9293:10;;:::i;:::-;;;9237:78;;;9325:19;9357:6;-1:-1:-1;;;;;9347:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9347:17:0;;9325:39;;9375:154;9382:10;;9375:154;;9409:11;9419:1;9409:11;;:::i;:::-;;-1:-1:-1;9478:10:0;9486:2;9478:5;:10;:::i;:::-;9465:24;;:2;:24;:::i;:::-;9452:39;;9435:6;9442;9435:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9435:56:0;;;;;;;;-1:-1:-1;9506:11:0;9515:2;9506:11;;:::i;:::-;;;9375:154;;56512:461;56577:13;56603:15;56643:3;56647:31;56655:8;:11;;;56647:20;;:29;:31::i;:::-;56679:3;56683:37;56691:8;:17;;;56683:26;;:35;:37::i;:::-;56626:95;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56603:119;;56759:1;56761:3;56765:36;56773:8;:16;;;56765:25;;:34;:36::i;:::-;56802:3;56806:34;56814:8;:14;;;56806:23;;:32;:34::i;:::-;56742:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56733:109;;56884:1;56886:3;56890:31;56898:8;:11;;;56890:20;;:29;:31::i;:::-;56922:3;56926:8;:14;;;56941:3;56945:8;:14;;;56960:3;56867:97;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56853:112;;;56512:461;;;:::o;33614:3053::-;33672:13;33909:4;:11;33924:1;33909:16;33905:31;;;-1:-1:-1;;33927:9:0;;;;;;;;;-1:-1:-1;33927:9:0;;;33614:3053::o;33905:31::-;33989:19;34011:6;;;;;;;;;;;;;;;;;33989:28;;34428:20;34487:1;34468:4;:11;34482:1;34468:15;;;;:::i;:::-;34467:21;;;;:::i;:::-;34462:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;34451:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34451:39:0;;34428:62;;34626:1;34619:5;34615:13;34730:2;34722:6;34718:15;34841:4;34893;34887:11;34881:4;34877:22;34803:1432;34927:6;34918:7;34915:19;34803:1432;;;35033:1;35024:7;35020:15;35009:26;;35072:7;35066:14;35725:4;35717:5;35713:2;35709:14;35705:25;35695:8;35691:40;35685:47;35674:9;35666:67;35779:1;35768:9;35764:17;35751:30;;35871:4;35863:5;35859:2;35855:14;35851:25;35841:8;35837:40;35831:47;35820:9;35812:67;35925:1;35914:9;35910:17;35897:30;;36016:4;36008:5;36005:1;36001:13;35997:24;35987:8;35983:39;35977:46;35966:9;35958:66;36070:1;36059:9;36055:17;36042:30;;36153:4;36146:5;36142:16;36132:8;36128:31;36122:38;36111:9;36103:58;;36207:1;36196:9;36192:17;36179:30;;34803:1432;;;34807:107;;36397:1;36390:4;36384:11;36380:19;36418:1;36413:123;;;;36555:1;36550:73;;;;36373:250;;36413:123;36466:4;36462:1;36451:9;36447:17;36439:32;36516:4;36512:1;36501:9;36497:17;36489:32;36413:123;;36550:73;36603:4;36599:1;36588:9;36584:17;36576:32;36373:250;-1:-1:-1;36653:6:0;;33614:3053;-1:-1:-1;;;;;33614:3053:0:o;47122:988::-;47388:22;47438:1;47413:22;47430:4;47413:16;:22::i;:::-;:26;;;;:::i;:::-;47450:18;47471:26;;;:17;:26;;;;;;47388:51;;-1:-1:-1;47604:28:0;;;47600:328;;-1:-1:-1;;;;;47671:18:0;;47649:19;47671:18;;;:12;:18;;;;;;;;:34;;;;;;;;;47722:30;;;;;;:44;;;47839:30;;:17;:30;;;;;:43;;;47600:328;-1:-1:-1;48024:26:0;;;;:17;:26;;;;;;;;48017:33;;;-1:-1:-1;;;;;48068:18:0;;;;;:12;:18;;;;;:34;;;;;;;48061:41;47122:988::o;48405:1079::-;48683:10;:17;48658:22;;48683:21;;48703:1;;48683:21;:::i;:::-;48715:18;48736:24;;;:15;:24;;;;;;49109:10;:26;;48658:46;;-1:-1:-1;48736:24:0;;48658:46;;49109:26;;;;;;:::i;:::-;;;;;;;;;49087:48;;49173:11;49148:10;49159;49148:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;49253:28;;;:15;:28;;;;;;;:41;;;49425:24;;;;;49418:31;49460:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48476:1008;;;48405:1079;:::o;45909:221::-;45994:14;46011:20;46028:2;46011:16;:20::i;:::-;-1:-1:-1;;;;;46042:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;46087:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45909:221:0:o;27953:439::-;-1:-1:-1;;;;;28033:16:0;;28025:61;;;;-1:-1:-1;;;28025:61:0;;19649:2:1;28025:61:0;;;19631:21:1;;;19668:18;;;19661:30;19727:34;19707:18;;;19700:62;19779:18;;28025:61:0;19447:356:1;28025:61:0;28106:16;28114:7;28106;:16::i;:::-;28105:17;28097:58;;;;-1:-1:-1;;;28097:58:0;;17358:2:1;28097:58:0;;;17340:21:1;17397:2;17377:18;;;17370:30;-1:-1:-1;;;17416:18:1;;;17409:58;17484:18;;28097:58:0;17156:352:1;28097:58:0;28168:45;28197:1;28201:2;28205:7;28168:20;:45::i;:::-;-1:-1:-1;;;;;28226:13:0;;;;;;:9;:13;;;;;:18;;28243:1;;28226:13;:18;;28243:1;;28226:18;:::i;:::-;;;;-1:-1:-1;;28255:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28255:21:0;-1:-1:-1;;;;;28255:21:0;;;;;;;;28294:33;;28255:16;;;-1:-1:-1;;;;;;;;;;;28294:33:0;28255:16;;28294:33;23014:155;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;138:14:1;;;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:221::-;871:5;924:3;917:4;909:6;905:17;901:27;891:55;;942:1;939;932:12;891:55;964:79;1039:3;1030:6;1017:20;1010:4;1002:6;998:17;964:79;:::i;:::-;955:88;828:221;-1:-1:-1;;;828:221:1:o;1054:186::-;1113:6;1166:2;1154:9;1145:7;1141:23;1137:32;1134:52;;;1182:1;1179;1172:12;1134:52;1205:29;1224:9;1205:29;:::i;1245:260::-;1313:6;1321;1374:2;1362:9;1353:7;1349:23;1345:32;1342:52;;;1390:1;1387;1380:12;1342:52;1413:29;1432:9;1413:29;:::i;:::-;1403:39;;1461:38;1495:2;1484:9;1480:18;1461:38;:::i;:::-;1451:48;;1245:260;;;;;:::o;1510:328::-;1587:6;1595;1603;1656:2;1644:9;1635:7;1631:23;1627:32;1624:52;;;1672:1;1669;1662:12;1624:52;1695:29;1714:9;1695:29;:::i;:::-;1685:39;;1743:38;1777:2;1766:9;1762:18;1743:38;:::i;:::-;1733:48;;1828:2;1817:9;1813:18;1800:32;1790:42;;1510:328;;;;;:::o;1843:666::-;1938:6;1946;1954;1962;2015:3;2003:9;1994:7;1990:23;1986:33;1983:53;;;2032:1;2029;2022:12;1983:53;2055:29;2074:9;2055:29;:::i;:::-;2045:39;;2103:38;2137:2;2126:9;2122:18;2103:38;:::i;:::-;2093:48;-1:-1:-1;2188:2:1;2173:18;;2160:32;;-1:-1:-1;2243:2:1;2228:18;;2215:32;-1:-1:-1;;;;;2259:30:1;;2256:50;;;2302:1;2299;2292:12;2256:50;2325:22;;2378:4;2370:13;;2366:27;-1:-1:-1;2356:55:1;;2407:1;2404;2397:12;2356:55;2430:73;2495:7;2490:2;2477:16;2472:2;2468;2464:11;2430:73;:::i;:::-;2420:83;;;1843:666;;;;;;;:::o;2514:347::-;2579:6;2587;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2679:29;2698:9;2679:29;:::i;:::-;2669:39;;2758:2;2747:9;2743:18;2730:32;2805:5;2798:13;2791:21;2784:5;2781:32;2771:60;;2827:1;2824;2817:12;2771:60;2850:5;2840:15;;;2514:347;;;;;:::o;2866:254::-;2934:6;2942;2995:2;2983:9;2974:7;2970:23;2966:32;2963:52;;;3011:1;3008;3001:12;2963:52;3034:29;3053:9;3034:29;:::i;:::-;3024:39;3110:2;3095:18;;;;3082:32;;-1:-1:-1;;;2866:254:1:o;3125:245::-;3183:6;3236:2;3224:9;3215:7;3211:23;3207:32;3204:52;;;3252:1;3249;3242:12;3204:52;3291:9;3278:23;3310:30;3334:5;3310:30;:::i;3375:249::-;3444:6;3497:2;3485:9;3476:7;3472:23;3468:32;3465:52;;;3513:1;3510;3503:12;3465:52;3545:9;3539:16;3564:30;3588:5;3564:30;:::i;3629:543::-;3717:6;3725;3778:2;3766:9;3757:7;3753:23;3749:32;3746:52;;;3794:1;3791;3784:12;3746:52;3821:23;;-1:-1:-1;;;;;3893:14:1;;;3890:34;;;3920:1;3917;3910:12;3890:34;3943:50;3985:7;3976:6;3965:9;3961:22;3943:50;:::i;:::-;3933:60;;4046:2;4035:9;4031:18;4018:32;4002:48;;4075:2;4065:8;4062:16;4059:36;;;4091:1;4088;4081:12;4059:36;;4114:52;4158:7;4147:8;4136:9;4132:24;4114:52;:::i;:::-;4104:62;;;3629:543;;;;;:::o;4177:180::-;4236:6;4289:2;4277:9;4268:7;4264:23;4260:32;4257:52;;;4305:1;4302;4295:12;4257:52;-1:-1:-1;4328:23:1;;4177:180;-1:-1:-1;4177:180:1:o;4362:257::-;4403:3;4441:5;4435:12;4468:6;4463:3;4456:19;4484:63;4540:6;4533:4;4528:3;4524:14;4517:4;4510:5;4506:16;4484:63;:::i;:::-;4601:2;4580:15;-1:-1:-1;;4576:29:1;4567:39;;;;4608:4;4563:50;;4362:257;-1:-1:-1;;4362:257:1:o;4624:973::-;4709:12;;4674:3;;4764:1;4784:18;;;;4837;;;;4864:61;;4918:4;4910:6;4906:17;4896:27;;4864:61;4944:2;4992;4984:6;4981:14;4961:18;4958:38;4955:161;;;5038:10;5033:3;5029:20;5026:1;5019:31;5073:4;5070:1;5063:15;5101:4;5098:1;5091:15;4955:161;5132:18;5159:104;;;;5277:1;5272:319;;;;5125:466;;5159:104;-1:-1:-1;;5192:24:1;;5180:37;;5237:16;;;;-1:-1:-1;5159:104:1;;5272:319;24767:1;24760:14;;;24804:4;24791:18;;5366:1;5380:165;5394:6;5391:1;5388:13;5380:165;;;5472:14;;5459:11;;;5452:35;5515:16;;;;5409:10;;5380:165;;;5384:3;;5574:6;5569:3;5565:16;5558:23;;5125:466;;;;;;;4624:973;;;;:::o;5602:221::-;5776:2;5747:15;;;;-1:-1:-1;;;;;;5743:45:1;5731:58;;5814:2;5805:12;;5602:221::o;6070:550::-;6294:3;6332:6;6326:13;6348:53;6394:6;6389:3;6382:4;6374:6;6370:17;6348:53;:::i;:::-;6464:13;;6423:16;;;;6486:57;6464:13;6423:16;6520:4;6508:17;;6486:57;:::i;:::-;6559:55;6604:8;6597:5;6593:20;6585:6;6559:55;:::i;:::-;6552:62;6070:550;-1:-1:-1;;;;;;;6070:550:1:o;6625:806::-;6942:3;6980:6;6974:13;6996:53;7042:6;7037:3;7030:4;7022:6;7018:17;6996:53;:::i;:::-;7068:51;7111:6;7106:3;7102:16;7094:6;7068:51;:::i;:::-;7058:61;;7150:6;7144:13;7166:54;7211:8;7207:2;7200:4;7192:6;7188:17;7166:54;:::i;:::-;7239:52;7281:8;7277:2;7273:17;7265:6;7239:52;:::i;:::-;7229:62;;;7322:6;7316:13;7338:54;7383:8;7379:2;7372:4;7364:6;7360:17;7338:54;:::i;:::-;7408:17;;6625:806;-1:-1:-1;;;;;;;6625:806:1:o;7436:1151::-;7891:3;7929:6;7923:13;7945:53;7991:6;7986:3;7979:4;7971:6;7967:17;7945:53;:::i;:::-;8017:51;8060:6;8055:3;8051:16;8043:6;8017:51;:::i;:::-;8007:61;;8099:6;8093:13;8115:54;8160:8;8156:2;8149:4;8141:6;8137:17;8115:54;:::i;:::-;8188:52;8230:8;8226:2;8222:17;8214:6;8188:52;:::i;:::-;8178:62;;;8271:6;8265:13;8287:54;8332:8;8328:2;8321:4;8313:6;8309:17;8287:54;:::i;:::-;8360:52;8402:8;8398:2;8394:17;8386:6;8360:52;:::i;:::-;8350:62;;;8443:6;8437:13;8459:54;8504:8;8500:2;8493:4;8485:6;8481:17;8459:54;:::i;:::-;8529:52;8571:8;8567:2;8563:17;8555:6;8529:52;:::i;:::-;8522:59;7436:1151;-1:-1:-1;;;;;;;;;;;;7436:1151:1:o;8592:941::-;9041:3;9079:6;9073:13;9095:53;9141:6;9136:3;9129:4;9121:6;9117:17;9095:53;:::i;:::-;9167:51;9210:6;9205:3;9201:16;9193:6;9167:51;:::i;:::-;9157:61;;9249:6;9243:13;9265:54;9310:8;9306:2;9299:4;9291:6;9287:17;9265:54;:::i;:::-;9335:192;9369:157;9403:122;9437:87;9471:52;9513:8;9509:2;9505:17;9497:6;9471:52;:::i;:::-;9463:6;9437:87;:::i;:::-;9429:6;9403:122;:::i;:::-;9395:6;9369:157;:::i;:::-;9361:6;9335:192;:::i;9538:756::-;9939:3;9977:6;9971:13;9993:53;10039:6;10034:3;10027:4;10019:6;10015:17;9993:53;:::i;:::-;10062:226;10096:191;10130:156;10164:121;10198:86;10232:51;10275:6;10270:3;10266:16;10258:6;10232:51;:::i;:::-;10224:6;10198:86;:::i;:::-;10190:6;10164:121;:::i;:::-;10156:6;10130:156;:::i;:::-;10122:6;10096:191;:::i;:::-;10088:6;10062:226;:::i;:::-;10055:233;9538:756;-1:-1:-1;;;;;;;;;;9538:756:1:o;10299:614::-;10579:3;10617:6;10611:13;10633:53;10679:6;10674:3;10667:4;10659:6;10655:17;10633:53;:::i;:::-;-1:-1:-1;;;10708:16:1;;;10733:18;;;10776:13;;10798:65;10776:13;10850:1;10839:13;;10832:4;10820:17;;10798:65;:::i;:::-;10883:20;10905:1;10879:28;;10299:614;-1:-1:-1;;;;10299:614:1:o;10918:641::-;11187:3;11215:38;11249:3;11241:6;11215:38;:::i;:::-;11282:6;11276:13;11298:52;11343:6;11339:2;11332:4;11324:6;11320:17;11298:52;:::i;:::-;11369:50;11411:6;11407:2;11403:15;11395:6;11369:50;:::i;:::-;11359:60;;;11450:6;11444:13;11466:54;11511:8;11507:2;11500:4;11492:6;11488:17;11466:54;:::i;:::-;11536:17;;10918:641;-1:-1:-1;;;;;;10918:641:1:o;11564:597::-;11917:3;11942:213;11976:178;12010:143;12044:108;12078:73;12112:38;12146:3;12138:6;12112:38;:::i;11976:178::-;11968:6;11942:213;:::i;:::-;11935:220;11564:597;-1:-1:-1;;;;;;;;11564:597:1:o;12166:1037::-;12625:66;12620:3;12613:79;12595:3;12721:6;12715:13;12737:62;12792:6;12787:2;12782:3;12778:12;12771:4;12763:6;12759:17;12737:62;:::i;:::-;12859:13;;12818:16;;;;12881:63;12859:13;12930:2;12922:11;;12915:4;12903:17;;12881:63;:::i;:::-;13005:13;;12963:17;;;13027:63;13005:13;13076:2;13068:11;;13061:4;13049:17;;13027:63;:::i;:::-;-1:-1:-1;;;13150:2:1;13109:17;;;;13142:11;;;13135:35;13194:2;13186:11;;12166:1037;-1:-1:-1;;;;;12166:1037:1:o;13208:448::-;13470:31;13465:3;13458:44;13440:3;13531:6;13525:13;13547:62;13602:6;13597:2;13592:3;13588:12;13581:4;13573:6;13569:17;13547:62;:::i;:::-;13629:16;;;;13647:2;13625:25;;13208:448;-1:-1:-1;;13208:448:1:o;14266:488::-;-1:-1:-1;;;;;14535:15:1;;;14517:34;;14587:15;;14582:2;14567:18;;14560:43;14634:2;14619:18;;14612:34;;;14682:3;14677:2;14662:18;;14655:31;;;14460:4;;14703:45;;14728:19;;14720:6;14703:45;:::i;:::-;14695:53;14266:488;-1:-1:-1;;;;;;14266:488:1:o;14951:219::-;15100:2;15089:9;15082:21;15063:4;15120:44;15160:2;15149:9;15145:18;15137:6;15120:44;:::i;15924:414::-;16126:2;16108:21;;;16165:2;16145:18;;;16138:30;16204:34;16199:2;16184:18;;16177:62;-1:-1:-1;;;16270:2:1;16255:18;;16248:48;16328:3;16313:19;;15924:414::o;20221:356::-;20423:2;20405:21;;;20442:18;;;20435:30;20501:34;20496:2;20481:18;;20474:62;20568:2;20553:18;;20221:356::o;22008:413::-;22210:2;22192:21;;;22249:2;22229:18;;;22222:30;22288:34;22283:2;22268:18;;22261:62;-1:-1:-1;;;22354:2:1;22339:18;;22332:47;22411:3;22396:19;;22008:413::o;23730:959::-;24058:4;24087:3;24129:4;24121:6;24117:17;24106:9;24099:36;24183:4;24175:6;24171:17;24166:2;24155:9;24151:18;24144:45;24237:4;24229:6;24225:17;24220:2;24209:9;24205:18;24198:45;24291:4;24283:6;24279:17;24274:2;24263:9;24259:18;24252:45;24346:4;24338:6;24334:17;24328:3;24317:9;24313:19;24306:46;24389:2;24383:3;24372:9;24368:19;24361:31;24415:44;24455:2;24444:9;24440:18;24432:6;24415:44;:::i;:::-;24401:58;;24508:9;24500:6;24496:22;24490:3;24479:9;24475:19;24468:51;24542:32;24567:6;24559;24542:32;:::i;:::-;24528:46;;24623:9;24615:6;24611:22;24605:3;24594:9;24590:19;24583:51;24651:32;24676:6;24668;24651:32;:::i;:::-;24643:40;23730:959;-1:-1:-1;;;;;;;;;;;23730:959:1:o;24820:128::-;24860:3;24891:1;24887:6;24884:1;24881:13;24878:39;;;24897:18;;:::i;:::-;-1:-1:-1;24933:9:1;;24820:128::o;24953:120::-;24993:1;25019;25009:35;;25024:18;;:::i;:::-;-1:-1:-1;25058:9:1;;24953:120::o;25078:168::-;25118:7;25184:1;25180;25176:6;25172:14;25169:1;25166:21;25161:1;25154:9;25147:17;25143:45;25140:71;;;25191:18;;:::i;:::-;-1:-1:-1;25231:9:1;;25078:168::o;25251:125::-;25291:4;25319:1;25316;25313:8;25310:34;;;25324:18;;:::i;:::-;-1:-1:-1;25361:9:1;;25251:125::o;25381:258::-;25453:1;25463:113;25477:6;25474:1;25471:13;25463:113;;;25553:11;;;25547:18;25534:11;;;25527:39;25499:2;25492:10;25463:113;;;25594:6;25591:1;25588:13;25585:48;;;-1:-1:-1;;25629:1:1;25611:16;;25604:27;25381:258::o;25644:380::-;25723:1;25719:12;;;;25766;;;25787:61;;25841:4;25833:6;25829:17;25819:27;;25787:61;25894:2;25886:6;25883:14;25863:18;25860:38;25857:161;;;25940:10;25935:3;25931:20;25928:1;25921:31;25975:4;25972:1;25965:15;26003:4;26000:1;25993:15;25857:161;;25644:380;;;:::o;26029:135::-;26068:3;-1:-1:-1;;26089:17:1;;26086:43;;;26109:18;;:::i;:::-;-1:-1:-1;26156:1:1;26145:13;;26029:135::o;26169:175::-;26206:3;26250:4;26243:5;26239:16;26279:4;26270:7;26267:17;26264:43;;;26287:18;;:::i;:::-;26336:1;26323:15;;26169:175;-1:-1:-1;;26169:175:1:o;26349:112::-;26381:1;26407;26397:35;;26412:18;;:::i;:::-;-1:-1:-1;26446:9:1;;26349:112::o;26466:127::-;26527:10;26522:3;26518:20;26515:1;26508:31;26558:4;26555:1;26548:15;26582:4;26579:1;26572:15;26598:127;26659:10;26654:3;26650:20;26647:1;26640:31;26690:4;26687:1;26680:15;26714:4;26711:1;26704:15;26730:127;26791:10;26786:3;26782:20;26779:1;26772:31;26822:4;26819:1;26812:15;26846:4;26843:1;26836:15;26862:127;26923:10;26918:3;26914:20;26911:1;26904:31;26954:4;26951:1;26944:15;26978:4;26975:1;26968:15;26994:127;27055:10;27050:3;27046:20;27043:1;27036:31;27086:4;27083:1;27076:15;27110:4;27107:1;27100:15;27126:131;-1:-1:-1;;;;;;27200:32:1;;27190:43;;27180:71;;27247:1;27244;27237:12

Swarm Source

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