ETH Price: $3,285.74 (-0.93%)

Token

DIGITZ (DIGITZ)
 

Overview

Max Total Supply

2,182 DIGITZ

Holders

772

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DIGITZ
0x67b9A49baB1aEd81B54bE26b6A335325f492bb86
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

MINTING IS NOW LIVE: https://digitznft.com The Digitz Genesis collection features 3,333 1/1 NFTs that reward holders through our innovative bounty system and give initial minters lifetime access to digitz alpha and exclusive artist drops.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Digitz

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-18
*/

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.4;

/*
________  .___  ________
\______ \ |   |/  _____/
 |    |  \|   /   \  ___
 |    `   \   \    \_\  \
/_______  /___|\______  /
        \/            \/
.________________________
|   \__    ___/\____    /
|   | |    |     /     /
|   | |    |    /     /_
|___| |____|   /_______ \
                       \/
                                        By Dylan Massoud and Arthur Wolfe.
*/


contract Digitz is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;
    uint256 public constant DIGITZ_PRIVATE = 9999;
    uint256 public constant DIGITZ_MAX =  9999;
    uint256 public constant DIGITZ_PRICE = 0.069 ether;
    uint256 public constant DIGITZ_PER_PUBLIC_MINT = 10;
    mapping(address => uint256) public presalerListPurchases;
    string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/QmNNmN2JGayxRk3hwEWw5gMCUyfmikgosrAQuCWnc9tDdN/";
    string private constant Sig_WORD = "private";
    address private _signerAddress = 0x956231B802D9494296acdE7B3Ce3890c8b0438b8;
    address private a1 = 0x5799f96991DeDECD1200ddFbe5197f64725a24c7;
    uint256 public privateAmountMinted;
    uint256 public presalePurchaseLimit = 10;
    bool public presaleLive;
    bool public saleLive;
    bool public locked;

    constructor() ERC721("DIGITZ", "DIGITZ") {}

    modifier notLocked {
        require(!locked, "Contract metadata methods are locked");
        _;
    }


    function matchAddresSigner(bytes memory signature) private view returns(bool) {
         bytes32 hash = keccak256(abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(msg.sender, Sig_WORD)))
          );
        return _signerAddress == hash.recover(signature);
    }

    function founderMint(uint256 tokenQuantity) external onlyOwner {
        require(totalSupply() + tokenQuantity <= DIGITZ_MAX, "EXCEED_MAX");
        for(uint256 i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function gift(address[] calldata receivers) external onlyOwner {
        require(totalSupply() + receivers.length <= DIGITZ_MAX, "EXCEED_MAX");
        for (uint256 i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], totalSupply() + 1);
        }
    }

    function buy(uint256 tokenQuantity) external payable {
        require(saleLive, "SALE_CLOSED");
        require(!presaleLive, "ONLY_PRESALE");
        require(totalSupply() + tokenQuantity <= DIGITZ_MAX, "EXCEED_MAX");
        require(tokenQuantity <= DIGITZ_PER_PUBLIC_MINT, "EXCEED_DIGITZ_PER_PUBLIC_MINT");
        require(DIGITZ_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        for(uint256 i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function presaleBuy(bytes memory signature, uint256 tokenQuantity) external payable {
        require(!saleLive && presaleLive, "PRESALE_CLOSED");
        require(matchAddresSigner(signature), "DIRECT_MINT_DISALLOWED");
        require(privateAmountMinted + tokenQuantity <= DIGITZ_PRIVATE, "EXCEED_PRIVATE");
        require(presalerListPurchases[msg.sender] + tokenQuantity <= presalePurchaseLimit, "EXCEED_ALLOC");
        require(DIGITZ_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        for(uint256 i = 0; i < tokenQuantity; i++) {
            privateAmountMinted++;
            presalerListPurchases[msg.sender]++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function withdraw() external {
        uint256 balance = address(this).balance;
        require(balance > 0);
        payable(a1).transfer(address(this).balance);
    }

    function presalePurchasedCount(address addr) external view returns (uint256) {
        return presalerListPurchases[addr];
    }

    function lockMetadata() external onlyOwner {
        locked = true;
    }

    function togglePresaleStatus() external onlyOwner {
        presaleLive = !presaleLive;
    }

    function toggleSaleStatus() external onlyOwner {
        saleLive = !saleLive;
    }

    function setSignerAddress(address addr) external onlyOwner {
        _signerAddress = addr;
    }

    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");

        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DIGITZ_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIGITZ_PER_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIGITZ_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIGITZ_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"founderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","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":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","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":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280605181526020016200580b60519139600c90805190602001906200003592919062000287565b5073956231b802d9494296acde7b3ce3890c8b0438b8600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735799f96991dedecd1200ddfbe5197f64725a24c7600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a601055348015620000f257600080fd5b506040518060400160405280600681526020017f44494749545a00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f44494749545a000000000000000000000000000000000000000000000000000081525081600090805190602001906200017792919062000287565b5080600190805190602001906200019092919062000287565b505050620001b3620001a7620001b960201b60201c565b620001c160201b60201c565b6200039c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002959062000337565b90600052602060002090601f016020900481019282620002b9576000855562000305565b82601f10620002d457805160ff191683800117855562000305565b8280016001018555821562000305579182015b8281111562000304578251825591602001919060010190620002e7565b5b50905062000314919062000318565b5090565b5b808211156200033357600081600090555060010162000319565b5090565b600060028204905060018216806200035057607f821691505b602082108114156200036757620003666200036d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61545f80620003ac6000396000f3fe60806040526004361061023b5760003560e01c80636352211e1161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610840578063f2fde38b1461087d578063f42202e8146108a6578063f4743070146108cf578063fd917b07146108fa5761023b565b8063b88d4fde14610768578063c87b56dd14610791578063cf309012146107ce578063d96a094a146107f9578063e081b781146108155761023b565b80638da5cb5b116100f25780638da5cb5b1461069557806395d89b41146106c0578063989bdbb6146106eb5780639bf8031614610702578063a22cb4651461073f5761023b565b80636352211e146105c257806370a08231146105ff578063715018a61461063c5780637bffb4ce1461065357806383a9e0491461066a5761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104db57806359a12ad5146105045780635b0978281461052f5780635cdb15a01461055a5780635ce7af1f146105855761023b565b80633ccfd60b1461040857806342842e0e1461041f5780634dc95c93146104485780634f6ccce714610473578063527716f6146104b05761023b565b8063095ea7b311610203578063095ea7b314610325578063163e1e611461034e57806318160ddd1461037757806323b872dd146103a25780632f745c59146103cb5761023b565b806301ffc9a714610240578063046dc1661461027d578063049c5c49146102a657806306fdde03146102bd578063081812fc146102e8575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613b07565b610916565b6040516102749190614312565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f919061391b565b610990565b005b3480156102b257600080fd5b506102bb610a50565b005b3480156102c957600080fd5b506102d2610af8565b6040516102df9190614372565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a9190613bf2565b610b8a565b60405161031c91906142ab565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190613a86565b610c0f565b005b34801561035a57600080fd5b5061037560048036038101906103709190613ac2565b610d27565b005b34801561038357600080fd5b5061038c610e8d565b6040516103999190614794565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190613980565b610e9a565b005b3480156103d757600080fd5b506103f260048036038101906103ed9190613a86565b610efa565b6040516103ff9190614794565b60405180910390f35b34801561041457600080fd5b5061041d610f9f565b005b34801561042b57600080fd5b5061044660048036038101906104419190613980565b61101d565b005b34801561045457600080fd5b5061045d61103d565b60405161046a9190614794565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190613bf2565b611043565b6040516104a79190614794565b60405180910390f35b3480156104bc57600080fd5b506104c56110da565b6040516104d29190614794565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190613bad565b6110df565b005b34801561051057600080fd5b506105196111c1565b6040516105269190614794565b60405180910390f35b34801561053b57600080fd5b506105446111c7565b6040516105519190614794565b60405180910390f35b34801561056657600080fd5b5061056f6111cd565b60405161057c9190614794565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a7919061391b565b6111d8565b6040516105b99190614794565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190613bf2565b611221565b6040516105f691906142ab565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061391b565b6112d3565b6040516106339190614794565b60405180910390f35b34801561064857600080fd5b5061065161138b565b005b34801561065f57600080fd5b50610668611413565b005b34801561067657600080fd5b5061067f6114bb565b60405161068c9190614312565b60405180910390f35b3480156106a157600080fd5b506106aa6114ce565b6040516106b791906142ab565b60405180910390f35b3480156106cc57600080fd5b506106d56114f8565b6040516106e29190614372565b60405180910390f35b3480156106f757600080fd5b5061070061158a565b005b34801561070e57600080fd5b506107296004803603810190610724919061391b565b611623565b6040516107369190614794565b60405180910390f35b34801561074b57600080fd5b5061076660048036038101906107619190613a4a565b61163b565b005b34801561077457600080fd5b5061078f600480360381019061078a91906139cf565b6117bc565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613bf2565b61181e565b6040516107c59190614372565b60405180910390f35b3480156107da57600080fd5b506107e361189a565b6040516107f09190614312565b60405180910390f35b610813600480360381019061080e9190613bf2565b6118ad565b005b34801561082157600080fd5b5061082a611a7b565b6040516108379190614312565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613944565b611a8e565b6040516108749190614312565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f919061391b565b611b22565b005b3480156108b257600080fd5b506108cd60048036038101906108c89190613bf2565b611c1a565b005b3480156108db57600080fd5b506108e4611d2c565b6040516108f19190614794565b60405180910390f35b610914600480360381019061090f9190613b59565b611d32565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610989575061098882611fc5565b5b9050919050565b6109986120a7565b73ffffffffffffffffffffffffffffffffffffffff166109b66114ce565b73ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390614634565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a586120a7565b73ffffffffffffffffffffffffffffffffffffffff16610a766114ce565b73ffffffffffffffffffffffffffffffffffffffff1614610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390614634565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b606060008054610b0790614a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3390614a3f565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b95826120af565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614614565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1a82611221565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c82906146b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610caa6120a7565b73ffffffffffffffffffffffffffffffffffffffff161480610cd95750610cd881610cd36120a7565b611a8e565b5b610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90614554565b60405180910390fd5b610d22838361211b565b505050565b610d2f6120a7565b73ffffffffffffffffffffffffffffffffffffffff16610d4d6114ce565b73ffffffffffffffffffffffffffffffffffffffff1614610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90614634565b60405180910390fd5b61270f82829050610db2610e8d565b610dbc919061485d565b1115610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df4906146d4565b60405180910390fd5b60005b82829050811015610e8857610e75838383818110610e47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610e5c919061391b565b6001610e66610e8d565b610e70919061485d565b6121d4565b8080610e8090614aa2565b915050610e00565b505050565b6000600880549050905090565b610eab610ea56120a7565b826121f2565b610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee1906146f4565b60405180910390fd5b610ef58383836122d0565b505050565b6000610f05836112d3565b8210610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90614414565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600047905060008111610fb157600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611019573d6000803e3d6000fd5b5050565b611038838383604051806020016040528060008152506117bc565b505050565b61270f81565b600061104d610e8d565b821061108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590614714565b60405180910390fd5b600882815481106110c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600a81565b6110e76120a7565b73ffffffffffffffffffffffffffffffffffffffff166111056114ce565b73ffffffffffffffffffffffffffffffffffffffff161461115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290614634565b60405180910390fd5b601160029054906101000a900460ff16156111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290614674565b60405180910390fd5b8181600c91906111bc929190613713565b505050565b600f5481565b61270f81565b66f523226980800081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190614594565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90614574565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113936120a7565b73ffffffffffffffffffffffffffffffffffffffff166113b16114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90614634565b60405180910390fd5b611411600061252c565b565b61141b6120a7565b73ffffffffffffffffffffffffffffffffffffffff166114396114ce565b73ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690614634565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b601160009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461150790614a3f565b80601f016020809104026020016040519081016040528092919081815260200182805461153390614a3f565b80156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b5050505050905090565b6115926120a7565b73ffffffffffffffffffffffffffffffffffffffff166115b06114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90614634565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b600b6020528060005260406000206000915090505481565b6116436120a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a8906144b4565b60405180910390fd5b80600560006116be6120a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661176b6120a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117b09190614312565b60405180910390a35050565b6117cd6117c76120a7565b836121f2565b61180c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611803906146f4565b60405180910390fd5b611818848484846125f2565b50505050565b6060611829826120af565b611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f90614694565b60405180910390fd5b600c6118738361264e565b604051602001611884929190614261565b6040516020818303038152906040529050919050565b601160029054906101000a900460ff1681565b601160019054906101000a900460ff166118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906144f4565b60405180910390fd5b601160009054906101000a900460ff161561194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390614534565b60405180910390fd5b61270f81611958610e8d565b611962919061485d565b11156119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a906146d4565b60405180910390fd5b600a8111156119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de906145b4565b60405180910390fd5b348166f52322698080006119fb91906148e4565b1115611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3390614774565b60405180910390fd5b60005b81811015611a7757611a64336001611a55610e8d565b611a5f919061485d565b6121d4565b8080611a6f90614aa2565b915050611a3f565b5050565b601160019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b2a6120a7565b73ffffffffffffffffffffffffffffffffffffffff16611b486114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590614634565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0590614454565b60405180910390fd5b611c178161252c565b50565b611c226120a7565b73ffffffffffffffffffffffffffffffffffffffff16611c406114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90614634565b60405180910390fd5b61270f81611ca2610e8d565b611cac919061485d565b1115611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce4906146d4565b60405180910390fd5b60005b81811015611d2857611d15336001611d06610e8d565b611d10919061485d565b6121d4565b8080611d2090614aa2565b915050611cf0565b5050565b60105481565b601160019054906101000a900460ff16158015611d5b5750601160009054906101000a900460ff165b611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d91906143b4565b60405180910390fd5b611da3826127fb565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906143d4565b60405180910390fd5b61270f81600f54611df3919061485d565b1115611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90614734565b60405180910390fd5b60105481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e82919061485d565b1115611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614754565b60405180910390fd5b348166f5232269808000611ed791906148e4565b1115611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90614774565b60405180910390fd5b60005b81811015611fc057600f6000815480929190611f3690614aa2565b9190505550600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611f8b90614aa2565b9190505550611fad336001611f9e610e8d565b611fa8919061485d565b6121d4565b8080611fb890614aa2565b915050611f1b565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a0575061209f826128ef565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661218e83611221565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6121ee828260405180602001604052806000815250612959565b5050565b60006121fd826120af565b61223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390614514565b60405180910390fd5b600061224783611221565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122b657508373ffffffffffffffffffffffffffffffffffffffff1661229e84610b8a565b73ffffffffffffffffffffffffffffffffffffffff16145b806122c757506122c68185611a8e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122f082611221565b73ffffffffffffffffffffffffffffffffffffffff1614612346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d90614654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614494565b60405180910390fd5b6123c18383836129b4565b6123cc60008261211b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241c919061493e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612473919061485d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125fd8484846122d0565b61260984848484612ac8565b612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90614434565b60405180910390fd5b50505050565b60606000821415612696576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f6565b600082905060005b600082146126c85780806126b190614aa2565b915050600a826126c191906148b3565b915061269e565b60008167ffffffffffffffff81111561270a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561273c5781602001600182028036833780820191505090505b5090505b600085146127ef57600182612755919061493e565b9150600a856127649190614b19565b6030612770919061485d565b60f81b8183815181106127ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e891906148b3565b9450612740565b8093505050505b919050565b600080336040518060400160405280600781526020017f7072697661746500000000000000000000000000000000000000000000000000815250604051602001612846929190614239565b6040516020818303038152906040528051906020012060405160200161286c9190614285565b6040516020818303038152906040528051906020012090506128978382612c5f90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129638383612c86565b6129706000848484612ac8565b6129af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a690614434565b60405180910390fd5b505050565b6129bf838383612e54565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a02576129fd81612e59565b612a41565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4057612a3f8382612ea2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8457612a7f8161300f565b612ac3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ac257612ac18282613152565b5b5b505050565b6000612ae98473ffffffffffffffffffffffffffffffffffffffff166131d1565b15612c52578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b126120a7565b8786866040518563ffffffff1660e01b8152600401612b3494939291906142c6565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7f57506040513d601f19601f82011682018060405250810190612b7c9190613b30565b60015b612c02573d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b50600081511415612bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf190614434565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c57565b600190505b949350505050565b6000806000612c6e85856131e4565b91509150612c7b81613267565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced906145f4565b60405180910390fd5b612cff816120af565b15612d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3690614474565b60405180910390fd5b612d4b600083836129b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9b919061485d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612eaf846112d3565b612eb9919061493e565b9050600060076000848152602001908152602001600020549050818114612f9e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613023919061493e565b9050600060096000848152602001908152602001600020549050600060088381548110613079577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106130c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613136577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061315d836112d3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156132265760008060006020860151925060408601519150606086015160001a905061321a878285856135b8565b94509450505050613260565b60408351141561325757600080602085015191506040850151905061324c8683836136c5565b935093505050613260565b60006002915091505b9250929050565b600060048111156132a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156132da577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156132e5576135b5565b6001600481111561331f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613358577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339090614394565b60405180910390fd5b600260048111156133d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561340c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561344d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613444906143f4565b60405180910390fd5b60036004811115613487577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156134c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f8906144d4565b60405180910390fd5b60048081111561353a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613573577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156135b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ab906145d4565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156135f35760006003915091506136bc565b601b8560ff161415801561360b5750601c8560ff1614155b1561361d5760006004915091506136bc565b600060018787878760405160008152602001604052604051613642949392919061432d565b6020604051602081039080840390855afa158015613664573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156136b3576000600192509250506136bc565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613705878288856135b8565b935093505050935093915050565b82805461371f90614a3f565b90600052602060002090601f0160209004810192826137415760008555613788565b82601f1061375a57803560ff1916838001178555613788565b82800160010185558215613788579182015b8281111561378757823582559160200191906001019061376c565b5b5090506137959190613799565b5090565b5b808211156137b257600081600090555060010161379a565b5090565b60006137c96137c4846147d4565b6147af565b9050828152602081018484840111156137e157600080fd5b6137ec8482856149fd565b509392505050565b600081359050613803816153cd565b92915050565b60008083601f84011261381b57600080fd5b8235905067ffffffffffffffff81111561383457600080fd5b60208301915083602082028301111561384c57600080fd5b9250929050565b600081359050613862816153e4565b92915050565b600081359050613877816153fb565b92915050565b60008151905061388c816153fb565b92915050565b600082601f8301126138a357600080fd5b81356138b38482602086016137b6565b91505092915050565b60008083601f8401126138ce57600080fd5b8235905067ffffffffffffffff8111156138e757600080fd5b6020830191508360018202830111156138ff57600080fd5b9250929050565b60008135905061391581615412565b92915050565b60006020828403121561392d57600080fd5b600061393b848285016137f4565b91505092915050565b6000806040838503121561395757600080fd5b6000613965858286016137f4565b9250506020613976858286016137f4565b9150509250929050565b60008060006060848603121561399557600080fd5b60006139a3868287016137f4565b93505060206139b4868287016137f4565b92505060406139c586828701613906565b9150509250925092565b600080600080608085870312156139e557600080fd5b60006139f3878288016137f4565b9450506020613a04878288016137f4565b9350506040613a1587828801613906565b925050606085013567ffffffffffffffff811115613a3257600080fd5b613a3e87828801613892565b91505092959194509250565b60008060408385031215613a5d57600080fd5b6000613a6b858286016137f4565b9250506020613a7c85828601613853565b9150509250929050565b60008060408385031215613a9957600080fd5b6000613aa7858286016137f4565b9250506020613ab885828601613906565b9150509250929050565b60008060208385031215613ad557600080fd5b600083013567ffffffffffffffff811115613aef57600080fd5b613afb85828601613809565b92509250509250929050565b600060208284031215613b1957600080fd5b6000613b2784828501613868565b91505092915050565b600060208284031215613b4257600080fd5b6000613b508482850161387d565b91505092915050565b60008060408385031215613b6c57600080fd5b600083013567ffffffffffffffff811115613b8657600080fd5b613b9285828601613892565b9250506020613ba385828601613906565b9150509250929050565b60008060208385031215613bc057600080fd5b600083013567ffffffffffffffff811115613bda57600080fd5b613be6858286016138bc565b92509250509250929050565b600060208284031215613c0457600080fd5b6000613c1284828501613906565b91505092915050565b613c2481614972565b82525050565b613c3b613c3682614972565b614aeb565b82525050565b613c4a81614984565b82525050565b613c5981614990565b82525050565b613c70613c6b82614990565b614afd565b82525050565b6000613c818261481a565b613c8b8185614830565b9350613c9b818560208601614a0c565b613ca481614c06565b840191505092915050565b6000613cba82614825565b613cc48185614841565b9350613cd4818560208601614a0c565b613cdd81614c06565b840191505092915050565b6000613cf382614825565b613cfd8185614852565b9350613d0d818560208601614a0c565b80840191505092915050565b60008154613d2681614a3f565b613d308186614852565b94506001821660008114613d4b5760018114613d5c57613d8f565b60ff19831686528186019350613d8f565b613d6585614805565b60005b83811015613d8757815481890152600182019150602081019050613d68565b838801955050505b50505092915050565b6000613da5601883614841565b9150613db082614c24565b602082019050919050565b6000613dc8600e83614841565b9150613dd382614c4d565b602082019050919050565b6000613deb601683614841565b9150613df682614c76565b602082019050919050565b6000613e0e601f83614841565b9150613e1982614c9f565b602082019050919050565b6000613e31601c83614852565b9150613e3c82614cc8565b601c82019050919050565b6000613e54602b83614841565b9150613e5f82614cf1565b604082019050919050565b6000613e77603283614841565b9150613e8282614d40565b604082019050919050565b6000613e9a602683614841565b9150613ea582614d8f565b604082019050919050565b6000613ebd601c83614841565b9150613ec882614dde565b602082019050919050565b6000613ee0602483614841565b9150613eeb82614e07565b604082019050919050565b6000613f03601983614841565b9150613f0e82614e56565b602082019050919050565b6000613f26602283614841565b9150613f3182614e7f565b604082019050919050565b6000613f49600b83614841565b9150613f5482614ece565b602082019050919050565b6000613f6c602c83614841565b9150613f7782614ef7565b604082019050919050565b6000613f8f600c83614841565b9150613f9a82614f46565b602082019050919050565b6000613fb2603883614841565b9150613fbd82614f6f565b604082019050919050565b6000613fd5602a83614841565b9150613fe082614fbe565b604082019050919050565b6000613ff8602983614841565b91506140038261500d565b604082019050919050565b600061401b601d83614841565b91506140268261505c565b602082019050919050565b600061403e602283614841565b915061404982615085565b604082019050919050565b6000614061602083614841565b915061406c826150d4565b602082019050919050565b6000614084602c83614841565b915061408f826150fd565b604082019050919050565b60006140a7602083614841565b91506140b28261514c565b602082019050919050565b60006140ca602983614841565b91506140d582615175565b604082019050919050565b60006140ed602483614841565b91506140f8826151c4565b604082019050919050565b6000614110601f83614841565b915061411b82615213565b602082019050919050565b6000614133602183614841565b915061413e8261523c565b604082019050919050565b6000614156600a83614841565b91506141618261528b565b602082019050919050565b6000614179603183614841565b9150614184826152b4565b604082019050919050565b600061419c602c83614841565b91506141a782615303565b604082019050919050565b60006141bf600e83614841565b91506141ca82615352565b602082019050919050565b60006141e2600c83614841565b91506141ed8261537b565b602082019050919050565b6000614205601083614841565b9150614210826153a4565b602082019050919050565b614224816149e6565b82525050565b614233816149f0565b82525050565b60006142458285613c2a565b6014820191506142558284613ce8565b91508190509392505050565b600061426d8285613d19565b91506142798284613ce8565b91508190509392505050565b600061429082613e24565b915061429c8284613c5f565b60208201915081905092915050565b60006020820190506142c06000830184613c1b565b92915050565b60006080820190506142db6000830187613c1b565b6142e86020830186613c1b565b6142f5604083018561421b565b81810360608301526143078184613c76565b905095945050505050565b60006020820190506143276000830184613c41565b92915050565b60006080820190506143426000830187613c50565b61434f602083018661422a565b61435c6040830185613c50565b6143696060830184613c50565b95945050505050565b6000602082019050818103600083015261438c8184613caf565b905092915050565b600060208201905081810360008301526143ad81613d98565b9050919050565b600060208201905081810360008301526143cd81613dbb565b9050919050565b600060208201905081810360008301526143ed81613dde565b9050919050565b6000602082019050818103600083015261440d81613e01565b9050919050565b6000602082019050818103600083015261442d81613e47565b9050919050565b6000602082019050818103600083015261444d81613e6a565b9050919050565b6000602082019050818103600083015261446d81613e8d565b9050919050565b6000602082019050818103600083015261448d81613eb0565b9050919050565b600060208201905081810360008301526144ad81613ed3565b9050919050565b600060208201905081810360008301526144cd81613ef6565b9050919050565b600060208201905081810360008301526144ed81613f19565b9050919050565b6000602082019050818103600083015261450d81613f3c565b9050919050565b6000602082019050818103600083015261452d81613f5f565b9050919050565b6000602082019050818103600083015261454d81613f82565b9050919050565b6000602082019050818103600083015261456d81613fa5565b9050919050565b6000602082019050818103600083015261458d81613fc8565b9050919050565b600060208201905081810360008301526145ad81613feb565b9050919050565b600060208201905081810360008301526145cd8161400e565b9050919050565b600060208201905081810360008301526145ed81614031565b9050919050565b6000602082019050818103600083015261460d81614054565b9050919050565b6000602082019050818103600083015261462d81614077565b9050919050565b6000602082019050818103600083015261464d8161409a565b9050919050565b6000602082019050818103600083015261466d816140bd565b9050919050565b6000602082019050818103600083015261468d816140e0565b9050919050565b600060208201905081810360008301526146ad81614103565b9050919050565b600060208201905081810360008301526146cd81614126565b9050919050565b600060208201905081810360008301526146ed81614149565b9050919050565b6000602082019050818103600083015261470d8161416c565b9050919050565b6000602082019050818103600083015261472d8161418f565b9050919050565b6000602082019050818103600083015261474d816141b2565b9050919050565b6000602082019050818103600083015261476d816141d5565b9050919050565b6000602082019050818103600083015261478d816141f8565b9050919050565b60006020820190506147a9600083018461421b565b92915050565b60006147b96147ca565b90506147c58282614a71565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ef576147ee614bd7565b5b6147f882614c06565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614868826149e6565b9150614873836149e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a8576148a7614b4a565b5b828201905092915050565b60006148be826149e6565b91506148c9836149e6565b9250826148d9576148d8614b79565b5b828204905092915050565b60006148ef826149e6565b91506148fa836149e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561493357614932614b4a565b5b828202905092915050565b6000614949826149e6565b9150614954836149e6565b92508282101561496757614966614b4a565b5b828203905092915050565b600061497d826149c6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614a2a578082015181840152602081019050614a0f565b83811115614a39576000848401525b50505050565b60006002820490506001821680614a5757607f821691505b60208210811415614a6b57614a6a614ba8565b5b50919050565b614a7a82614c06565b810181811067ffffffffffffffff82111715614a9957614a98614bd7565b5b80604052505050565b6000614aad826149e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ae057614adf614b4a565b5b600182019050919050565b6000614af682614b07565b9050919050565b6000819050919050565b6000614b1282614c17565b9050919050565b6000614b24826149e6565b9150614b2f836149e6565b925082614b3f57614b3e614b79565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f4e4c595f50524553414c450000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4558434545445f44494749545a5f5045525f5055424c49435f4d494e54000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b6153d681614972565b81146153e157600080fd5b50565b6153ed81614984565b81146153f857600080fd5b50565b6154048161499a565b811461540f57600080fd5b50565b61541b816149e6565b811461542657600080fd5b5056fea2646970667358221220b0f39b824021bb9bc272af6dd3ffd3501848b8b34b857a702c883adbffefc44f64736f6c6343000804003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e4e6d4e324a47617978526b33687745577735674d435579666d696b676f737241517543576e63397444644e2f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636352211e1161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610840578063f2fde38b1461087d578063f42202e8146108a6578063f4743070146108cf578063fd917b07146108fa5761023b565b8063b88d4fde14610768578063c87b56dd14610791578063cf309012146107ce578063d96a094a146107f9578063e081b781146108155761023b565b80638da5cb5b116100f25780638da5cb5b1461069557806395d89b41146106c0578063989bdbb6146106eb5780639bf8031614610702578063a22cb4651461073f5761023b565b80636352211e146105c257806370a08231146105ff578063715018a61461063c5780637bffb4ce1461065357806383a9e0491461066a5761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104db57806359a12ad5146105045780635b0978281461052f5780635cdb15a01461055a5780635ce7af1f146105855761023b565b80633ccfd60b1461040857806342842e0e1461041f5780634dc95c93146104485780634f6ccce714610473578063527716f6146104b05761023b565b8063095ea7b311610203578063095ea7b314610325578063163e1e611461034e57806318160ddd1461037757806323b872dd146103a25780632f745c59146103cb5761023b565b806301ffc9a714610240578063046dc1661461027d578063049c5c49146102a657806306fdde03146102bd578063081812fc146102e8575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613b07565b610916565b6040516102749190614312565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f919061391b565b610990565b005b3480156102b257600080fd5b506102bb610a50565b005b3480156102c957600080fd5b506102d2610af8565b6040516102df9190614372565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a9190613bf2565b610b8a565b60405161031c91906142ab565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190613a86565b610c0f565b005b34801561035a57600080fd5b5061037560048036038101906103709190613ac2565b610d27565b005b34801561038357600080fd5b5061038c610e8d565b6040516103999190614794565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190613980565b610e9a565b005b3480156103d757600080fd5b506103f260048036038101906103ed9190613a86565b610efa565b6040516103ff9190614794565b60405180910390f35b34801561041457600080fd5b5061041d610f9f565b005b34801561042b57600080fd5b5061044660048036038101906104419190613980565b61101d565b005b34801561045457600080fd5b5061045d61103d565b60405161046a9190614794565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190613bf2565b611043565b6040516104a79190614794565b60405180910390f35b3480156104bc57600080fd5b506104c56110da565b6040516104d29190614794565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190613bad565b6110df565b005b34801561051057600080fd5b506105196111c1565b6040516105269190614794565b60405180910390f35b34801561053b57600080fd5b506105446111c7565b6040516105519190614794565b60405180910390f35b34801561056657600080fd5b5061056f6111cd565b60405161057c9190614794565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a7919061391b565b6111d8565b6040516105b99190614794565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190613bf2565b611221565b6040516105f691906142ab565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061391b565b6112d3565b6040516106339190614794565b60405180910390f35b34801561064857600080fd5b5061065161138b565b005b34801561065f57600080fd5b50610668611413565b005b34801561067657600080fd5b5061067f6114bb565b60405161068c9190614312565b60405180910390f35b3480156106a157600080fd5b506106aa6114ce565b6040516106b791906142ab565b60405180910390f35b3480156106cc57600080fd5b506106d56114f8565b6040516106e29190614372565b60405180910390f35b3480156106f757600080fd5b5061070061158a565b005b34801561070e57600080fd5b506107296004803603810190610724919061391b565b611623565b6040516107369190614794565b60405180910390f35b34801561074b57600080fd5b5061076660048036038101906107619190613a4a565b61163b565b005b34801561077457600080fd5b5061078f600480360381019061078a91906139cf565b6117bc565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613bf2565b61181e565b6040516107c59190614372565b60405180910390f35b3480156107da57600080fd5b506107e361189a565b6040516107f09190614312565b60405180910390f35b610813600480360381019061080e9190613bf2565b6118ad565b005b34801561082157600080fd5b5061082a611a7b565b6040516108379190614312565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613944565b611a8e565b6040516108749190614312565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f919061391b565b611b22565b005b3480156108b257600080fd5b506108cd60048036038101906108c89190613bf2565b611c1a565b005b3480156108db57600080fd5b506108e4611d2c565b6040516108f19190614794565b60405180910390f35b610914600480360381019061090f9190613b59565b611d32565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610989575061098882611fc5565b5b9050919050565b6109986120a7565b73ffffffffffffffffffffffffffffffffffffffff166109b66114ce565b73ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390614634565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a586120a7565b73ffffffffffffffffffffffffffffffffffffffff16610a766114ce565b73ffffffffffffffffffffffffffffffffffffffff1614610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390614634565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b606060008054610b0790614a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3390614a3f565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b95826120af565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614614565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1a82611221565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c82906146b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610caa6120a7565b73ffffffffffffffffffffffffffffffffffffffff161480610cd95750610cd881610cd36120a7565b611a8e565b5b610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90614554565b60405180910390fd5b610d22838361211b565b505050565b610d2f6120a7565b73ffffffffffffffffffffffffffffffffffffffff16610d4d6114ce565b73ffffffffffffffffffffffffffffffffffffffff1614610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90614634565b60405180910390fd5b61270f82829050610db2610e8d565b610dbc919061485d565b1115610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df4906146d4565b60405180910390fd5b60005b82829050811015610e8857610e75838383818110610e47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610e5c919061391b565b6001610e66610e8d565b610e70919061485d565b6121d4565b8080610e8090614aa2565b915050610e00565b505050565b6000600880549050905090565b610eab610ea56120a7565b826121f2565b610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee1906146f4565b60405180910390fd5b610ef58383836122d0565b505050565b6000610f05836112d3565b8210610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90614414565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600047905060008111610fb157600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611019573d6000803e3d6000fd5b5050565b611038838383604051806020016040528060008152506117bc565b505050565b61270f81565b600061104d610e8d565b821061108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590614714565b60405180910390fd5b600882815481106110c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600a81565b6110e76120a7565b73ffffffffffffffffffffffffffffffffffffffff166111056114ce565b73ffffffffffffffffffffffffffffffffffffffff161461115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290614634565b60405180910390fd5b601160029054906101000a900460ff16156111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290614674565b60405180910390fd5b8181600c91906111bc929190613713565b505050565b600f5481565b61270f81565b66f523226980800081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190614594565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90614574565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113936120a7565b73ffffffffffffffffffffffffffffffffffffffff166113b16114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90614634565b60405180910390fd5b611411600061252c565b565b61141b6120a7565b73ffffffffffffffffffffffffffffffffffffffff166114396114ce565b73ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690614634565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b601160009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461150790614a3f565b80601f016020809104026020016040519081016040528092919081815260200182805461153390614a3f565b80156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b5050505050905090565b6115926120a7565b73ffffffffffffffffffffffffffffffffffffffff166115b06114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90614634565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b600b6020528060005260406000206000915090505481565b6116436120a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a8906144b4565b60405180910390fd5b80600560006116be6120a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661176b6120a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117b09190614312565b60405180910390a35050565b6117cd6117c76120a7565b836121f2565b61180c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611803906146f4565b60405180910390fd5b611818848484846125f2565b50505050565b6060611829826120af565b611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f90614694565b60405180910390fd5b600c6118738361264e565b604051602001611884929190614261565b6040516020818303038152906040529050919050565b601160029054906101000a900460ff1681565b601160019054906101000a900460ff166118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906144f4565b60405180910390fd5b601160009054906101000a900460ff161561194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390614534565b60405180910390fd5b61270f81611958610e8d565b611962919061485d565b11156119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a906146d4565b60405180910390fd5b600a8111156119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de906145b4565b60405180910390fd5b348166f52322698080006119fb91906148e4565b1115611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3390614774565b60405180910390fd5b60005b81811015611a7757611a64336001611a55610e8d565b611a5f919061485d565b6121d4565b8080611a6f90614aa2565b915050611a3f565b5050565b601160019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b2a6120a7565b73ffffffffffffffffffffffffffffffffffffffff16611b486114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590614634565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0590614454565b60405180910390fd5b611c178161252c565b50565b611c226120a7565b73ffffffffffffffffffffffffffffffffffffffff16611c406114ce565b73ffffffffffffffffffffffffffffffffffffffff1614611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90614634565b60405180910390fd5b61270f81611ca2610e8d565b611cac919061485d565b1115611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce4906146d4565b60405180910390fd5b60005b81811015611d2857611d15336001611d06610e8d565b611d10919061485d565b6121d4565b8080611d2090614aa2565b915050611cf0565b5050565b60105481565b601160019054906101000a900460ff16158015611d5b5750601160009054906101000a900460ff165b611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d91906143b4565b60405180910390fd5b611da3826127fb565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906143d4565b60405180910390fd5b61270f81600f54611df3919061485d565b1115611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90614734565b60405180910390fd5b60105481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e82919061485d565b1115611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614754565b60405180910390fd5b348166f5232269808000611ed791906148e4565b1115611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90614774565b60405180910390fd5b60005b81811015611fc057600f6000815480929190611f3690614aa2565b9190505550600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611f8b90614aa2565b9190505550611fad336001611f9e610e8d565b611fa8919061485d565b6121d4565b8080611fb890614aa2565b915050611f1b565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a0575061209f826128ef565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661218e83611221565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6121ee828260405180602001604052806000815250612959565b5050565b60006121fd826120af565b61223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390614514565b60405180910390fd5b600061224783611221565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122b657508373ffffffffffffffffffffffffffffffffffffffff1661229e84610b8a565b73ffffffffffffffffffffffffffffffffffffffff16145b806122c757506122c68185611a8e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122f082611221565b73ffffffffffffffffffffffffffffffffffffffff1614612346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d90614654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614494565b60405180910390fd5b6123c18383836129b4565b6123cc60008261211b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241c919061493e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612473919061485d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125fd8484846122d0565b61260984848484612ac8565b612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90614434565b60405180910390fd5b50505050565b60606000821415612696576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f6565b600082905060005b600082146126c85780806126b190614aa2565b915050600a826126c191906148b3565b915061269e565b60008167ffffffffffffffff81111561270a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561273c5781602001600182028036833780820191505090505b5090505b600085146127ef57600182612755919061493e565b9150600a856127649190614b19565b6030612770919061485d565b60f81b8183815181106127ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e891906148b3565b9450612740565b8093505050505b919050565b600080336040518060400160405280600781526020017f7072697661746500000000000000000000000000000000000000000000000000815250604051602001612846929190614239565b6040516020818303038152906040528051906020012060405160200161286c9190614285565b6040516020818303038152906040528051906020012090506128978382612c5f90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129638383612c86565b6129706000848484612ac8565b6129af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a690614434565b60405180910390fd5b505050565b6129bf838383612e54565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a02576129fd81612e59565b612a41565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4057612a3f8382612ea2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8457612a7f8161300f565b612ac3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ac257612ac18282613152565b5b5b505050565b6000612ae98473ffffffffffffffffffffffffffffffffffffffff166131d1565b15612c52578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b126120a7565b8786866040518563ffffffff1660e01b8152600401612b3494939291906142c6565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7f57506040513d601f19601f82011682018060405250810190612b7c9190613b30565b60015b612c02573d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b50600081511415612bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf190614434565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c57565b600190505b949350505050565b6000806000612c6e85856131e4565b91509150612c7b81613267565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced906145f4565b60405180910390fd5b612cff816120af565b15612d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3690614474565b60405180910390fd5b612d4b600083836129b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9b919061485d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612eaf846112d3565b612eb9919061493e565b9050600060076000848152602001908152602001600020549050818114612f9e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613023919061493e565b9050600060096000848152602001908152602001600020549050600060088381548110613079577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106130c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613136577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061315d836112d3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156132265760008060006020860151925060408601519150606086015160001a905061321a878285856135b8565b94509450505050613260565b60408351141561325757600080602085015191506040850151905061324c8683836136c5565b935093505050613260565b60006002915091505b9250929050565b600060048111156132a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156132da577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156132e5576135b5565b6001600481111561331f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613358577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339090614394565b60405180910390fd5b600260048111156133d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561340c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561344d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613444906143f4565b60405180910390fd5b60036004811115613487577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156134c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f8906144d4565b60405180910390fd5b60048081111561353a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613573577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156135b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ab906145d4565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156135f35760006003915091506136bc565b601b8560ff161415801561360b5750601c8560ff1614155b1561361d5760006004915091506136bc565b600060018787878760405160008152602001604052604051613642949392919061432d565b6020604051602081039080840390855afa158015613664573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156136b3576000600192509250506136bc565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613705878288856135b8565b935093505050935093915050565b82805461371f90614a3f565b90600052602060002090601f0160209004810192826137415760008555613788565b82601f1061375a57803560ff1916838001178555613788565b82800160010185558215613788579182015b8281111561378757823582559160200191906001019061376c565b5b5090506137959190613799565b5090565b5b808211156137b257600081600090555060010161379a565b5090565b60006137c96137c4846147d4565b6147af565b9050828152602081018484840111156137e157600080fd5b6137ec8482856149fd565b509392505050565b600081359050613803816153cd565b92915050565b60008083601f84011261381b57600080fd5b8235905067ffffffffffffffff81111561383457600080fd5b60208301915083602082028301111561384c57600080fd5b9250929050565b600081359050613862816153e4565b92915050565b600081359050613877816153fb565b92915050565b60008151905061388c816153fb565b92915050565b600082601f8301126138a357600080fd5b81356138b38482602086016137b6565b91505092915050565b60008083601f8401126138ce57600080fd5b8235905067ffffffffffffffff8111156138e757600080fd5b6020830191508360018202830111156138ff57600080fd5b9250929050565b60008135905061391581615412565b92915050565b60006020828403121561392d57600080fd5b600061393b848285016137f4565b91505092915050565b6000806040838503121561395757600080fd5b6000613965858286016137f4565b9250506020613976858286016137f4565b9150509250929050565b60008060006060848603121561399557600080fd5b60006139a3868287016137f4565b93505060206139b4868287016137f4565b92505060406139c586828701613906565b9150509250925092565b600080600080608085870312156139e557600080fd5b60006139f3878288016137f4565b9450506020613a04878288016137f4565b9350506040613a1587828801613906565b925050606085013567ffffffffffffffff811115613a3257600080fd5b613a3e87828801613892565b91505092959194509250565b60008060408385031215613a5d57600080fd5b6000613a6b858286016137f4565b9250506020613a7c85828601613853565b9150509250929050565b60008060408385031215613a9957600080fd5b6000613aa7858286016137f4565b9250506020613ab885828601613906565b9150509250929050565b60008060208385031215613ad557600080fd5b600083013567ffffffffffffffff811115613aef57600080fd5b613afb85828601613809565b92509250509250929050565b600060208284031215613b1957600080fd5b6000613b2784828501613868565b91505092915050565b600060208284031215613b4257600080fd5b6000613b508482850161387d565b91505092915050565b60008060408385031215613b6c57600080fd5b600083013567ffffffffffffffff811115613b8657600080fd5b613b9285828601613892565b9250506020613ba385828601613906565b9150509250929050565b60008060208385031215613bc057600080fd5b600083013567ffffffffffffffff811115613bda57600080fd5b613be6858286016138bc565b92509250509250929050565b600060208284031215613c0457600080fd5b6000613c1284828501613906565b91505092915050565b613c2481614972565b82525050565b613c3b613c3682614972565b614aeb565b82525050565b613c4a81614984565b82525050565b613c5981614990565b82525050565b613c70613c6b82614990565b614afd565b82525050565b6000613c818261481a565b613c8b8185614830565b9350613c9b818560208601614a0c565b613ca481614c06565b840191505092915050565b6000613cba82614825565b613cc48185614841565b9350613cd4818560208601614a0c565b613cdd81614c06565b840191505092915050565b6000613cf382614825565b613cfd8185614852565b9350613d0d818560208601614a0c565b80840191505092915050565b60008154613d2681614a3f565b613d308186614852565b94506001821660008114613d4b5760018114613d5c57613d8f565b60ff19831686528186019350613d8f565b613d6585614805565b60005b83811015613d8757815481890152600182019150602081019050613d68565b838801955050505b50505092915050565b6000613da5601883614841565b9150613db082614c24565b602082019050919050565b6000613dc8600e83614841565b9150613dd382614c4d565b602082019050919050565b6000613deb601683614841565b9150613df682614c76565b602082019050919050565b6000613e0e601f83614841565b9150613e1982614c9f565b602082019050919050565b6000613e31601c83614852565b9150613e3c82614cc8565b601c82019050919050565b6000613e54602b83614841565b9150613e5f82614cf1565b604082019050919050565b6000613e77603283614841565b9150613e8282614d40565b604082019050919050565b6000613e9a602683614841565b9150613ea582614d8f565b604082019050919050565b6000613ebd601c83614841565b9150613ec882614dde565b602082019050919050565b6000613ee0602483614841565b9150613eeb82614e07565b604082019050919050565b6000613f03601983614841565b9150613f0e82614e56565b602082019050919050565b6000613f26602283614841565b9150613f3182614e7f565b604082019050919050565b6000613f49600b83614841565b9150613f5482614ece565b602082019050919050565b6000613f6c602c83614841565b9150613f7782614ef7565b604082019050919050565b6000613f8f600c83614841565b9150613f9a82614f46565b602082019050919050565b6000613fb2603883614841565b9150613fbd82614f6f565b604082019050919050565b6000613fd5602a83614841565b9150613fe082614fbe565b604082019050919050565b6000613ff8602983614841565b91506140038261500d565b604082019050919050565b600061401b601d83614841565b91506140268261505c565b602082019050919050565b600061403e602283614841565b915061404982615085565b604082019050919050565b6000614061602083614841565b915061406c826150d4565b602082019050919050565b6000614084602c83614841565b915061408f826150fd565b604082019050919050565b60006140a7602083614841565b91506140b28261514c565b602082019050919050565b60006140ca602983614841565b91506140d582615175565b604082019050919050565b60006140ed602483614841565b91506140f8826151c4565b604082019050919050565b6000614110601f83614841565b915061411b82615213565b602082019050919050565b6000614133602183614841565b915061413e8261523c565b604082019050919050565b6000614156600a83614841565b91506141618261528b565b602082019050919050565b6000614179603183614841565b9150614184826152b4565b604082019050919050565b600061419c602c83614841565b91506141a782615303565b604082019050919050565b60006141bf600e83614841565b91506141ca82615352565b602082019050919050565b60006141e2600c83614841565b91506141ed8261537b565b602082019050919050565b6000614205601083614841565b9150614210826153a4565b602082019050919050565b614224816149e6565b82525050565b614233816149f0565b82525050565b60006142458285613c2a565b6014820191506142558284613ce8565b91508190509392505050565b600061426d8285613d19565b91506142798284613ce8565b91508190509392505050565b600061429082613e24565b915061429c8284613c5f565b60208201915081905092915050565b60006020820190506142c06000830184613c1b565b92915050565b60006080820190506142db6000830187613c1b565b6142e86020830186613c1b565b6142f5604083018561421b565b81810360608301526143078184613c76565b905095945050505050565b60006020820190506143276000830184613c41565b92915050565b60006080820190506143426000830187613c50565b61434f602083018661422a565b61435c6040830185613c50565b6143696060830184613c50565b95945050505050565b6000602082019050818103600083015261438c8184613caf565b905092915050565b600060208201905081810360008301526143ad81613d98565b9050919050565b600060208201905081810360008301526143cd81613dbb565b9050919050565b600060208201905081810360008301526143ed81613dde565b9050919050565b6000602082019050818103600083015261440d81613e01565b9050919050565b6000602082019050818103600083015261442d81613e47565b9050919050565b6000602082019050818103600083015261444d81613e6a565b9050919050565b6000602082019050818103600083015261446d81613e8d565b9050919050565b6000602082019050818103600083015261448d81613eb0565b9050919050565b600060208201905081810360008301526144ad81613ed3565b9050919050565b600060208201905081810360008301526144cd81613ef6565b9050919050565b600060208201905081810360008301526144ed81613f19565b9050919050565b6000602082019050818103600083015261450d81613f3c565b9050919050565b6000602082019050818103600083015261452d81613f5f565b9050919050565b6000602082019050818103600083015261454d81613f82565b9050919050565b6000602082019050818103600083015261456d81613fa5565b9050919050565b6000602082019050818103600083015261458d81613fc8565b9050919050565b600060208201905081810360008301526145ad81613feb565b9050919050565b600060208201905081810360008301526145cd8161400e565b9050919050565b600060208201905081810360008301526145ed81614031565b9050919050565b6000602082019050818103600083015261460d81614054565b9050919050565b6000602082019050818103600083015261462d81614077565b9050919050565b6000602082019050818103600083015261464d8161409a565b9050919050565b6000602082019050818103600083015261466d816140bd565b9050919050565b6000602082019050818103600083015261468d816140e0565b9050919050565b600060208201905081810360008301526146ad81614103565b9050919050565b600060208201905081810360008301526146cd81614126565b9050919050565b600060208201905081810360008301526146ed81614149565b9050919050565b6000602082019050818103600083015261470d8161416c565b9050919050565b6000602082019050818103600083015261472d8161418f565b9050919050565b6000602082019050818103600083015261474d816141b2565b9050919050565b6000602082019050818103600083015261476d816141d5565b9050919050565b6000602082019050818103600083015261478d816141f8565b9050919050565b60006020820190506147a9600083018461421b565b92915050565b60006147b96147ca565b90506147c58282614a71565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ef576147ee614bd7565b5b6147f882614c06565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614868826149e6565b9150614873836149e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a8576148a7614b4a565b5b828201905092915050565b60006148be826149e6565b91506148c9836149e6565b9250826148d9576148d8614b79565b5b828204905092915050565b60006148ef826149e6565b91506148fa836149e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561493357614932614b4a565b5b828202905092915050565b6000614949826149e6565b9150614954836149e6565b92508282101561496757614966614b4a565b5b828203905092915050565b600061497d826149c6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614a2a578082015181840152602081019050614a0f565b83811115614a39576000848401525b50505050565b60006002820490506001821680614a5757607f821691505b60208210811415614a6b57614a6a614ba8565b5b50919050565b614a7a82614c06565b810181811067ffffffffffffffff82111715614a9957614a98614bd7565b5b80604052505050565b6000614aad826149e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ae057614adf614b4a565b5b600182019050919050565b6000614af682614b07565b9050919050565b6000819050919050565b6000614b1282614c17565b9050919050565b6000614b24826149e6565b9150614b2f836149e6565b925082614b3f57614b3e614b79565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f4e4c595f50524553414c450000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4558434545445f44494749545a5f5045525f5055424c49435f4d494e54000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b6153d681614972565b81146153e157600080fd5b50565b6153ed81614984565b81146153f857600080fd5b50565b6154048161499a565b811461540f57600080fd5b50565b61541b816149e6565b811461542657600080fd5b5056fea2646970667358221220b0f39b824021bb9bc272af6dd3ffd3501848b8b34b857a702c883adbffefc44f64736f6c63430008040033

Deployed Bytecode Sourcemap

54807:4277:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39025:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58612:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58518:86;;;;;;;;;;;;;:::i;:::-;;26262:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27955:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27478:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56472:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39828:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29014:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39409:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58014:172;;;;;;;;;;;;;:::i;:::-;;29461:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54973:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40018:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55079:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58719:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55524:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54921:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55022:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58194:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25869:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25512:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9419:94;;;;;;;;;;;;;:::i;:::-;;58415:95;;;;;;;;;;;;;:::i;:::-;;55612:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8768:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26431:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58332:75;;;;;;;;;;;;;:::i;:::-;;55137:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28335:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29717:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58835:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55669:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56757:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55642:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28733:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9668:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56196:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55565:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57289:717;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39025:300;39172:4;39229:35;39214:50;;;:11;:50;;;;:103;;;;39281:36;39305:11;39281:23;:36::i;:::-;39214:103;39194:123;;39025:300;;;:::o;58612:99::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58699:4:::1;58682:14;;:21;;;;;;;;;;;;;;;;;;58612:99:::0;:::o;58518:86::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58588:8:::1;;;;;;;;;;;58587:9;58576:8;;:20;;;;;;;;;;;;;;;;;;58518:86::o:0;26262:100::-;26316:13;26349:5;26342:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26262:100;:::o;27955:308::-;28076:7;28123:16;28131:7;28123;:16::i;:::-;28101:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28231:15;:24;28247:7;28231:24;;;;;;;;;;;;;;;;;;;;;28224:31;;27955:308;;;:::o;27478:411::-;27559:13;27575:23;27590:7;27575:14;:23::i;:::-;27559:39;;27623:5;27617:11;;:2;:11;;;;27609:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27717:5;27701:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27726:37;27743:5;27750:12;:10;:12::i;:::-;27726:16;:37::i;:::-;27701:62;27679:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27860:21;27869:2;27873:7;27860:8;:21::i;:::-;27478:411;;;:::o;56472:277::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55011:4:::1;56570:9;;:16;;56554:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;56546:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56631:9;56626:116;56650:9;;:16;;56646:1;:20;56626:116;;;56688:42;56698:9;;56708:1;56698:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56728:1;56712:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56688:9;:42::i;:::-;56668:3;;;;;:::i;:::-;;;;56626:116;;;;56472:277:::0;;:::o;39828:113::-;39889:7;39916:10;:17;;;;39909:24;;39828:113;:::o;29014:376::-;29223:41;29242:12;:10;:12::i;:::-;29256:7;29223:18;:41::i;:::-;29201:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29354:28;29364:4;29370:2;29374:7;29354:9;:28::i;:::-;29014:376;;;:::o;39409:343::-;39551:7;39606:23;39623:5;39606:16;:23::i;:::-;39598:5;:31;39576:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39718:12;:19;39731:5;39718:19;;;;;;;;;;;;;;;:26;39738:5;39718:26;;;;;;;;;;;;39711:33;;39409:343;;;;:::o;58014:172::-;58054:15;58072:21;58054:39;;58122:1;58112:7;:11;58104:20;;;;;;58143:2;;;;;;;;;;;58135:20;;:43;58156:21;58135:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58014:172;:::o;29461:185::-;29599:39;29616:4;29622:2;29626:7;29599:39;;;;;;;;;;;;:16;:39::i;:::-;29461:185;;;:::o;54973:42::-;55011:4;54973:42;:::o;40018:320::-;40138:7;40193:30;:28;:30::i;:::-;40185:5;:38;40163:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;40313:10;40324:5;40313:17;;;;;;;;;;;;;;;;;;;;;;;;40306:24;;40018:320;;;:::o;55079:51::-;55128:2;55079:51;:::o;58719:108::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55786:6:::1;;;;;;;;;;;55785:7;55777:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58816:3:::2;;58800:13;:19;;;;;;;:::i;:::-;;58719:108:::0;;:::o;55524:34::-;;;;:::o;54921:45::-;54962:4;54921:45;:::o;55022:50::-;55061:11;55022:50;:::o;58194:130::-;58262:7;58289:21;:27;58311:4;58289:27;;;;;;;;;;;;;;;;58282:34;;58194:130;;;:::o;25869:326::-;25986:7;26011:13;26027:7;:16;26035:7;26027:16;;;;;;;;;;;;;;;;;;;;;26011:32;;26093:1;26076:19;;:5;:19;;;;26054:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26182:5;26175:12;;;25869:326;;;:::o;25512:295::-;25629:7;25693:1;25676:19;;:5;:19;;;;25654:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25783:9;:16;25793:5;25783:16;;;;;;;;;;;;;;;;25776:23;;25512:295;;;:::o;9419:94::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9484:21:::1;9502:1;9484:9;:21::i;:::-;9419:94::o:0;58415:95::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58491:11:::1;;;;;;;;;;;58490:12;58476:11;;:26;;;;;;;;;;;;;;;;;;58415:95::o:0;55612:23::-;;;;;;;;;;;;;:::o;8768:87::-;8814:7;8841:6;;;;;;;;;;;8834:13;;8768:87;:::o;26431:104::-;26487:13;26520:7;26513:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26431:104;:::o;58332:75::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58395:4:::1;58386:6;;:13;;;;;;;;;;;;;;;;;;58332:75::o:0;55137:56::-;;;;;;;;;;;;;;;;;:::o;28335:327::-;28482:12;:10;:12::i;:::-;28470:24;;:8;:24;;;;28462:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28582:8;28537:18;:32;28556:12;:10;:12::i;:::-;28537:32;;;;;;;;;;;;;;;:42;28570:8;28537:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28635:8;28606:48;;28621:12;:10;:12::i;:::-;28606:48;;;28645:8;28606:48;;;;;;:::i;:::-;;;;;;;;28335:327;;:::o;29717:365::-;29906:41;29925:12;:10;:12::i;:::-;29939:7;29906:18;:41::i;:::-;29884:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30035:39;30049:4;30055:2;30059:7;30068:5;30035:13;:39::i;:::-;29717:365;;;;:::o;58835:246::-;58908:13;58942:16;58950:7;58942;:16::i;:::-;58934:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59038:13;59053:18;:7;:16;:18::i;:::-;59021:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59007:66;;58835:246;;;:::o;55669:18::-;;;;;;;;;;;;;:::o;56757:524::-;56829:8;;;;;;;;;;;56821:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;56873:11;;;;;;;;;;;56872:12;56864:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55011:4;56936:13;56920;:11;:13::i;:::-;:29;;;;:::i;:::-;:43;;56912:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55128:2;56997:13;:39;;56989:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57121:9;57104:13;55061:11;57089:28;;;;:::i;:::-;:41;;57081:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57168:9;57164:110;57187:13;57183:1;:17;57164:110;;;57222:40;57232:10;57260:1;57244:13;:11;:13::i;:::-;:17;;;;:::i;:::-;57222:9;:40::i;:::-;57202:3;;;;;:::i;:::-;;;;57164:110;;;;56757:524;:::o;55642:20::-;;;;;;;;;;;;;:::o;28733:214::-;28875:4;28904:18;:25;28923:5;28904:25;;;;;;;;;;;;;;;:35;28930:8;28904:35;;;;;;;;;;;;;;;;;;;;;;;;;28897:42;;28733:214;;;;:::o;9668:229::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9791:1:::1;9771:22;;:8;:22;;;;9749:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9870:19;9880:8;9870:9;:19::i;:::-;9668:229:::0;:::o;56196:268::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55011:4:::1;56294:13;56278;:11;:13::i;:::-;:29;;;;:::i;:::-;:43;;56270:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56351:9;56347:110;56370:13;56366:1;:17;56347:110;;;56405:40;56415:10;56443:1;56427:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56405:9;:40::i;:::-;56385:3;;;;;:::i;:::-;;;;56347:110;;;;56196:268:::0;:::o;55565:40::-;;;;:::o;57289:717::-;57393:8;;;;;;;;;;;57392:9;:24;;;;;57405:11;;;;;;;;;;;57392:24;57384:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:28;57472:9;57454:17;:28::i;:::-;57446:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54962:4;57550:13;57528:19;;:35;;;;:::i;:::-;:53;;57520:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57672:20;;57655:13;57619:21;:33;57641:10;57619:33;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:73;;57611:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57760:9;57743:13;55061:11;57728:28;;;;:::i;:::-;:41;;57720:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57807:9;57803:196;57826:13;57822:1;:17;57803:196;;;57861:19;;:21;;;;;;;;;:::i;:::-;;;;;;57897;:33;57919:10;57897:33;;;;;;;;;;;;;;;;:35;;;;;;;;;:::i;:::-;;;;;;57947:40;57957:10;57985:1;57969:13;:11;:13::i;:::-;:17;;;;:::i;:::-;57947:9;:40::i;:::-;57841:3;;;;;:::i;:::-;;;;57803:196;;;;57289:717;;:::o;25093:355::-;25240:4;25297:25;25282:40;;;:11;:40;;;;:105;;;;25354:33;25339:48;;;:11;:48;;;;25282:105;:158;;;;25404:36;25428:11;25404:23;:36::i;:::-;25282:158;25262:178;;25093:355;;;:::o;1919:98::-;1972:7;1999:10;1992:17;;1919:98;:::o;31629:127::-;31694:4;31746:1;31718:30;;:7;:16;31726:7;31718:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31711:37;;31629:127;;;:::o;35752:174::-;35854:2;35827:15;:24;35843:7;35827:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35910:7;35906:2;35872:46;;35881:23;35896:7;35881:14;:23::i;:::-;35872:46;;;;;;;;;;;;35752:174;;:::o;32717:110::-;32793:26;32803:2;32807:7;32793:26;;;;;;;;;;;;:9;:26::i;:::-;32717:110;;:::o;31923:452::-;32052:4;32096:16;32104:7;32096;:16::i;:::-;32074:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32195:13;32211:23;32226:7;32211:14;:23::i;:::-;32195:39;;32264:5;32253:16;;:7;:16;;;:64;;;;32310:7;32286:31;;:20;32298:7;32286:11;:20::i;:::-;:31;;;32253:64;:113;;;;32334:32;32351:5;32358:7;32334:16;:32::i;:::-;32253:113;32245:122;;;31923:452;;;;:::o;35019:615::-;35192:4;35165:31;;:23;35180:7;35165:14;:23::i;:::-;:31;;;35143:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;35298:1;35284:16;;:2;:16;;;;35276:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35354:39;35375:4;35381:2;35385:7;35354:20;:39::i;:::-;35458:29;35475:1;35479:7;35458:8;:29::i;:::-;35519:1;35500:9;:15;35510:4;35500:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35548:1;35531:9;:13;35541:2;35531:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35579:2;35560:7;:16;35568:7;35560:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35618:7;35614:2;35599:27;;35608:4;35599:27;;;;;;;;;;;;35019:615;;;:::o;9905:173::-;9961:16;9980:6;;;;;;;;;;;9961:25;;10006:8;9997:6;;:17;;;;;;;;;;;;;;;;;;10061:8;10030:40;;10051:8;10030:40;;;;;;;;;;;;9905:173;;:::o;30964:352::-;31121:28;31131:4;31137:2;31141:7;31121:9;:28::i;:::-;31182:48;31205:4;31211:2;31215:7;31224:5;31182:22;:48::i;:::-;31160:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;30964:352;;;;:::o;12213:723::-;12269:13;12499:1;12490:5;:10;12486:53;;;12517:10;;;;;;;;;;;;;;;;;;;;;12486:53;12549:12;12564:5;12549:20;;12580:14;12605:78;12620:1;12612:4;:9;12605:78;;12638:8;;;;;:::i;:::-;;;;12669:2;12661:10;;;;;:::i;:::-;;;12605:78;;;12693:19;12725:6;12715:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12693:39;;12743:154;12759:1;12750:5;:10;12743:154;;12787:1;12777:11;;;;;:::i;:::-;;;12854:2;12846:5;:10;;;;:::i;:::-;12833:2;:24;;;;:::i;:::-;12820:39;;12803:6;12810;12803:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;12883:2;12874:11;;;;;:::i;:::-;;;12743:154;;;12921:6;12907:21;;;;;12213:723;;;;:::o;55863:325::-;55935:4;55953:12;56085:10;56097:8;;;;;;;;;;;;;;;;;56068:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56058:49;;;;;;55978:130;;;;;;;;:::i;:::-;;;;;;;;;;;;;55968:153;;;;;;55953:168;;56157:23;56170:9;56157:4;:12;;:23;;;;:::i;:::-;56139:41;;:14;;;;;;;;;;;:41;;;56132:48;;;55863:325;;;:::o;11744:207::-;11874:4;11918:25;11903:40;;;:11;:40;;;;11896:47;;11744:207;;;:::o;33054:321::-;33184:18;33190:2;33194:7;33184:5;:18::i;:::-;33235:54;33266:1;33270:2;33274:7;33283:5;33235:22;:54::i;:::-;33213:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33054:321;;;:::o;40951:589::-;41095:45;41122:4;41128:2;41132:7;41095:26;:45::i;:::-;41173:1;41157:18;;:4;:18;;;41153:187;;;41192:40;41224:7;41192:31;:40::i;:::-;41153:187;;;41262:2;41254:10;;:4;:10;;;41250:90;;41281:47;41314:4;41320:7;41281:32;:47::i;:::-;41250:90;41153:187;41368:1;41354:16;;:2;:16;;;41350:183;;;41387:45;41424:7;41387:36;:45::i;:::-;41350:183;;;41460:4;41454:10;;:2;:10;;;41450:83;;41481:40;41509:2;41513:7;41481:27;:40::i;:::-;41450:83;41350:183;40951:589;;;:::o;36491:984::-;36646:4;36667:15;:2;:13;;;:15::i;:::-;36663:805;;;36736:2;36720:36;;;36779:12;:10;:12::i;:::-;36814:4;36841:7;36871:5;36720:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36699:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37099:1;37082:6;:13;:18;37078:320;;;37125:108;;;;;;;;;;:::i;:::-;;;;;;;;37078:320;37348:6;37342:13;37333:6;37329:2;37325:15;37318:38;36699:714;36969:45;;;36959:55;;;:6;:55;;;;36952:62;;;;;36663:805;37452:4;37445:11;;36491:984;;;;;;;:::o;49703:231::-;49781:7;49802:17;49821:18;49843:27;49854:4;49860:9;49843:10;:27::i;:::-;49801:69;;;;49881:18;49893:5;49881:11;:18::i;:::-;49917:9;49910:16;;;;49703:231;;;;:::o;33711:382::-;33805:1;33791:16;;:2;:16;;;;33783:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33864:16;33872:7;33864;:16::i;:::-;33863:17;33855:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33926:45;33955:1;33959:2;33963:7;33926:20;:45::i;:::-;34001:1;33984:9;:13;33994:2;33984:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34032:2;34013:7;:16;34021:7;34013:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34077:7;34073:2;34052:33;;34069:1;34052:33;;;;;;;;;;;;33711:382;;:::o;38047:126::-;;;;:::o;42263:164::-;42367:10;:17;;;;42340:15;:24;42356:7;42340:24;;;;;;;;;;;:44;;;;42395:10;42411:7;42395:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42263:164;:::o;43054:1002::-;43334:22;43384:1;43359:22;43376:4;43359:16;:22::i;:::-;:26;;;;:::i;:::-;43334:51;;43396:18;43417:17;:26;43435:7;43417:26;;;;;;;;;;;;43396:47;;43564:14;43550:10;:28;43546:328;;43595:19;43617:12;:18;43630:4;43617:18;;;;;;;;;;;;;;;:34;43636:14;43617:34;;;;;;;;;;;;43595:56;;43701:11;43668:12;:18;43681:4;43668:18;;;;;;;;;;;;;;;:30;43687:10;43668:30;;;;;;;;;;;:44;;;;43818:10;43785:17;:30;43803:11;43785:30;;;;;;;;;;;:43;;;;43546:328;;43970:17;:26;43988:7;43970:26;;;;;;;;;;;43963:33;;;44014:12;:18;44027:4;44014:18;;;;;;;;;;;;;;;:34;44033:14;44014:34;;;;;;;;;;;44007:41;;;43054:1002;;;;:::o;44351:1079::-;44604:22;44649:1;44629:10;:17;;;;:21;;;;:::i;:::-;44604:46;;44661:18;44682:15;:24;44698:7;44682:24;;;;;;;;;;;;44661:45;;45033:19;45055:10;45066:14;45055:26;;;;;;;;;;;;;;;;;;;;;;;;45033:48;;45119:11;45094:10;45105;45094:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45230:10;45199:15;:28;45215:11;45199:28;;;;;;;;;;;:41;;;;45371:15;:24;45387:7;45371:24;;;;;;;;;;;45364:31;;;45406:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44351:1079;;;;:::o;41841:221::-;41926:14;41943:20;41960:2;41943:16;:20::i;:::-;41926:37;;42001:7;41974:12;:16;41987:2;41974:16;;;;;;;;;;;;;;;:24;41991:6;41974:24;;;;;;;;;;;:34;;;;42048:6;42019:17;:26;42037:7;42019:26;;;;;;;;;;;:35;;;;41841:221;;;:::o;14714:387::-;14774:4;14982:12;15049:7;15037:20;15029:28;;15092:1;15085:4;:8;15078:15;;;14714:387;;;:::o;47593:1308::-;47674:7;47683:12;47928:2;47908:9;:16;:22;47904:990;;;47947:9;47971;47995:7;48204:4;48193:9;48189:20;48183:27;48178:32;;48254:4;48243:9;48239:20;48233:27;48228:32;;48312:4;48301:9;48297:20;48291:27;48288:1;48283:36;48278:41;;48355:25;48366:4;48372:1;48375;48378;48355:10;:25::i;:::-;48348:32;;;;;;;;;47904:990;48422:2;48402:9;:16;:22;48398:496;;;48441:9;48465:10;48677:4;48666:9;48662:20;48656:27;48651:32;;48728:4;48717:9;48713:20;48707:27;48701:33;;48770:23;48781:4;48787:1;48790:2;48770:10;:23::i;:::-;48763:30;;;;;;;;48398:496;48842:1;48846:35;48826:56;;;;47593:1308;;;;;;:::o;45864:643::-;45942:20;45933:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;45929:571;;;45979:7;;45929:571;46040:29;46031:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;46027:473;;;46086:34;;;;;;;;;;:::i;:::-;;;;;;;;46027:473;46151:35;46142:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;46138:362;;;46203:41;;;;;;;;;;:::i;:::-;;;;;;;;46138:362;46275:30;46266:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;46262:238;;;46322:44;;;;;;;;;;:::i;:::-;;;;;;;;46262:238;46397:30;46388:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;46384:116;;;46444:44;;;;;;;;;;:::i;:::-;;;;;;;;46384:116;45864:643;;:::o;51202:1632::-;51333:7;51342:12;52267:66;52262:1;52254:10;;:79;52250:163;;;52366:1;52370:30;52350:51;;;;;;52250:163;52432:2;52427:1;:7;;;;:18;;;;;52443:2;52438:1;:7;;;;52427:18;52423:102;;;52478:1;52482:30;52462:51;;;;;;52423:102;52622:14;52639:24;52649:4;52655:1;52658;52661;52639:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52622:41;;52696:1;52678:20;;:6;:20;;;52674:103;;;52731:1;52735:29;52715:50;;;;;;;52674:103;52797:6;52805:20;52789:37;;;;;51202:1632;;;;;;;;:::o;50197:391::-;50311:7;50320:12;50345:9;50365:7;50420:66;50416:2;50412:75;50407:80;;50524:2;50519;50514:3;50510:12;50506:21;50501:26;;50555:25;50566:4;50572:1;50575;50578;50555:10;:25::i;:::-;50548:32;;;;;;50197:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:137::-;1075:5;1113:6;1100:20;1091:29;;1129:32;1155:5;1129:32;:::i;:::-;1081:86;;;;:::o;1173:141::-;1229:5;1260:6;1254:13;1245:22;;1276:32;1302:5;1276:32;:::i;:::-;1235:79;;;;:::o;1333:271::-;1388:5;1437:3;1430:4;1422:6;1418:17;1414:27;1404:2;;1455:1;1452;1445:12;1404:2;1495:6;1482:20;1520:78;1594:3;1586:6;1579:4;1571:6;1567:17;1520:78;:::i;:::-;1511:87;;1394:210;;;;;:::o;1624:352::-;1682:8;1692:6;1742:3;1735:4;1727:6;1723:17;1719:27;1709:2;;1760:1;1757;1750:12;1709:2;1796:6;1783:20;1773:30;;1826:18;1818:6;1815:30;1812:2;;;1858:1;1855;1848:12;1812:2;1895:4;1887:6;1883:17;1871:29;;1949:3;1941:4;1933:6;1929:17;1919:8;1915:32;1912:41;1909:2;;;1966:1;1963;1956:12;1909:2;1699:277;;;;;:::o;1982:139::-;2028:5;2066:6;2053:20;2044:29;;2082:33;2109:5;2082:33;:::i;:::-;2034:87;;;;:::o;2127:262::-;2186:6;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2294:1;2319:53;2364:7;2355:6;2344:9;2340:22;2319:53;:::i;:::-;2309:63;;2265:117;2193:196;;;;:::o;2395:407::-;2463:6;2471;2520:2;2508:9;2499:7;2495:23;2491:32;2488:2;;;2536:1;2533;2526:12;2488:2;2579:1;2604:53;2649:7;2640:6;2629:9;2625:22;2604:53;:::i;:::-;2594:63;;2550:117;2706:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2677:118;2478:324;;;;;:::o;2808:552::-;2885:6;2893;2901;2950:2;2938:9;2929:7;2925:23;2921:32;2918:2;;;2966:1;2963;2956:12;2918:2;3009:1;3034:53;3079:7;3070:6;3059:9;3055:22;3034:53;:::i;:::-;3024:63;;2980:117;3136:2;3162:53;3207:7;3198:6;3187:9;3183:22;3162:53;:::i;:::-;3152:63;;3107:118;3264:2;3290:53;3335:7;3326:6;3315:9;3311:22;3290:53;:::i;:::-;3280:63;;3235:118;2908:452;;;;;:::o;3366:809::-;3461:6;3469;3477;3485;3534:3;3522:9;3513:7;3509:23;3505:33;3502:2;;;3551:1;3548;3541:12;3502:2;3594:1;3619:53;3664:7;3655:6;3644:9;3640:22;3619:53;:::i;:::-;3609:63;;3565:117;3721:2;3747:53;3792:7;3783:6;3772:9;3768:22;3747:53;:::i;:::-;3737:63;;3692:118;3849:2;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3820:118;4005:2;3994:9;3990:18;3977:32;4036:18;4028:6;4025:30;4022:2;;;4068:1;4065;4058:12;4022:2;4096:62;4150:7;4141:6;4130:9;4126:22;4096:62;:::i;:::-;4086:72;;3948:220;3492:683;;;;;;;:::o;4181:401::-;4246:6;4254;4303:2;4291:9;4282:7;4278:23;4274:32;4271:2;;;4319:1;4316;4309:12;4271:2;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4489:2;4515:50;4557:7;4548:6;4537:9;4533:22;4515:50;:::i;:::-;4505:60;;4460:115;4261:321;;;;;:::o;4588:407::-;4656:6;4664;4713:2;4701:9;4692:7;4688:23;4684:32;4681:2;;;4729:1;4726;4719:12;4681:2;4772:1;4797:53;4842:7;4833:6;4822:9;4818:22;4797:53;:::i;:::-;4787:63;;4743:117;4899:2;4925:53;4970:7;4961:6;4950:9;4946:22;4925:53;:::i;:::-;4915:63;;4870:118;4671:324;;;;;:::o;5001:425::-;5087:6;5095;5144:2;5132:9;5123:7;5119:23;5115:32;5112:2;;;5160:1;5157;5150:12;5112:2;5231:1;5220:9;5216:17;5203:31;5261:18;5253:6;5250:30;5247:2;;;5293:1;5290;5283:12;5247:2;5329:80;5401:7;5392:6;5381:9;5377:22;5329:80;:::i;:::-;5311:98;;;;5174:245;5102:324;;;;;:::o;5432:260::-;5490:6;5539:2;5527:9;5518:7;5514:23;5510:32;5507:2;;;5555:1;5552;5545:12;5507:2;5598:1;5623:52;5667:7;5658:6;5647:9;5643:22;5623:52;:::i;:::-;5613:62;;5569:116;5497:195;;;;:::o;5698:282::-;5767:6;5816:2;5804:9;5795:7;5791:23;5787:32;5784:2;;;5832:1;5829;5822:12;5784:2;5875:1;5900:63;5955:7;5946:6;5935:9;5931:22;5900:63;:::i;:::-;5890:73;;5846:127;5774:206;;;;:::o;5986:518::-;6063:6;6071;6120:2;6108:9;6099:7;6095:23;6091:32;6088:2;;;6136:1;6133;6126:12;6088:2;6207:1;6196:9;6192:17;6179:31;6237:18;6229:6;6226:30;6223:2;;;6269:1;6266;6259:12;6223:2;6297:62;6351:7;6342:6;6331:9;6327:22;6297:62;:::i;:::-;6287:72;;6150:219;6408:2;6434:53;6479:7;6470:6;6459:9;6455:22;6434:53;:::i;:::-;6424:63;;6379:118;6078:426;;;;;:::o;6510:395::-;6581:6;6589;6638:2;6626:9;6617:7;6613:23;6609:32;6606:2;;;6654:1;6651;6644:12;6606:2;6725:1;6714:9;6710:17;6697:31;6755:18;6747:6;6744:30;6741:2;;;6787:1;6784;6777:12;6741:2;6823:65;6880:7;6871:6;6860:9;6856:22;6823:65;:::i;:::-;6805:83;;;;6668:230;6596:309;;;;;:::o;6911:262::-;6970:6;7019:2;7007:9;6998:7;6994:23;6990:32;6987:2;;;7035:1;7032;7025:12;6987:2;7078:1;7103:53;7148:7;7139:6;7128:9;7124:22;7103:53;:::i;:::-;7093:63;;7049:117;6977:196;;;;:::o;7179:118::-;7266:24;7284:5;7266:24;:::i;:::-;7261:3;7254:37;7244:53;;:::o;7303:157::-;7408:45;7428:24;7446:5;7428:24;:::i;:::-;7408:45;:::i;:::-;7403:3;7396:58;7386:74;;:::o;7466:109::-;7547:21;7562:5;7547:21;:::i;:::-;7542:3;7535:34;7525:50;;:::o;7581:118::-;7668:24;7686:5;7668:24;:::i;:::-;7663:3;7656:37;7646:53;;:::o;7705:157::-;7810:45;7830:24;7848:5;7830:24;:::i;:::-;7810:45;:::i;:::-;7805:3;7798:58;7788:74;;:::o;7868:360::-;7954:3;7982:38;8014:5;7982:38;:::i;:::-;8036:70;8099:6;8094:3;8036:70;:::i;:::-;8029:77;;8115:52;8160:6;8155:3;8148:4;8141:5;8137:16;8115:52;:::i;:::-;8192:29;8214:6;8192:29;:::i;:::-;8187:3;8183:39;8176:46;;7958:270;;;;;:::o;8234:364::-;8322:3;8350:39;8383:5;8350:39;:::i;:::-;8405:71;8469:6;8464:3;8405:71;:::i;:::-;8398:78;;8485:52;8530:6;8525:3;8518:4;8511:5;8507:16;8485:52;:::i;:::-;8562:29;8584:6;8562:29;:::i;:::-;8557:3;8553:39;8546:46;;8326:272;;;;;:::o;8604:377::-;8710:3;8738:39;8771:5;8738:39;:::i;:::-;8793:89;8875:6;8870:3;8793:89;:::i;:::-;8786:96;;8891:52;8936:6;8931:3;8924:4;8917:5;8913:16;8891:52;:::i;:::-;8968:6;8963:3;8959:16;8952:23;;8714:267;;;;;:::o;9011:845::-;9114:3;9151:5;9145:12;9180:36;9206:9;9180:36;:::i;:::-;9232:89;9314:6;9309:3;9232:89;:::i;:::-;9225:96;;9352:1;9341:9;9337:17;9368:1;9363:137;;;;9514:1;9509:341;;;;9330:520;;9363:137;9447:4;9443:9;9432;9428:25;9423:3;9416:38;9483:6;9478:3;9474:16;9467:23;;9363:137;;9509:341;9576:38;9608:5;9576:38;:::i;:::-;9636:1;9650:154;9664:6;9661:1;9658:13;9650:154;;;9738:7;9732:14;9728:1;9723:3;9719:11;9712:35;9788:1;9779:7;9775:15;9764:26;;9686:4;9683:1;9679:12;9674:17;;9650:154;;;9833:6;9828:3;9824:16;9817:23;;9516:334;;9330:520;;9118:738;;;;;;:::o;9862:366::-;10004:3;10025:67;10089:2;10084:3;10025:67;:::i;:::-;10018:74;;10101:93;10190:3;10101:93;:::i;:::-;10219:2;10214:3;10210:12;10203:19;;10008:220;;;:::o;10234:366::-;10376:3;10397:67;10461:2;10456:3;10397:67;:::i;:::-;10390:74;;10473:93;10562:3;10473:93;:::i;:::-;10591:2;10586:3;10582:12;10575:19;;10380:220;;;:::o;10606:366::-;10748:3;10769:67;10833:2;10828:3;10769:67;:::i;:::-;10762:74;;10845:93;10934:3;10845:93;:::i;:::-;10963:2;10958:3;10954:12;10947:19;;10752:220;;;:::o;10978:366::-;11120:3;11141:67;11205:2;11200:3;11141:67;:::i;:::-;11134:74;;11217:93;11306:3;11217:93;:::i;:::-;11335:2;11330:3;11326:12;11319:19;;11124:220;;;:::o;11350:402::-;11510:3;11531:85;11613:2;11608:3;11531:85;:::i;:::-;11524:92;;11625:93;11714:3;11625:93;:::i;:::-;11743:2;11738:3;11734:12;11727:19;;11514:238;;;:::o;11758:366::-;11900:3;11921:67;11985:2;11980:3;11921:67;:::i;:::-;11914:74;;11997:93;12086:3;11997:93;:::i;:::-;12115:2;12110:3;12106:12;12099:19;;11904:220;;;:::o;12130:366::-;12272:3;12293:67;12357:2;12352:3;12293:67;:::i;:::-;12286:74;;12369:93;12458:3;12369:93;:::i;:::-;12487:2;12482:3;12478:12;12471:19;;12276:220;;;:::o;12502:366::-;12644:3;12665:67;12729:2;12724:3;12665:67;:::i;:::-;12658:74;;12741:93;12830:3;12741:93;:::i;:::-;12859:2;12854:3;12850:12;12843:19;;12648:220;;;:::o;12874:366::-;13016:3;13037:67;13101:2;13096:3;13037:67;:::i;:::-;13030:74;;13113:93;13202:3;13113:93;:::i;:::-;13231:2;13226:3;13222:12;13215:19;;13020:220;;;:::o;13246:366::-;13388:3;13409:67;13473:2;13468:3;13409:67;:::i;:::-;13402:74;;13485:93;13574:3;13485:93;:::i;:::-;13603:2;13598:3;13594:12;13587:19;;13392:220;;;:::o;13618:366::-;13760:3;13781:67;13845:2;13840:3;13781:67;:::i;:::-;13774:74;;13857:93;13946:3;13857:93;:::i;:::-;13975:2;13970:3;13966:12;13959:19;;13764:220;;;:::o;13990:366::-;14132:3;14153:67;14217:2;14212:3;14153:67;:::i;:::-;14146:74;;14229:93;14318:3;14229:93;:::i;:::-;14347:2;14342:3;14338:12;14331:19;;14136:220;;;:::o;14362:366::-;14504:3;14525:67;14589:2;14584:3;14525:67;:::i;:::-;14518:74;;14601:93;14690:3;14601:93;:::i;:::-;14719:2;14714:3;14710:12;14703:19;;14508:220;;;:::o;14734:366::-;14876:3;14897:67;14961:2;14956:3;14897:67;:::i;:::-;14890:74;;14973:93;15062:3;14973:93;:::i;:::-;15091:2;15086:3;15082:12;15075:19;;14880:220;;;:::o;15106:366::-;15248:3;15269:67;15333:2;15328:3;15269:67;:::i;:::-;15262:74;;15345:93;15434:3;15345:93;:::i;:::-;15463:2;15458:3;15454:12;15447:19;;15252:220;;;:::o;15478:366::-;15620:3;15641:67;15705:2;15700:3;15641:67;:::i;:::-;15634:74;;15717:93;15806:3;15717:93;:::i;:::-;15835:2;15830:3;15826:12;15819:19;;15624:220;;;:::o;15850:366::-;15992:3;16013:67;16077:2;16072:3;16013:67;:::i;:::-;16006:74;;16089:93;16178:3;16089:93;:::i;:::-;16207:2;16202:3;16198:12;16191:19;;15996:220;;;:::o;16222:366::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16368:220;;;:::o;16594:366::-;16736:3;16757:67;16821:2;16816:3;16757:67;:::i;:::-;16750:74;;16833:93;16922:3;16833:93;:::i;:::-;16951:2;16946:3;16942:12;16935:19;;16740:220;;;:::o;16966:366::-;17108:3;17129:67;17193:2;17188:3;17129:67;:::i;:::-;17122:74;;17205:93;17294:3;17205:93;:::i;:::-;17323:2;17318:3;17314:12;17307:19;;17112:220;;;:::o;17338:366::-;17480:3;17501:67;17565:2;17560:3;17501:67;:::i;:::-;17494:74;;17577:93;17666:3;17577:93;:::i;:::-;17695:2;17690:3;17686:12;17679:19;;17484:220;;;:::o;17710:366::-;17852:3;17873:67;17937:2;17932:3;17873:67;:::i;:::-;17866:74;;17949:93;18038:3;17949:93;:::i;:::-;18067:2;18062:3;18058:12;18051:19;;17856:220;;;:::o;18082:366::-;18224:3;18245:67;18309:2;18304:3;18245:67;:::i;:::-;18238:74;;18321:93;18410:3;18321:93;:::i;:::-;18439:2;18434:3;18430:12;18423:19;;18228:220;;;:::o;18454:366::-;18596:3;18617:67;18681:2;18676:3;18617:67;:::i;:::-;18610:74;;18693:93;18782:3;18693:93;:::i;:::-;18811:2;18806:3;18802:12;18795:19;;18600:220;;;:::o;18826:366::-;18968:3;18989:67;19053:2;19048:3;18989:67;:::i;:::-;18982:74;;19065:93;19154:3;19065:93;:::i;:::-;19183:2;19178:3;19174:12;19167:19;;18972:220;;;:::o;19198:366::-;19340:3;19361:67;19425:2;19420:3;19361:67;:::i;:::-;19354:74;;19437:93;19526:3;19437:93;:::i;:::-;19555:2;19550:3;19546:12;19539:19;;19344:220;;;:::o;19570:366::-;19712:3;19733:67;19797:2;19792:3;19733:67;:::i;:::-;19726:74;;19809:93;19898:3;19809:93;:::i;:::-;19927:2;19922:3;19918:12;19911:19;;19716:220;;;:::o;19942:366::-;20084:3;20105:67;20169:2;20164:3;20105:67;:::i;:::-;20098:74;;20181:93;20270:3;20181:93;:::i;:::-;20299:2;20294:3;20290:12;20283:19;;20088:220;;;:::o;20314:366::-;20456:3;20477:67;20541:2;20536:3;20477:67;:::i;:::-;20470:74;;20553:93;20642:3;20553:93;:::i;:::-;20671:2;20666:3;20662:12;20655:19;;20460:220;;;:::o;20686:366::-;20828:3;20849:67;20913:2;20908:3;20849:67;:::i;:::-;20842:74;;20925:93;21014:3;20925:93;:::i;:::-;21043:2;21038:3;21034:12;21027:19;;20832:220;;;:::o;21058:366::-;21200:3;21221:67;21285:2;21280:3;21221:67;:::i;:::-;21214:74;;21297:93;21386:3;21297:93;:::i;:::-;21415:2;21410:3;21406:12;21399:19;;21204:220;;;:::o;21430:366::-;21572:3;21593:67;21657:2;21652:3;21593:67;:::i;:::-;21586:74;;21669:93;21758:3;21669:93;:::i;:::-;21787:2;21782:3;21778:12;21771:19;;21576:220;;;:::o;21802:366::-;21944:3;21965:67;22029:2;22024:3;21965:67;:::i;:::-;21958:74;;22041:93;22130:3;22041:93;:::i;:::-;22159:2;22154:3;22150:12;22143:19;;21948:220;;;:::o;22174:118::-;22261:24;22279:5;22261:24;:::i;:::-;22256:3;22249:37;22239:53;;:::o;22298:112::-;22381:22;22397:5;22381:22;:::i;:::-;22376:3;22369:35;22359:51;;:::o;22416:416::-;22576:3;22591:75;22662:3;22653:6;22591:75;:::i;:::-;22691:2;22686:3;22682:12;22675:19;;22711:95;22802:3;22793:6;22711:95;:::i;:::-;22704:102;;22823:3;22816:10;;22580:252;;;;;:::o;22838:429::-;23015:3;23037:92;23125:3;23116:6;23037:92;:::i;:::-;23030:99;;23146:95;23237:3;23228:6;23146:95;:::i;:::-;23139:102;;23258:3;23251:10;;23019:248;;;;;:::o;23273:522::-;23486:3;23508:148;23652:3;23508:148;:::i;:::-;23501:155;;23666:75;23737:3;23728:6;23666:75;:::i;:::-;23766:2;23761:3;23757:12;23750:19;;23786:3;23779:10;;23490:305;;;;:::o;23801:222::-;23894:4;23932:2;23921:9;23917:18;23909:26;;23945:71;24013:1;24002:9;23998:17;23989:6;23945:71;:::i;:::-;23899:124;;;;:::o;24029:640::-;24224:4;24262:3;24251:9;24247:19;24239:27;;24276:71;24344:1;24333:9;24329:17;24320:6;24276:71;:::i;:::-;24357:72;24425:2;24414:9;24410:18;24401:6;24357:72;:::i;:::-;24439;24507:2;24496:9;24492:18;24483:6;24439:72;:::i;:::-;24558:9;24552:4;24548:20;24543:2;24532:9;24528:18;24521:48;24586:76;24657:4;24648:6;24586:76;:::i;:::-;24578:84;;24229:440;;;;;;;:::o;24675:210::-;24762:4;24800:2;24789:9;24785:18;24777:26;;24813:65;24875:1;24864:9;24860:17;24851:6;24813:65;:::i;:::-;24767:118;;;;:::o;24891:545::-;25064:4;25102:3;25091:9;25087:19;25079:27;;25116:71;25184:1;25173:9;25169:17;25160:6;25116:71;:::i;:::-;25197:68;25261:2;25250:9;25246:18;25237:6;25197:68;:::i;:::-;25275:72;25343:2;25332:9;25328:18;25319:6;25275:72;:::i;:::-;25357;25425:2;25414:9;25410:18;25401:6;25357:72;:::i;:::-;25069:367;;;;;;;:::o;25442:313::-;25555:4;25593:2;25582:9;25578:18;25570:26;;25642:9;25636:4;25632:20;25628:1;25617:9;25613:17;25606:47;25670:78;25743:4;25734:6;25670:78;:::i;:::-;25662:86;;25560:195;;;;:::o;25761:419::-;25927:4;25965:2;25954:9;25950:18;25942:26;;26014:9;26008:4;26004:20;26000:1;25989:9;25985:17;25978:47;26042:131;26168:4;26042:131;:::i;:::-;26034:139;;25932:248;;;:::o;26186:419::-;26352:4;26390:2;26379:9;26375:18;26367:26;;26439:9;26433:4;26429:20;26425:1;26414:9;26410:17;26403:47;26467:131;26593:4;26467:131;:::i;:::-;26459:139;;26357:248;;;:::o;26611:419::-;26777:4;26815:2;26804:9;26800:18;26792:26;;26864:9;26858:4;26854:20;26850:1;26839:9;26835:17;26828:47;26892:131;27018:4;26892:131;:::i;:::-;26884:139;;26782:248;;;:::o;27036:419::-;27202:4;27240:2;27229:9;27225:18;27217:26;;27289:9;27283:4;27279:20;27275:1;27264:9;27260:17;27253:47;27317:131;27443:4;27317:131;:::i;:::-;27309:139;;27207:248;;;:::o;27461:419::-;27627:4;27665:2;27654:9;27650:18;27642:26;;27714:9;27708:4;27704:20;27700:1;27689:9;27685:17;27678:47;27742:131;27868:4;27742:131;:::i;:::-;27734:139;;27632:248;;;:::o;27886:419::-;28052:4;28090:2;28079:9;28075:18;28067:26;;28139:9;28133:4;28129:20;28125:1;28114:9;28110:17;28103:47;28167:131;28293:4;28167:131;:::i;:::-;28159:139;;28057:248;;;:::o;28311:419::-;28477:4;28515:2;28504:9;28500:18;28492:26;;28564:9;28558:4;28554:20;28550:1;28539:9;28535:17;28528:47;28592:131;28718:4;28592:131;:::i;:::-;28584:139;;28482:248;;;:::o;28736:419::-;28902:4;28940:2;28929:9;28925:18;28917:26;;28989:9;28983:4;28979:20;28975:1;28964:9;28960:17;28953:47;29017:131;29143:4;29017:131;:::i;:::-;29009:139;;28907:248;;;:::o;29161:419::-;29327:4;29365:2;29354:9;29350:18;29342:26;;29414:9;29408:4;29404:20;29400:1;29389:9;29385:17;29378:47;29442:131;29568:4;29442:131;:::i;:::-;29434:139;;29332:248;;;:::o;29586:419::-;29752:4;29790:2;29779:9;29775:18;29767:26;;29839:9;29833:4;29829:20;29825:1;29814:9;29810:17;29803:47;29867:131;29993:4;29867:131;:::i;:::-;29859:139;;29757:248;;;:::o;30011:419::-;30177:4;30215:2;30204:9;30200:18;30192:26;;30264:9;30258:4;30254:20;30250:1;30239:9;30235:17;30228:47;30292:131;30418:4;30292:131;:::i;:::-;30284:139;;30182:248;;;:::o;30436:419::-;30602:4;30640:2;30629:9;30625:18;30617:26;;30689:9;30683:4;30679:20;30675:1;30664:9;30660:17;30653:47;30717:131;30843:4;30717:131;:::i;:::-;30709:139;;30607:248;;;:::o;30861:419::-;31027:4;31065:2;31054:9;31050:18;31042:26;;31114:9;31108:4;31104:20;31100:1;31089:9;31085:17;31078:47;31142:131;31268:4;31142:131;:::i;:::-;31134:139;;31032:248;;;:::o;31286:419::-;31452:4;31490:2;31479:9;31475:18;31467:26;;31539:9;31533:4;31529:20;31525:1;31514:9;31510:17;31503:47;31567:131;31693:4;31567:131;:::i;:::-;31559:139;;31457:248;;;:::o;31711:419::-;31877:4;31915:2;31904:9;31900:18;31892:26;;31964:9;31958:4;31954:20;31950:1;31939:9;31935:17;31928:47;31992:131;32118:4;31992:131;:::i;:::-;31984:139;;31882:248;;;:::o;32136:419::-;32302:4;32340:2;32329:9;32325:18;32317:26;;32389:9;32383:4;32379:20;32375:1;32364:9;32360:17;32353:47;32417:131;32543:4;32417:131;:::i;:::-;32409:139;;32307:248;;;:::o;32561:419::-;32727:4;32765:2;32754:9;32750:18;32742:26;;32814:9;32808:4;32804:20;32800:1;32789:9;32785:17;32778:47;32842:131;32968:4;32842:131;:::i;:::-;32834:139;;32732:248;;;:::o;32986:419::-;33152:4;33190:2;33179:9;33175:18;33167:26;;33239:9;33233:4;33229:20;33225:1;33214:9;33210:17;33203:47;33267:131;33393:4;33267:131;:::i;:::-;33259:139;;33157:248;;;:::o;33411:419::-;33577:4;33615:2;33604:9;33600:18;33592:26;;33664:9;33658:4;33654:20;33650:1;33639:9;33635:17;33628:47;33692:131;33818:4;33692:131;:::i;:::-;33684:139;;33582:248;;;:::o;33836:419::-;34002:4;34040:2;34029:9;34025:18;34017:26;;34089:9;34083:4;34079:20;34075:1;34064:9;34060:17;34053:47;34117:131;34243:4;34117:131;:::i;:::-;34109:139;;34007:248;;;:::o;34261:419::-;34427:4;34465:2;34454:9;34450:18;34442:26;;34514:9;34508:4;34504:20;34500:1;34489:9;34485:17;34478:47;34542:131;34668:4;34542:131;:::i;:::-;34534:139;;34432:248;;;:::o;34686:419::-;34852:4;34890:2;34879:9;34875:18;34867:26;;34939:9;34933:4;34929:20;34925:1;34914:9;34910:17;34903:47;34967:131;35093:4;34967:131;:::i;:::-;34959:139;;34857:248;;;:::o;35111:419::-;35277:4;35315:2;35304:9;35300:18;35292:26;;35364:9;35358:4;35354:20;35350:1;35339:9;35335:17;35328:47;35392:131;35518:4;35392:131;:::i;:::-;35384:139;;35282:248;;;:::o;35536:419::-;35702:4;35740:2;35729:9;35725:18;35717:26;;35789:9;35783:4;35779:20;35775:1;35764:9;35760:17;35753:47;35817:131;35943:4;35817:131;:::i;:::-;35809:139;;35707:248;;;:::o;35961:419::-;36127:4;36165:2;36154:9;36150:18;36142:26;;36214:9;36208:4;36204:20;36200:1;36189:9;36185:17;36178:47;36242:131;36368:4;36242:131;:::i;:::-;36234:139;;36132:248;;;:::o;36386:419::-;36552:4;36590:2;36579:9;36575:18;36567:26;;36639:9;36633:4;36629:20;36625:1;36614:9;36610:17;36603:47;36667:131;36793:4;36667:131;:::i;:::-;36659:139;;36557:248;;;:::o;36811:419::-;36977:4;37015:2;37004:9;37000:18;36992:26;;37064:9;37058:4;37054:20;37050:1;37039:9;37035:17;37028:47;37092:131;37218:4;37092:131;:::i;:::-;37084:139;;36982:248;;;:::o;37236:419::-;37402:4;37440:2;37429:9;37425:18;37417:26;;37489:9;37483:4;37479:20;37475:1;37464:9;37460:17;37453:47;37517:131;37643:4;37517:131;:::i;:::-;37509:139;;37407:248;;;:::o;37661:419::-;37827:4;37865:2;37854:9;37850:18;37842:26;;37914:9;37908:4;37904:20;37900:1;37889:9;37885:17;37878:47;37942:131;38068:4;37942:131;:::i;:::-;37934:139;;37832:248;;;:::o;38086:419::-;38252:4;38290:2;38279:9;38275:18;38267:26;;38339:9;38333:4;38329:20;38325:1;38314:9;38310:17;38303:47;38367:131;38493:4;38367:131;:::i;:::-;38359:139;;38257:248;;;:::o;38511:419::-;38677:4;38715:2;38704:9;38700:18;38692:26;;38764:9;38758:4;38754:20;38750:1;38739:9;38735:17;38728:47;38792:131;38918:4;38792:131;:::i;:::-;38784:139;;38682:248;;;:::o;38936:419::-;39102:4;39140:2;39129:9;39125:18;39117:26;;39189:9;39183:4;39179:20;39175:1;39164:9;39160:17;39153:47;39217:131;39343:4;39217:131;:::i;:::-;39209:139;;39107:248;;;:::o;39361:222::-;39454:4;39492:2;39481:9;39477:18;39469:26;;39505:71;39573:1;39562:9;39558:17;39549:6;39505:71;:::i;:::-;39459:124;;;;:::o;39589:129::-;39623:6;39650:20;;:::i;:::-;39640:30;;39679:33;39707:4;39699:6;39679:33;:::i;:::-;39630:88;;;:::o;39724:75::-;39757:6;39790:2;39784:9;39774:19;;39764:35;:::o;39805:307::-;39866:4;39956:18;39948:6;39945:30;39942:2;;;39978:18;;:::i;:::-;39942:2;40016:29;40038:6;40016:29;:::i;:::-;40008:37;;40100:4;40094;40090:15;40082:23;;39871:241;;;:::o;40118:141::-;40167:4;40190:3;40182:11;;40213:3;40210:1;40203:14;40247:4;40244:1;40234:18;40226:26;;40172:87;;;:::o;40265:98::-;40316:6;40350:5;40344:12;40334:22;;40323:40;;;:::o;40369:99::-;40421:6;40455:5;40449:12;40439:22;;40428:40;;;:::o;40474:168::-;40557:11;40591:6;40586:3;40579:19;40631:4;40626:3;40622:14;40607:29;;40569:73;;;;:::o;40648:169::-;40732:11;40766:6;40761:3;40754:19;40806:4;40801:3;40797:14;40782:29;;40744:73;;;;:::o;40823:148::-;40925:11;40962:3;40947:18;;40937:34;;;;:::o;40977:305::-;41017:3;41036:20;41054:1;41036:20;:::i;:::-;41031:25;;41070:20;41088:1;41070:20;:::i;:::-;41065:25;;41224:1;41156:66;41152:74;41149:1;41146:81;41143:2;;;41230:18;;:::i;:::-;41143:2;41274:1;41271;41267:9;41260:16;;41021:261;;;;:::o;41288:185::-;41328:1;41345:20;41363:1;41345:20;:::i;:::-;41340:25;;41379:20;41397:1;41379:20;:::i;:::-;41374:25;;41418:1;41408:2;;41423:18;;:::i;:::-;41408:2;41465:1;41462;41458:9;41453:14;;41330:143;;;;:::o;41479:348::-;41519:7;41542:20;41560:1;41542:20;:::i;:::-;41537:25;;41576:20;41594:1;41576:20;:::i;:::-;41571:25;;41764:1;41696:66;41692:74;41689:1;41686:81;41681:1;41674:9;41667:17;41663:105;41660:2;;;41771:18;;:::i;:::-;41660:2;41819:1;41816;41812:9;41801:20;;41527:300;;;;:::o;41833:191::-;41873:4;41893:20;41911:1;41893:20;:::i;:::-;41888:25;;41927:20;41945:1;41927:20;:::i;:::-;41922:25;;41966:1;41963;41960:8;41957:2;;;41971:18;;:::i;:::-;41957:2;42016:1;42013;42009:9;42001:17;;41878:146;;;;:::o;42030:96::-;42067:7;42096:24;42114:5;42096:24;:::i;:::-;42085:35;;42075:51;;;:::o;42132:90::-;42166:7;42209:5;42202:13;42195:21;42184:32;;42174:48;;;:::o;42228:77::-;42265:7;42294:5;42283:16;;42273:32;;;:::o;42311:149::-;42347:7;42387:66;42380:5;42376:78;42365:89;;42355:105;;;:::o;42466:126::-;42503:7;42543:42;42536:5;42532:54;42521:65;;42511:81;;;:::o;42598:77::-;42635:7;42664:5;42653:16;;42643:32;;;:::o;42681:86::-;42716:7;42756:4;42749:5;42745:16;42734:27;;42724:43;;;:::o;42773:154::-;42857:6;42852:3;42847;42834:30;42919:1;42910:6;42905:3;42901:16;42894:27;42824:103;;;:::o;42933:307::-;43001:1;43011:113;43025:6;43022:1;43019:13;43011:113;;;43110:1;43105:3;43101:11;43095:18;43091:1;43086:3;43082:11;43075:39;43047:2;43044:1;43040:10;43035:15;;43011:113;;;43142:6;43139:1;43136:13;43133:2;;;43222:1;43213:6;43208:3;43204:16;43197:27;43133:2;42982:258;;;;:::o;43246:320::-;43290:6;43327:1;43321:4;43317:12;43307:22;;43374:1;43368:4;43364:12;43395:18;43385:2;;43451:4;43443:6;43439:17;43429:27;;43385:2;43513;43505:6;43502:14;43482:18;43479:38;43476:2;;;43532:18;;:::i;:::-;43476:2;43297:269;;;;:::o;43572:281::-;43655:27;43677:4;43655:27;:::i;:::-;43647:6;43643:40;43785:6;43773:10;43770:22;43749:18;43737:10;43734:34;43731:62;43728:2;;;43796:18;;:::i;:::-;43728:2;43836:10;43832:2;43825:22;43615:238;;;:::o;43859:233::-;43898:3;43921:24;43939:5;43921:24;:::i;:::-;43912:33;;43967:66;43960:5;43957:77;43954:2;;;44037:18;;:::i;:::-;43954:2;44084:1;44077:5;44073:13;44066:20;;43902:190;;;:::o;44098:100::-;44137:7;44166:26;44186:5;44166:26;:::i;:::-;44155:37;;44145:53;;;:::o;44204:79::-;44243:7;44272:5;44261:16;;44251:32;;;:::o;44289:94::-;44328:7;44357:20;44371:5;44357:20;:::i;:::-;44346:31;;44336:47;;;:::o;44389:176::-;44421:1;44438:20;44456:1;44438:20;:::i;:::-;44433:25;;44472:20;44490:1;44472:20;:::i;:::-;44467:25;;44511:1;44501:2;;44516:18;;:::i;:::-;44501:2;44557:1;44554;44550:9;44545:14;;44423:142;;;;:::o;44571:180::-;44619:77;44616:1;44609:88;44716:4;44713:1;44706:15;44740:4;44737:1;44730:15;44757:180;44805:77;44802:1;44795:88;44902:4;44899:1;44892:15;44926:4;44923:1;44916:15;44943:180;44991:77;44988:1;44981:88;45088:4;45085:1;45078:15;45112:4;45109:1;45102:15;45129:180;45177:77;45174:1;45167:88;45274:4;45271:1;45264:15;45298:4;45295:1;45288:15;45315:102;45356:6;45407:2;45403:7;45398:2;45391:5;45387:14;45383:28;45373:38;;45363:54;;;:::o;45423:94::-;45456:8;45504:5;45500:2;45496:14;45475:35;;45465:52;;;:::o;45523:174::-;45663:26;45659:1;45651:6;45647:14;45640:50;45629:68;:::o;45703:164::-;45843:16;45839:1;45831:6;45827:14;45820:40;45809:58;:::o;45873:172::-;46013:24;46009:1;46001:6;45997:14;45990:48;45979:66;:::o;46051:181::-;46191:33;46187:1;46179:6;46175:14;46168:57;46157:75;:::o;46238:214::-;46378:66;46374:1;46366:6;46362:14;46355:90;46344:108;:::o;46458:230::-;46598:34;46594:1;46586:6;46582:14;46575:58;46667:13;46662:2;46654:6;46650:15;46643:38;46564:124;:::o;46694:237::-;46834:34;46830:1;46822:6;46818:14;46811:58;46903:20;46898:2;46890:6;46886:15;46879:45;46800:131;:::o;46937:225::-;47077:34;47073:1;47065:6;47061:14;47054:58;47146:8;47141:2;47133:6;47129:15;47122:33;47043:119;:::o;47168:178::-;47308:30;47304:1;47296:6;47292:14;47285:54;47274:72;:::o;47352:223::-;47492:34;47488:1;47480:6;47476:14;47469:58;47561:6;47556:2;47548:6;47544:15;47537:31;47458:117;:::o;47581:175::-;47721:27;47717:1;47709:6;47705:14;47698:51;47687:69;:::o;47762:221::-;47902:34;47898:1;47890:6;47886:14;47879:58;47971:4;47966:2;47958:6;47954:15;47947:29;47868:115;:::o;47989:161::-;48129:13;48125:1;48117:6;48113:14;48106:37;48095:55;:::o;48156:231::-;48296:34;48292:1;48284:6;48280:14;48273:58;48365:14;48360:2;48352:6;48348:15;48341:39;48262:125;:::o;48393:162::-;48533:14;48529:1;48521:6;48517:14;48510:38;48499:56;:::o;48561:243::-;48701:34;48697:1;48689:6;48685:14;48678:58;48770:26;48765:2;48757:6;48753:15;48746:51;48667:137;:::o;48810:229::-;48950:34;48946:1;48938:6;48934:14;48927:58;49019:12;49014:2;49006:6;49002:15;48995:37;48916:123;:::o;49045:228::-;49185:34;49181:1;49173:6;49169:14;49162:58;49254:11;49249:2;49241:6;49237:15;49230:36;49151:122;:::o;49279:179::-;49419:31;49415:1;49407:6;49403:14;49396:55;49385:73;:::o;49464:221::-;49604:34;49600:1;49592:6;49588:14;49581:58;49673:4;49668:2;49660:6;49656:15;49649:29;49570:115;:::o;49691:182::-;49831:34;49827:1;49819:6;49815:14;49808:58;49797:76;:::o;49879:231::-;50019:34;50015:1;50007:6;50003:14;49996:58;50088:14;50083:2;50075:6;50071:15;50064:39;49985:125;:::o;50116:182::-;50256:34;50252:1;50244:6;50240:14;50233:58;50222:76;:::o;50304:228::-;50444:34;50440:1;50432:6;50428:14;50421:58;50513:11;50508:2;50500:6;50496:15;50489:36;50410:122;:::o;50538:223::-;50678:34;50674:1;50666:6;50662:14;50655:58;50747:6;50742:2;50734:6;50730:15;50723:31;50644:117;:::o;50767:181::-;50907:33;50903:1;50895:6;50891:14;50884:57;50873:75;:::o;50954:220::-;51094:34;51090:1;51082:6;51078:14;51071:58;51163:3;51158:2;51150:6;51146:15;51139:28;51060:114;:::o;51180:160::-;51320:12;51316:1;51308:6;51304:14;51297:36;51286:54;:::o;51346:236::-;51486:34;51482:1;51474:6;51470:14;51463:58;51555:19;51550:2;51542:6;51538:15;51531:44;51452:130;:::o;51588:231::-;51728:34;51724:1;51716:6;51712:14;51705:58;51797:14;51792:2;51784:6;51780:15;51773:39;51694:125;:::o;51825:164::-;51965:16;51961:1;51953:6;51949:14;51942:40;51931:58;:::o;51995:162::-;52135:14;52131:1;52123:6;52119:14;52112:38;52101:56;:::o;52163:166::-;52303:18;52299:1;52291:6;52287:14;52280:42;52269:60;:::o;52335:122::-;52408:24;52426:5;52408:24;:::i;:::-;52401:5;52398:35;52388:2;;52447:1;52444;52437:12;52388:2;52378:79;:::o;52463:116::-;52533:21;52548:5;52533:21;:::i;:::-;52526:5;52523:32;52513:2;;52569:1;52566;52559:12;52513:2;52503:76;:::o;52585:120::-;52657:23;52674:5;52657:23;:::i;:::-;52650:5;52647:34;52637:2;;52695:1;52692;52685:12;52637:2;52627:78;:::o;52711:122::-;52784:24;52802:5;52784:24;:::i;:::-;52777:5;52774:35;52764:2;;52823:1;52820;52813:12;52764:2;52754:79;:::o

Swarm Source

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