ETH Price: $3,435.22 (+1.61%)
Gas: 2 Gwei

Token

TYGR CUB ALLIANCE: RETRIBUTION (TYGR)
 

Overview

Max Total Supply

5,555 TYGR

Holders

1,806

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jamars.eth
Balance
8 TYGR
0xe6d0b64f79fcb4c33a6c714989b5a042ddf2be20
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:
TygrNFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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


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

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

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

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

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


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

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



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


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


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



////import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
////import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
////import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
////import '@openzeppelin/contracts/utils/Address.sol';
////import '@openzeppelin/contracts/utils/Context.sol';
////import '@openzeppelin/contracts/utils/Strings.sol';
////import '@openzeppelin/contracts/utils/introspection/ERC165.sol';

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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


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

contract TygrNFT is Ownable, ERC721A, ReentrancyGuard {
    uint256 constant RESERVE_MINTS = 200; // Reserve for Vault
    uint256 constant FREE_MINTS = 500;
    uint256 constant LEV1_MINTS = 888;
    uint256 constant LEV2_MINTS = 2000;
    uint256 constant LEV3_MINTS = 3000;
    uint256 constant LEV4_MINTS = 4000;
    uint256 constant LEV5_MINTS = 5000;
    uint256 constant LEV6_MINTS = 6000;
    uint256 constant LEV7_MINTS = 7000;
    uint256 constant LEV8_MINTS = 8000;
    uint256 constant LEV9_MINTS = 8888;

    string private _baseTokenURI;

    uint256 public MAX_SUPPLY = 8888;

    uint256 public MINT_START;

    address public WITHDRAW_ADDRESS;

    address public COMMUNITY_VAULT;

    mapping(address => uint256) public presaleAddresses;
    mapping(address => uint256) public whitelistAddresses;

    constructor() ERC721A("TYGR CUB ALLIANCE: RETRIBUTION", "TYGR") {
        _baseTokenURI = "https://metadata.tygrnft.com/";
        MINT_START = 1649455200; // Launch Time
        WITHDRAW_ADDRESS = address(0xe9980dB2761354c596333BEcA26F9dcf51401e46);
        COMMUNITY_VAULT = 0xcb94885c4DCC04933d5aaBcCF96B71B6F709f6a0;
    }

    modifier onlyEOAUser() {
        require(msg.sender == tx.origin, "Caller is not EOA");
        _;
    }

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

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

    function contractURI() external view returns (string memory) {
        return _baseTokenURI;
    }

    function mintStarted() public view returns (bool) {
        return block.timestamp >= MINT_START;
    }

    /**
     * An efficient way to check amount of NFT a user can mint at a particular level.
     * It saves gas as we don't need to STORE user mints at each level. It relies
     * on user's Balance to determine mint left.
     * User who misses mints in the previous level can mint them at the current level
     * but at the price of current level.
     * Eg. A user can mint 2 NFTs at level 2,
     * but will be able to mint upto 4 if they miss Free Mints and Level 1
     */
    function userMintLeft() public view returns (uint256) {
        uint256 userBalance = _numberMinted(_msgSender());
        uint256 mintSoFar = _totalMinted();
        uint256 levelMintCap = 1; // One free mint

        // Add PreSale and Whitelist Balance for user with access
        levelMintCap = levelMintCap + presaleAddresses[_msgSender()] + whitelistAddresses[_msgSender()];
        

        if (mintSoFar >= FREE_MINTS) levelMintCap += 1;
        if (mintSoFar >= LEV1_MINTS) levelMintCap += 2;
        if (mintSoFar >= LEV2_MINTS) levelMintCap += 3;
        if (mintSoFar >= LEV3_MINTS) levelMintCap += 3;
        if (mintSoFar >= LEV4_MINTS) levelMintCap += 3;
        if (mintSoFar >= LEV5_MINTS) levelMintCap += 3;
        if (mintSoFar >= LEV6_MINTS) levelMintCap += 3;
        if (mintSoFar >= LEV7_MINTS) levelMintCap += 4;
        if (mintSoFar >= LEV8_MINTS) levelMintCap += 4;

        if(userBalance > mintSoFar) return 0;
        return levelMintCap - userBalance;
    }

    /**
     * Returns the price of NFT at any current stage, supports Bulk Mint.
     * Bulk Minting at the endpoint of a stage pays price of the next stage.
     * eg. minting 3 NFT when total mint = 1999, will result to paying 0.015 for 2000, 2001, 2002
     */
    function price(uint256 quantity) public view returns (uint256) {
        uint256 stage = _totalMinted() + quantity;

        if (stage <= FREE_MINTS) return 0;

        if (stage <= LEV1_MINTS) return quantity * 0.005 ether;

        if (stage <= LEV2_MINTS) return quantity * 0.01 ether;

        if (stage <= LEV3_MINTS) return quantity * 0.015 ether;

        if (stage <= LEV4_MINTS) return quantity * 0.019 ether;

        if (stage <= LEV5_MINTS) return quantity * 0.025 ether;

        if (stage <= LEV6_MINTS) return quantity * 0.029 ether;

        if (stage <= LEV7_MINTS) return quantity * 0.035 ether;

        if (stage <= LEV8_MINTS) return quantity * 0.039 ether;

        return quantity * 0.045 ether;
    }

    function _isEligible(uint256 quantity) internal onlyEOAUser {
        require(mintStarted(), "Minting not started");
        require(_totalMinted() + quantity <= MAX_SUPPLY, "Minting would exceed max supply");
        require(
            _totalMinted() >= RESERVE_MINTS,
            "Vault Reserve yet to be minted"
        );
        require(
            userMintLeft() >= quantity,
            "Requested number exceeds maximum per address at current level"
        );

        if (presaleAddresses[_msgSender()] >= quantity) {
            require(
                msg.value >= 0.01 ether * quantity,
                "PS: Did not send enough eth."
            );
            presaleAddresses[_msgSender()] =
                presaleAddresses[_msgSender()] -
                quantity;
        } else if (whitelistAddresses[_msgSender()] >= quantity) {
            require(
                msg.value >= 0.019 ether * quantity,
                "WL: Did not send enough eth."
            );
            whitelistAddresses[_msgSender()] =
                whitelistAddresses[_msgSender()] -
                quantity;
        } else {
            require(msg.value >= price(quantity), "Did not send enough eth."); // For normal USer
        }
    }

    function mint(uint256 quantity) external payable {
        _isEligible(quantity);
        _safeMint(msg.sender, quantity);
    }

    function burn(uint256 tokenId) external {
        _burn(tokenId, true);
    }

    function totalMinted() external view returns (uint256) {
        return _totalMinted();
    }

    function totalBurned() external view returns (uint256) {
        return _burnCounter;
    }

    function mintToVault() external {
        require(_totalMinted() == 0, "NFTs already minted to vault");
        _safeMint(COMMUNITY_VAULT, RESERVE_MINTS);
    }

    /// Admin Functions

    function setBaseTokenURI(string memory baseTokenURI) external onlyOwner {
        _baseTokenURI = baseTokenURI;
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "NOTHING_TO_WITHDRAW");
        
        (bool success, ) = payable(WITHDRAW_ADDRESS).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }

    function setPresaleAddresses(address[] calldata presales)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < presales.length; i++) {
            if (presaleAddresses[presales[i]] == 0) {
                // Avoid overriding balance
                presaleAddresses[presales[i]] = 6;
            }
        }
    }

    function setWhitesaleAddresses(address[] calldata whitesales)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < whitesales.length; i++) {
            if (whitelistAddresses[whitesales[i]] == 0) {
                // Avoid overriding balance
                whitelistAddresses[whitesales[i]] = 4;
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COMMUNITY_VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"presales","type":"address[]"}],"name":"setPresaleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitesales","type":"address[]"}],"name":"setWhitesaleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"userMintLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526122b8600b553480156200001757600080fd5b506040518060400160405280601e81526020017f545947522043554220414c4c49414e43453a205245545249425554494f4e00008152506040518060400160405280600481526020017f5459475200000000000000000000000000000000000000000000000000000000815250620000a462000098620001ff60201b60201c565b6200020760201b60201c565b8160039080519060200190620000bc929190620002d4565b508060049080519060200190620000d5929190620002d4565b50620000e6620002cb60201b60201c565b600181905550505060016009819055506040518060400160405280601d81526020017f68747470733a2f2f6d657461646174612e747967726e66742e636f6d2f000000815250600a908051906020019062000143929190620002d4565b50636250b060600c8190555073e9980db2761354c596333beca26f9dcf51401e46600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073cb94885c4dcc04933d5aabccf96b71b6f709f6a0600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003e9565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620002e290620003b3565b90600052602060002090601f01602090048101928262000306576000855562000352565b82601f106200032157805160ff191683800117855562000352565b8280016001018555821562000352579182015b828111156200035157825182559160200191906001019062000334565b5b50905062000361919062000365565b5090565b5b808211156200038057600081600090555060010162000366565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003cc57607f821691505b60208210811415620003e357620003e262000384565b5b50919050565b61491e80620003f96000396000f3fe60806040526004361061020f5760003560e01c806369ddd67d11610118578063a9722cf3116100a0578063c87b56dd1161006f578063c87b56dd1461076a578063d89135cd146107a7578063e8a3d485146107d2578063e985e9c5146107fd578063f2fde38b1461083a5761020f565b8063a9722cf3146106c0578063afed7bec146106eb578063b88d4fde14610716578063c6374d0c1461073f5761020f565b806395d89b41116100e757806395d89b41146105fa5780639bcae51014610625578063a0712d6814610650578063a22cb4651461066c578063a2309ff8146106955761020f565b806369ddd67d1461053e57806370a082311461057b578063715018a6146105b85780638da5cb5b146105cf5761020f565b806326a49e371161019b5780633ff35a4f1161016a5780633ff35a4f1461044957806342842e0e1461047257806342966c681461049b5780636352211e146104c457806366fca980146105015761020f565b806326a49e37146103a157806330176e13146103de57806332cb6b0c146104075780633ccfd60b146104325761020f565b8063095ea7b3116101e2578063095ea7b3146102e2578063122e04a81461030b57806318160ddd1461033657806319caedd01461036157806323b872dd146103785761020f565b806301ffc9a71461021457806306fdde031461025157806307f697fa1461027c578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906137c0565b610863565b6040516102489190613808565b60405180910390f35b34801561025d57600080fd5b50610266610945565b60405161027391906138bc565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613943565b6109d7565b005b3480156102b157600080fd5b506102cc60048036038101906102c791906139c6565b610b55565b6040516102d99190613a34565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613a7b565b610bd1565b005b34801561031757600080fd5b50610320610cdc565b60405161032d9190613a34565b60405180910390f35b34801561034257600080fd5b5061034b610d02565b6040516103589190613aca565b60405180910390f35b34801561036d57600080fd5b50610376610d19565b005b34801561038457600080fd5b5061039f600480360381019061039a9190613ae5565b610d92565b005b3480156103ad57600080fd5b506103c860048036038101906103c391906139c6565b610da2565b6040516103d59190613aca565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190613c68565b610f09565b005b34801561041357600080fd5b5061041c610f9f565b6040516104299190613aca565b60405180910390f35b34801561043e57600080fd5b50610447610fa5565b005b34801561045557600080fd5b50610470600480360381019061046b9190613943565b611191565b005b34801561047e57600080fd5b5061049960048036038101906104949190613ae5565b61130f565b005b3480156104a757600080fd5b506104c260048036038101906104bd91906139c6565b61132f565b005b3480156104d057600080fd5b506104eb60048036038101906104e691906139c6565b61133d565b6040516104f89190613a34565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613cb1565b611353565b6040516105359190613aca565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613cb1565b61136b565b6040516105729190613aca565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613cb1565b611383565b6040516105af9190613aca565b60405180910390f35b3480156105c457600080fd5b506105cd611453565b005b3480156105db57600080fd5b506105e46114db565b6040516105f19190613a34565b60405180910390f35b34801561060657600080fd5b5061060f611504565b60405161061c91906138bc565b60405180910390f35b34801561063157600080fd5b5061063a611596565b6040516106479190613a34565b60405180910390f35b61066a600480360381019061066591906139c6565b6115bc565b005b34801561067857600080fd5b50610693600480360381019061068e9190613d0a565b6115d2565b005b3480156106a157600080fd5b506106aa61174a565b6040516106b79190613aca565b60405180910390f35b3480156106cc57600080fd5b506106d5611759565b6040516106e29190613808565b60405180910390f35b3480156106f757600080fd5b50610700611766565b60405161070d9190613aca565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190613deb565b61193c565b005b34801561074b57600080fd5b506107546119b8565b6040516107619190613aca565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906139c6565b6119be565b60405161079e91906138bc565b60405180910390f35b3480156107b357600080fd5b506107bc611a5d565b6040516107c99190613aca565b60405180910390f35b3480156107de57600080fd5b506107e7611a67565b6040516107f491906138bc565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613e6e565b611af9565b6040516108319190613808565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613cb1565b611b8d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093e575061093d82611c85565b5b9050919050565b60606003805461095490613edd565b80601f016020809104026020016040519081016040528092919081815260200182805461098090613edd565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050905090565b6109df611cef565b73ffffffffffffffffffffffffffffffffffffffff166109fd6114db565b73ffffffffffffffffffffffffffffffffffffffff1614610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90613f5b565b60405180910390fd5b60005b82829050811015610b5057600060106000858585818110610a7a57610a79613f7b565b5b9050602002016020810190610a8f9190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610b3d57600460106000858585818110610ae957610ae8613f7b565b5b9050602002016020810190610afe9190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8080610b4890613fd9565b915050610a56565b505050565b6000610b6082611cf7565b610b96576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bdc8261133d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c44576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c63611cef565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c955750610c9381610c8e611cef565b611af9565b155b15610ccc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd7838383611d45565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d0c611df7565b6002546001540303905090565b6000610d23611e00565b14610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a9061406e565b60405180910390fd5b610d90600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660c8611e13565b565b610d9d838383611e31565b505050565b60008082610dae611e00565b610db8919061408e565b90506101f48111610dcd576000915050610f04565b6103788111610df1576611c37937e0800083610de991906140e4565b915050610f04565b6107d08111610e1557662386f26fc1000083610e0d91906140e4565b915050610f04565b610bb88111610e395766354a6ba7a1800083610e3191906140e4565b915050610f04565b610fa08111610e5d57664380663abb800083610e5591906140e4565b915050610f04565b6113888111610e81576658d15e1762800083610e7991906140e4565b915050610f04565b6117708111610ea55766670758aa7c800083610e9d91906140e4565b915050610f04565b611b588111610ec957667c58508723800083610ec191906140e4565b915050610f04565b611f408111610eed57668a8e4b1a3d800083610ee591906140e4565b915050610f04565b669fdf42f6e4800083610f0091906140e4565b9150505b919050565b610f11611cef565b73ffffffffffffffffffffffffffffffffffffffff16610f2f6114db565b73ffffffffffffffffffffffffffffffffffffffff1614610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90613f5b565b60405180910390fd5b80600a9080519060200190610f9b92919061366e565b5050565b600b5481565b610fad611cef565b73ffffffffffffffffffffffffffffffffffffffff16610fcb6114db565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613f5b565b60405180910390fd5b60026009541415611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e9061418a565b60405180910390fd5b60026009819055506000479050600081116110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906141f6565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110ff90614247565b60006040518083038185875af1925050503d806000811461113c576040519150601f19603f3d011682016040523d82523d6000602084013e611141565b606091505b5050905080611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c906142a8565b60405180910390fd5b50506001600981905550565b611199611cef565b73ffffffffffffffffffffffffffffffffffffffff166111b76114db565b73ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613f5b565b60405180910390fd5b60005b8282905081101561130a576000600f600085858581811061123457611233613f7b565b5b90506020020160208101906112499190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112f7576006600f60008585858181106112a3576112a2613f7b565b5b90506020020160208101906112b89190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b808061130290613fd9565b915050611210565b505050565b61132a8383836040518060200160405280600081525061193c565b505050565b61133a8160016122e7565b50565b6000611348826126d7565b600001519050919050565b600f6020528060005260406000206000915090505481565b60106020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113eb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61145b611cef565b73ffffffffffffffffffffffffffffffffffffffff166114796114db565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613f5b565b60405180910390fd5b6114d96000612966565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461151390613edd565b80601f016020809104026020016040519081016040528092919081815260200182805461153f90613edd565b801561158c5780601f106115615761010080835404028352916020019161158c565b820191906000526020600020905b81548152906001019060200180831161156f57829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115c581612a2a565b6115cf3382611e13565b50565b6115da611cef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061164c611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116f9611cef565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161173e9190613808565b60405180910390a35050565b6000611754611e00565b905090565b6000600c54421015905090565b600080611779611774611cef565b612ea1565b90506000611785611e00565b905060006001905060106000611799611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600f60006117e0611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611826919061408e565b611830919061408e565b90506101f4821061184b57600181611848919061408e565b90505b610378821061186457600281611861919061408e565b90505b6107d0821061187d5760038161187a919061408e565b90505b610bb8821061189657600381611893919061408e565b90505b610fa082106118af576003816118ac919061408e565b90505b61138882106118c8576003816118c5919061408e565b90505b61177082106118e1576003816118de919061408e565b90505b611b5882106118fa576004816118f7919061408e565b90505b611f40821061191357600481611910919061408e565b90505b818311156119275760009350505050611939565b828161193391906142c8565b93505050505b90565b611947848484611e31565b6119668373ffffffffffffffffffffffffffffffffffffffff16612f0b565b801561197b575061197984848484612f2e565b155b156119b2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b60606119c982611cf7565b6119ff576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a0961308e565b9050600081511415611a2a5760405180602001604052806000815250611a55565b80611a3484613120565b604051602001611a45929190614338565b6040516020818303038152906040525b915050919050565b6000600254905090565b6060600a8054611a7690613edd565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa290613edd565b8015611aef5780601f10611ac457610100808354040283529160200191611aef565b820191906000526020600020905b815481529060010190602001808311611ad257829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b95611cef565b73ffffffffffffffffffffffffffffffffffffffff16611bb36114db565b73ffffffffffffffffffffffffffffffffffffffff1614611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0090613f5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906143ce565b60405180910390fd5b611c8281612966565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d02611df7565b11158015611d11575060015482105b8015611d3e575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611e0a611df7565b60015403905090565b611e2d828260405180602001604052806000815250613281565b5050565b6000611e3c826126d7565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ea7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611ec8611cef565b73ffffffffffffffffffffffffffffffffffffffff161480611ef75750611ef685611ef1611cef565b611af9565b5b80611f3c5750611f05611cef565b73ffffffffffffffffffffffffffffffffffffffff16611f2484610b55565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f75576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fdc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe98585856001613293565b611ff560008487611d45565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561227557600154821461227457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122e08585856001613299565b5050505050565b60006122f2836126d7565b905060008160000151905082156123d35760008173ffffffffffffffffffffffffffffffffffffffff16612324611cef565b73ffffffffffffffffffffffffffffffffffffffff16148061235357506123528261234d611cef565b611af9565b5b806123985750612361611cef565b73ffffffffffffffffffffffffffffffffffffffff1661238086610b55565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123d1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6123e1816000866001613293565b6123ed60008583611d45565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561265157600154821461265057848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126bf816000866001613299565b60026000815480929190600101919050555050505050565b6126df6136f4565b6000829050806126ed611df7565b111580156126fc575060015481105b1561292f576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161292d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612811578092505050612961565b5b60011561292c57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612927578092505050612961565b612812565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f9061443a565b60405180910390fd5b612aa0611759565b612adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad6906144a6565b60405180910390fd5b600b5481612aeb611e00565b612af5919061408e565b1115612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614512565b60405180910390fd5b60c8612b40611e00565b1015612b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b789061457e565b60405180910390fd5b80612b8a611766565b1015612bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc290614610565b60405180910390fd5b80600f6000612bd8611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612d0e5780662386f26fc10000612c2b91906140e4565b341015612c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c649061467c565b60405180910390fd5b80600f6000612c7a611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cbf91906142c8565b600f6000612ccb611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e9e565b8060106000612d1b611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612e515780664380663abb8000612d6e91906140e4565b341015612db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da7906146e8565b60405180910390fd5b8060106000612dbd611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e0291906142c8565b60106000612e0e611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e9d565b612e5a81610da2565b341015612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390614754565b60405180910390fd5b5b5b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f54611cef565b8786866040518563ffffffff1660e01b8152600401612f7694939291906147c9565b602060405180830381600087803b158015612f9057600080fd5b505af1925050508015612fc157506040513d601f19601f82011682018060405250810190612fbe919061482a565b60015b61303b573d8060008114612ff1576040519150601f19603f3d011682016040523d82523d6000602084013e612ff6565b606091505b50600081511415613033576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461309d90613edd565b80601f01602080910402602001604051908101604052809291908181526020018280546130c990613edd565b80156131165780601f106130eb57610100808354040283529160200191613116565b820191906000526020600020905b8154815290600101906020018083116130f957829003601f168201915b5050505050905090565b60606000821415613168576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061327c565b600082905060005b6000821461319a57808061318390613fd9565b915050600a826131939190614886565b9150613170565b60008167ffffffffffffffff8111156131b6576131b5613b3d565b5b6040519080825280601f01601f1916602001820160405280156131e85781602001600182028036833780820191505090505b5090505b600085146132755760018261320191906142c8565b9150600a8561321091906148b7565b603061321c919061408e565b60f81b81838151811061323257613231613f7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561326e9190614886565b94506131ec565b8093505050505b919050565b61328e838383600161329f565b505050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561330d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613348576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133556000868387613293565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561351f575061351e8773ffffffffffffffffffffffffffffffffffffffff16612f0b565b5b156135e5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135946000888480600101955088612f2e565b6135ca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156135255782600154146135e057600080fd5b613651565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156135e6575b8160018190555050506136676000868387613299565b5050505050565b82805461367a90613edd565b90600052602060002090601f01602090048101928261369c57600085556136e3565b82601f106136b557805160ff19168380011785556136e3565b828001600101855582156136e3579182015b828111156136e25782518255916020019190600101906136c7565b5b5090506136f09190613737565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613750576000816000905550600101613738565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61379d81613768565b81146137a857600080fd5b50565b6000813590506137ba81613794565b92915050565b6000602082840312156137d6576137d561375e565b5b60006137e4848285016137ab565b91505092915050565b60008115159050919050565b613802816137ed565b82525050565b600060208201905061381d60008301846137f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561385d578082015181840152602081019050613842565b8381111561386c576000848401525b50505050565b6000601f19601f8301169050919050565b600061388e82613823565b613898818561382e565b93506138a881856020860161383f565b6138b181613872565b840191505092915050565b600060208201905081810360008301526138d68184613883565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613903576139026138de565b5b8235905067ffffffffffffffff8111156139205761391f6138e3565b5b60208301915083602082028301111561393c5761393b6138e8565b5b9250929050565b6000806020838503121561395a5761395961375e565b5b600083013567ffffffffffffffff81111561397857613977613763565b5b613984858286016138ed565b92509250509250929050565b6000819050919050565b6139a381613990565b81146139ae57600080fd5b50565b6000813590506139c08161399a565b92915050565b6000602082840312156139dc576139db61375e565b5b60006139ea848285016139b1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a1e826139f3565b9050919050565b613a2e81613a13565b82525050565b6000602082019050613a496000830184613a25565b92915050565b613a5881613a13565b8114613a6357600080fd5b50565b600081359050613a7581613a4f565b92915050565b60008060408385031215613a9257613a9161375e565b5b6000613aa085828601613a66565b9250506020613ab1858286016139b1565b9150509250929050565b613ac481613990565b82525050565b6000602082019050613adf6000830184613abb565b92915050565b600080600060608486031215613afe57613afd61375e565b5b6000613b0c86828701613a66565b9350506020613b1d86828701613a66565b9250506040613b2e868287016139b1565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b7582613872565b810181811067ffffffffffffffff82111715613b9457613b93613b3d565b5b80604052505050565b6000613ba7613754565b9050613bb38282613b6c565b919050565b600067ffffffffffffffff821115613bd357613bd2613b3d565b5b613bdc82613872565b9050602081019050919050565b82818337600083830152505050565b6000613c0b613c0684613bb8565b613b9d565b905082815260208101848484011115613c2757613c26613b38565b5b613c32848285613be9565b509392505050565b600082601f830112613c4f57613c4e6138de565b5b8135613c5f848260208601613bf8565b91505092915050565b600060208284031215613c7e57613c7d61375e565b5b600082013567ffffffffffffffff811115613c9c57613c9b613763565b5b613ca884828501613c3a565b91505092915050565b600060208284031215613cc757613cc661375e565b5b6000613cd584828501613a66565b91505092915050565b613ce7816137ed565b8114613cf257600080fd5b50565b600081359050613d0481613cde565b92915050565b60008060408385031215613d2157613d2061375e565b5b6000613d2f85828601613a66565b9250506020613d4085828601613cf5565b9150509250929050565b600067ffffffffffffffff821115613d6557613d64613b3d565b5b613d6e82613872565b9050602081019050919050565b6000613d8e613d8984613d4a565b613b9d565b905082815260208101848484011115613daa57613da9613b38565b5b613db5848285613be9565b509392505050565b600082601f830112613dd257613dd16138de565b5b8135613de2848260208601613d7b565b91505092915050565b60008060008060808587031215613e0557613e0461375e565b5b6000613e1387828801613a66565b9450506020613e2487828801613a66565b9350506040613e35878288016139b1565b925050606085013567ffffffffffffffff811115613e5657613e55613763565b5b613e6287828801613dbd565b91505092959194509250565b60008060408385031215613e8557613e8461375e565b5b6000613e9385828601613a66565b9250506020613ea485828601613a66565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ef557607f821691505b60208210811415613f0957613f08613eae565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f4560208361382e565b9150613f5082613f0f565b602082019050919050565b60006020820190508181036000830152613f7481613f38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fe482613990565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561401757614016613faa565b5b600182019050919050565b7f4e46547320616c7265616479206d696e74656420746f207661756c7400000000600082015250565b6000614058601c8361382e565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b600061409982613990565b91506140a483613990565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140d9576140d8613faa565b5b828201905092915050565b60006140ef82613990565b91506140fa83613990565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561413357614132613faa565b5b828202905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614174601f8361382e565b915061417f8261413e565b602082019050919050565b600060208201905081810360008301526141a381614167565b9050919050565b7f4e4f5448494e475f544f5f574954484452415700000000000000000000000000600082015250565b60006141e060138361382e565b91506141eb826141aa565b602082019050919050565b6000602082019050818103600083015261420f816141d3565b9050919050565b600081905092915050565b50565b6000614231600083614216565b915061423c82614221565b600082019050919050565b600061425282614224565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061429260108361382e565b915061429d8261425c565b602082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b60006142d382613990565b91506142de83613990565b9250828210156142f1576142f0613faa565b5b828203905092915050565b600081905092915050565b600061431282613823565b61431c81856142fc565b935061432c81856020860161383f565b80840191505092915050565b60006143448285614307565b91506143508284614307565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143b860268361382e565b91506143c38261435c565b604082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b7f43616c6c6572206973206e6f7420454f41000000000000000000000000000000600082015250565b600061442460118361382e565b915061442f826143ee565b602082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4d696e74696e67206e6f74207374617274656400000000000000000000000000600082015250565b600061449060138361382e565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b60006144fc601f8361382e565b9150614507826144c6565b602082019050919050565b6000602082019050818103600083015261452b816144ef565b9050919050565b7f5661756c7420526573657276652079657420746f206265206d696e7465640000600082015250565b6000614568601e8361382e565b915061457382614532565b602082019050919050565b600060208201905081810360008301526145978161455b565b9050919050565b7f526571756573746564206e756d6265722065786365656473206d6178696d756d60008201527f2070657220616464726573732061742063757272656e74206c6576656c000000602082015250565b60006145fa603d8361382e565b91506146058261459e565b604082019050919050565b60006020820190508181036000830152614629816145ed565b9050919050565b7f50533a20446964206e6f742073656e6420656e6f756768206574682e00000000600082015250565b6000614666601c8361382e565b915061467182614630565b602082019050919050565b6000602082019050818103600083015261469581614659565b9050919050565b7f574c3a20446964206e6f742073656e6420656e6f756768206574682e00000000600082015250565b60006146d2601c8361382e565b91506146dd8261469c565b602082019050919050565b60006020820190508181036000830152614701816146c5565b9050919050565b7f446964206e6f742073656e6420656e6f756768206574682e0000000000000000600082015250565b600061473e60188361382e565b915061474982614708565b602082019050919050565b6000602082019050818103600083015261476d81614731565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061479b82614774565b6147a5818561477f565b93506147b581856020860161383f565b6147be81613872565b840191505092915050565b60006080820190506147de6000830187613a25565b6147eb6020830186613a25565b6147f86040830185613abb565b818103606083015261480a8184614790565b905095945050505050565b60008151905061482481613794565b92915050565b6000602082840312156148405761483f61375e565b5b600061484e84828501614815565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061489182613990565b915061489c83613990565b9250826148ac576148ab614857565b5b828204905092915050565b60006148c282613990565b91506148cd83613990565b9250826148dd576148dc614857565b5b82820690509291505056fea264697066735822122073c93b765e80d2c57c73a09518a7387837168b4af67c4fef73fff5c20cee0e3064736f6c63430008090033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806369ddd67d11610118578063a9722cf3116100a0578063c87b56dd1161006f578063c87b56dd1461076a578063d89135cd146107a7578063e8a3d485146107d2578063e985e9c5146107fd578063f2fde38b1461083a5761020f565b8063a9722cf3146106c0578063afed7bec146106eb578063b88d4fde14610716578063c6374d0c1461073f5761020f565b806395d89b41116100e757806395d89b41146105fa5780639bcae51014610625578063a0712d6814610650578063a22cb4651461066c578063a2309ff8146106955761020f565b806369ddd67d1461053e57806370a082311461057b578063715018a6146105b85780638da5cb5b146105cf5761020f565b806326a49e371161019b5780633ff35a4f1161016a5780633ff35a4f1461044957806342842e0e1461047257806342966c681461049b5780636352211e146104c457806366fca980146105015761020f565b806326a49e37146103a157806330176e13146103de57806332cb6b0c146104075780633ccfd60b146104325761020f565b8063095ea7b3116101e2578063095ea7b3146102e2578063122e04a81461030b57806318160ddd1461033657806319caedd01461036157806323b872dd146103785761020f565b806301ffc9a71461021457806306fdde031461025157806307f697fa1461027c578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906137c0565b610863565b6040516102489190613808565b60405180910390f35b34801561025d57600080fd5b50610266610945565b60405161027391906138bc565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613943565b6109d7565b005b3480156102b157600080fd5b506102cc60048036038101906102c791906139c6565b610b55565b6040516102d99190613a34565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613a7b565b610bd1565b005b34801561031757600080fd5b50610320610cdc565b60405161032d9190613a34565b60405180910390f35b34801561034257600080fd5b5061034b610d02565b6040516103589190613aca565b60405180910390f35b34801561036d57600080fd5b50610376610d19565b005b34801561038457600080fd5b5061039f600480360381019061039a9190613ae5565b610d92565b005b3480156103ad57600080fd5b506103c860048036038101906103c391906139c6565b610da2565b6040516103d59190613aca565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190613c68565b610f09565b005b34801561041357600080fd5b5061041c610f9f565b6040516104299190613aca565b60405180910390f35b34801561043e57600080fd5b50610447610fa5565b005b34801561045557600080fd5b50610470600480360381019061046b9190613943565b611191565b005b34801561047e57600080fd5b5061049960048036038101906104949190613ae5565b61130f565b005b3480156104a757600080fd5b506104c260048036038101906104bd91906139c6565b61132f565b005b3480156104d057600080fd5b506104eb60048036038101906104e691906139c6565b61133d565b6040516104f89190613a34565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613cb1565b611353565b6040516105359190613aca565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613cb1565b61136b565b6040516105729190613aca565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613cb1565b611383565b6040516105af9190613aca565b60405180910390f35b3480156105c457600080fd5b506105cd611453565b005b3480156105db57600080fd5b506105e46114db565b6040516105f19190613a34565b60405180910390f35b34801561060657600080fd5b5061060f611504565b60405161061c91906138bc565b60405180910390f35b34801561063157600080fd5b5061063a611596565b6040516106479190613a34565b60405180910390f35b61066a600480360381019061066591906139c6565b6115bc565b005b34801561067857600080fd5b50610693600480360381019061068e9190613d0a565b6115d2565b005b3480156106a157600080fd5b506106aa61174a565b6040516106b79190613aca565b60405180910390f35b3480156106cc57600080fd5b506106d5611759565b6040516106e29190613808565b60405180910390f35b3480156106f757600080fd5b50610700611766565b60405161070d9190613aca565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190613deb565b61193c565b005b34801561074b57600080fd5b506107546119b8565b6040516107619190613aca565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906139c6565b6119be565b60405161079e91906138bc565b60405180910390f35b3480156107b357600080fd5b506107bc611a5d565b6040516107c99190613aca565b60405180910390f35b3480156107de57600080fd5b506107e7611a67565b6040516107f491906138bc565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613e6e565b611af9565b6040516108319190613808565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613cb1565b611b8d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093e575061093d82611c85565b5b9050919050565b60606003805461095490613edd565b80601f016020809104026020016040519081016040528092919081815260200182805461098090613edd565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050905090565b6109df611cef565b73ffffffffffffffffffffffffffffffffffffffff166109fd6114db565b73ffffffffffffffffffffffffffffffffffffffff1614610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90613f5b565b60405180910390fd5b60005b82829050811015610b5057600060106000858585818110610a7a57610a79613f7b565b5b9050602002016020810190610a8f9190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610b3d57600460106000858585818110610ae957610ae8613f7b565b5b9050602002016020810190610afe9190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8080610b4890613fd9565b915050610a56565b505050565b6000610b6082611cf7565b610b96576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bdc8261133d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c44576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c63611cef565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c955750610c9381610c8e611cef565b611af9565b155b15610ccc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd7838383611d45565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d0c611df7565b6002546001540303905090565b6000610d23611e00565b14610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a9061406e565b60405180910390fd5b610d90600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660c8611e13565b565b610d9d838383611e31565b505050565b60008082610dae611e00565b610db8919061408e565b90506101f48111610dcd576000915050610f04565b6103788111610df1576611c37937e0800083610de991906140e4565b915050610f04565b6107d08111610e1557662386f26fc1000083610e0d91906140e4565b915050610f04565b610bb88111610e395766354a6ba7a1800083610e3191906140e4565b915050610f04565b610fa08111610e5d57664380663abb800083610e5591906140e4565b915050610f04565b6113888111610e81576658d15e1762800083610e7991906140e4565b915050610f04565b6117708111610ea55766670758aa7c800083610e9d91906140e4565b915050610f04565b611b588111610ec957667c58508723800083610ec191906140e4565b915050610f04565b611f408111610eed57668a8e4b1a3d800083610ee591906140e4565b915050610f04565b669fdf42f6e4800083610f0091906140e4565b9150505b919050565b610f11611cef565b73ffffffffffffffffffffffffffffffffffffffff16610f2f6114db565b73ffffffffffffffffffffffffffffffffffffffff1614610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90613f5b565b60405180910390fd5b80600a9080519060200190610f9b92919061366e565b5050565b600b5481565b610fad611cef565b73ffffffffffffffffffffffffffffffffffffffff16610fcb6114db565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613f5b565b60405180910390fd5b60026009541415611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e9061418a565b60405180910390fd5b60026009819055506000479050600081116110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906141f6565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110ff90614247565b60006040518083038185875af1925050503d806000811461113c576040519150601f19603f3d011682016040523d82523d6000602084013e611141565b606091505b5050905080611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c906142a8565b60405180910390fd5b50506001600981905550565b611199611cef565b73ffffffffffffffffffffffffffffffffffffffff166111b76114db565b73ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613f5b565b60405180910390fd5b60005b8282905081101561130a576000600f600085858581811061123457611233613f7b565b5b90506020020160208101906112499190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112f7576006600f60008585858181106112a3576112a2613f7b565b5b90506020020160208101906112b89190613cb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b808061130290613fd9565b915050611210565b505050565b61132a8383836040518060200160405280600081525061193c565b505050565b61133a8160016122e7565b50565b6000611348826126d7565b600001519050919050565b600f6020528060005260406000206000915090505481565b60106020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113eb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61145b611cef565b73ffffffffffffffffffffffffffffffffffffffff166114796114db565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613f5b565b60405180910390fd5b6114d96000612966565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461151390613edd565b80601f016020809104026020016040519081016040528092919081815260200182805461153f90613edd565b801561158c5780601f106115615761010080835404028352916020019161158c565b820191906000526020600020905b81548152906001019060200180831161156f57829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115c581612a2a565b6115cf3382611e13565b50565b6115da611cef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061164c611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116f9611cef565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161173e9190613808565b60405180910390a35050565b6000611754611e00565b905090565b6000600c54421015905090565b600080611779611774611cef565b612ea1565b90506000611785611e00565b905060006001905060106000611799611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600f60006117e0611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611826919061408e565b611830919061408e565b90506101f4821061184b57600181611848919061408e565b90505b610378821061186457600281611861919061408e565b90505b6107d0821061187d5760038161187a919061408e565b90505b610bb8821061189657600381611893919061408e565b90505b610fa082106118af576003816118ac919061408e565b90505b61138882106118c8576003816118c5919061408e565b90505b61177082106118e1576003816118de919061408e565b90505b611b5882106118fa576004816118f7919061408e565b90505b611f40821061191357600481611910919061408e565b90505b818311156119275760009350505050611939565b828161193391906142c8565b93505050505b90565b611947848484611e31565b6119668373ffffffffffffffffffffffffffffffffffffffff16612f0b565b801561197b575061197984848484612f2e565b155b156119b2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b60606119c982611cf7565b6119ff576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a0961308e565b9050600081511415611a2a5760405180602001604052806000815250611a55565b80611a3484613120565b604051602001611a45929190614338565b6040516020818303038152906040525b915050919050565b6000600254905090565b6060600a8054611a7690613edd565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa290613edd565b8015611aef5780601f10611ac457610100808354040283529160200191611aef565b820191906000526020600020905b815481529060010190602001808311611ad257829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b95611cef565b73ffffffffffffffffffffffffffffffffffffffff16611bb36114db565b73ffffffffffffffffffffffffffffffffffffffff1614611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0090613f5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906143ce565b60405180910390fd5b611c8281612966565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d02611df7565b11158015611d11575060015482105b8015611d3e575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611e0a611df7565b60015403905090565b611e2d828260405180602001604052806000815250613281565b5050565b6000611e3c826126d7565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ea7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611ec8611cef565b73ffffffffffffffffffffffffffffffffffffffff161480611ef75750611ef685611ef1611cef565b611af9565b5b80611f3c5750611f05611cef565b73ffffffffffffffffffffffffffffffffffffffff16611f2484610b55565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f75576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fdc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe98585856001613293565b611ff560008487611d45565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561227557600154821461227457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122e08585856001613299565b5050505050565b60006122f2836126d7565b905060008160000151905082156123d35760008173ffffffffffffffffffffffffffffffffffffffff16612324611cef565b73ffffffffffffffffffffffffffffffffffffffff16148061235357506123528261234d611cef565b611af9565b5b806123985750612361611cef565b73ffffffffffffffffffffffffffffffffffffffff1661238086610b55565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123d1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6123e1816000866001613293565b6123ed60008583611d45565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561265157600154821461265057848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126bf816000866001613299565b60026000815480929190600101919050555050505050565b6126df6136f4565b6000829050806126ed611df7565b111580156126fc575060015481105b1561292f576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161292d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612811578092505050612961565b5b60011561292c57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612927578092505050612961565b612812565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f9061443a565b60405180910390fd5b612aa0611759565b612adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad6906144a6565b60405180910390fd5b600b5481612aeb611e00565b612af5919061408e565b1115612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614512565b60405180910390fd5b60c8612b40611e00565b1015612b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b789061457e565b60405180910390fd5b80612b8a611766565b1015612bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc290614610565b60405180910390fd5b80600f6000612bd8611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612d0e5780662386f26fc10000612c2b91906140e4565b341015612c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c649061467c565b60405180910390fd5b80600f6000612c7a611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cbf91906142c8565b600f6000612ccb611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e9e565b8060106000612d1b611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612e515780664380663abb8000612d6e91906140e4565b341015612db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da7906146e8565b60405180910390fd5b8060106000612dbd611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e0291906142c8565b60106000612e0e611cef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e9d565b612e5a81610da2565b341015612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390614754565b60405180910390fd5b5b5b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f54611cef565b8786866040518563ffffffff1660e01b8152600401612f7694939291906147c9565b602060405180830381600087803b158015612f9057600080fd5b505af1925050508015612fc157506040513d601f19601f82011682018060405250810190612fbe919061482a565b60015b61303b573d8060008114612ff1576040519150601f19603f3d011682016040523d82523d6000602084013e612ff6565b606091505b50600081511415613033576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461309d90613edd565b80601f01602080910402602001604051908101604052809291908181526020018280546130c990613edd565b80156131165780601f106130eb57610100808354040283529160200191613116565b820191906000526020600020905b8154815290600101906020018083116130f957829003601f168201915b5050505050905090565b60606000821415613168576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061327c565b600082905060005b6000821461319a57808061318390613fd9565b915050600a826131939190614886565b9150613170565b60008167ffffffffffffffff8111156131b6576131b5613b3d565b5b6040519080825280601f01601f1916602001820160405280156131e85781602001600182028036833780820191505090505b5090505b600085146132755760018261320191906142c8565b9150600a8561321091906148b7565b603061321c919061408e565b60f81b81838151811061323257613231613f7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561326e9190614886565b94506131ec565b8093505050505b919050565b61328e838383600161329f565b505050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561330d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613348576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133556000868387613293565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561351f575061351e8773ffffffffffffffffffffffffffffffffffffffff16612f0b565b5b156135e5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135946000888480600101955088612f2e565b6135ca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156135255782600154146135e057600080fd5b613651565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156135e6575b8160018190555050506136676000868387613299565b5050505050565b82805461367a90613edd565b90600052602060002090601f01602090048101928261369c57600085556136e3565b82601f106136b557805160ff19168380011785556136e3565b828001600101855582156136e3579182015b828111156136e25782518255916020019190600101906136c7565b5b5090506136f09190613737565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613750576000816000905550600101613738565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61379d81613768565b81146137a857600080fd5b50565b6000813590506137ba81613794565b92915050565b6000602082840312156137d6576137d561375e565b5b60006137e4848285016137ab565b91505092915050565b60008115159050919050565b613802816137ed565b82525050565b600060208201905061381d60008301846137f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561385d578082015181840152602081019050613842565b8381111561386c576000848401525b50505050565b6000601f19601f8301169050919050565b600061388e82613823565b613898818561382e565b93506138a881856020860161383f565b6138b181613872565b840191505092915050565b600060208201905081810360008301526138d68184613883565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613903576139026138de565b5b8235905067ffffffffffffffff8111156139205761391f6138e3565b5b60208301915083602082028301111561393c5761393b6138e8565b5b9250929050565b6000806020838503121561395a5761395961375e565b5b600083013567ffffffffffffffff81111561397857613977613763565b5b613984858286016138ed565b92509250509250929050565b6000819050919050565b6139a381613990565b81146139ae57600080fd5b50565b6000813590506139c08161399a565b92915050565b6000602082840312156139dc576139db61375e565b5b60006139ea848285016139b1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a1e826139f3565b9050919050565b613a2e81613a13565b82525050565b6000602082019050613a496000830184613a25565b92915050565b613a5881613a13565b8114613a6357600080fd5b50565b600081359050613a7581613a4f565b92915050565b60008060408385031215613a9257613a9161375e565b5b6000613aa085828601613a66565b9250506020613ab1858286016139b1565b9150509250929050565b613ac481613990565b82525050565b6000602082019050613adf6000830184613abb565b92915050565b600080600060608486031215613afe57613afd61375e565b5b6000613b0c86828701613a66565b9350506020613b1d86828701613a66565b9250506040613b2e868287016139b1565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b7582613872565b810181811067ffffffffffffffff82111715613b9457613b93613b3d565b5b80604052505050565b6000613ba7613754565b9050613bb38282613b6c565b919050565b600067ffffffffffffffff821115613bd357613bd2613b3d565b5b613bdc82613872565b9050602081019050919050565b82818337600083830152505050565b6000613c0b613c0684613bb8565b613b9d565b905082815260208101848484011115613c2757613c26613b38565b5b613c32848285613be9565b509392505050565b600082601f830112613c4f57613c4e6138de565b5b8135613c5f848260208601613bf8565b91505092915050565b600060208284031215613c7e57613c7d61375e565b5b600082013567ffffffffffffffff811115613c9c57613c9b613763565b5b613ca884828501613c3a565b91505092915050565b600060208284031215613cc757613cc661375e565b5b6000613cd584828501613a66565b91505092915050565b613ce7816137ed565b8114613cf257600080fd5b50565b600081359050613d0481613cde565b92915050565b60008060408385031215613d2157613d2061375e565b5b6000613d2f85828601613a66565b9250506020613d4085828601613cf5565b9150509250929050565b600067ffffffffffffffff821115613d6557613d64613b3d565b5b613d6e82613872565b9050602081019050919050565b6000613d8e613d8984613d4a565b613b9d565b905082815260208101848484011115613daa57613da9613b38565b5b613db5848285613be9565b509392505050565b600082601f830112613dd257613dd16138de565b5b8135613de2848260208601613d7b565b91505092915050565b60008060008060808587031215613e0557613e0461375e565b5b6000613e1387828801613a66565b9450506020613e2487828801613a66565b9350506040613e35878288016139b1565b925050606085013567ffffffffffffffff811115613e5657613e55613763565b5b613e6287828801613dbd565b91505092959194509250565b60008060408385031215613e8557613e8461375e565b5b6000613e9385828601613a66565b9250506020613ea485828601613a66565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ef557607f821691505b60208210811415613f0957613f08613eae565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f4560208361382e565b9150613f5082613f0f565b602082019050919050565b60006020820190508181036000830152613f7481613f38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fe482613990565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561401757614016613faa565b5b600182019050919050565b7f4e46547320616c7265616479206d696e74656420746f207661756c7400000000600082015250565b6000614058601c8361382e565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b600061409982613990565b91506140a483613990565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140d9576140d8613faa565b5b828201905092915050565b60006140ef82613990565b91506140fa83613990565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561413357614132613faa565b5b828202905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614174601f8361382e565b915061417f8261413e565b602082019050919050565b600060208201905081810360008301526141a381614167565b9050919050565b7f4e4f5448494e475f544f5f574954484452415700000000000000000000000000600082015250565b60006141e060138361382e565b91506141eb826141aa565b602082019050919050565b6000602082019050818103600083015261420f816141d3565b9050919050565b600081905092915050565b50565b6000614231600083614216565b915061423c82614221565b600082019050919050565b600061425282614224565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061429260108361382e565b915061429d8261425c565b602082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b60006142d382613990565b91506142de83613990565b9250828210156142f1576142f0613faa565b5b828203905092915050565b600081905092915050565b600061431282613823565b61431c81856142fc565b935061432c81856020860161383f565b80840191505092915050565b60006143448285614307565b91506143508284614307565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143b860268361382e565b91506143c38261435c565b604082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b7f43616c6c6572206973206e6f7420454f41000000000000000000000000000000600082015250565b600061442460118361382e565b915061442f826143ee565b602082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4d696e74696e67206e6f74207374617274656400000000000000000000000000600082015250565b600061449060138361382e565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b60006144fc601f8361382e565b9150614507826144c6565b602082019050919050565b6000602082019050818103600083015261452b816144ef565b9050919050565b7f5661756c7420526573657276652079657420746f206265206d696e7465640000600082015250565b6000614568601e8361382e565b915061457382614532565b602082019050919050565b600060208201905081810360008301526145978161455b565b9050919050565b7f526571756573746564206e756d6265722065786365656473206d6178696d756d60008201527f2070657220616464726573732061742063757272656e74206c6576656c000000602082015250565b60006145fa603d8361382e565b91506146058261459e565b604082019050919050565b60006020820190508181036000830152614629816145ed565b9050919050565b7f50533a20446964206e6f742073656e6420656e6f756768206574682e00000000600082015250565b6000614666601c8361382e565b915061467182614630565b602082019050919050565b6000602082019050818103600083015261469581614659565b9050919050565b7f574c3a20446964206e6f742073656e6420656e6f756768206574682e00000000600082015250565b60006146d2601c8361382e565b91506146dd8261469c565b602082019050919050565b60006020820190508181036000830152614701816146c5565b9050919050565b7f446964206e6f742073656e6420656e6f756768206574682e0000000000000000600082015250565b600061473e60188361382e565b915061474982614708565b602082019050919050565b6000602082019050818103600083015261476d81614731565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061479b82614774565b6147a5818561477f565b93506147b581856020860161383f565b6147be81613872565b840191505092915050565b60006080820190506147de6000830187613a25565b6147eb6020830186613a25565b6147f86040830185613abb565b818103606083015261480a8184614790565b905095945050505050565b60008151905061482481613794565b92915050565b6000602082840312156148405761483f61375e565b5b600061484e84828501614815565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061489182613990565b915061489c83613990565b9250826148ac576148ab614857565b5b828204905092915050565b60006148c282613990565b91506148cd83613990565b9250826148dd576148dc614857565b5b82820690509291505056fea264697066735822122073c93b765e80d2c57c73a09518a7387837168b4af67c4fef73fff5c20cee0e3064736f6c63430008090033

Deployed Bytecode Sourcemap

46341:7366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23596:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26709:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53347:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28212:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27775:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46988:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22845:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52324:163;;;;;;;;;;;;;:::i;:::-;;29077:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49858:746;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52522:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46913:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52649:339;;;;;;;;;;;;;:::i;:::-;;52996:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29318:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52033:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26517:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47067:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47125:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23965:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45524:103;;;;;;;;;;;;;:::i;:::-;;44873:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26878:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47028:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51894:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28488:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52120:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47964:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48568:1012;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29574:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46954:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27053:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52223:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47856:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28846:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45782:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23596:305;23698:4;23750:25;23735:40;;;:11;:40;;;;:105;;;;23807:33;23792:48;;;:11;:48;;;;23735:105;:158;;;;23857:36;23881:11;23857:23;:36::i;:::-;23735:158;23715:178;;23596:305;;;:::o;26709:100::-;26763:13;26796:5;26789:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26709:100;:::o;53347:357::-;45104:12;:10;:12::i;:::-;45093:23;;:7;:5;:7::i;:::-;:23;;;45085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53467:9:::1;53462:235;53486:10;;:17;;53482:1;:21;53462:235;;;53566:1;53529:18;:33;53548:10;;53559:1;53548:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53529:33;;;;;;;;;;;;;;;;:38;53525:161;;;53669:1;53633:18;:33;53652:10;;53663:1;53652:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53633:33;;;;;;;;;;;;;;;:37;;;;53525:161;53505:3;;;;;:::i;:::-;;;;53462:235;;;;53347:357:::0;;:::o;28212:204::-;28280:7;28305:16;28313:7;28305;:16::i;:::-;28300:64;;28330:34;;;;;;;;;;;;;;28300:64;28384:15;:24;28400:7;28384:24;;;;;;;;;;;;;;;;;;;;;28377:31;;28212:204;;;:::o;27775:371::-;27848:13;27864:24;27880:7;27864:15;:24::i;:::-;27848:40;;27909:5;27903:11;;:2;:11;;;27899:48;;;27923:24;;;;;;;;;;;;;;27899:48;27980:5;27964:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;27990:37;28007:5;28014:12;:10;:12::i;:::-;27990:16;:37::i;:::-;27989:38;27964:63;27960:138;;;28051:35;;;;;;;;;;;;;;27960:138;28110:28;28119:2;28123:7;28132:5;28110:8;:28::i;:::-;27837:309;27775:371;;:::o;46988:31::-;;;;;;;;;;;;;:::o;22845:303::-;22889:7;23114:15;:13;:15::i;:::-;23099:12;;23083:13;;:28;:46;23076:53;;22845:303;:::o;52324:163::-;52393:1;52375:14;:12;:14::i;:::-;:19;52367:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52438:41;52448:15;;;;;;;;;;;46435:3;52438:9;:41::i;:::-;52324:163::o;29077:170::-;29211:28;29221:4;29227:2;29231:7;29211:9;:28::i;:::-;29077:170;;;:::o;49858:746::-;49912:7;49932:13;49965:8;49948:14;:12;:14::i;:::-;:25;;;;:::i;:::-;49932:41;;46496:3;49990:5;:19;49986:33;;50018:1;50011:8;;;;;49986:33;46536:3;50036:5;:19;50032:54;;50075:11;50064:8;:22;;;;:::i;:::-;50057:29;;;;;50032:54;46576:4;50103:5;:19;50099:53;;50142:10;50131:8;:21;;;;:::i;:::-;50124:28;;;;;50099:53;46617:4;50169:5;:19;50165:54;;50208:11;50197:8;:22;;;;:::i;:::-;50190:29;;;;;50165:54;46658:4;50236:5;:19;50232:54;;50275:11;50264:8;:22;;;;:::i;:::-;50257:29;;;;;50232:54;46699:4;50303:5;:19;50299:54;;50342:11;50331:8;:22;;;;:::i;:::-;50324:29;;;;;50299:54;46740:4;50370:5;:19;50366:54;;50409:11;50398:8;:22;;;;:::i;:::-;50391:29;;;;;50366:54;46781:4;50437:5;:19;50433:54;;50476:11;50465:8;:22;;;;:::i;:::-;50458:29;;;;;50433:54;46822:4;50504:5;:19;50500:54;;50543:11;50532:8;:22;;;;:::i;:::-;50525:29;;;;;50500:54;50585:11;50574:8;:22;;;;:::i;:::-;50567:29;;;49858:746;;;;:::o;52522:119::-;45104:12;:10;:12::i;:::-;45093:23;;:7;:5;:7::i;:::-;:23;;;45085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52621:12:::1;52605:13;:28;;;;;;;;;;;;:::i;:::-;;52522:119:::0;:::o;46913:32::-;;;;:::o;52649:339::-;45104:12;:10;:12::i;:::-;45093:23;;:7;:5;:7::i;:::-;:23;;;45085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43005:1:::1;43603:7;;:19;;43595:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43005:1;43736:7;:18;;;;52712:15:::2;52730:21;52712:39;;52780:1;52770:7;:11;52762:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;52827:12;52853:16;;;;;;;;;;;52845:30;;52897:21;52845:88;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52826:107;;;52952:7;52944:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52701:287;;42961:1:::1;43915:7;:22;;;;52649:339::o:0;52996:343::-;45104:12;:10;:12::i;:::-;45093:23;;:7;:5;:7::i;:::-;:23;;;45085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53112:9:::1;53107:225;53131:8;;:15;;53127:1;:19;53107:225;;;53205:1;53172:16;:29;53189:8;;53198:1;53189:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53172:29;;;;;;;;;;;;;;;;:34;53168:153;;;53304:1;53272:16;:29;53289:8;;53298:1;53289:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53272:29;;;;;;;;;;;;;;;:33;;;;53168:153;53148:3;;;;;:::i;:::-;;;;53107:225;;;;52996:343:::0;;:::o;29318:185::-;29456:39;29473:4;29479:2;29483:7;29456:39;;;;;;;;;;;;:16;:39::i;:::-;29318:185;;;:::o;52033:79::-;52084:20;52090:7;52099:4;52084:5;:20::i;:::-;52033:79;:::o;26517:125::-;26581:7;26608:21;26621:7;26608:12;:21::i;:::-;:26;;;26601:33;;26517:125;;;:::o;47067:51::-;;;;;;;;;;;;;;;;;:::o;47125:53::-;;;;;;;;;;;;;;;;;:::o;23965:206::-;24029:7;24070:1;24053:19;;:5;:19;;;24049:60;;;24081:28;;;;;;;;;;;;;;24049:60;24135:12;:19;24148:5;24135:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24127:36;;24120:43;;23965:206;;;:::o;45524:103::-;45104:12;:10;:12::i;:::-;45093:23;;:7;:5;:7::i;:::-;:23;;;45085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45589:30:::1;45616:1;45589:18;:30::i;:::-;45524:103::o:0;44873:87::-;44919:7;44946:6;;;;;;;;;;;44939:13;;44873:87;:::o;26878:104::-;26934:13;26967:7;26960:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26878:104;:::o;47028:30::-;;;;;;;;;;;;;:::o;51894:131::-;51954:21;51966:8;51954:11;:21::i;:::-;51986:31;51996:10;52008:8;51986:9;:31::i;:::-;51894:131;:::o;28488:287::-;28599:12;:10;:12::i;:::-;28587:24;;:8;:24;;;28583:54;;;28620:17;;;;;;;;;;;;;;28583:54;28695:8;28650:18;:32;28669:12;:10;:12::i;:::-;28650:32;;;;;;;;;;;;;;;:42;28683:8;28650:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28748:8;28719:48;;28734:12;:10;:12::i;:::-;28719:48;;;28758:8;28719:48;;;;;;:::i;:::-;;;;;;;;28488:287;;:::o;52120:95::-;52166:7;52193:14;:12;:14::i;:::-;52186:21;;52120:95;:::o;47964:105::-;48008:4;48051:10;;48032:15;:29;;48025:36;;47964:105;:::o;48568:1012::-;48613:7;48633:19;48655:27;48669:12;:10;:12::i;:::-;48655:13;:27::i;:::-;48633:49;;48693:17;48713:14;:12;:14::i;:::-;48693:34;;48738:20;48761:1;48738:24;;48922:18;:32;48941:12;:10;:12::i;:::-;48922:32;;;;;;;;;;;;;;;;48889:16;:30;48906:12;:10;:12::i;:::-;48889:30;;;;;;;;;;;;;;;;48874:12;:45;;;;:::i;:::-;:80;;;;:::i;:::-;48859:95;;46496:3;48981:9;:23;48977:46;;49022:1;49006:17;;;;;:::i;:::-;;;48977:46;46536:3;49038:9;:23;49034:46;;49079:1;49063:17;;;;;:::i;:::-;;;49034:46;46576:4;49095:9;:23;49091:46;;49136:1;49120:17;;;;;:::i;:::-;;;49091:46;46617:4;49152:9;:23;49148:46;;49193:1;49177:17;;;;;:::i;:::-;;;49148:46;46658:4;49209:9;:23;49205:46;;49250:1;49234:17;;;;;:::i;:::-;;;49205:46;46699:4;49266:9;:23;49262:46;;49307:1;49291:17;;;;;:::i;:::-;;;49262:46;46740:4;49323:9;:23;49319:46;;49364:1;49348:17;;;;;:::i;:::-;;;49319:46;46781:4;49380:9;:23;49376:46;;49421:1;49405:17;;;;;:::i;:::-;;;49376:46;46822:4;49437:9;:23;49433:46;;49478:1;49462:17;;;;;:::i;:::-;;;49433:46;49509:9;49495:11;:23;49492:36;;;49527:1;49520:8;;;;;;;49492:36;49561:11;49546:12;:26;;;;:::i;:::-;49539:33;;;;;48568:1012;;:::o;29574:369::-;29741:28;29751:4;29757:2;29761:7;29741:9;:28::i;:::-;29784:15;:2;:13;;;:15::i;:::-;:76;;;;;29804:56;29835:4;29841:2;29845:7;29854:5;29804:30;:56::i;:::-;29803:57;29784:76;29780:156;;;29884:40;;;;;;;;;;;;;;29780:156;29574:369;;;;:::o;46954:25::-;;;;:::o;27053:318::-;27126:13;27157:16;27165:7;27157;:16::i;:::-;27152:59;;27182:29;;;;;;;;;;;;;;27152:59;27224:21;27248:10;:8;:10::i;:::-;27224:34;;27301:1;27282:7;27276:21;:26;;:87;;;;;;;;;;;;;;;;;27329:7;27338:18;:7;:16;:18::i;:::-;27312:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27276:87;27269:94;;;27053:318;;;:::o;52223:93::-;52269:7;52296:12;;52289:19;;52223:93;:::o;47856:100::-;47902:13;47935;47928:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47856:100;:::o;28846:164::-;28943:4;28967:18;:25;28986:5;28967:25;;;;;;;;;;;;;;;:35;28993:8;28967:35;;;;;;;;;;;;;;;;;;;;;;;;;28960:42;;28846:164;;;;:::o;45782:201::-;45104:12;:10;:12::i;:::-;45093:23;;:7;:5;:7::i;:::-;:23;;;45085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45891:1:::1;45871:22;;:8;:22;;;;45863:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45947:28;45966:8;45947:18;:28::i;:::-;45782:201:::0;:::o;6217:157::-;6302:4;6341:25;6326:40;;;:11;:40;;;;6319:47;;6217:157;;;:::o;8910:98::-;8963:7;8990:10;8983:17;;8910:98;:::o;30198:187::-;30255:4;30298:7;30279:15;:13;:15::i;:::-;:26;;:53;;;;;30319:13;;30309:7;:23;30279:53;:98;;;;;30350:11;:20;30362:7;30350:20;;;;;;;;;;;:27;;;;;;;;;;;;30349:28;30279:98;30272:105;;30198:187;;;:::o;38368:196::-;38510:2;38483:15;:24;38499:7;38483:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38548:7;38544:2;38528:28;;38537:5;38528:28;;;;;;;;;;;;38368:196;;;:::o;47641:93::-;47698:7;47725:1;47718:8;;47641:93;:::o;23241:283::-;23288:7;23490:15;:13;:15::i;:::-;23474:13;;:31;23467:38;;23241:283;:::o;30393:104::-;30462:27;30472:2;30476:8;30462:27;;;;;;;;;;;;:9;:27::i;:::-;30393:104;;:::o;33311:2130::-;33426:35;33464:21;33477:7;33464:12;:21::i;:::-;33426:59;;33524:4;33502:26;;:13;:18;;;:26;;;33498:67;;33537:28;;;;;;;;;;;;;;33498:67;33578:22;33620:4;33604:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;33641:36;33658:4;33664:12;:10;:12::i;:::-;33641:16;:36::i;:::-;33604:73;:126;;;;33718:12;:10;:12::i;:::-;33694:36;;:20;33706:7;33694:11;:20::i;:::-;:36;;;33604:126;33578:153;;33749:17;33744:66;;33775:35;;;;;;;;;;;;;;33744:66;33839:1;33825:16;;:2;:16;;;33821:52;;;33850:23;;;;;;;;;;;;;;33821:52;33886:43;33908:4;33914:2;33918:7;33927:1;33886:21;:43::i;:::-;33994:35;34011:1;34015:7;34024:4;33994:8;:35::i;:::-;34355:1;34325:12;:18;34338:4;34325:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34399:1;34371:12;:16;34384:2;34371:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34417:31;34451:11;:20;34463:7;34451:20;;;;;;;;;;;34417:54;;34502:2;34486:8;:13;;;:18;;;;;;;;;;;;;;;;;;34552:15;34519:8;:23;;;:49;;;;;;;;;;;;;;;;;;34820:19;34852:1;34842:7;:11;34820:33;;34868:31;34902:11;:24;34914:11;34902:24;;;;;;;;;;;34868:58;;34970:1;34945:27;;:8;:13;;;;;;;;;;;;:27;;;34941:384;;;35155:13;;35140:11;:28;35136:174;;35209:4;35193:8;:13;;;:20;;;;;;;;;;;;;;;;;;35262:13;:28;;;35236:8;:23;;;:54;;;;;;;;;;;;;;;;;;35136:174;34941:384;34300:1036;;;35372:7;35368:2;35353:27;;35362:4;35353:27;;;;;;;;;;;;35391:42;35412:4;35418:2;35422:7;35431:1;35391:20;:42::i;:::-;33415:2026;;33311:2130;;;:::o;35842:2408::-;35922:35;35960:21;35973:7;35960:12;:21::i;:::-;35922:59;;35994:12;36009:13;:18;;;35994:33;;36044:13;36040:290;;;36074:22;36116:4;36100:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;36141:36;36158:4;36164:12;:10;:12::i;:::-;36141:16;:36::i;:::-;36100:77;:134;;;;36222:12;:10;:12::i;:::-;36198:36;;:20;36210:7;36198:11;:20::i;:::-;:36;;;36100:134;36074:161;;36257:17;36252:66;;36283:35;;;;;;;;;;;;;;36252:66;36059:271;36040:290;36342:51;36364:4;36378:1;36382:7;36391:1;36342:21;:51::i;:::-;36458:35;36475:1;36479:7;36488:4;36458:8;:35::i;:::-;36789:31;36823:12;:18;36836:4;36823:18;;;;;;;;;;;;;;;36789:52;;36879:1;36856:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36923:1;36895:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37023:31;37057:11;:20;37069:7;37057:20;;;;;;;;;;;37023:54;;37108:4;37092:8;:13;;;:20;;;;;;;;;;;;;;;;;;37160:15;37127:8;:23;;;:49;;;;;;;;;;;;;;;;;;37209:4;37191:8;:15;;;:22;;;;;;;;;;;;;;;;;;37461:19;37493:1;37483:7;:11;37461:33;;37509:31;37543:11;:24;37555:11;37543:24;;;;;;;;;;;37509:58;;37611:1;37586:27;;:8;:13;;;;;;;;;;;;:27;;;37582:384;;;37796:13;;37781:11;:28;37777:174;;37850:4;37834:8;:13;;;:20;;;;;;;;;;;;;;;;;;37903:13;:28;;;37877:8;:23;;;:54;;;;;;;;;;;;;;;;;;37777:174;37582:384;36764:1213;;;;38021:7;38017:1;37994:35;;38003:4;37994:35;;;;;;;;;;;;38040:50;38061:4;38075:1;38079:7;38088:1;38040:20;:50::i;:::-;38217:12;;:14;;;;;;;;;;;;;35911:2339;;35842:2408;;:::o;25346:1109::-;25408:21;;:::i;:::-;25442:12;25457:7;25442:22;;25525:4;25506:15;:13;:15::i;:::-;:23;;:47;;;;;25540:13;;25533:4;:20;25506:47;25502:886;;;25574:31;25608:11;:17;25620:4;25608:17;;;;;;;;;;;25574:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25649:9;:16;;;25644:729;;25720:1;25694:28;;:9;:14;;;:28;;;25690:101;;25758:9;25751:16;;;;;;25690:101;26093:261;26100:4;26093:261;;;26133:6;;;;;;;;26178:11;:17;26190:4;26178:17;;;;;;;;;;;26166:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26252:1;26226:28;;:9;:14;;;:28;;;26222:109;;26294:9;26287:16;;;;;;26222:109;26093:261;;;25644:729;25555:833;25502:886;26416:31;;;;;;;;;;;;;;25346:1109;;;;:::o;46143:191::-;46217:16;46236:6;;;;;;;;;;;46217:25;;46262:8;46253:6;;:17;;;;;;;;;;;;;;;;;;46317:8;46286:40;;46307:8;46286:40;;;;;;;;;;;;46206:128;46143:191;:::o;50612:1274::-;47582:9;47568:23;;:10;:23;;;47560:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50691:13:::1;:11;:13::i;:::-;50683:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;50776:10;;50764:8;50747:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;50739:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;46435:3;50855:14;:12;:14::i;:::-;:31;;50833:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;50995:8;50977:14;:12;:14::i;:::-;:26;;50955:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;51143:8;51109:16;:30;51126:12;:10;:12::i;:::-;51109:30;;;;;;;;;;;;;;;;:42;51105:774;;51220:8;51207:10;:21;;;;:::i;:::-;51194:9;:34;;51168:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;51407:8;51357:16;:30;51374:12;:10;:12::i;:::-;51357:30;;;;;;;;;;;;;;;;:58;;;;:::i;:::-;51307:16;:30;51324:12;:10;:12::i;:::-;51307:30;;;;;;;;;;;;;;;:108;;;;51105:774;;;51473:8;51437:18;:32;51456:12;:10;:12::i;:::-;51437:32;;;;;;;;;;;;;;;;:44;51433:446;;51551:8;51537:11;:22;;;;:::i;:::-;51524:9;:35;;51498:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;51742:8;51690:18;:32;51709:12;:10;:12::i;:::-;51690:32;;;;;;;;;;;;;;;;:60;;;;:::i;:::-;51638:18;:32;51657:12;:10;:12::i;:::-;51638:32;;;;;;;;;;;;;;;:112;;;;51433:446;;;51804:15;51810:8;51804:5;:15::i;:::-;51791:9;:28;;51783:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51433:446;51105:774;50612:1274:::0;:::o;24253:137::-;24314:7;24349:12;:19;24362:5;24349:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;24341:41;;24334:48;;24253:137;;;:::o;10211:326::-;10271:4;10528:1;10506:7;:19;;;:23;10499:30;;10211:326;;;:::o;39056:667::-;39219:4;39256:2;39240:36;;;39277:12;:10;:12::i;:::-;39291:4;39297:7;39306:5;39240:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39236:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39491:1;39474:6;:13;:18;39470:235;;;39520:40;;;;;;;;;;;;;;39470:235;39663:6;39657:13;39648:6;39644:2;39640:15;39633:38;39236:480;39369:45;;;39359:55;;;:6;:55;;;;39352:62;;;39056:667;;;;;;:::o;47742:106::-;47794:13;47827;47820:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47742:106;:::o;6609:723::-;6665:13;6895:1;6886:5;:10;6882:53;;;6913:10;;;;;;;;;;;;;;;;;;;;;6882:53;6945:12;6960:5;6945:20;;6976:14;7001:78;7016:1;7008:4;:9;7001:78;;7034:8;;;;;:::i;:::-;;;;7065:2;7057:10;;;;;:::i;:::-;;;7001:78;;;7089:19;7121:6;7111:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7089:39;;7139:154;7155:1;7146:5;:10;7139:154;;7183:1;7173:11;;;;;:::i;:::-;;;7250:2;7242:5;:10;;;;:::i;:::-;7229:2;:24;;;;:::i;:::-;7216:39;;7199:6;7206;7199:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7279:2;7270:11;;;;;:::i;:::-;;;7139:154;;;7317:6;7303:21;;;;;6609:723;;;;:::o;30860:163::-;30983:32;30989:2;30993:8;31003:5;31010:4;30983:5;:32::i;:::-;30860:163;;;:::o;40371:159::-;;;;;:::o;41189:158::-;;;;;:::o;31282:1775::-;31421:20;31444:13;;31421:36;;31486:1;31472:16;;:2;:16;;;31468:48;;;31497:19;;;;;;;;;;;;;;31468:48;31543:1;31531:8;:13;31527:44;;;31553:18;;;;;;;;;;;;;;31527:44;31584:61;31614:1;31618:2;31622:12;31636:8;31584:21;:61::i;:::-;31957:8;31922:12;:16;31935:2;31922:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32021:8;31981:12;:16;31994:2;31981:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32080:2;32047:11;:25;32059:12;32047:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32147:15;32097:11;:25;32109:12;32097:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32180:20;32203:12;32180:35;;32230:11;32259:8;32244:12;:23;32230:37;;32288:4;:23;;;;;32296:15;:2;:13;;;:15::i;:::-;32288:23;32284:641;;;32332:314;32388:12;32384:2;32363:38;;32380:1;32363:38;;;;;;;;;;;;32429:69;32468:1;32472:2;32476:14;;;;;;32492:5;32429:30;:69::i;:::-;32424:174;;32534:40;;;;;;;;;;;;;;32424:174;32641:3;32625:12;:19;;32332:314;;32727:12;32710:13;;:29;32706:43;;32741:8;;;32706:43;32284:641;;;32790:120;32846:14;;;;;;32842:2;32821:40;;32838:1;32821:40;;;;;;;;;;;;32905:3;32889:12;:19;;32790:120;;32284:641;32955:12;32939:13;:28;;;;31897:1082;;32989:60;33018:1;33022:2;33026:12;33040:8;32989:20;:60::i;:::-;31410:1647;31282:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:117::-;3017:1;3014;3007:12;3031:117;3140:1;3137;3130:12;3154:117;3263:1;3260;3253:12;3294:568;3367:8;3377:6;3427:3;3420:4;3412:6;3408:17;3404:27;3394:122;;3435:79;;:::i;:::-;3394:122;3548:6;3535:20;3525:30;;3578:18;3570:6;3567:30;3564:117;;;3600:79;;:::i;:::-;3564:117;3714:4;3706:6;3702:17;3690:29;;3768:3;3760:4;3752:6;3748:17;3738:8;3734:32;3731:41;3728:128;;;3775:79;;:::i;:::-;3728:128;3294:568;;;;;:::o;3868:559::-;3954:6;3962;4011:2;3999:9;3990:7;3986:23;3982:32;3979:119;;;4017:79;;:::i;:::-;3979:119;4165:1;4154:9;4150:17;4137:31;4195:18;4187:6;4184:30;4181:117;;;4217:79;;:::i;:::-;4181:117;4330:80;4402:7;4393:6;4382:9;4378:22;4330:80;:::i;:::-;4312:98;;;;4108:312;3868:559;;;;;:::o;4433:77::-;4470:7;4499:5;4488:16;;4433:77;;;:::o;4516:122::-;4589:24;4607:5;4589:24;:::i;:::-;4582:5;4579:35;4569:63;;4628:1;4625;4618:12;4569:63;4516:122;:::o;4644:139::-;4690:5;4728:6;4715:20;4706:29;;4744:33;4771:5;4744:33;:::i;:::-;4644:139;;;;:::o;4789:329::-;4848:6;4897:2;4885:9;4876:7;4872:23;4868:32;4865:119;;;4903:79;;:::i;:::-;4865:119;5023:1;5048:53;5093:7;5084:6;5073:9;5069:22;5048:53;:::i;:::-;5038:63;;4994:117;4789:329;;;;:::o;5124:126::-;5161:7;5201:42;5194:5;5190:54;5179:65;;5124:126;;;:::o;5256:96::-;5293:7;5322:24;5340:5;5322:24;:::i;:::-;5311:35;;5256:96;;;:::o;5358:118::-;5445:24;5463:5;5445:24;:::i;:::-;5440:3;5433:37;5358:118;;:::o;5482:222::-;5575:4;5613:2;5602:9;5598:18;5590:26;;5626:71;5694:1;5683:9;5679:17;5670:6;5626:71;:::i;:::-;5482:222;;;;:::o;5710:122::-;5783:24;5801:5;5783:24;:::i;:::-;5776:5;5773:35;5763:63;;5822:1;5819;5812:12;5763:63;5710:122;:::o;5838:139::-;5884:5;5922:6;5909:20;5900:29;;5938:33;5965:5;5938:33;:::i;:::-;5838:139;;;;:::o;5983:474::-;6051:6;6059;6108:2;6096:9;6087:7;6083:23;6079:32;6076:119;;;6114:79;;:::i;:::-;6076:119;6234:1;6259:53;6304:7;6295:6;6284:9;6280:22;6259:53;:::i;:::-;6249:63;;6205:117;6361:2;6387:53;6432:7;6423:6;6412:9;6408:22;6387:53;:::i;:::-;6377:63;;6332:118;5983:474;;;;;:::o;6463:118::-;6550:24;6568:5;6550:24;:::i;:::-;6545:3;6538:37;6463:118;;:::o;6587:222::-;6680:4;6718:2;6707:9;6703:18;6695:26;;6731:71;6799:1;6788:9;6784:17;6775:6;6731:71;:::i;:::-;6587:222;;;;:::o;6815:619::-;6892:6;6900;6908;6957:2;6945:9;6936:7;6932:23;6928:32;6925:119;;;6963:79;;:::i;:::-;6925:119;7083:1;7108:53;7153:7;7144:6;7133:9;7129:22;7108:53;:::i;:::-;7098:63;;7054:117;7210:2;7236:53;7281:7;7272:6;7261:9;7257:22;7236:53;:::i;:::-;7226:63;;7181:118;7338:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;:::i;:::-;7354:63;;7309:118;6815:619;;;;;:::o;7440:117::-;7549:1;7546;7539:12;7563:180;7611:77;7608:1;7601:88;7708:4;7705:1;7698:15;7732:4;7729:1;7722:15;7749:281;7832:27;7854:4;7832:27;:::i;:::-;7824:6;7820:40;7962:6;7950:10;7947:22;7926:18;7914:10;7911:34;7908:62;7905:88;;;7973:18;;:::i;:::-;7905:88;8013:10;8009:2;8002:22;7792:238;7749:281;;:::o;8036:129::-;8070:6;8097:20;;:::i;:::-;8087:30;;8126:33;8154:4;8146:6;8126:33;:::i;:::-;8036:129;;;:::o;8171:308::-;8233:4;8323:18;8315:6;8312:30;8309:56;;;8345:18;;:::i;:::-;8309:56;8383:29;8405:6;8383:29;:::i;:::-;8375:37;;8467:4;8461;8457:15;8449:23;;8171:308;;;:::o;8485:154::-;8569:6;8564:3;8559;8546:30;8631:1;8622:6;8617:3;8613:16;8606:27;8485:154;;;:::o;8645:412::-;8723:5;8748:66;8764:49;8806:6;8764:49;:::i;:::-;8748:66;:::i;:::-;8739:75;;8837:6;8830:5;8823:21;8875:4;8868:5;8864:16;8913:3;8904:6;8899:3;8895:16;8892:25;8889:112;;;8920:79;;:::i;:::-;8889:112;9010:41;9044:6;9039:3;9034;9010:41;:::i;:::-;8729:328;8645:412;;;;;:::o;9077:340::-;9133:5;9182:3;9175:4;9167:6;9163:17;9159:27;9149:122;;9190:79;;:::i;:::-;9149:122;9307:6;9294:20;9332:79;9407:3;9399:6;9392:4;9384:6;9380:17;9332:79;:::i;:::-;9323:88;;9139:278;9077:340;;;;:::o;9423:509::-;9492:6;9541:2;9529:9;9520:7;9516:23;9512:32;9509:119;;;9547:79;;:::i;:::-;9509:119;9695:1;9684:9;9680:17;9667:31;9725:18;9717:6;9714:30;9711:117;;;9747:79;;:::i;:::-;9711:117;9852:63;9907:7;9898:6;9887:9;9883:22;9852:63;:::i;:::-;9842:73;;9638:287;9423:509;;;;:::o;9938:329::-;9997:6;10046:2;10034:9;10025:7;10021:23;10017:32;10014:119;;;10052:79;;:::i;:::-;10014:119;10172:1;10197:53;10242:7;10233:6;10222:9;10218:22;10197:53;:::i;:::-;10187:63;;10143:117;9938:329;;;;:::o;10273:116::-;10343:21;10358:5;10343:21;:::i;:::-;10336:5;10333:32;10323:60;;10379:1;10376;10369:12;10323:60;10273:116;:::o;10395:133::-;10438:5;10476:6;10463:20;10454:29;;10492:30;10516:5;10492:30;:::i;:::-;10395:133;;;;:::o;10534:468::-;10599:6;10607;10656:2;10644:9;10635:7;10631:23;10627:32;10624:119;;;10662:79;;:::i;:::-;10624:119;10782:1;10807:53;10852:7;10843:6;10832:9;10828:22;10807:53;:::i;:::-;10797:63;;10753:117;10909:2;10935:50;10977:7;10968:6;10957:9;10953:22;10935:50;:::i;:::-;10925:60;;10880:115;10534:468;;;;;:::o;11008:307::-;11069:4;11159:18;11151:6;11148:30;11145:56;;;11181:18;;:::i;:::-;11145:56;11219:29;11241:6;11219:29;:::i;:::-;11211:37;;11303:4;11297;11293:15;11285:23;;11008:307;;;:::o;11321:410::-;11398:5;11423:65;11439:48;11480:6;11439:48;:::i;:::-;11423:65;:::i;:::-;11414:74;;11511:6;11504:5;11497:21;11549:4;11542:5;11538:16;11587:3;11578:6;11573:3;11569:16;11566:25;11563:112;;;11594:79;;:::i;:::-;11563:112;11684:41;11718:6;11713:3;11708;11684:41;:::i;:::-;11404:327;11321:410;;;;;:::o;11750:338::-;11805:5;11854:3;11847:4;11839:6;11835:17;11831:27;11821:122;;11862:79;;:::i;:::-;11821:122;11979:6;11966:20;12004:78;12078:3;12070:6;12063:4;12055:6;12051:17;12004:78;:::i;:::-;11995:87;;11811:277;11750:338;;;;:::o;12094:943::-;12189:6;12197;12205;12213;12262:3;12250:9;12241:7;12237:23;12233:33;12230:120;;;12269:79;;:::i;:::-;12230:120;12389:1;12414:53;12459:7;12450:6;12439:9;12435:22;12414:53;:::i;:::-;12404:63;;12360:117;12516:2;12542:53;12587:7;12578:6;12567:9;12563:22;12542:53;:::i;:::-;12532:63;;12487:118;12644:2;12670:53;12715:7;12706:6;12695:9;12691:22;12670:53;:::i;:::-;12660:63;;12615:118;12800:2;12789:9;12785:18;12772:32;12831:18;12823:6;12820:30;12817:117;;;12853:79;;:::i;:::-;12817:117;12958:62;13012:7;13003:6;12992:9;12988:22;12958:62;:::i;:::-;12948:72;;12743:287;12094:943;;;;;;;:::o;13043:474::-;13111:6;13119;13168:2;13156:9;13147:7;13143:23;13139:32;13136:119;;;13174:79;;:::i;:::-;13136:119;13294:1;13319:53;13364:7;13355:6;13344:9;13340:22;13319:53;:::i;:::-;13309:63;;13265:117;13421:2;13447:53;13492:7;13483:6;13472:9;13468:22;13447:53;:::i;:::-;13437:63;;13392:118;13043:474;;;;;:::o;13523:180::-;13571:77;13568:1;13561:88;13668:4;13665:1;13658:15;13692:4;13689:1;13682:15;13709:320;13753:6;13790:1;13784:4;13780:12;13770:22;;13837:1;13831:4;13827:12;13858:18;13848:81;;13914:4;13906:6;13902:17;13892:27;;13848:81;13976:2;13968:6;13965:14;13945:18;13942:38;13939:84;;;13995:18;;:::i;:::-;13939:84;13760:269;13709:320;;;:::o;14035:182::-;14175:34;14171:1;14163:6;14159:14;14152:58;14035:182;:::o;14223:366::-;14365:3;14386:67;14450:2;14445:3;14386:67;:::i;:::-;14379:74;;14462:93;14551:3;14462:93;:::i;:::-;14580:2;14575:3;14571:12;14564:19;;14223:366;;;:::o;14595:419::-;14761:4;14799:2;14788:9;14784:18;14776:26;;14848:9;14842:4;14838:20;14834:1;14823:9;14819:17;14812:47;14876:131;15002:4;14876:131;:::i;:::-;14868:139;;14595:419;;;:::o;15020:180::-;15068:77;15065:1;15058:88;15165:4;15162:1;15155:15;15189:4;15186:1;15179:15;15206:180;15254:77;15251:1;15244:88;15351:4;15348:1;15341:15;15375:4;15372:1;15365:15;15392:233;15431:3;15454:24;15472:5;15454:24;:::i;:::-;15445:33;;15500:66;15493:5;15490:77;15487:103;;;15570:18;;:::i;:::-;15487:103;15617:1;15610:5;15606:13;15599:20;;15392:233;;;:::o;15631:178::-;15771:30;15767:1;15759:6;15755:14;15748:54;15631:178;:::o;15815:366::-;15957:3;15978:67;16042:2;16037:3;15978:67;:::i;:::-;15971:74;;16054:93;16143:3;16054:93;:::i;:::-;16172:2;16167:3;16163:12;16156:19;;15815:366;;;:::o;16187:419::-;16353:4;16391:2;16380:9;16376:18;16368:26;;16440:9;16434:4;16430:20;16426:1;16415:9;16411:17;16404:47;16468:131;16594:4;16468:131;:::i;:::-;16460:139;;16187:419;;;:::o;16612:305::-;16652:3;16671:20;16689:1;16671:20;:::i;:::-;16666:25;;16705:20;16723:1;16705:20;:::i;:::-;16700:25;;16859:1;16791:66;16787:74;16784:1;16781:81;16778:107;;;16865:18;;:::i;:::-;16778:107;16909:1;16906;16902:9;16895:16;;16612:305;;;;:::o;16923:348::-;16963:7;16986:20;17004:1;16986:20;:::i;:::-;16981:25;;17020:20;17038:1;17020:20;:::i;:::-;17015:25;;17208:1;17140:66;17136:74;17133:1;17130:81;17125:1;17118:9;17111:17;17107:105;17104:131;;;17215:18;;:::i;:::-;17104:131;17263:1;17260;17256:9;17245:20;;16923:348;;;;:::o;17277:181::-;17417:33;17413:1;17405:6;17401:14;17394:57;17277:181;:::o;17464:366::-;17606:3;17627:67;17691:2;17686:3;17627:67;:::i;:::-;17620:74;;17703:93;17792:3;17703:93;:::i;:::-;17821:2;17816:3;17812:12;17805:19;;17464:366;;;:::o;17836:419::-;18002:4;18040:2;18029:9;18025:18;18017:26;;18089:9;18083:4;18079:20;18075:1;18064:9;18060:17;18053:47;18117:131;18243:4;18117:131;:::i;:::-;18109:139;;17836:419;;;:::o;18261:169::-;18401:21;18397:1;18389:6;18385:14;18378:45;18261:169;:::o;18436:366::-;18578:3;18599:67;18663:2;18658:3;18599:67;:::i;:::-;18592:74;;18675:93;18764:3;18675:93;:::i;:::-;18793:2;18788:3;18784:12;18777:19;;18436:366;;;:::o;18808:419::-;18974:4;19012:2;19001:9;18997:18;18989:26;;19061:9;19055:4;19051:20;19047:1;19036:9;19032:17;19025:47;19089:131;19215:4;19089:131;:::i;:::-;19081:139;;18808:419;;;:::o;19233:147::-;19334:11;19371:3;19356:18;;19233:147;;;;:::o;19386:114::-;;:::o;19506:398::-;19665:3;19686:83;19767:1;19762:3;19686:83;:::i;:::-;19679:90;;19778:93;19867:3;19778:93;:::i;:::-;19896:1;19891:3;19887:11;19880:18;;19506:398;;;:::o;19910:379::-;20094:3;20116:147;20259:3;20116:147;:::i;:::-;20109:154;;20280:3;20273:10;;19910:379;;;:::o;20295:166::-;20435:18;20431:1;20423:6;20419:14;20412:42;20295:166;:::o;20467:366::-;20609:3;20630:67;20694:2;20689:3;20630:67;:::i;:::-;20623:74;;20706:93;20795:3;20706:93;:::i;:::-;20824:2;20819:3;20815:12;20808:19;;20467:366;;;:::o;20839:419::-;21005:4;21043:2;21032:9;21028:18;21020:26;;21092:9;21086:4;21082:20;21078:1;21067:9;21063:17;21056:47;21120:131;21246:4;21120:131;:::i;:::-;21112:139;;20839:419;;;:::o;21264:191::-;21304:4;21324:20;21342:1;21324:20;:::i;:::-;21319:25;;21358:20;21376:1;21358:20;:::i;:::-;21353:25;;21397:1;21394;21391:8;21388:34;;;21402:18;;:::i;:::-;21388:34;21447:1;21444;21440:9;21432:17;;21264:191;;;;:::o;21461:148::-;21563:11;21600:3;21585:18;;21461:148;;;;:::o;21615:377::-;21721:3;21749:39;21782:5;21749:39;:::i;:::-;21804:89;21886:6;21881:3;21804:89;:::i;:::-;21797:96;;21902:52;21947:6;21942:3;21935:4;21928:5;21924:16;21902:52;:::i;:::-;21979:6;21974:3;21970:16;21963:23;;21725:267;21615:377;;;;:::o;21998:435::-;22178:3;22200:95;22291:3;22282:6;22200:95;:::i;:::-;22193:102;;22312:95;22403:3;22394:6;22312:95;:::i;:::-;22305:102;;22424:3;22417:10;;21998:435;;;;;:::o;22439:225::-;22579:34;22575:1;22567:6;22563:14;22556:58;22648:8;22643:2;22635:6;22631:15;22624:33;22439:225;:::o;22670:366::-;22812:3;22833:67;22897:2;22892:3;22833:67;:::i;:::-;22826:74;;22909:93;22998:3;22909:93;:::i;:::-;23027:2;23022:3;23018:12;23011:19;;22670:366;;;:::o;23042:419::-;23208:4;23246:2;23235:9;23231:18;23223:26;;23295:9;23289:4;23285:20;23281:1;23270:9;23266:17;23259:47;23323:131;23449:4;23323:131;:::i;:::-;23315:139;;23042:419;;;:::o;23467:167::-;23607:19;23603:1;23595:6;23591:14;23584:43;23467:167;:::o;23640:366::-;23782:3;23803:67;23867:2;23862:3;23803:67;:::i;:::-;23796:74;;23879:93;23968:3;23879:93;:::i;:::-;23997:2;23992:3;23988:12;23981:19;;23640:366;;;:::o;24012:419::-;24178:4;24216:2;24205:9;24201:18;24193:26;;24265:9;24259:4;24255:20;24251:1;24240:9;24236:17;24229:47;24293:131;24419:4;24293:131;:::i;:::-;24285:139;;24012:419;;;:::o;24437:169::-;24577:21;24573:1;24565:6;24561:14;24554:45;24437:169;:::o;24612:366::-;24754:3;24775:67;24839:2;24834:3;24775:67;:::i;:::-;24768:74;;24851:93;24940:3;24851:93;:::i;:::-;24969:2;24964:3;24960:12;24953:19;;24612:366;;;:::o;24984:419::-;25150:4;25188:2;25177:9;25173:18;25165:26;;25237:9;25231:4;25227:20;25223:1;25212:9;25208:17;25201:47;25265:131;25391:4;25265:131;:::i;:::-;25257:139;;24984:419;;;:::o;25409:181::-;25549:33;25545:1;25537:6;25533:14;25526:57;25409:181;:::o;25596:366::-;25738:3;25759:67;25823:2;25818:3;25759:67;:::i;:::-;25752:74;;25835:93;25924:3;25835:93;:::i;:::-;25953:2;25948:3;25944:12;25937:19;;25596:366;;;:::o;25968:419::-;26134:4;26172:2;26161:9;26157:18;26149:26;;26221:9;26215:4;26211:20;26207:1;26196:9;26192:17;26185:47;26249:131;26375:4;26249:131;:::i;:::-;26241:139;;25968:419;;;:::o;26393:180::-;26533:32;26529:1;26521:6;26517:14;26510:56;26393:180;:::o;26579:366::-;26721:3;26742:67;26806:2;26801:3;26742:67;:::i;:::-;26735:74;;26818:93;26907:3;26818:93;:::i;:::-;26936:2;26931:3;26927:12;26920:19;;26579:366;;;:::o;26951:419::-;27117:4;27155:2;27144:9;27140:18;27132:26;;27204:9;27198:4;27194:20;27190:1;27179:9;27175:17;27168:47;27232:131;27358:4;27232:131;:::i;:::-;27224:139;;26951:419;;;:::o;27376:248::-;27516:34;27512:1;27504:6;27500:14;27493:58;27585:31;27580:2;27572:6;27568:15;27561:56;27376:248;:::o;27630:366::-;27772:3;27793:67;27857:2;27852:3;27793:67;:::i;:::-;27786:74;;27869:93;27958:3;27869:93;:::i;:::-;27987:2;27982:3;27978:12;27971:19;;27630:366;;;:::o;28002:419::-;28168:4;28206:2;28195:9;28191:18;28183:26;;28255:9;28249:4;28245:20;28241:1;28230:9;28226:17;28219:47;28283:131;28409:4;28283:131;:::i;:::-;28275:139;;28002:419;;;:::o;28427:178::-;28567:30;28563:1;28555:6;28551:14;28544:54;28427:178;:::o;28611:366::-;28753:3;28774:67;28838:2;28833:3;28774:67;:::i;:::-;28767:74;;28850:93;28939:3;28850:93;:::i;:::-;28968:2;28963:3;28959:12;28952:19;;28611:366;;;:::o;28983:419::-;29149:4;29187:2;29176:9;29172:18;29164:26;;29236:9;29230:4;29226:20;29222:1;29211:9;29207:17;29200:47;29264:131;29390:4;29264:131;:::i;:::-;29256:139;;28983:419;;;:::o;29408:178::-;29548:30;29544:1;29536:6;29532:14;29525:54;29408:178;:::o;29592:366::-;29734:3;29755:67;29819:2;29814:3;29755:67;:::i;:::-;29748:74;;29831:93;29920:3;29831:93;:::i;:::-;29949:2;29944:3;29940:12;29933:19;;29592:366;;;:::o;29964:419::-;30130:4;30168:2;30157:9;30153:18;30145:26;;30217:9;30211:4;30207:20;30203:1;30192:9;30188:17;30181:47;30245:131;30371:4;30245:131;:::i;:::-;30237:139;;29964:419;;;:::o;30389:174::-;30529:26;30525:1;30517:6;30513:14;30506:50;30389:174;:::o;30569:366::-;30711:3;30732:67;30796:2;30791:3;30732:67;:::i;:::-;30725:74;;30808:93;30897:3;30808:93;:::i;:::-;30926:2;30921:3;30917:12;30910:19;;30569:366;;;:::o;30941:419::-;31107:4;31145:2;31134:9;31130:18;31122:26;;31194:9;31188:4;31184:20;31180:1;31169:9;31165:17;31158:47;31222:131;31348:4;31222:131;:::i;:::-;31214:139;;30941:419;;;:::o;31366:98::-;31417:6;31451:5;31445:12;31435:22;;31366:98;;;:::o;31470:168::-;31553:11;31587:6;31582:3;31575:19;31627:4;31622:3;31618:14;31603:29;;31470:168;;;;:::o;31644:360::-;31730:3;31758:38;31790:5;31758:38;:::i;:::-;31812:70;31875:6;31870:3;31812:70;:::i;:::-;31805:77;;31891:52;31936:6;31931:3;31924:4;31917:5;31913:16;31891:52;:::i;:::-;31968:29;31990:6;31968:29;:::i;:::-;31963:3;31959:39;31952:46;;31734:270;31644:360;;;;:::o;32010:640::-;32205:4;32243:3;32232:9;32228:19;32220:27;;32257:71;32325:1;32314:9;32310:17;32301:6;32257:71;:::i;:::-;32338:72;32406:2;32395:9;32391:18;32382:6;32338:72;:::i;:::-;32420;32488:2;32477:9;32473:18;32464:6;32420:72;:::i;:::-;32539:9;32533:4;32529:20;32524:2;32513:9;32509:18;32502:48;32567:76;32638:4;32629:6;32567:76;:::i;:::-;32559:84;;32010:640;;;;;;;:::o;32656:141::-;32712:5;32743:6;32737:13;32728:22;;32759:32;32785:5;32759:32;:::i;:::-;32656:141;;;;:::o;32803:349::-;32872:6;32921:2;32909:9;32900:7;32896:23;32892:32;32889:119;;;32927:79;;:::i;:::-;32889:119;33047:1;33072:63;33127:7;33118:6;33107:9;33103:22;33072:63;:::i;:::-;33062:73;;33018:127;32803:349;;;;:::o;33158:180::-;33206:77;33203:1;33196:88;33303:4;33300:1;33293:15;33327:4;33324:1;33317:15;33344:185;33384:1;33401:20;33419:1;33401:20;:::i;:::-;33396:25;;33435:20;33453:1;33435:20;:::i;:::-;33430:25;;33474:1;33464:35;;33479:18;;:::i;:::-;33464:35;33521:1;33518;33514:9;33509:14;;33344:185;;;;:::o;33535:176::-;33567:1;33584:20;33602:1;33584:20;:::i;:::-;33579:25;;33618:20;33636:1;33618:20;:::i;:::-;33613:25;;33657:1;33647:35;;33662:18;;:::i;:::-;33647:35;33703:1;33700;33696:9;33691:14;;33535:176;;;;:::o

Swarm Source

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