ETH Price: $2,478.37 (-1.69%)

Token

Metarobotica (Metarobotica)
 

Overview

Max Total Supply

118 Metarobotica

Holders

80

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
electra7.eth
Balance
1 Metarobotica
0x8d138b59609a005c328c5814737853a242325152
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Contract

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

// File @openzeppelin/contracts/utils/introspection/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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


// File @openzeppelin/contracts/utils/[email protected]

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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


// File @openzeppelin/contracts/utils/[email protected]

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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


// File @openzeppelin/contracts/utils/math/[email protected]


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]

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

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

contract Contract is ERC721("Metarobotica", "Metarobotica"), ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    /*
     * Currently Assuming there will be one baseURI.
     * If it fails to upload all NFTs data under one baseURI,
     * we will divide baseURI and tokenURI function will be changed accordingly.
    */
    string private baseURI;
    string private blindURI;
    uint256 private constant PHASE_1_LIMIT = 2222;
    uint256 private constant PHASE_2_3_LIMIT = 3333;
    uint256 private constant MAX_FREE_LIMIT = 100;
    uint256 public NFT1Price = 120000000000000000;  // 0.12 ETH
    uint256 public NFT2Price = 160000000000000000;  // 0.16 ETH
    uint256 public NFT3Price = 200000000000000000;  // 0.2 ETH
    bool public revealPhase1;
    bool public revealPhase2;
    bool public revealPhase3;
    bool public isActive;
    bool public isRafflePresaleActive;
    bytes32 public ogRoot;
    bytes32 public freeRoot;
    bytes32 public wlRoot;
    bytes32 public rwRoot;
    uint256 public constant OG_MAX_MINT = 4;
    uint256 public constant FREE_MAX_MINT = 1;
    uint256 public constant WHITELIST_MAX_MINT = 2;
    uint256 public constant RW_MAX_MINT = 2;
    uint256 private freeClaimed;
    mapping(uint256 => mapping(address => uint256)) private claimed;
    mapping(uint256 => uint256) public phaseClaimed;
    uint256 private phase = 1;

    /*
     * Function to reveal NFTs
    */
    function setRevealPhase1(
        bool _reveal
    ) 
        external 
        onlyOwner 
    {
        revealPhase1 = _reveal;
    }

    /*
     * Function to reveal NFTs
    */
    function setRevealPhase2(
        bool _reveal
    ) 
        external 
        onlyOwner 
    {
        revealPhase2 = _reveal;
    }

    /*
     * Function to reveal NFTs
    */
    function setRevealPhase3(
        bool _reveal
    ) 
        external 
        onlyOwner 
    {
        revealPhase3 = _reveal;
    }
    
    /*
     * Function setIsActive to activate/desactivate the smart contract
    */
    function setIsActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isActive = _isActive;
    }
    
    /*
     * Function setRafflePresaleActive to activate/desactivate the presale  
    */
    function setRafflePresaleActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isRafflePresaleActive = _isActive;
    }

    function setRoot(uint256 _ogRoot, uint256 _freeRoot, uint256 _wlRoot, uint256 _rwRoot) external onlyOwner() {
        ogRoot = bytes32(_ogRoot);
        freeRoot = bytes32(_freeRoot);
        wlRoot = bytes32(_wlRoot);
        rwRoot = bytes32(_rwRoot);
    }

    function setPhase(uint256 _phase) external onlyOwner()  {
        require(_phase >= 1 && _phase <= 3, 'Wrong phase');
        phase = _phase;
    }

    /*
     * Function to set Base and Blind URI 
    */
    function setURIs(
        string memory _blindURI, 
        string memory _URI
    ) 
        external 
        onlyOwner 
    {
        blindURI = _blindURI;
        baseURI = _URI;
    }
    
    /*
     * Function to withdraw collected amount during minting by the owner
    */
    function withdraw(
    ) 
        public 
        onlyOwner 
    {
        address ownerAddress = 0x74B6EE60C68E5AeB3aba65F99EE6112707866e96;
        payable(ownerAddress).transfer(address(this).balance);
    }
    
    /*
     * Function to mint new NFTs
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTOg(
        uint256 _numOfTokens,
        bytes32[] memory _proof
    ) 
        public 
        payable
    {
        require(isActive, 'Sale is not active');
        require(MerkleProof.verify(_proof, ogRoot, keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(phaseClaimed[phase].add(_numOfTokens) <= _getPhaseLimit(), 'Tokens number to mint cannot exceed number of MAX tokens per phase');
        require(_numOfTokens <= OG_MAX_MINT, 'Cannot purchase this many tokens');
        require(claimed[phase][msg.sender].add(_numOfTokens) <= OG_MAX_MINT, 'Purchase exceeds max whiteed');
        require(_getPhasePrice().mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        for (uint256 i = 0; i < _numOfTokens; i++) {
                claimed[phase][msg.sender] += _numOfTokens;
                phaseClaimed[phase]+=1;
                _safeMint(msg.sender, totalSupply());
        }
    }

    /*
     * Function to mint new NFTs
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTWhitelist(
        uint256 _numOfTokens,
        bytes32[] memory _proof
    ) 
        public 
        payable
    {
        require(isActive, 'Sale is not active');
        require(MerkleProof.verify(_proof, wlRoot, keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(phaseClaimed[phase].add(_numOfTokens) <= _getPhaseLimit(), 'Tokens number to mint cannot exceed number of MAX tokens per phase');
        require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens');
        require(claimed[phase][msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed');
        require(_getPhasePrice().mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        for (uint256 i = 0; i < _numOfTokens; i++) {
                claimed[phase][msg.sender] += _numOfTokens;
                phaseClaimed[phase]+=1;
                _safeMint(msg.sender, totalSupply());
        }
    }

    /*
     * Function to mint new NFTs
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTRaffleWinner(
        uint256 _numOfTokens,
        bytes32[] memory _proof
    ) 
        public 
        payable
    {
        require(isActive, 'Sale is not active');
        require(isRafflePresaleActive, 'Raffle winners presale is not active');
        require(MerkleProof.verify(_proof, rwRoot, keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(phaseClaimed[phase].add(_numOfTokens) <= _getPhaseLimit(), 'Tokens number to mint cannot exceed number of MAX tokens per phase');
        require(_numOfTokens <= RW_MAX_MINT, 'Cannot purchase this many tokens');
        require(claimed[phase][msg.sender].add(_numOfTokens) <= RW_MAX_MINT, 'Purchase exceeds max whiteed');
        require(_getPhasePrice().mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        for (uint256 i = 0; i < _numOfTokens; i++) {
                claimed[phase][msg.sender] += _numOfTokens;
                phaseClaimed[phase]+=1;
                _safeMint(msg.sender, totalSupply());
        }
    }

    /*
     * Function to mint new NFTs
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTFree(
        uint256 _numOfTokens,
        bytes32[] memory _proof
    ) 
        public 
        payable
    {
        require(isActive, 'Sale is not active');
        require(MerkleProof.verify(_proof, freeRoot, keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(freeClaimed < MAX_FREE_LIMIT, 'All free tokens have been minted');
        require(phaseClaimed[phase].add(_numOfTokens) <= _getPhaseLimit(), 'Tokens number to mint cannot exceed number of MAX tokens per phase');
        require(_numOfTokens <= FREE_MAX_MINT, 'Cannot purchase this many tokens');
        require(claimed[phase][msg.sender].add(_numOfTokens) <= FREE_MAX_MINT, 'Purchase exceeds max whiteed');
        for (uint256 i = 0; i < _numOfTokens; i++) {
                claimed[phase][msg.sender] += _numOfTokens;
                phaseClaimed[phase]+=1;
                freeClaimed+=1;
                _safeMint(msg.sender, totalSupply());
        }
    }

    /*
     * Function to mint any NFTs
    */
    function mintMultipleByOwner(
        address _to, 
        uint256 _numOfTokens
    )
        public
        onlyOwner
    {
        require(phaseClaimed[phase].add(_numOfTokens) <= _getPhaseLimit(), "Tokens number to mint cannot exceed number of MAX tokens per phase");
        for(uint256 i = 0; i < _numOfTokens; i++){
            claimed[phase][_to] += 1;
            phaseClaimed[phase]+=1;
            _safeMint(_to, totalSupply());
        }
    }

    /*
     * Function to get token URI of given token ID
    */
    function tokenURI(
        uint256 _tokenId
    )
        public 
        view 
        virtual 
        override 
        returns (string memory) 
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (
            (_tokenId < PHASE_1_LIMIT && revealPhase1) ||
            (_tokenId < (PHASE_1_LIMIT + PHASE_2_3_LIMIT) && revealPhase2) ||
            revealPhase3
            ) {
            return string(abi.encodePacked(baseURI, _tokenId.toString()));
        } else {
            return string(abi.encodePacked(blindURI));
        }
    }
    
    function supportsInterface(
        bytes4 _interfaceId
    ) 
        public
        view 
        override (ERC721, ERC721Enumerable) 
        returns (bool) 
    {
        return super.supportsInterface(_interfaceId);
    }

    // Standard functions to be overridden 
    function _beforeTokenTransfer(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) 
        internal 
        override(ERC721, ERC721Enumerable) 
    {
        super._beforeTokenTransfer(_from, _to, _tokenId);
    }

    function _getPhaseLimit() view private returns (uint256) {
        if (phase == 1) {
            return PHASE_1_LIMIT;
        } else if (phase == 2)  {
            return PHASE_2_3_LIMIT;
        } else if (phase == 3) {
            return PHASE_2_3_LIMIT;
        } else {
            return 0;
        }
    }

    function _getPhasePrice() view private returns (uint256) {
        if (phase == 1) {
            return NFT1Price;
        } else if (phase == 2)  {
            return NFT2Price;
        } else if (phase == 3) {
            return NFT3Price;
        } else {
            return 1;
        }
    }
}

Contract Security Audit

Contract ABI

[{"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":"FREE_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT1Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT2Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT3Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RW_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","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":[],"name":"freeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRafflePresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTOg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTRaffleWinner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"uint256","name":"","type":"uint256"}],"name":"phaseClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealPhase1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealPhase2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealPhase3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rwRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phase","type":"uint256"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setRafflePresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setRevealPhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setRevealPhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setRevealPhase3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogRoot","type":"uint256"},{"internalType":"uint256","name":"_freeRoot","type":"uint256"},{"internalType":"uint256","name":"_wlRoot","type":"uint256"},{"internalType":"uint256","name":"_rwRoot","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

60806040526701aa535d3d0c0000600d556702386f26fc100000600e556702c68af0bb140000600f5560016018553480156200003a57600080fd5b506040518060400160405280600c81526020017f4d657461726f626f7469636100000000000000000000000000000000000000008152506040518060400160405280600c81526020017f4d657461726f626f7469636100000000000000000000000000000000000000008152508160009080519060200190620000bf929190620001cf565b508060019080519060200190620000d8929190620001cf565b505050620000fb620000ef6200010160201b60201c565b6200010960201b60201c565b620002e4565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001dd906200027f565b90600052602060002090601f0160209004810192826200020157600085556200024d565b82601f106200021c57805160ff19168380011785556200024d565b828001600101855582156200024d579182015b828111156200024c5782518255916020019190600101906200022f565b5b5090506200025c919062000260565b5090565b5b808211156200027b57600081600090555060010162000261565b5090565b600060028204905060018216806200029857607f821691505b60208210811415620002af57620002ae620002b5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b5e80620002f46000396000f3fe6080604052600436106102c95760003560e01c8063715018a611610175578063b231d37f116100dc578063dbea564711610095578063f0bd3d711161006f578063f0bd3d7114610aae578063f2fde38b14610ad7578063f4f4d10714610b00578063fdfc12e214610b2b576102c9565b8063dbea564714610a1f578063e825417414610a48578063e985e9c514610a71576102c9565b8063b231d37f146108fb578063b88d4fde14610926578063c87b56dd1461094f578063cd855e7b1461098c578063d3919472146109b7578063d42e04b7146109f4576102c9565b8063909b29901161012e578063909b29901461080a57806395d89b4114610835578063a22cb46514610860578063ada8afe114610889578063aeb16768146108a5578063b1a3e15a146108d0576102c9565b8063715018a61461071e57806381f962191461073557806382c309871461075e5780638712a356146107895780638da5cb5b146107b4578063903afdc0146107df576102c9565b80632750fc7811610234578063444ed7af116101ed5780635301ceb6116101c75780635301ceb6146106505780636352211e1461067b5780636d84a6f8146106b857806370a08231146106e1576102c9565b8063444ed7af146105bd5780634df34e78146105e85780634f6ccce714610613576102c9565b80632750fc78146104c35780632cc82655146104ec5780632f745c591461051557806332b3cd1a146105525780633ccfd60b1461057d57806342842e0e14610594576102c9565b806318160ddd1161028657806318160ddd146103e15780631e69d2251461040c57806322c849cd1461042857806322f3e2d41461044457806323592c3c1461046f57806323b872dd1461049a576102c9565b806301ffc9a7146102ce5780630687c3381461030b57806306fdde0314610334578063081812fc1461035f578063095ea7b31461039c5780631124420c146103c5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906143cd565b610b54565b6040516103029190614b4e565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d91906143a4565b610b66565b005b34801561034057600080fd5b50610349610bff565b6040516103569190614b84565b60405180910390f35b34801561036b57600080fd5b506103866004803603810190610381919061448b565b610c91565b6040516103939190614ae7565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190614368565b610d16565b005b6103df60048036038101906103da91906144b4565b610e2e565b005b3480156103ed57600080fd5b506103f66111c0565b6040516104039190614f06565b60405180910390f35b610426600480360381019061042191906144b4565b6111cd565b005b610442600480360381019061043d91906144b4565b611510565b005b34801561045057600080fd5b50610459611853565b6040516104669190614b4e565b60405180910390f35b34801561047b57600080fd5b50610484611866565b6040516104919190614b4e565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190614262565b611879565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906143a4565b6118d9565b005b3480156104f857600080fd5b50610513600480360381019061050e919061448b565b611972565b005b34801561052157600080fd5b5061053c60048036038101906105379190614368565b611a49565b6040516105499190614f06565b60405180910390f35b34801561055e57600080fd5b50610567611aee565b6040516105749190614b4e565b60405180910390f35b34801561058957600080fd5b50610592611b01565b005b3480156105a057600080fd5b506105bb60048036038101906105b69190614262565b611be0565b005b3480156105c957600080fd5b506105d2611c00565b6040516105df9190614f06565b60405180910390f35b3480156105f457600080fd5b506105fd611c06565b60405161060a9190614b69565b60405180910390f35b34801561061f57600080fd5b5061063a6004803603810190610635919061448b565b611c0c565b6040516106479190614f06565b60405180910390f35b34801561065c57600080fd5b50610665611ca3565b6040516106729190614f06565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d919061448b565b611ca9565b6040516106af9190614ae7565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da91906143a4565b611d5b565b005b3480156106ed57600080fd5b50610708600480360381019061070391906141fd565b611df4565b6040516107159190614f06565b60405180910390f35b34801561072a57600080fd5b50610733611eac565b005b34801561074157600080fd5b5061075c600480360381019061075791906143a4565b611f34565b005b34801561076a57600080fd5b50610773611fcd565b6040516107809190614b69565b60405180910390f35b34801561079557600080fd5b5061079e611fd3565b6040516107ab9190614f06565b60405180910390f35b3480156107c057600080fd5b506107c9611fd8565b6040516107d69190614ae7565b60405180910390f35b3480156107eb57600080fd5b506107f4612002565b6040516108019190614b69565b60405180910390f35b34801561081657600080fd5b5061081f612008565b60405161082c9190614b4e565b60405180910390f35b34801561084157600080fd5b5061084a61201b565b6040516108579190614b84565b60405180910390f35b34801561086c57600080fd5b506108876004803603810190610882919061432c565b6120ad565b005b6108a3600480360381019061089e91906144b4565b61222e565b005b3480156108b157600080fd5b506108ba612575565b6040516108c79190614f06565b60405180910390f35b3480156108dc57600080fd5b506108e561257a565b6040516108f29190614b69565b60405180910390f35b34801561090757600080fd5b50610910612580565b60405161091d9190614b4e565b60405180910390f35b34801561093257600080fd5b5061094d600480360381019061094891906142b1565b612593565b005b34801561095b57600080fd5b506109766004803603810190610971919061448b565b6125f5565b6040516109839190614b84565b60405180910390f35b34801561099857600080fd5b506109a1612704565b6040516109ae9190614f06565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d9919061448b565b612709565b6040516109eb9190614f06565b60405180910390f35b348015610a0057600080fd5b50610a09612721565b604051610a169190614f06565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a4191906143a4565b612727565b005b348015610a5457600080fd5b50610a6f6004803603810190610a6a919061441f565b6127c0565b005b348015610a7d57600080fd5b50610a986004803603810190610a939190614226565b61286e565b604051610aa59190614b4e565b60405180910390f35b348015610aba57600080fd5b50610ad56004803603810190610ad09190614508565b612902565b005b348015610ae357600080fd5b50610afe6004803603810190610af991906141fd565b6129ac565b005b348015610b0c57600080fd5b50610b15612aa4565b604051610b229190614f06565b60405180910390f35b348015610b3757600080fd5b50610b526004803603810190610b4d9190614368565b612aa9565b005b6000610b5f82612c61565b9050919050565b610b6e612cdb565b73ffffffffffffffffffffffffffffffffffffffff16610b8c611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990614e06565b60405180910390fd5b80601060046101000a81548160ff02191690831515021790555050565b606060008054610c0e90615201565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3a90615201565b8015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b5050505050905090565b6000610c9c82612ce3565b610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290614de6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2182611ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8990614e66565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db1612cdb565b73ffffffffffffffffffffffffffffffffffffffff161480610de05750610ddf81610dda612cdb565b61286e565b5b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690614d26565b60405180910390fd5b610e298383612d4f565b505050565b601060039054906101000a900460ff16610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7490614cc6565b60405180910390fd5b601060049054906101000a900460ff16610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390614da6565b60405180910390fd5b610eff8160145433604051602001610ee49190614a91565b60405160208183030381529060405280519060200120612e08565b610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614d46565b60405180910390fd5b610f46612e1f565b610f6e8360176000601854815260200190815260200160002054612e6890919063ffffffff16565b1115610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690614ee6565b60405180910390fd5b6002821115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614ec6565b60405180910390fd5b600261105a8360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b111561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614c06565b60405180910390fd5b346110b6836110a8612e7e565b612ec790919063ffffffff16565b146110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90614ce6565b60405180910390fd5b60005b828110156111bb578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611163919061502c565b9250508190555060016017600060185481526020019081526020016000206000828254611190919061502c565b925050819055506111a8336111a36111c0565b612edd565b80806111b390615264565b9150506110f9565b505050565b6000600880549050905090565b601060039054906101000a900460ff1661121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614cc6565b60405180910390fd5b61124f81601354336040516020016112349190614a91565b60405160208183030381529060405280519060200120612e08565b61128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590614d46565b60405180910390fd5b611296612e1f565b6112be8360176000601854815260200190815260200160002054612e6890919063ffffffff16565b11156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614ee6565b60405180910390fd5b6002821115611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90614ec6565b60405180910390fd5b60026113aa8360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b11156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290614c06565b60405180910390fd5b34611406836113f8612e7e565b612ec790919063ffffffff16565b14611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d90614ce6565b60405180910390fd5b60005b8281101561150b578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b3919061502c565b92505081905550600160176000601854815260200190815260200160002060008282546114e0919061502c565b925050819055506114f8336114f36111c0565b612edd565b808061150390615264565b915050611449565b505050565b601060039054906101000a900460ff1661155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690614cc6565b60405180910390fd5b61159281601154336040516020016115779190614a91565b60405160208183030381529060405280519060200120612e08565b6115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614d46565b60405180910390fd5b6115d9612e1f565b6116018360176000601854815260200190815260200160002054612e6890919063ffffffff16565b1115611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990614ee6565b60405180910390fd5b6004821115611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90614ec6565b60405180910390fd5b60046116ed8360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b111561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614c06565b60405180910390fd5b346117498361173b612e7e565b612ec790919063ffffffff16565b14611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090614ce6565b60405180910390fd5b60005b8281101561184e578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f6919061502c565b9250508190555060016017600060185481526020019081526020016000206000828254611823919061502c565b9250508190555061183b336118366111c0565b612edd565b808061184690615264565b91505061178c565b505050565b601060039054906101000a900460ff1681565b601060019054906101000a900460ff1681565b61188a611884612cdb565b82612efb565b6118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090614e86565b60405180910390fd5b6118d4838383612fd9565b505050565b6118e1612cdb565b73ffffffffffffffffffffffffffffffffffffffff166118ff611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194c90614e06565b60405180910390fd5b80601060036101000a81548160ff02191690831515021790555050565b61197a612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611998611fd8565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590614e06565b60405180910390fd5b60018110158015611a00575060038111155b611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614ba6565b60405180910390fd5b8060188190555050565b6000611a5483611df4565b8210611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614bc6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601060009054906101000a900460ff1681565b611b09612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611b27611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7490614e06565b60405180910390fd5b60007374b6ee60c68e5aeb3aba65f99ee6112707866e9690508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611bdc573d6000803e3d6000fd5b5050565b611bfb83838360405180602001604052806000815250612593565b505050565b600e5481565b60125481565b6000611c166111c0565b8210611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614ea6565b60405180910390fd5b60088281548110611c91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990614d86565b60405180910390fd5b80915050919050565b611d63612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611d81611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614e06565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5c90614d66565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611eb4612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611ed2611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90614e06565b60405180910390fd5b611f326000613235565b565b611f3c612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611f5a611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa790614e06565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60135481565b600481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b601060049054906101000a900460ff1681565b60606001805461202a90615201565b80601f016020809104026020016040519081016040528092919081815260200182805461205690615201565b80156120a35780601f10612078576101008083540402835291602001916120a3565b820191906000526020600020905b81548152906001019060200180831161208657829003601f168201915b5050505050905090565b6120b5612cdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90614ca6565b60405180910390fd5b8060056000612130612cdb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121dd612cdb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122229190614b4e565b60405180910390a35050565b601060039054906101000a900460ff1661227d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227490614cc6565b60405180910390fd5b6122b081601254336040516020016122959190614a91565b60405160208183030381529060405280519060200120612e08565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690614d46565b60405180910390fd5b606460155410612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614c66565b60405180910390fd5b61233c612e1f565b6123648360176000601854815260200190815260200160002054612e6890919063ffffffff16565b11156123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c90614ee6565b60405180910390fd5b60018211156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090614ec6565b60405180910390fd5b60016124508360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b1115612491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248890614c06565b60405180910390fd5b60005b82811015612570578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fe919061502c565b925050819055506001601760006018548152602001908152602001600020600082825461252b919061502c565b92505081905550600160156000828254612545919061502c565b9250508190555061255d336125586111c0565b612edd565b808061256890615264565b915050612494565b505050565b600281565b60145481565b601060029054906101000a900460ff1681565b6125a461259e612cdb565b83612efb565b6125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90614e86565b60405180910390fd5b6125ef848484846132fb565b50505050565b606061260082612ce3565b61263f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263690614e46565b60405180910390fd5b6108ae8210801561265c5750601060009054906101000a900460ff165b8061268d5750610d056108ae612672919061502c565b8210801561268c5750601060019054906101000a900460ff165b5b806126a45750601060029054906101000a900460ff165b156126db57600b6126b483613357565b6040516020016126c5929190614ac3565b60405160208183030381529060405290506126ff565b600c6040516020016126ed9190614aac565b60405160208183030381529060405290505b919050565b600281565b60176020528060005260406000206000915090505481565b600d5481565b61272f612cdb565b73ffffffffffffffffffffffffffffffffffffffff1661274d611fd8565b73ffffffffffffffffffffffffffffffffffffffff16146127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614e06565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6127c8612cdb565b73ffffffffffffffffffffffffffffffffffffffff166127e6611fd8565b73ffffffffffffffffffffffffffffffffffffffff161461283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614e06565b60405180910390fd5b81600c9080519060200190612852929190613f76565b5080600b9080519060200190612869929190613f76565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61290a612cdb565b73ffffffffffffffffffffffffffffffffffffffff16612928611fd8565b73ffffffffffffffffffffffffffffffffffffffff161461297e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297590614e06565b60405180910390fd5b8360001b6011819055508260001b6012819055508160001b6013819055508060001b60148190555050505050565b6129b4612cdb565b73ffffffffffffffffffffffffffffffffffffffff166129d2611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f90614e06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90614c26565b60405180910390fd5b612aa181613235565b50565b600181565b612ab1612cdb565b73ffffffffffffffffffffffffffffffffffffffff16612acf611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90614e06565b60405180910390fd5b612b2d612e1f565b612b558260176000601854815260200190815260200160002054612e6890919063ffffffff16565b1115612b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8d90614ee6565b60405180910390fd5b60005b81811015612c5c57600160166000601854815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c04919061502c565b9250508190555060016017600060185481526020019081526020016000206000828254612c31919061502c565b92505081905550612c4983612c446111c0565b612edd565b8080612c5490615264565b915050612b99565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cd45750612cd382613504565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dc283611ca9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082612e1585846135e6565b1490509392505050565b600060016018541415612e36576108ae9050612e65565b60026018541415612e4b57610d059050612e65565b60036018541415612e6057610d059050612e65565b600090505b90565b60008183612e76919061502c565b905092915050565b600060016018541415612e9557600d549050612ec4565b60026018541415612eaa57600e549050612ec4565b60036018541415612ebf57600f549050612ec4565b600190505b90565b60008183612ed591906150b3565b905092915050565b612ef7828260405180602001604052806000815250613681565b5050565b6000612f0682612ce3565b612f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3c90614d06565b60405180910390fd5b6000612f5083611ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fbf57508373ffffffffffffffffffffffffffffffffffffffff16612fa784610c91565b73ffffffffffffffffffffffffffffffffffffffff16145b80612fd05750612fcf818561286e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ff982611ca9565b73ffffffffffffffffffffffffffffffffffffffff161461304f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304690614e26565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690614c86565b60405180910390fd5b6130ca8383836136dc565b6130d5600082612d4f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613125919061510d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461317c919061502c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613306848484612fd9565b613312848484846136ec565b613351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334890614be6565b60405180910390fd5b50505050565b6060600082141561339f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134ff565b600082905060005b600082146133d15780806133ba90615264565b915050600a826133ca9190615082565b91506133a7565b60008167ffffffffffffffff811115613413577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134455781602001600182028036833780820191505090505b5090505b600085146134f85760018261345e919061510d565b9150600a8561346d91906152d1565b6030613479919061502c565b60f81b8183815181106134b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134f19190615082565b9450613449565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806135cf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806135df57506135de82613883565b5b9050919050565b60008082905060005b8451811015613676576000858281518110613633577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116136555761364e83826138ed565b9250613662565b61365f81846138ed565b92505b50808061366e90615264565b9150506135ef565b508091505092915050565b61368b8383613904565b61369860008484846136ec565b6136d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ce90614be6565b60405180910390fd5b505050565b6136e7838383613ad2565b505050565b600061370d8473ffffffffffffffffffffffffffffffffffffffff16613be6565b15613876578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613736612cdb565b8786866040518563ffffffff1660e01b81526004016137589493929190614b02565b602060405180830381600087803b15801561377257600080fd5b505af19250505080156137a357506040513d601f19601f820116820180604052508101906137a091906143f6565b60015b613826573d80600081146137d3576040519150601f19603f3d011682016040523d82523d6000602084013e6137d8565b606091505b5060008151141561381e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381590614be6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061387b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396b90614dc6565b60405180910390fd5b61397d81612ce3565b156139bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b490614c46565b60405180910390fd5b6139c9600083836136dc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a19919061502c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613add838383613bf9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b2057613b1b81613bfe565b613b5f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b5e57613b5d8382613c47565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ba257613b9d81613db4565b613be1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613be057613bdf8282613ef7565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c5484611df4565b613c5e919061510d565b9050600060076000848152602001908152602001600020549050818114613d43576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613dc8919061510d565b9050600060096000848152602001908152602001600020549050600060088381548110613e1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613e66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613edb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613f0283611df4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613f8290615201565b90600052602060002090601f016020900481019282613fa45760008555613feb565b82601f10613fbd57805160ff1916838001178555613feb565b82800160010185558215613feb579182015b82811115613fea578251825591602001919060010190613fcf565b5b509050613ff89190613ffc565b5090565b5b80821115614015576000816000905550600101613ffd565b5090565b600061402c61402784614f46565b614f21565b9050808382526020820190508285602086028201111561404b57600080fd5b60005b8581101561407b57816140618882614155565b84526020840193506020830192505060018101905061404e565b5050509392505050565b600061409861409384614f72565b614f21565b9050828152602081018484840111156140b057600080fd5b6140bb8482856151bf565b509392505050565b60006140d66140d184614fa3565b614f21565b9050828152602081018484840111156140ee57600080fd5b6140f98482856151bf565b509392505050565b60008135905061411081615ab5565b92915050565b600082601f83011261412757600080fd5b8135614137848260208601614019565b91505092915050565b60008135905061414f81615acc565b92915050565b60008135905061416481615ae3565b92915050565b60008135905061417981615afa565b92915050565b60008151905061418e81615afa565b92915050565b600082601f8301126141a557600080fd5b81356141b5848260208601614085565b91505092915050565b600082601f8301126141cf57600080fd5b81356141df8482602086016140c3565b91505092915050565b6000813590506141f781615b11565b92915050565b60006020828403121561420f57600080fd5b600061421d84828501614101565b91505092915050565b6000806040838503121561423957600080fd5b600061424785828601614101565b925050602061425885828601614101565b9150509250929050565b60008060006060848603121561427757600080fd5b600061428586828701614101565b935050602061429686828701614101565b92505060406142a7868287016141e8565b9150509250925092565b600080600080608085870312156142c757600080fd5b60006142d587828801614101565b94505060206142e687828801614101565b93505060406142f7878288016141e8565b925050606085013567ffffffffffffffff81111561431457600080fd5b61432087828801614194565b91505092959194509250565b6000806040838503121561433f57600080fd5b600061434d85828601614101565b925050602061435e85828601614140565b9150509250929050565b6000806040838503121561437b57600080fd5b600061438985828601614101565b925050602061439a858286016141e8565b9150509250929050565b6000602082840312156143b657600080fd5b60006143c484828501614140565b91505092915050565b6000602082840312156143df57600080fd5b60006143ed8482850161416a565b91505092915050565b60006020828403121561440857600080fd5b60006144168482850161417f565b91505092915050565b6000806040838503121561443257600080fd5b600083013567ffffffffffffffff81111561444c57600080fd5b614458858286016141be565b925050602083013567ffffffffffffffff81111561447557600080fd5b614481858286016141be565b9150509250929050565b60006020828403121561449d57600080fd5b60006144ab848285016141e8565b91505092915050565b600080604083850312156144c757600080fd5b60006144d5858286016141e8565b925050602083013567ffffffffffffffff8111156144f257600080fd5b6144fe85828601614116565b9150509250929050565b6000806000806080858703121561451e57600080fd5b600061452c878288016141e8565b945050602061453d878288016141e8565b935050604061454e878288016141e8565b925050606061455f878288016141e8565b91505092959194509250565b61457481615141565b82525050565b61458b61458682615141565b6152ad565b82525050565b61459a81615153565b82525050565b6145a98161515f565b82525050565b60006145ba82614fe9565b6145c48185614fff565b93506145d48185602086016151ce565b6145dd816153be565b840191505092915050565b60006145f382614ff4565b6145fd8185615010565b935061460d8185602086016151ce565b614616816153be565b840191505092915050565b600061462c82614ff4565b6146368185615021565b93506146468185602086016151ce565b80840191505092915050565b6000815461465f81615201565b6146698186615021565b945060018216600081146146845760018114614695576146c8565b60ff198316865281860193506146c8565b61469e85614fd4565b60005b838110156146c0578154818901526001820191506020810190506146a1565b838801955050505b50505092915050565b60006146de600b83615010565b91506146e9826153dc565b602082019050919050565b6000614701602b83615010565b915061470c82615405565b604082019050919050565b6000614724603283615010565b915061472f82615454565b604082019050919050565b6000614747601c83615010565b9150614752826154a3565b602082019050919050565b600061476a602683615010565b9150614775826154cc565b604082019050919050565b600061478d601c83615010565b91506147988261551b565b602082019050919050565b60006147b0602083615010565b91506147bb82615544565b602082019050919050565b60006147d3602483615010565b91506147de8261556d565b604082019050919050565b60006147f6601983615010565b9150614801826155bc565b602082019050919050565b6000614819601283615010565b9150614824826155e5565b602082019050919050565b600061483c601f83615010565b91506148478261560e565b602082019050919050565b600061485f602c83615010565b915061486a82615637565b604082019050919050565b6000614882603883615010565b915061488d82615686565b604082019050919050565b60006148a5600f83615010565b91506148b0826156d5565b602082019050919050565b60006148c8602a83615010565b91506148d3826156fe565b604082019050919050565b60006148eb602983615010565b91506148f68261574d565b604082019050919050565b600061490e602483615010565b91506149198261579c565b604082019050919050565b6000614931602083615010565b915061493c826157eb565b602082019050919050565b6000614954602c83615010565b915061495f82615814565b604082019050919050565b6000614977602083615010565b915061498282615863565b602082019050919050565b600061499a602983615010565b91506149a58261588c565b604082019050919050565b60006149bd602f83615010565b91506149c8826158db565b604082019050919050565b60006149e0602183615010565b91506149eb8261592a565b604082019050919050565b6000614a03603183615010565b9150614a0e82615979565b604082019050919050565b6000614a26602c83615010565b9150614a31826159c8565b604082019050919050565b6000614a49602083615010565b9150614a5482615a17565b602082019050919050565b6000614a6c604283615010565b9150614a7782615a40565b606082019050919050565b614a8b816151b5565b82525050565b6000614a9d828461457a565b60148201915081905092915050565b6000614ab88284614652565b915081905092915050565b6000614acf8285614652565b9150614adb8284614621565b91508190509392505050565b6000602082019050614afc600083018461456b565b92915050565b6000608082019050614b17600083018761456b565b614b24602083018661456b565b614b316040830185614a82565b8181036060830152614b4381846145af565b905095945050505050565b6000602082019050614b636000830184614591565b92915050565b6000602082019050614b7e60008301846145a0565b92915050565b60006020820190508181036000830152614b9e81846145e8565b905092915050565b60006020820190508181036000830152614bbf816146d1565b9050919050565b60006020820190508181036000830152614bdf816146f4565b9050919050565b60006020820190508181036000830152614bff81614717565b9050919050565b60006020820190508181036000830152614c1f8161473a565b9050919050565b60006020820190508181036000830152614c3f8161475d565b9050919050565b60006020820190508181036000830152614c5f81614780565b9050919050565b60006020820190508181036000830152614c7f816147a3565b9050919050565b60006020820190508181036000830152614c9f816147c6565b9050919050565b60006020820190508181036000830152614cbf816147e9565b9050919050565b60006020820190508181036000830152614cdf8161480c565b9050919050565b60006020820190508181036000830152614cff8161482f565b9050919050565b60006020820190508181036000830152614d1f81614852565b9050919050565b60006020820190508181036000830152614d3f81614875565b9050919050565b60006020820190508181036000830152614d5f81614898565b9050919050565b60006020820190508181036000830152614d7f816148bb565b9050919050565b60006020820190508181036000830152614d9f816148de565b9050919050565b60006020820190508181036000830152614dbf81614901565b9050919050565b60006020820190508181036000830152614ddf81614924565b9050919050565b60006020820190508181036000830152614dff81614947565b9050919050565b60006020820190508181036000830152614e1f8161496a565b9050919050565b60006020820190508181036000830152614e3f8161498d565b9050919050565b60006020820190508181036000830152614e5f816149b0565b9050919050565b60006020820190508181036000830152614e7f816149d3565b9050919050565b60006020820190508181036000830152614e9f816149f6565b9050919050565b60006020820190508181036000830152614ebf81614a19565b9050919050565b60006020820190508181036000830152614edf81614a3c565b9050919050565b60006020820190508181036000830152614eff81614a5f565b9050919050565b6000602082019050614f1b6000830184614a82565b92915050565b6000614f2b614f3c565b9050614f378282615233565b919050565b6000604051905090565b600067ffffffffffffffff821115614f6157614f6061538f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f8d57614f8c61538f565b5b614f96826153be565b9050602081019050919050565b600067ffffffffffffffff821115614fbe57614fbd61538f565b5b614fc7826153be565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615037826151b5565b9150615042836151b5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561507757615076615302565b5b828201905092915050565b600061508d826151b5565b9150615098836151b5565b9250826150a8576150a7615331565b5b828204905092915050565b60006150be826151b5565b91506150c9836151b5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561510257615101615302565b5b828202905092915050565b6000615118826151b5565b9150615123836151b5565b92508282101561513657615135615302565b5b828203905092915050565b600061514c82615195565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151ec5780820151818401526020810190506151d1565b838111156151fb576000848401525b50505050565b6000600282049050600182168061521957607f821691505b6020821081141561522d5761522c615360565b5b50919050565b61523c826153be565b810181811067ffffffffffffffff8211171561525b5761525a61538f565b5b80604052505050565b600061526f826151b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152a2576152a1615302565b5b600182019050919050565b60006152b8826152bf565b9050919050565b60006152ca826153cf565b9050919050565b60006152dc826151b5565b91506152e7836151b5565b9250826152f7576152f6615331565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57726f6e67207068617365000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d6178207768697465656400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f416c6c206672656520746f6b656e732068617665206265656e206d696e746564600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f526166666c652077696e6e6572732070726573616c65206973206e6f7420616360008201527f7469766500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b7f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360008201527f656564206e756d626572206f66204d415820746f6b656e73207065722070686160208201527f7365000000000000000000000000000000000000000000000000000000000000604082015250565b615abe81615141565b8114615ac957600080fd5b50565b615ad581615153565b8114615ae057600080fd5b50565b615aec8161515f565b8114615af757600080fd5b50565b615b0381615169565b8114615b0e57600080fd5b50565b615b1a816151b5565b8114615b2557600080fd5b5056fea26469706673582212202ed84473cd4af513528656142a2a35d37c9c961ff9cd36124ec0ed49de914b7a64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102c95760003560e01c8063715018a611610175578063b231d37f116100dc578063dbea564711610095578063f0bd3d711161006f578063f0bd3d7114610aae578063f2fde38b14610ad7578063f4f4d10714610b00578063fdfc12e214610b2b576102c9565b8063dbea564714610a1f578063e825417414610a48578063e985e9c514610a71576102c9565b8063b231d37f146108fb578063b88d4fde14610926578063c87b56dd1461094f578063cd855e7b1461098c578063d3919472146109b7578063d42e04b7146109f4576102c9565b8063909b29901161012e578063909b29901461080a57806395d89b4114610835578063a22cb46514610860578063ada8afe114610889578063aeb16768146108a5578063b1a3e15a146108d0576102c9565b8063715018a61461071e57806381f962191461073557806382c309871461075e5780638712a356146107895780638da5cb5b146107b4578063903afdc0146107df576102c9565b80632750fc7811610234578063444ed7af116101ed5780635301ceb6116101c75780635301ceb6146106505780636352211e1461067b5780636d84a6f8146106b857806370a08231146106e1576102c9565b8063444ed7af146105bd5780634df34e78146105e85780634f6ccce714610613576102c9565b80632750fc78146104c35780632cc82655146104ec5780632f745c591461051557806332b3cd1a146105525780633ccfd60b1461057d57806342842e0e14610594576102c9565b806318160ddd1161028657806318160ddd146103e15780631e69d2251461040c57806322c849cd1461042857806322f3e2d41461044457806323592c3c1461046f57806323b872dd1461049a576102c9565b806301ffc9a7146102ce5780630687c3381461030b57806306fdde0314610334578063081812fc1461035f578063095ea7b31461039c5780631124420c146103c5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906143cd565b610b54565b6040516103029190614b4e565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d91906143a4565b610b66565b005b34801561034057600080fd5b50610349610bff565b6040516103569190614b84565b60405180910390f35b34801561036b57600080fd5b506103866004803603810190610381919061448b565b610c91565b6040516103939190614ae7565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190614368565b610d16565b005b6103df60048036038101906103da91906144b4565b610e2e565b005b3480156103ed57600080fd5b506103f66111c0565b6040516104039190614f06565b60405180910390f35b610426600480360381019061042191906144b4565b6111cd565b005b610442600480360381019061043d91906144b4565b611510565b005b34801561045057600080fd5b50610459611853565b6040516104669190614b4e565b60405180910390f35b34801561047b57600080fd5b50610484611866565b6040516104919190614b4e565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190614262565b611879565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906143a4565b6118d9565b005b3480156104f857600080fd5b50610513600480360381019061050e919061448b565b611972565b005b34801561052157600080fd5b5061053c60048036038101906105379190614368565b611a49565b6040516105499190614f06565b60405180910390f35b34801561055e57600080fd5b50610567611aee565b6040516105749190614b4e565b60405180910390f35b34801561058957600080fd5b50610592611b01565b005b3480156105a057600080fd5b506105bb60048036038101906105b69190614262565b611be0565b005b3480156105c957600080fd5b506105d2611c00565b6040516105df9190614f06565b60405180910390f35b3480156105f457600080fd5b506105fd611c06565b60405161060a9190614b69565b60405180910390f35b34801561061f57600080fd5b5061063a6004803603810190610635919061448b565b611c0c565b6040516106479190614f06565b60405180910390f35b34801561065c57600080fd5b50610665611ca3565b6040516106729190614f06565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d919061448b565b611ca9565b6040516106af9190614ae7565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da91906143a4565b611d5b565b005b3480156106ed57600080fd5b50610708600480360381019061070391906141fd565b611df4565b6040516107159190614f06565b60405180910390f35b34801561072a57600080fd5b50610733611eac565b005b34801561074157600080fd5b5061075c600480360381019061075791906143a4565b611f34565b005b34801561076a57600080fd5b50610773611fcd565b6040516107809190614b69565b60405180910390f35b34801561079557600080fd5b5061079e611fd3565b6040516107ab9190614f06565b60405180910390f35b3480156107c057600080fd5b506107c9611fd8565b6040516107d69190614ae7565b60405180910390f35b3480156107eb57600080fd5b506107f4612002565b6040516108019190614b69565b60405180910390f35b34801561081657600080fd5b5061081f612008565b60405161082c9190614b4e565b60405180910390f35b34801561084157600080fd5b5061084a61201b565b6040516108579190614b84565b60405180910390f35b34801561086c57600080fd5b506108876004803603810190610882919061432c565b6120ad565b005b6108a3600480360381019061089e91906144b4565b61222e565b005b3480156108b157600080fd5b506108ba612575565b6040516108c79190614f06565b60405180910390f35b3480156108dc57600080fd5b506108e561257a565b6040516108f29190614b69565b60405180910390f35b34801561090757600080fd5b50610910612580565b60405161091d9190614b4e565b60405180910390f35b34801561093257600080fd5b5061094d600480360381019061094891906142b1565b612593565b005b34801561095b57600080fd5b506109766004803603810190610971919061448b565b6125f5565b6040516109839190614b84565b60405180910390f35b34801561099857600080fd5b506109a1612704565b6040516109ae9190614f06565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d9919061448b565b612709565b6040516109eb9190614f06565b60405180910390f35b348015610a0057600080fd5b50610a09612721565b604051610a169190614f06565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a4191906143a4565b612727565b005b348015610a5457600080fd5b50610a6f6004803603810190610a6a919061441f565b6127c0565b005b348015610a7d57600080fd5b50610a986004803603810190610a939190614226565b61286e565b604051610aa59190614b4e565b60405180910390f35b348015610aba57600080fd5b50610ad56004803603810190610ad09190614508565b612902565b005b348015610ae357600080fd5b50610afe6004803603810190610af991906141fd565b6129ac565b005b348015610b0c57600080fd5b50610b15612aa4565b604051610b229190614f06565b60405180910390f35b348015610b3757600080fd5b50610b526004803603810190610b4d9190614368565b612aa9565b005b6000610b5f82612c61565b9050919050565b610b6e612cdb565b73ffffffffffffffffffffffffffffffffffffffff16610b8c611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990614e06565b60405180910390fd5b80601060046101000a81548160ff02191690831515021790555050565b606060008054610c0e90615201565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3a90615201565b8015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b5050505050905090565b6000610c9c82612ce3565b610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290614de6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2182611ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8990614e66565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db1612cdb565b73ffffffffffffffffffffffffffffffffffffffff161480610de05750610ddf81610dda612cdb565b61286e565b5b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690614d26565b60405180910390fd5b610e298383612d4f565b505050565b601060039054906101000a900460ff16610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7490614cc6565b60405180910390fd5b601060049054906101000a900460ff16610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390614da6565b60405180910390fd5b610eff8160145433604051602001610ee49190614a91565b60405160208183030381529060405280519060200120612e08565b610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614d46565b60405180910390fd5b610f46612e1f565b610f6e8360176000601854815260200190815260200160002054612e6890919063ffffffff16565b1115610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690614ee6565b60405180910390fd5b6002821115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614ec6565b60405180910390fd5b600261105a8360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b111561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614c06565b60405180910390fd5b346110b6836110a8612e7e565b612ec790919063ffffffff16565b146110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90614ce6565b60405180910390fd5b60005b828110156111bb578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611163919061502c565b9250508190555060016017600060185481526020019081526020016000206000828254611190919061502c565b925050819055506111a8336111a36111c0565b612edd565b80806111b390615264565b9150506110f9565b505050565b6000600880549050905090565b601060039054906101000a900460ff1661121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614cc6565b60405180910390fd5b61124f81601354336040516020016112349190614a91565b60405160208183030381529060405280519060200120612e08565b61128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590614d46565b60405180910390fd5b611296612e1f565b6112be8360176000601854815260200190815260200160002054612e6890919063ffffffff16565b11156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614ee6565b60405180910390fd5b6002821115611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90614ec6565b60405180910390fd5b60026113aa8360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b11156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290614c06565b60405180910390fd5b34611406836113f8612e7e565b612ec790919063ffffffff16565b14611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d90614ce6565b60405180910390fd5b60005b8281101561150b578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b3919061502c565b92505081905550600160176000601854815260200190815260200160002060008282546114e0919061502c565b925050819055506114f8336114f36111c0565b612edd565b808061150390615264565b915050611449565b505050565b601060039054906101000a900460ff1661155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690614cc6565b60405180910390fd5b61159281601154336040516020016115779190614a91565b60405160208183030381529060405280519060200120612e08565b6115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614d46565b60405180910390fd5b6115d9612e1f565b6116018360176000601854815260200190815260200160002054612e6890919063ffffffff16565b1115611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990614ee6565b60405180910390fd5b6004821115611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90614ec6565b60405180910390fd5b60046116ed8360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b111561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614c06565b60405180910390fd5b346117498361173b612e7e565b612ec790919063ffffffff16565b14611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090614ce6565b60405180910390fd5b60005b8281101561184e578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f6919061502c565b9250508190555060016017600060185481526020019081526020016000206000828254611823919061502c565b9250508190555061183b336118366111c0565b612edd565b808061184690615264565b91505061178c565b505050565b601060039054906101000a900460ff1681565b601060019054906101000a900460ff1681565b61188a611884612cdb565b82612efb565b6118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090614e86565b60405180910390fd5b6118d4838383612fd9565b505050565b6118e1612cdb565b73ffffffffffffffffffffffffffffffffffffffff166118ff611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194c90614e06565b60405180910390fd5b80601060036101000a81548160ff02191690831515021790555050565b61197a612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611998611fd8565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590614e06565b60405180910390fd5b60018110158015611a00575060038111155b611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614ba6565b60405180910390fd5b8060188190555050565b6000611a5483611df4565b8210611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614bc6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601060009054906101000a900460ff1681565b611b09612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611b27611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7490614e06565b60405180910390fd5b60007374b6ee60c68e5aeb3aba65f99ee6112707866e9690508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611bdc573d6000803e3d6000fd5b5050565b611bfb83838360405180602001604052806000815250612593565b505050565b600e5481565b60125481565b6000611c166111c0565b8210611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614ea6565b60405180910390fd5b60088281548110611c91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990614d86565b60405180910390fd5b80915050919050565b611d63612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611d81611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614e06565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5c90614d66565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611eb4612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611ed2611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90614e06565b60405180910390fd5b611f326000613235565b565b611f3c612cdb565b73ffffffffffffffffffffffffffffffffffffffff16611f5a611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa790614e06565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60135481565b600481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b601060049054906101000a900460ff1681565b60606001805461202a90615201565b80601f016020809104026020016040519081016040528092919081815260200182805461205690615201565b80156120a35780601f10612078576101008083540402835291602001916120a3565b820191906000526020600020905b81548152906001019060200180831161208657829003601f168201915b5050505050905090565b6120b5612cdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90614ca6565b60405180910390fd5b8060056000612130612cdb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121dd612cdb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122229190614b4e565b60405180910390a35050565b601060039054906101000a900460ff1661227d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227490614cc6565b60405180910390fd5b6122b081601254336040516020016122959190614a91565b60405160208183030381529060405280519060200120612e08565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690614d46565b60405180910390fd5b606460155410612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614c66565b60405180910390fd5b61233c612e1f565b6123648360176000601854815260200190815260200160002054612e6890919063ffffffff16565b11156123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c90614ee6565b60405180910390fd5b60018211156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090614ec6565b60405180910390fd5b60016124508360166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6890919063ffffffff16565b1115612491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248890614c06565b60405180910390fd5b60005b82811015612570578260166000601854815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fe919061502c565b925050819055506001601760006018548152602001908152602001600020600082825461252b919061502c565b92505081905550600160156000828254612545919061502c565b9250508190555061255d336125586111c0565b612edd565b808061256890615264565b915050612494565b505050565b600281565b60145481565b601060029054906101000a900460ff1681565b6125a461259e612cdb565b83612efb565b6125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90614e86565b60405180910390fd5b6125ef848484846132fb565b50505050565b606061260082612ce3565b61263f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263690614e46565b60405180910390fd5b6108ae8210801561265c5750601060009054906101000a900460ff165b8061268d5750610d056108ae612672919061502c565b8210801561268c5750601060019054906101000a900460ff165b5b806126a45750601060029054906101000a900460ff165b156126db57600b6126b483613357565b6040516020016126c5929190614ac3565b60405160208183030381529060405290506126ff565b600c6040516020016126ed9190614aac565b60405160208183030381529060405290505b919050565b600281565b60176020528060005260406000206000915090505481565b600d5481565b61272f612cdb565b73ffffffffffffffffffffffffffffffffffffffff1661274d611fd8565b73ffffffffffffffffffffffffffffffffffffffff16146127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614e06565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6127c8612cdb565b73ffffffffffffffffffffffffffffffffffffffff166127e6611fd8565b73ffffffffffffffffffffffffffffffffffffffff161461283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614e06565b60405180910390fd5b81600c9080519060200190612852929190613f76565b5080600b9080519060200190612869929190613f76565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61290a612cdb565b73ffffffffffffffffffffffffffffffffffffffff16612928611fd8565b73ffffffffffffffffffffffffffffffffffffffff161461297e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297590614e06565b60405180910390fd5b8360001b6011819055508260001b6012819055508160001b6013819055508060001b60148190555050505050565b6129b4612cdb565b73ffffffffffffffffffffffffffffffffffffffff166129d2611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f90614e06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90614c26565b60405180910390fd5b612aa181613235565b50565b600181565b612ab1612cdb565b73ffffffffffffffffffffffffffffffffffffffff16612acf611fd8565b73ffffffffffffffffffffffffffffffffffffffff1614612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90614e06565b60405180910390fd5b612b2d612e1f565b612b558260176000601854815260200190815260200160002054612e6890919063ffffffff16565b1115612b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8d90614ee6565b60405180910390fd5b60005b81811015612c5c57600160166000601854815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c04919061502c565b9250508190555060016017600060185481526020019081526020016000206000828254612c31919061502c565b92505081905550612c4983612c446111c0565b612edd565b8080612c5490615264565b915050612b99565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cd45750612cd382613504565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dc283611ca9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082612e1585846135e6565b1490509392505050565b600060016018541415612e36576108ae9050612e65565b60026018541415612e4b57610d059050612e65565b60036018541415612e6057610d059050612e65565b600090505b90565b60008183612e76919061502c565b905092915050565b600060016018541415612e9557600d549050612ec4565b60026018541415612eaa57600e549050612ec4565b60036018541415612ebf57600f549050612ec4565b600190505b90565b60008183612ed591906150b3565b905092915050565b612ef7828260405180602001604052806000815250613681565b5050565b6000612f0682612ce3565b612f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3c90614d06565b60405180910390fd5b6000612f5083611ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fbf57508373ffffffffffffffffffffffffffffffffffffffff16612fa784610c91565b73ffffffffffffffffffffffffffffffffffffffff16145b80612fd05750612fcf818561286e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ff982611ca9565b73ffffffffffffffffffffffffffffffffffffffff161461304f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304690614e26565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690614c86565b60405180910390fd5b6130ca8383836136dc565b6130d5600082612d4f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613125919061510d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461317c919061502c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613306848484612fd9565b613312848484846136ec565b613351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334890614be6565b60405180910390fd5b50505050565b6060600082141561339f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134ff565b600082905060005b600082146133d15780806133ba90615264565b915050600a826133ca9190615082565b91506133a7565b60008167ffffffffffffffff811115613413577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134455781602001600182028036833780820191505090505b5090505b600085146134f85760018261345e919061510d565b9150600a8561346d91906152d1565b6030613479919061502c565b60f81b8183815181106134b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134f19190615082565b9450613449565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806135cf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806135df57506135de82613883565b5b9050919050565b60008082905060005b8451811015613676576000858281518110613633577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116136555761364e83826138ed565b9250613662565b61365f81846138ed565b92505b50808061366e90615264565b9150506135ef565b508091505092915050565b61368b8383613904565b61369860008484846136ec565b6136d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ce90614be6565b60405180910390fd5b505050565b6136e7838383613ad2565b505050565b600061370d8473ffffffffffffffffffffffffffffffffffffffff16613be6565b15613876578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613736612cdb565b8786866040518563ffffffff1660e01b81526004016137589493929190614b02565b602060405180830381600087803b15801561377257600080fd5b505af19250505080156137a357506040513d601f19601f820116820180604052508101906137a091906143f6565b60015b613826573d80600081146137d3576040519150601f19603f3d011682016040523d82523d6000602084013e6137d8565b606091505b5060008151141561381e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381590614be6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061387b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396b90614dc6565b60405180910390fd5b61397d81612ce3565b156139bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b490614c46565b60405180910390fd5b6139c9600083836136dc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a19919061502c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613add838383613bf9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b2057613b1b81613bfe565b613b5f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b5e57613b5d8382613c47565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ba257613b9d81613db4565b613be1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613be057613bdf8282613ef7565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c5484611df4565b613c5e919061510d565b9050600060076000848152602001908152602001600020549050818114613d43576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613dc8919061510d565b9050600060096000848152602001908152602001600020549050600060088381548110613e1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613e66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613edb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613f0283611df4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613f8290615201565b90600052602060002090601f016020900481019282613fa45760008555613feb565b82601f10613fbd57805160ff1916838001178555613feb565b82800160010185558215613feb579182015b82811115613fea578251825591602001919060010190613fcf565b5b509050613ff89190613ffc565b5090565b5b80821115614015576000816000905550600101613ffd565b5090565b600061402c61402784614f46565b614f21565b9050808382526020820190508285602086028201111561404b57600080fd5b60005b8581101561407b57816140618882614155565b84526020840193506020830192505060018101905061404e565b5050509392505050565b600061409861409384614f72565b614f21565b9050828152602081018484840111156140b057600080fd5b6140bb8482856151bf565b509392505050565b60006140d66140d184614fa3565b614f21565b9050828152602081018484840111156140ee57600080fd5b6140f98482856151bf565b509392505050565b60008135905061411081615ab5565b92915050565b600082601f83011261412757600080fd5b8135614137848260208601614019565b91505092915050565b60008135905061414f81615acc565b92915050565b60008135905061416481615ae3565b92915050565b60008135905061417981615afa565b92915050565b60008151905061418e81615afa565b92915050565b600082601f8301126141a557600080fd5b81356141b5848260208601614085565b91505092915050565b600082601f8301126141cf57600080fd5b81356141df8482602086016140c3565b91505092915050565b6000813590506141f781615b11565b92915050565b60006020828403121561420f57600080fd5b600061421d84828501614101565b91505092915050565b6000806040838503121561423957600080fd5b600061424785828601614101565b925050602061425885828601614101565b9150509250929050565b60008060006060848603121561427757600080fd5b600061428586828701614101565b935050602061429686828701614101565b92505060406142a7868287016141e8565b9150509250925092565b600080600080608085870312156142c757600080fd5b60006142d587828801614101565b94505060206142e687828801614101565b93505060406142f7878288016141e8565b925050606085013567ffffffffffffffff81111561431457600080fd5b61432087828801614194565b91505092959194509250565b6000806040838503121561433f57600080fd5b600061434d85828601614101565b925050602061435e85828601614140565b9150509250929050565b6000806040838503121561437b57600080fd5b600061438985828601614101565b925050602061439a858286016141e8565b9150509250929050565b6000602082840312156143b657600080fd5b60006143c484828501614140565b91505092915050565b6000602082840312156143df57600080fd5b60006143ed8482850161416a565b91505092915050565b60006020828403121561440857600080fd5b60006144168482850161417f565b91505092915050565b6000806040838503121561443257600080fd5b600083013567ffffffffffffffff81111561444c57600080fd5b614458858286016141be565b925050602083013567ffffffffffffffff81111561447557600080fd5b614481858286016141be565b9150509250929050565b60006020828403121561449d57600080fd5b60006144ab848285016141e8565b91505092915050565b600080604083850312156144c757600080fd5b60006144d5858286016141e8565b925050602083013567ffffffffffffffff8111156144f257600080fd5b6144fe85828601614116565b9150509250929050565b6000806000806080858703121561451e57600080fd5b600061452c878288016141e8565b945050602061453d878288016141e8565b935050604061454e878288016141e8565b925050606061455f878288016141e8565b91505092959194509250565b61457481615141565b82525050565b61458b61458682615141565b6152ad565b82525050565b61459a81615153565b82525050565b6145a98161515f565b82525050565b60006145ba82614fe9565b6145c48185614fff565b93506145d48185602086016151ce565b6145dd816153be565b840191505092915050565b60006145f382614ff4565b6145fd8185615010565b935061460d8185602086016151ce565b614616816153be565b840191505092915050565b600061462c82614ff4565b6146368185615021565b93506146468185602086016151ce565b80840191505092915050565b6000815461465f81615201565b6146698186615021565b945060018216600081146146845760018114614695576146c8565b60ff198316865281860193506146c8565b61469e85614fd4565b60005b838110156146c0578154818901526001820191506020810190506146a1565b838801955050505b50505092915050565b60006146de600b83615010565b91506146e9826153dc565b602082019050919050565b6000614701602b83615010565b915061470c82615405565b604082019050919050565b6000614724603283615010565b915061472f82615454565b604082019050919050565b6000614747601c83615010565b9150614752826154a3565b602082019050919050565b600061476a602683615010565b9150614775826154cc565b604082019050919050565b600061478d601c83615010565b91506147988261551b565b602082019050919050565b60006147b0602083615010565b91506147bb82615544565b602082019050919050565b60006147d3602483615010565b91506147de8261556d565b604082019050919050565b60006147f6601983615010565b9150614801826155bc565b602082019050919050565b6000614819601283615010565b9150614824826155e5565b602082019050919050565b600061483c601f83615010565b91506148478261560e565b602082019050919050565b600061485f602c83615010565b915061486a82615637565b604082019050919050565b6000614882603883615010565b915061488d82615686565b604082019050919050565b60006148a5600f83615010565b91506148b0826156d5565b602082019050919050565b60006148c8602a83615010565b91506148d3826156fe565b604082019050919050565b60006148eb602983615010565b91506148f68261574d565b604082019050919050565b600061490e602483615010565b91506149198261579c565b604082019050919050565b6000614931602083615010565b915061493c826157eb565b602082019050919050565b6000614954602c83615010565b915061495f82615814565b604082019050919050565b6000614977602083615010565b915061498282615863565b602082019050919050565b600061499a602983615010565b91506149a58261588c565b604082019050919050565b60006149bd602f83615010565b91506149c8826158db565b604082019050919050565b60006149e0602183615010565b91506149eb8261592a565b604082019050919050565b6000614a03603183615010565b9150614a0e82615979565b604082019050919050565b6000614a26602c83615010565b9150614a31826159c8565b604082019050919050565b6000614a49602083615010565b9150614a5482615a17565b602082019050919050565b6000614a6c604283615010565b9150614a7782615a40565b606082019050919050565b614a8b816151b5565b82525050565b6000614a9d828461457a565b60148201915081905092915050565b6000614ab88284614652565b915081905092915050565b6000614acf8285614652565b9150614adb8284614621565b91508190509392505050565b6000602082019050614afc600083018461456b565b92915050565b6000608082019050614b17600083018761456b565b614b24602083018661456b565b614b316040830185614a82565b8181036060830152614b4381846145af565b905095945050505050565b6000602082019050614b636000830184614591565b92915050565b6000602082019050614b7e60008301846145a0565b92915050565b60006020820190508181036000830152614b9e81846145e8565b905092915050565b60006020820190508181036000830152614bbf816146d1565b9050919050565b60006020820190508181036000830152614bdf816146f4565b9050919050565b60006020820190508181036000830152614bff81614717565b9050919050565b60006020820190508181036000830152614c1f8161473a565b9050919050565b60006020820190508181036000830152614c3f8161475d565b9050919050565b60006020820190508181036000830152614c5f81614780565b9050919050565b60006020820190508181036000830152614c7f816147a3565b9050919050565b60006020820190508181036000830152614c9f816147c6565b9050919050565b60006020820190508181036000830152614cbf816147e9565b9050919050565b60006020820190508181036000830152614cdf8161480c565b9050919050565b60006020820190508181036000830152614cff8161482f565b9050919050565b60006020820190508181036000830152614d1f81614852565b9050919050565b60006020820190508181036000830152614d3f81614875565b9050919050565b60006020820190508181036000830152614d5f81614898565b9050919050565b60006020820190508181036000830152614d7f816148bb565b9050919050565b60006020820190508181036000830152614d9f816148de565b9050919050565b60006020820190508181036000830152614dbf81614901565b9050919050565b60006020820190508181036000830152614ddf81614924565b9050919050565b60006020820190508181036000830152614dff81614947565b9050919050565b60006020820190508181036000830152614e1f8161496a565b9050919050565b60006020820190508181036000830152614e3f8161498d565b9050919050565b60006020820190508181036000830152614e5f816149b0565b9050919050565b60006020820190508181036000830152614e7f816149d3565b9050919050565b60006020820190508181036000830152614e9f816149f6565b9050919050565b60006020820190508181036000830152614ebf81614a19565b9050919050565b60006020820190508181036000830152614edf81614a3c565b9050919050565b60006020820190508181036000830152614eff81614a5f565b9050919050565b6000602082019050614f1b6000830184614a82565b92915050565b6000614f2b614f3c565b9050614f378282615233565b919050565b6000604051905090565b600067ffffffffffffffff821115614f6157614f6061538f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f8d57614f8c61538f565b5b614f96826153be565b9050602081019050919050565b600067ffffffffffffffff821115614fbe57614fbd61538f565b5b614fc7826153be565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615037826151b5565b9150615042836151b5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561507757615076615302565b5b828201905092915050565b600061508d826151b5565b9150615098836151b5565b9250826150a8576150a7615331565b5b828204905092915050565b60006150be826151b5565b91506150c9836151b5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561510257615101615302565b5b828202905092915050565b6000615118826151b5565b9150615123836151b5565b92508282101561513657615135615302565b5b828203905092915050565b600061514c82615195565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151ec5780820151818401526020810190506151d1565b838111156151fb576000848401525b50505050565b6000600282049050600182168061521957607f821691505b6020821081141561522d5761522c615360565b5b50919050565b61523c826153be565b810181811067ffffffffffffffff8211171561525b5761525a61538f565b5b80604052505050565b600061526f826151b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152a2576152a1615302565b5b600182019050919050565b60006152b8826152bf565b9050919050565b60006152ca826153cf565b9050919050565b60006152dc826151b5565b91506152e7836151b5565b9250826152f7576152f6615331565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57726f6e67207068617365000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d6178207768697465656400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f416c6c206672656520746f6b656e732068617665206265656e206d696e746564600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f526166666c652077696e6e6572732070726573616c65206973206e6f7420616360008201527f7469766500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b7f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360008201527f656564206e756d626572206f66204d415820746f6b656e73207065722070686160208201527f7365000000000000000000000000000000000000000000000000000000000000604082015250565b615abe81615141565b8114615ac957600080fd5b50565b615ad581615153565b8114615ae057600080fd5b50565b615aec8161515f565b8114615af757600080fd5b50565b615b0381615169565b8114615b0e57600080fd5b50565b615b1a816151b5565b8114615b2557600080fd5b5056fea26469706673582212202ed84473cd4af513528656142a2a35d37c9c961ff9cd36124ec0ed49de914b7a64736f6c63430008040033

Deployed Bytecode Sourcemap

52080:10522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61418:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54450:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21493:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23052:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22575:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58003:1059;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35182:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56875:989;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55768:968;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52958:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52896:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23942:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54207:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54891:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34850:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52865:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55408:217;;;;;;;;;;;;;:::i;:::-;;24352:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52736:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53053:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35372:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52801:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21187:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53966:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20917:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49250:94;;;;;;;;;;;;;:::i;:::-;;53572:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53083:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53139:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48599:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53025:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52985:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21662:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23345:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59201:991;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53233:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53111:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52927:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24608:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60794:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53286:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53436:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52671:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53769:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55109:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23711:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54619:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49499:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53185:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60250:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61418:235;61578:4;61608:37;61632:12;61608:23;:37::i;:::-;61601:44;;61418:235;;;:::o;54450:161::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54594:9:::1;54570:21;;:33;;;;;;;;;;;;;;;;;;54450:161:::0;:::o;21493:100::-;21547:13;21580:5;21573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21493:100;:::o;23052:221::-;23128:7;23156:16;23164:7;23156;:16::i;:::-;23148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23241:15;:24;23257:7;23241:24;;;;;;;;;;;;;;;;;;;;;23234:31;;23052:221;;;:::o;22575:411::-;22656:13;22672:23;22687:7;22672:14;:23::i;:::-;22656:39;;22720:5;22714:11;;:2;:11;;;;22706:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22814:5;22798:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22823:37;22840:5;22847:12;:10;:12::i;:::-;22823:16;:37::i;:::-;22798:62;22776:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22957:21;22966:2;22970:7;22957:8;:21::i;:::-;22575:411;;;:::o;58003:1059::-;58163:8;;;;;;;;;;;58155:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;58213:21;;;;;;;;;;;58205:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58294:75;58313:6;58321;;58356:10;58339:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58329:39;;;;;;58294:18;:75::i;:::-;58286:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;58449:16;:14;:16::i;:::-;58408:37;58432:12;58408;:19;58421:5;;58408:19;;;;;;;;;;;;:23;;:37;;;;:::i;:::-;:57;;58400:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;53324:1;58555:12;:27;;58547:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53324:1;58638:44;58669:12;58638:7;:14;58646:5;;58638:14;;;;;;;;;;;:26;58653:10;58638:26;;;;;;;;;;;;;;;;:30;;:44;;;;:::i;:::-;:59;;58630:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;58787:9;58749:34;58770:12;58749:16;:14;:16::i;:::-;:20;;:34;;;;:::i;:::-;:47;58741:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;58848:9;58843:212;58867:12;58863:1;:16;58843:212;;;58935:12;58905:7;:14;58913:5;;58905:14;;;;;;;;;;;:26;58920:10;58905:26;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;58987:1;58966:12;:19;58979:5;;58966:19;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;59007:36;59017:10;59029:13;:11;:13::i;:::-;59007:9;:36::i;:::-;58881:3;;;;;:::i;:::-;;;;58843:212;;;;58003:1059;;:::o;35182:113::-;35243:7;35270:10;:17;;;;35263:24;;35182:113;:::o;56875:989::-;57032:8;;;;;;;;;;;57024:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57082:75;57101:6;57109;;57144:10;57127:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57117:39;;;;;;57082:18;:75::i;:::-;57074:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;57237:16;:14;:16::i;:::-;57196:37;57220:12;57196;:19;57209:5;;57196:19;;;;;;;;;;;;:23;;:37;;;;:::i;:::-;:57;;57188:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;53278:1;57343:12;:34;;57335:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53278:1;57433:44;57464:12;57433:7;:14;57441:5;;57433:14;;;;;;;;;;;:26;57448:10;57433:26;;;;;;;;;;;;;;;;:30;;:44;;;;:::i;:::-;:66;;57425:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;57589:9;57551:34;57572:12;57551:16;:14;:16::i;:::-;:20;;:34;;;;:::i;:::-;:47;57543:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57650:9;57645:212;57669:12;57665:1;:16;57645:212;;;57737:12;57707:7;:14;57715:5;;57707:14;;;;;;;;;;;:26;57722:10;57707:26;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;57789:1;57768:12;:19;57781:5;;57768:19;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;57809:36;57819:10;57831:13;:11;:13::i;:::-;57809:9;:36::i;:::-;57683:3;;;;;:::i;:::-;;;;57645:212;;;;56875:989;;:::o;55768:968::-;55918:8;;;;;;;;;;;55910:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;55968:75;55987:6;55995;;56030:10;56013:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56003:39;;;;;;55968:18;:75::i;:::-;55960:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56123:16;:14;:16::i;:::-;56082:37;56106:12;56082;:19;56095:5;;56082:19;;;;;;;;;;;;:23;;:37;;;;:::i;:::-;:57;;56074:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;53177:1;56229:12;:27;;56221:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53177:1;56312:44;56343:12;56312:7;:14;56320:5;;56312:14;;;;;;;;;;;:26;56327:10;56312:26;;;;;;;;;;;;;;;;:30;;:44;;;;:::i;:::-;:59;;56304:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;56461:9;56423:34;56444:12;56423:16;:14;:16::i;:::-;:20;;:34;;;;:::i;:::-;:47;56415:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;56522:9;56517:212;56541:12;56537:1;:16;56517:212;;;56609:12;56579:7;:14;56587:5;;56579:14;;;;;;;;;;;:26;56594:10;56579:26;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;56661:1;56640:12;:19;56653:5;;56640:19;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;56681:36;56691:10;56703:13;:11;:13::i;:::-;56681:9;:36::i;:::-;56555:3;;;;;:::i;:::-;;;;56517:212;;;;55768:968;;:::o;52958:20::-;;;;;;;;;;;;;:::o;52896:24::-;;;;;;;;;;;;;:::o;23942:339::-;24137:41;24156:12;:10;:12::i;:::-;24170:7;24137:18;:41::i;:::-;24129:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24245:28;24255:4;24261:2;24265:7;24245:9;:28::i;:::-;23942:339;;;:::o;54207:137::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54327:9:::1;54316:8;;:20;;;;;;;;;;;;;;;;;;54207:137:::0;:::o;54891:150::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54976:1:::1;54966:6;:11;;:26;;;;;54991:1;54981:6;:11;;54966:26;54958:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55027:6;55019:5;:14;;;;54891:150:::0;:::o;34850:256::-;34947:7;34983:23;35000:5;34983:16;:23::i;:::-;34975:5;:31;34967:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35072:12;:19;35085:5;35072:19;;;;;;;;;;;;;;;:26;35092:5;35072:26;;;;;;;;;;;;35065:33;;34850:256;;;;:::o;52865:24::-;;;;;;;;;;;;;:::o;55408:217::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55488:20:::1;55511:42;55488:65;;55572:12;55564:30;;:53;55595:21;55564:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;48890:1;55408:217::o:0;24352:185::-;24490:39;24507:4;24513:2;24517:7;24490:39;;;;;;;;;;;;:16;:39::i;:::-;24352:185;;;:::o;52736:45::-;;;;:::o;53053:23::-;;;;:::o;35372:233::-;35447:7;35483:30;:28;:30::i;:::-;35475:5;:38;35467:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35580:10;35591:5;35580:17;;;;;;;;;;;;;;;;;;;;;;;;35573:24;;35372:233;;;:::o;52801:45::-;;;;:::o;21187:239::-;21259:7;21279:13;21295:7;:16;21303:7;21295:16;;;;;;;;;;;;;;;;;;;;;21279:32;;21347:1;21330:19;;:5;:19;;;;21322:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21413:5;21406:12;;;21187:239;;;:::o;53966:141::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54092:7:::1;54077:12;;:22;;;;;;;;;;;;;;;;;;53966:141:::0;:::o;20917:208::-;20989:7;21034:1;21017:19;;:5;:19;;;;21009:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21101:9;:16;21111:5;21101:16;;;;;;;;;;;;;;;;21094:23;;20917:208;;;:::o;49250:94::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49315:21:::1;49333:1;49315:9;:21::i;:::-;49250:94::o:0;53572:141::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53698:7:::1;53683:12;;:22;;;;;;;;;;;;;;;;;;53572:141:::0;:::o;53083:21::-;;;;:::o;53139:39::-;53177:1;53139:39;:::o;48599:87::-;48645:7;48672:6;;;;;;;;;;;48665:13;;48599:87;:::o;53025:21::-;;;;:::o;52985:33::-;;;;;;;;;;;;;:::o;21662:104::-;21718:13;21751:7;21744:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21662:104;:::o;23345:295::-;23460:12;:10;:12::i;:::-;23448:24;;:8;:24;;;;23440:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23560:8;23515:18;:32;23534:12;:10;:12::i;:::-;23515:32;;;;;;;;;;;;;;;:42;23548:8;23515:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23613:8;23584:48;;23599:12;:10;:12::i;:::-;23584:48;;;23623:8;23584:48;;;;;;:::i;:::-;;;;;;;;23345:295;;:::o;59201:991::-;59353:8;;;;;;;;;;;59345:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;59403:77;59422:6;59430:8;;59467:10;59450:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;59440:39;;;;;;59403:18;:77::i;:::-;59395:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;52661:3;59519:11;;:28;59511:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59644:16;:14;:16::i;:::-;59603:37;59627:12;59603;:19;59616:5;;59603:19;;;;;;;;;;;;:23;;:37;;;;:::i;:::-;:57;;59595:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;53225:1;59750:12;:29;;59742:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53225:1;59835:44;59866:12;59835:7;:14;59843:5;;59835:14;;;;;;;;;;;:26;59850:10;59835:26;;;;;;;;;;;;;;;;:30;;:44;;;;:::i;:::-;:61;;59827:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;59945:9;59940:245;59964:12;59960:1;:16;59940:245;;;60032:12;60002:7;:14;60010:5;;60002:14;;;;;;;;;;;:26;60017:10;60002:26;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;60084:1;60063:12;:19;60076:5;;60063:19;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;60117:1;60104:11;;:14;;;;;;;:::i;:::-;;;;;;;;60137:36;60147:10;60159:13;:11;:13::i;:::-;60137:9;:36::i;:::-;59978:3;;;;;:::i;:::-;;;;59940:245;;;;59201:991;;:::o;53233:46::-;53278:1;53233:46;:::o;53111:21::-;;;;:::o;52927:24::-;;;;;;;;;;;;;:::o;24608:328::-;24783:41;24802:12;:10;:12::i;:::-;24816:7;24783:18;:41::i;:::-;24775:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24889:39;24903:4;24909:2;24913:7;24922:5;24889:13;:39::i;:::-;24608:328;;;;:::o;60794:612::-;60933:13;60973:17;60981:8;60973:7;:17::i;:::-;60965:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;52554:4;61072:8;:24;:40;;;;;61100:12;;;;;;;;;;;61072:40;61071:121;;;;52608:4;52554;61143:31;;;;:::i;:::-;61131:8;:44;:60;;;;;61179:12;;;;;;;;;;;61131:60;61071:121;:150;;;;61209:12;;;;;;;;;;;61071:150;61053:346;;;61283:7;61292:19;:8;:17;:19::i;:::-;61266:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61252:61;;;;61053:346;61377:8;61360:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;61346:41;;60794:612;;;;:::o;53286:39::-;53324:1;53286:39;:::o;53436:47::-;;;;;;;;;;;;;;;;;:::o;52671:45::-;;;;:::o;53769:141::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53895:7:::1;53880:12;;:22;;;;;;;;;;;;;;;;;;53769:141:::0;:::o;55109:197::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55264:9:::1;55253:8;:20;;;;;;;;;;;;:::i;:::-;;55294:4;55284:7;:14;;;;;;;;;;;;:::i;:::-;;55109:197:::0;;:::o;23711:164::-;23808:4;23832:18;:25;23851:5;23832:25;;;;;;;;;;;;;;;:35;23858:8;23832:35;;;;;;;;;;;;;;;;;;;;;;;;;23825:42;;23711:164;;;;:::o;54619:264::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54755:7:::1;54747:16;;54738:6;:25;;;;54793:9;54785:18;;54774:8;:29;;;;54831:7;54823:16;;54814:6;:25;;;;54867:7;54859:16;;54850:6;:25;;;;54619:264:::0;;;;:::o;49499:192::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49608:1:::1;49588:22;;:8;:22;;;;49580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49664:19;49674:8;49664:9;:19::i;:::-;49499:192:::0;:::o;53185:41::-;53225:1;53185:41;:::o;60250:468::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60440:16:::1;:14;:16::i;:::-;60399:37;60423:12;60399;:19;60412:5;;60399:19;;;;;;;;;;;;:23;;:37;;;;:::i;:::-;:57;;60391:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;60542:9;60538:173;60561:12;60557:1;:16;60538:173;;;60617:1;60594:7;:14;60602:5;;60594:14;;;;;;;;;;;:19;60609:3;60594:19;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;60654:1;60633:12;:19;60646:5;;60633:19;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;60670:29;60680:3;60685:13;:11;:13::i;:::-;60670:9;:29::i;:::-;60575:3;;;;;:::i;:::-;;;;60538:173;;;;60250:468:::0;;:::o;34542:224::-;34644:4;34683:35;34668:50;;;:11;:50;;;;:90;;;;34722:36;34746:11;34722:23;:36::i;:::-;34668:90;34661:97;;34542:224;;;:::o;16055:98::-;16108:7;16135:10;16128:17;;16055:98;:::o;26446:127::-;26511:4;26563:1;26535:30;;:7;:16;26543:7;26535:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26528:37;;26446:127;;;:::o;30428:174::-;30530:2;30503:15;:24;30519:7;30503:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30586:7;30582:2;30548:46;;30557:23;30572:7;30557:14;:23::i;:::-;30548:46;;;;;;;;;;;;30428:174;;:::o;50614:190::-;50739:4;50792;50763:25;50776:5;50783:4;50763:12;:25::i;:::-;:33;50756:40;;50614:190;;;;;:::o;61963:322::-;62011:7;62044:1;62035:5;;:10;62031:247;;;52554:4;62062:20;;;;62031:247;62113:1;62104:5;;:10;62100:178;;;52608:4;62132:22;;;;62100:178;62185:1;62176:5;;:10;62172:106;;;52608:4;62203:22;;;;62172:106;62265:1;62258:8;;61963:322;;:::o;43461:98::-;43519:7;43550:1;43546;:5;;;;:::i;:::-;43539:12;;43461:98;;;;:::o;62293:306::-;62341:7;62374:1;62365:5;;:10;62361:231;;;62399:9;;62392:16;;;;62361:231;62439:1;62430:5;;:10;62426:166;;;62465:9;;62458:16;;;;62426:166;62505:1;62496:5;;:10;62492:100;;;62530:9;;62523:16;;;;62492:100;62579:1;62572:8;;62293:306;;:::o;44199:98::-;44257:7;44288:1;44284;:5;;;;:::i;:::-;44277:12;;44199:98;;;;:::o;27430:110::-;27506:26;27516:2;27520:7;27506:26;;;;;;;;;;;;:9;:26::i;:::-;27430:110;;:::o;26740:348::-;26833:4;26858:16;26866:7;26858;:16::i;:::-;26850:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26934:13;26950:23;26965:7;26950:14;:23::i;:::-;26934:39;;27003:5;26992:16;;:7;:16;;;:51;;;;27036:7;27012:31;;:20;27024:7;27012:11;:20::i;:::-;:31;;;26992:51;:87;;;;27047:32;27064:5;27071:7;27047:16;:32::i;:::-;26992:87;26984:96;;;26740:348;;;;:::o;29732:578::-;29891:4;29864:31;;:23;29879:7;29864:14;:23::i;:::-;:31;;;29856:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29974:1;29960:16;;:2;:16;;;;29952:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30030:39;30051:4;30057:2;30061:7;30030:20;:39::i;:::-;30134:29;30151:1;30155:7;30134:8;:29::i;:::-;30195:1;30176:9;:15;30186:4;30176:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30224:1;30207:9;:13;30217:2;30207:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30255:2;30236:7;:16;30244:7;30236:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30294:7;30290:2;30275:27;;30284:4;30275:27;;;;;;;;;;;;29732:578;;;:::o;49699:173::-;49755:16;49774:6;;;;;;;;;;;49755:25;;49800:8;49791:6;;:17;;;;;;;;;;;;;;;;;;49855:8;49824:40;;49845:8;49824:40;;;;;;;;;;;;49699:173;;:::o;25818:315::-;25975:28;25985:4;25991:2;25995:7;25975:9;:28::i;:::-;26022:48;26045:4;26051:2;26055:7;26064:5;26022:22;:48::i;:::-;26014:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25818:315;;;;:::o;16557:723::-;16613:13;16843:1;16834:5;:10;16830:53;;;16861:10;;;;;;;;;;;;;;;;;;;;;16830:53;16893:12;16908:5;16893:20;;16924:14;16949:78;16964:1;16956:4;:9;16949:78;;16982:8;;;;;:::i;:::-;;;;17013:2;17005:10;;;;;:::i;:::-;;;16949:78;;;17037:19;17069:6;17059:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17037:39;;17087:154;17103:1;17094:5;:10;17087:154;;17131:1;17121:11;;;;;:::i;:::-;;;17198:2;17190:5;:10;;;;:::i;:::-;17177:2;:24;;;;:::i;:::-;17164:39;;17147:6;17154;17147:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17227:2;17218:11;;;;;:::i;:::-;;;17087:154;;;17265:6;17251:21;;;;;16557:723;;;;:::o;20548:305::-;20650:4;20702:25;20687:40;;;:11;:40;;;;:105;;;;20759:33;20744:48;;;:11;:48;;;;20687:105;:158;;;;20809:36;20833:11;20809:23;:36::i;:::-;20687:158;20667:178;;20548:305;;;:::o;51166:675::-;51249:7;51269:20;51292:4;51269:27;;51312:9;51307:497;51331:5;:12;51327:1;:16;51307:497;;;51365:20;51388:5;51394:1;51388:8;;;;;;;;;;;;;;;;;;;;;;51365:31;;51431:12;51415;:28;51411:382;;51558:42;51573:12;51587;51558:14;:42::i;:::-;51543:57;;51411:382;;;51735:42;51750:12;51764;51735:14;:42::i;:::-;51720:57;;51411:382;51307:497;51345:3;;;;;:::i;:::-;;;;51307:497;;;;51821:12;51814:19;;;51166:675;;;;:::o;27767:321::-;27897:18;27903:2;27907:7;27897:5;:18::i;:::-;27948:54;27979:1;27983:2;27987:7;27996:5;27948:22;:54::i;:::-;27926:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27767:321;;;:::o;61706:249::-;61899:48;61926:5;61933:3;61938:8;61899:26;:48::i;:::-;61706:249;;;:::o;31167:799::-;31322:4;31343:15;:2;:13;;;:15::i;:::-;31339:620;;;31395:2;31379:36;;;31416:12;:10;:12::i;:::-;31430:4;31436:7;31445:5;31379:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31375:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31638:1;31621:6;:13;:18;31617:272;;;31664:60;;;;;;;;;;:::i;:::-;;;;;;;;31617:272;31839:6;31833:13;31824:6;31820:2;31816:15;31809:38;31375:529;31512:41;;;31502:51;;;:6;:51;;;;31495:58;;;;;31339:620;31943:4;31936:11;;31167:799;;;;;;;:::o;19089:157::-;19174:4;19213:25;19198:40;;;:11;:40;;;;19191:47;;19089:157;;;:::o;51849:224::-;51917:13;51980:1;51974:4;51967:15;52009:1;52003:4;51996:15;52050:4;52044;52034:21;52025:30;;51952:114;;;;:::o;28424:382::-;28518:1;28504:16;;:2;:16;;;;28496:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28577:16;28585:7;28577;:16::i;:::-;28576:17;28568:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28639:45;28668:1;28672:2;28676:7;28639:20;:45::i;:::-;28714:1;28697:9;:13;28707:2;28697:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28745:2;28726:7;:16;28734:7;28726:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28790:7;28786:2;28765:33;;28782:1;28765:33;;;;;;;;;;;;28424:382;;:::o;36218:589::-;36362:45;36389:4;36395:2;36399:7;36362:26;:45::i;:::-;36440:1;36424:18;;:4;:18;;;36420:187;;;36459:40;36491:7;36459:31;:40::i;:::-;36420:187;;;36529:2;36521:10;;:4;:10;;;36517:90;;36548:47;36581:4;36587:7;36548:32;:47::i;:::-;36517:90;36420:187;36635:1;36621:16;;:2;:16;;;36617:183;;;36654:45;36691:7;36654:36;:45::i;:::-;36617:183;;;36727:4;36721:10;;:2;:10;;;36717:83;;36748:40;36776:2;36780:7;36748:27;:40::i;:::-;36717:83;36617:183;36218:589;;;:::o;8122:387::-;8182:4;8390:12;8457:7;8445:20;8437:28;;8500:1;8493:4;:8;8486:15;;;8122:387;;;:::o;32538:126::-;;;;:::o;37530:164::-;37634:10;:17;;;;37607:15;:24;37623:7;37607:24;;;;;;;;;;;:44;;;;37662:10;37678:7;37662:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37530:164;:::o;38321:988::-;38587:22;38637:1;38612:22;38629:4;38612:16;:22::i;:::-;:26;;;;:::i;:::-;38587:51;;38649:18;38670:17;:26;38688:7;38670:26;;;;;;;;;;;;38649:47;;38817:14;38803:10;:28;38799:328;;38848:19;38870:12;:18;38883:4;38870:18;;;;;;;;;;;;;;;:34;38889:14;38870:34;;;;;;;;;;;;38848:56;;38954:11;38921:12;:18;38934:4;38921:18;;;;;;;;;;;;;;;:30;38940:10;38921:30;;;;;;;;;;;:44;;;;39071:10;39038:17;:30;39056:11;39038:30;;;;;;;;;;;:43;;;;38799:328;;39223:17;:26;39241:7;39223:26;;;;;;;;;;;39216:33;;;39267:12;:18;39280:4;39267:18;;;;;;;;;;;;;;;:34;39286:14;39267:34;;;;;;;;;;;39260:41;;;38321:988;;;;:::o;39604:1079::-;39857:22;39902:1;39882:10;:17;;;;:21;;;;:::i;:::-;39857:46;;39914:18;39935:15;:24;39951:7;39935:24;;;;;;;;;;;;39914:45;;40286:19;40308:10;40319:14;40308:26;;;;;;;;;;;;;;;;;;;;;;;;40286:48;;40372:11;40347:10;40358;40347:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40483:10;40452:15;:28;40468:11;40452:28;;;;;;;;;;;:41;;;;40624:15;:24;40640:7;40624:24;;;;;;;;;;;40617:31;;;40659:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39604:1079;;;;:::o;37108:221::-;37193:14;37210:20;37227:2;37210:16;:20::i;:::-;37193:37;;37268:7;37241:12;:16;37254:2;37241:16;;;;;;;;;;;;;;;:24;37258:6;37241:24;;;;;;;;;;;:34;;;;37315:6;37286:17;:26;37304:7;37286:26;;;;;;;;;;;:35;;;;37108:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:139::-;2041:5;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2140:137::-;2185:5;2223:6;2210:20;2201:29;;2239:32;2265:5;2239:32;:::i;:::-;2191:86;;;;:::o;2283:141::-;2339:5;2370:6;2364:13;2355:22;;2386:32;2412:5;2386:32;:::i;:::-;2345:79;;;;:::o;2443:271::-;2498:5;2547:3;2540:4;2532:6;2528:17;2524:27;2514:2;;2565:1;2562;2555:12;2514:2;2605:6;2592:20;2630:78;2704:3;2696:6;2689:4;2681:6;2677:17;2630:78;:::i;:::-;2621:87;;2504:210;;;;;:::o;2734:273::-;2790:5;2839:3;2832:4;2824:6;2820:17;2816:27;2806:2;;2857:1;2854;2847:12;2806:2;2897:6;2884:20;2922:79;2997:3;2989:6;2982:4;2974:6;2970:17;2922:79;:::i;:::-;2913:88;;2796:211;;;;;:::o;3013:139::-;3059:5;3097:6;3084:20;3075:29;;3113:33;3140:5;3113:33;:::i;:::-;3065:87;;;;:::o;3158:262::-;3217:6;3266:2;3254:9;3245:7;3241:23;3237:32;3234:2;;;3282:1;3279;3272:12;3234:2;3325:1;3350:53;3395:7;3386:6;3375:9;3371:22;3350:53;:::i;:::-;3340:63;;3296:117;3224:196;;;;:::o;3426:407::-;3494:6;3502;3551:2;3539:9;3530:7;3526:23;3522:32;3519:2;;;3567:1;3564;3557:12;3519:2;3610:1;3635:53;3680:7;3671:6;3660:9;3656:22;3635:53;:::i;:::-;3625:63;;3581:117;3737:2;3763:53;3808:7;3799:6;3788:9;3784:22;3763:53;:::i;:::-;3753:63;;3708:118;3509:324;;;;;:::o;3839:552::-;3916:6;3924;3932;3981:2;3969:9;3960:7;3956:23;3952:32;3949:2;;;3997:1;3994;3987:12;3949:2;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;4167:2;4193:53;4238:7;4229:6;4218:9;4214:22;4193:53;:::i;:::-;4183:63;;4138:118;4295:2;4321:53;4366:7;4357:6;4346:9;4342:22;4321:53;:::i;:::-;4311:63;;4266:118;3939:452;;;;;:::o;4397:809::-;4492:6;4500;4508;4516;4565:3;4553:9;4544:7;4540:23;4536:33;4533:2;;;4582:1;4579;4572:12;4533:2;4625:1;4650:53;4695:7;4686:6;4675:9;4671:22;4650:53;:::i;:::-;4640:63;;4596:117;4752:2;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4723:118;4880:2;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4851:118;5036:2;5025:9;5021:18;5008:32;5067:18;5059:6;5056:30;5053:2;;;5099:1;5096;5089:12;5053:2;5127:62;5181:7;5172:6;5161:9;5157:22;5127:62;:::i;:::-;5117:72;;4979:220;4523:683;;;;;;;:::o;5212:401::-;5277:6;5285;5334:2;5322:9;5313:7;5309:23;5305:32;5302:2;;;5350:1;5347;5340:12;5302:2;5393:1;5418:53;5463:7;5454:6;5443:9;5439:22;5418:53;:::i;:::-;5408:63;;5364:117;5520:2;5546:50;5588:7;5579:6;5568:9;5564:22;5546:50;:::i;:::-;5536:60;;5491:115;5292:321;;;;;:::o;5619:407::-;5687:6;5695;5744:2;5732:9;5723:7;5719:23;5715:32;5712:2;;;5760:1;5757;5750:12;5712:2;5803:1;5828:53;5873:7;5864:6;5853:9;5849:22;5828:53;:::i;:::-;5818:63;;5774:117;5930:2;5956:53;6001:7;5992:6;5981:9;5977:22;5956:53;:::i;:::-;5946:63;;5901:118;5702:324;;;;;:::o;6032:256::-;6088:6;6137:2;6125:9;6116:7;6112:23;6108:32;6105:2;;;6153:1;6150;6143:12;6105:2;6196:1;6221:50;6263:7;6254:6;6243:9;6239:22;6221:50;:::i;:::-;6211:60;;6167:114;6095:193;;;;:::o;6294:260::-;6352:6;6401:2;6389:9;6380:7;6376:23;6372:32;6369:2;;;6417:1;6414;6407:12;6369:2;6460:1;6485:52;6529:7;6520:6;6509:9;6505:22;6485:52;:::i;:::-;6475:62;;6431:116;6359:195;;;;:::o;6560:282::-;6629:6;6678:2;6666:9;6657:7;6653:23;6649:32;6646:2;;;6694:1;6691;6684:12;6646:2;6737:1;6762:63;6817:7;6808:6;6797:9;6793:22;6762:63;:::i;:::-;6752:73;;6708:127;6636:206;;;;:::o;6848:633::-;6936:6;6944;6993:2;6981:9;6972:7;6968:23;6964:32;6961:2;;;7009:1;7006;6999:12;6961:2;7080:1;7069:9;7065:17;7052:31;7110:18;7102:6;7099:30;7096:2;;;7142:1;7139;7132:12;7096:2;7170:63;7225:7;7216:6;7205:9;7201:22;7170:63;:::i;:::-;7160:73;;7023:220;7310:2;7299:9;7295:18;7282:32;7341:18;7333:6;7330:30;7327:2;;;7373:1;7370;7363:12;7327:2;7401:63;7456:7;7447:6;7436:9;7432:22;7401:63;:::i;:::-;7391:73;;7253:221;6951:530;;;;;:::o;7487:262::-;7546:6;7595:2;7583:9;7574:7;7570:23;7566:32;7563:2;;;7611:1;7608;7601:12;7563:2;7654:1;7679:53;7724:7;7715:6;7704:9;7700:22;7679:53;:::i;:::-;7669:63;;7625:117;7553:196;;;;:::o;7755:550::-;7848:6;7856;7905:2;7893:9;7884:7;7880:23;7876:32;7873:2;;;7921:1;7918;7911:12;7873:2;7964:1;7989:53;8034:7;8025:6;8014:9;8010:22;7989:53;:::i;:::-;7979:63;;7935:117;8119:2;8108:9;8104:18;8091:32;8150:18;8142:6;8139:30;8136:2;;;8182:1;8179;8172:12;8136:2;8210:78;8280:7;8271:6;8260:9;8256:22;8210:78;:::i;:::-;8200:88;;8062:236;7863:442;;;;;:::o;8311:698::-;8397:6;8405;8413;8421;8470:3;8458:9;8449:7;8445:23;8441:33;8438:2;;;8487:1;8484;8477:12;8438:2;8530:1;8555:53;8600:7;8591:6;8580:9;8576:22;8555:53;:::i;:::-;8545:63;;8501:117;8657:2;8683:53;8728:7;8719:6;8708:9;8704:22;8683:53;:::i;:::-;8673:63;;8628:118;8785:2;8811:53;8856:7;8847:6;8836:9;8832:22;8811:53;:::i;:::-;8801:63;;8756:118;8913:2;8939:53;8984:7;8975:6;8964:9;8960:22;8939:53;:::i;:::-;8929:63;;8884:118;8428:581;;;;;;;:::o;9015:118::-;9102:24;9120:5;9102:24;:::i;:::-;9097:3;9090:37;9080:53;;:::o;9139:157::-;9244:45;9264:24;9282:5;9264:24;:::i;:::-;9244:45;:::i;:::-;9239:3;9232:58;9222:74;;:::o;9302:109::-;9383:21;9398:5;9383:21;:::i;:::-;9378:3;9371:34;9361:50;;:::o;9417:118::-;9504:24;9522:5;9504:24;:::i;:::-;9499:3;9492:37;9482:53;;:::o;9541:360::-;9627:3;9655:38;9687:5;9655:38;:::i;:::-;9709:70;9772:6;9767:3;9709:70;:::i;:::-;9702:77;;9788:52;9833:6;9828:3;9821:4;9814:5;9810:16;9788:52;:::i;:::-;9865:29;9887:6;9865:29;:::i;:::-;9860:3;9856:39;9849:46;;9631:270;;;;;:::o;9907:364::-;9995:3;10023:39;10056:5;10023:39;:::i;:::-;10078:71;10142:6;10137:3;10078:71;:::i;:::-;10071:78;;10158:52;10203:6;10198:3;10191:4;10184:5;10180:16;10158:52;:::i;:::-;10235:29;10257:6;10235:29;:::i;:::-;10230:3;10226:39;10219:46;;9999:272;;;;;:::o;10277:377::-;10383:3;10411:39;10444:5;10411:39;:::i;:::-;10466:89;10548:6;10543:3;10466:89;:::i;:::-;10459:96;;10564:52;10609:6;10604:3;10597:4;10590:5;10586:16;10564:52;:::i;:::-;10641:6;10636:3;10632:16;10625:23;;10387:267;;;;;:::o;10684:845::-;10787:3;10824:5;10818:12;10853:36;10879:9;10853:36;:::i;:::-;10905:89;10987:6;10982:3;10905:89;:::i;:::-;10898:96;;11025:1;11014:9;11010:17;11041:1;11036:137;;;;11187:1;11182:341;;;;11003:520;;11036:137;11120:4;11116:9;11105;11101:25;11096:3;11089:38;11156:6;11151:3;11147:16;11140:23;;11036:137;;11182:341;11249:38;11281:5;11249:38;:::i;:::-;11309:1;11323:154;11337:6;11334:1;11331:13;11323:154;;;11411:7;11405:14;11401:1;11396:3;11392:11;11385:35;11461:1;11452:7;11448:15;11437:26;;11359:4;11356:1;11352:12;11347:17;;11323:154;;;11506:6;11501:3;11497:16;11490:23;;11189:334;;11003:520;;10791:738;;;;;;:::o;11535:366::-;11677:3;11698:67;11762:2;11757:3;11698:67;:::i;:::-;11691:74;;11774:93;11863:3;11774:93;:::i;:::-;11892:2;11887:3;11883:12;11876:19;;11681:220;;;:::o;11907:366::-;12049:3;12070:67;12134:2;12129:3;12070:67;:::i;:::-;12063:74;;12146:93;12235:3;12146:93;:::i;:::-;12264:2;12259:3;12255:12;12248:19;;12053:220;;;:::o;12279:366::-;12421:3;12442:67;12506:2;12501:3;12442:67;:::i;:::-;12435:74;;12518:93;12607:3;12518:93;:::i;:::-;12636:2;12631:3;12627:12;12620:19;;12425:220;;;:::o;12651:366::-;12793:3;12814:67;12878:2;12873:3;12814:67;:::i;:::-;12807:74;;12890:93;12979:3;12890:93;:::i;:::-;13008:2;13003:3;12999:12;12992:19;;12797:220;;;:::o;13023:366::-;13165:3;13186:67;13250:2;13245:3;13186:67;:::i;:::-;13179:74;;13262:93;13351:3;13262:93;:::i;:::-;13380:2;13375:3;13371:12;13364:19;;13169:220;;;:::o;13395:366::-;13537:3;13558:67;13622:2;13617:3;13558:67;:::i;:::-;13551:74;;13634:93;13723:3;13634:93;:::i;:::-;13752:2;13747:3;13743:12;13736:19;;13541:220;;;:::o;13767:366::-;13909:3;13930:67;13994:2;13989:3;13930:67;:::i;:::-;13923:74;;14006:93;14095:3;14006:93;:::i;:::-;14124:2;14119:3;14115:12;14108:19;;13913:220;;;:::o;14139:366::-;14281:3;14302:67;14366:2;14361:3;14302:67;:::i;:::-;14295:74;;14378:93;14467:3;14378:93;:::i;:::-;14496:2;14491:3;14487:12;14480:19;;14285:220;;;:::o;14511:366::-;14653:3;14674:67;14738:2;14733:3;14674:67;:::i;:::-;14667:74;;14750:93;14839:3;14750:93;:::i;:::-;14868:2;14863:3;14859:12;14852:19;;14657:220;;;:::o;14883:366::-;15025:3;15046:67;15110:2;15105:3;15046:67;:::i;:::-;15039:74;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;15029:220;;;:::o;15255:366::-;15397:3;15418:67;15482:2;15477:3;15418:67;:::i;:::-;15411:74;;15494:93;15583:3;15494:93;:::i;:::-;15612:2;15607:3;15603:12;15596:19;;15401:220;;;:::o;15627:366::-;15769:3;15790:67;15854:2;15849:3;15790:67;:::i;:::-;15783:74;;15866:93;15955:3;15866:93;:::i;:::-;15984:2;15979:3;15975:12;15968:19;;15773:220;;;:::o;15999:366::-;16141:3;16162:67;16226:2;16221:3;16162:67;:::i;:::-;16155:74;;16238:93;16327:3;16238:93;:::i;:::-;16356:2;16351:3;16347:12;16340:19;;16145:220;;;:::o;16371:366::-;16513:3;16534:67;16598:2;16593:3;16534:67;:::i;:::-;16527:74;;16610:93;16699:3;16610:93;:::i;:::-;16728:2;16723:3;16719:12;16712:19;;16517:220;;;:::o;16743:366::-;16885:3;16906:67;16970:2;16965:3;16906:67;:::i;:::-;16899:74;;16982:93;17071:3;16982:93;:::i;:::-;17100:2;17095:3;17091:12;17084:19;;16889:220;;;:::o;17115:366::-;17257:3;17278:67;17342:2;17337:3;17278:67;:::i;:::-;17271:74;;17354:93;17443:3;17354:93;:::i;:::-;17472:2;17467:3;17463:12;17456:19;;17261:220;;;:::o;17487:366::-;17629:3;17650:67;17714:2;17709:3;17650:67;:::i;:::-;17643:74;;17726:93;17815:3;17726:93;:::i;:::-;17844:2;17839:3;17835:12;17828:19;;17633:220;;;:::o;17859:366::-;18001:3;18022:67;18086:2;18081:3;18022:67;:::i;:::-;18015:74;;18098:93;18187:3;18098:93;:::i;:::-;18216:2;18211:3;18207:12;18200:19;;18005:220;;;:::o;18231:366::-;18373:3;18394:67;18458:2;18453:3;18394:67;:::i;:::-;18387:74;;18470:93;18559:3;18470:93;:::i;:::-;18588:2;18583:3;18579:12;18572:19;;18377:220;;;:::o;18603:366::-;18745:3;18766:67;18830:2;18825:3;18766:67;:::i;:::-;18759:74;;18842:93;18931:3;18842:93;:::i;:::-;18960:2;18955:3;18951:12;18944:19;;18749:220;;;:::o;18975:366::-;19117:3;19138:67;19202:2;19197:3;19138:67;:::i;:::-;19131:74;;19214:93;19303:3;19214:93;:::i;:::-;19332:2;19327:3;19323:12;19316:19;;19121:220;;;:::o;19347:366::-;19489:3;19510:67;19574:2;19569:3;19510:67;:::i;:::-;19503:74;;19586:93;19675:3;19586:93;:::i;:::-;19704:2;19699:3;19695:12;19688:19;;19493:220;;;:::o;19719:366::-;19861:3;19882:67;19946:2;19941:3;19882:67;:::i;:::-;19875:74;;19958:93;20047:3;19958:93;:::i;:::-;20076:2;20071:3;20067:12;20060:19;;19865:220;;;:::o;20091:366::-;20233:3;20254:67;20318:2;20313:3;20254:67;:::i;:::-;20247:74;;20330:93;20419:3;20330:93;:::i;:::-;20448:2;20443:3;20439:12;20432:19;;20237:220;;;:::o;20463:366::-;20605:3;20626:67;20690:2;20685:3;20626:67;:::i;:::-;20619:74;;20702:93;20791:3;20702:93;:::i;:::-;20820:2;20815:3;20811:12;20804:19;;20609:220;;;:::o;20835:366::-;20977:3;20998:67;21062:2;21057:3;20998:67;:::i;:::-;20991:74;;21074:93;21163:3;21074:93;:::i;:::-;21192:2;21187:3;21183:12;21176:19;;20981:220;;;:::o;21207:366::-;21349:3;21370:67;21434:2;21429:3;21370:67;:::i;:::-;21363:74;;21446:93;21535:3;21446:93;:::i;:::-;21564:2;21559:3;21555:12;21548:19;;21353:220;;;:::o;21579:118::-;21666:24;21684:5;21666:24;:::i;:::-;21661:3;21654:37;21644:53;;:::o;21703:256::-;21815:3;21830:75;21901:3;21892:6;21830:75;:::i;:::-;21930:2;21925:3;21921:12;21914:19;;21950:3;21943:10;;21819:140;;;;:::o;21965:269::-;22094:3;22116:92;22204:3;22195:6;22116:92;:::i;:::-;22109:99;;22225:3;22218:10;;22098:136;;;;:::o;22240:429::-;22417:3;22439:92;22527:3;22518:6;22439:92;:::i;:::-;22432:99;;22548:95;22639:3;22630:6;22548:95;:::i;:::-;22541:102;;22660:3;22653:10;;22421:248;;;;;:::o;22675:222::-;22768:4;22806:2;22795:9;22791:18;22783:26;;22819:71;22887:1;22876:9;22872:17;22863:6;22819:71;:::i;:::-;22773:124;;;;:::o;22903:640::-;23098:4;23136:3;23125:9;23121:19;23113:27;;23150:71;23218:1;23207:9;23203:17;23194:6;23150:71;:::i;:::-;23231:72;23299:2;23288:9;23284:18;23275:6;23231:72;:::i;:::-;23313;23381:2;23370:9;23366:18;23357:6;23313:72;:::i;:::-;23432:9;23426:4;23422:20;23417:2;23406:9;23402:18;23395:48;23460:76;23531:4;23522:6;23460:76;:::i;:::-;23452:84;;23103:440;;;;;;;:::o;23549:210::-;23636:4;23674:2;23663:9;23659:18;23651:26;;23687:65;23749:1;23738:9;23734:17;23725:6;23687:65;:::i;:::-;23641:118;;;;:::o;23765:222::-;23858:4;23896:2;23885:9;23881:18;23873:26;;23909:71;23977:1;23966:9;23962:17;23953:6;23909:71;:::i;:::-;23863:124;;;;:::o;23993:313::-;24106:4;24144:2;24133:9;24129:18;24121:26;;24193:9;24187:4;24183:20;24179:1;24168:9;24164:17;24157:47;24221:78;24294:4;24285:6;24221:78;:::i;:::-;24213:86;;24111:195;;;;:::o;24312:419::-;24478:4;24516:2;24505:9;24501:18;24493:26;;24565:9;24559:4;24555:20;24551:1;24540:9;24536:17;24529:47;24593:131;24719:4;24593:131;:::i;:::-;24585:139;;24483:248;;;:::o;24737:419::-;24903:4;24941:2;24930:9;24926:18;24918:26;;24990:9;24984:4;24980:20;24976:1;24965:9;24961:17;24954:47;25018:131;25144:4;25018:131;:::i;:::-;25010:139;;24908:248;;;:::o;25162:419::-;25328:4;25366:2;25355:9;25351:18;25343:26;;25415:9;25409:4;25405:20;25401:1;25390:9;25386:17;25379:47;25443:131;25569:4;25443:131;:::i;:::-;25435:139;;25333:248;;;:::o;25587:419::-;25753:4;25791:2;25780:9;25776:18;25768:26;;25840:9;25834:4;25830:20;25826:1;25815:9;25811:17;25804:47;25868:131;25994:4;25868:131;:::i;:::-;25860:139;;25758:248;;;:::o;26012:419::-;26178:4;26216:2;26205:9;26201:18;26193:26;;26265:9;26259:4;26255:20;26251:1;26240:9;26236:17;26229:47;26293:131;26419:4;26293:131;:::i;:::-;26285:139;;26183:248;;;:::o;26437:419::-;26603:4;26641:2;26630:9;26626:18;26618:26;;26690:9;26684:4;26680:20;26676:1;26665:9;26661:17;26654:47;26718:131;26844:4;26718:131;:::i;:::-;26710:139;;26608:248;;;:::o;26862:419::-;27028:4;27066:2;27055:9;27051:18;27043:26;;27115:9;27109:4;27105:20;27101:1;27090:9;27086:17;27079:47;27143:131;27269:4;27143:131;:::i;:::-;27135:139;;27033:248;;;:::o;27287:419::-;27453:4;27491:2;27480:9;27476:18;27468:26;;27540:9;27534:4;27530:20;27526:1;27515:9;27511:17;27504:47;27568:131;27694:4;27568:131;:::i;:::-;27560:139;;27458:248;;;:::o;27712:419::-;27878:4;27916:2;27905:9;27901:18;27893:26;;27965:9;27959:4;27955:20;27951:1;27940:9;27936:17;27929:47;27993:131;28119:4;27993:131;:::i;:::-;27985:139;;27883:248;;;:::o;28137:419::-;28303:4;28341:2;28330:9;28326:18;28318:26;;28390:9;28384:4;28380:20;28376:1;28365:9;28361:17;28354:47;28418:131;28544:4;28418:131;:::i;:::-;28410:139;;28308:248;;;:::o;28562:419::-;28728:4;28766:2;28755:9;28751:18;28743:26;;28815:9;28809:4;28805:20;28801:1;28790:9;28786:17;28779:47;28843:131;28969:4;28843:131;:::i;:::-;28835:139;;28733:248;;;:::o;28987:419::-;29153:4;29191:2;29180:9;29176:18;29168:26;;29240:9;29234:4;29230:20;29226:1;29215:9;29211:17;29204:47;29268:131;29394:4;29268:131;:::i;:::-;29260:139;;29158:248;;;:::o;29412:419::-;29578:4;29616:2;29605:9;29601:18;29593:26;;29665:9;29659:4;29655:20;29651:1;29640:9;29636:17;29629:47;29693:131;29819:4;29693:131;:::i;:::-;29685:139;;29583:248;;;:::o;29837:419::-;30003:4;30041:2;30030:9;30026:18;30018:26;;30090:9;30084:4;30080:20;30076:1;30065:9;30061:17;30054:47;30118:131;30244:4;30118:131;:::i;:::-;30110:139;;30008:248;;;:::o;30262:419::-;30428:4;30466:2;30455:9;30451:18;30443:26;;30515:9;30509:4;30505:20;30501:1;30490:9;30486:17;30479:47;30543:131;30669:4;30543:131;:::i;:::-;30535:139;;30433:248;;;:::o;30687:419::-;30853:4;30891:2;30880:9;30876:18;30868:26;;30940:9;30934:4;30930:20;30926:1;30915:9;30911:17;30904:47;30968:131;31094:4;30968:131;:::i;:::-;30960:139;;30858:248;;;:::o;31112:419::-;31278:4;31316:2;31305:9;31301:18;31293:26;;31365:9;31359:4;31355:20;31351:1;31340:9;31336:17;31329:47;31393:131;31519:4;31393:131;:::i;:::-;31385:139;;31283:248;;;:::o;31537:419::-;31703:4;31741:2;31730:9;31726:18;31718:26;;31790:9;31784:4;31780:20;31776:1;31765:9;31761:17;31754:47;31818:131;31944:4;31818:131;:::i;:::-;31810:139;;31708:248;;;:::o;31962:419::-;32128:4;32166:2;32155:9;32151:18;32143:26;;32215:9;32209:4;32205:20;32201:1;32190:9;32186:17;32179:47;32243:131;32369:4;32243:131;:::i;:::-;32235:139;;32133:248;;;:::o;32387:419::-;32553:4;32591:2;32580:9;32576:18;32568:26;;32640:9;32634:4;32630:20;32626:1;32615:9;32611:17;32604:47;32668:131;32794:4;32668:131;:::i;:::-;32660:139;;32558:248;;;:::o;32812:419::-;32978:4;33016:2;33005:9;33001:18;32993:26;;33065:9;33059:4;33055:20;33051:1;33040:9;33036:17;33029:47;33093:131;33219:4;33093:131;:::i;:::-;33085:139;;32983:248;;;:::o;33237:419::-;33403:4;33441:2;33430:9;33426:18;33418:26;;33490:9;33484:4;33480:20;33476:1;33465:9;33461:17;33454:47;33518:131;33644:4;33518:131;:::i;:::-;33510:139;;33408:248;;;:::o;33662:419::-;33828:4;33866:2;33855:9;33851:18;33843:26;;33915:9;33909:4;33905:20;33901:1;33890:9;33886:17;33879:47;33943:131;34069:4;33943:131;:::i;:::-;33935:139;;33833:248;;;:::o;34087:419::-;34253:4;34291:2;34280:9;34276:18;34268:26;;34340:9;34334:4;34330:20;34326:1;34315:9;34311:17;34304:47;34368:131;34494:4;34368:131;:::i;:::-;34360:139;;34258:248;;;:::o;34512:419::-;34678:4;34716:2;34705:9;34701:18;34693:26;;34765:9;34759:4;34755:20;34751:1;34740:9;34736:17;34729:47;34793:131;34919:4;34793:131;:::i;:::-;34785:139;;34683:248;;;:::o;34937:419::-;35103:4;35141:2;35130:9;35126:18;35118:26;;35190:9;35184:4;35180:20;35176:1;35165:9;35161:17;35154:47;35218:131;35344:4;35218:131;:::i;:::-;35210:139;;35108:248;;;:::o;35362:419::-;35528:4;35566:2;35555:9;35551:18;35543:26;;35615:9;35609:4;35605:20;35601:1;35590:9;35586:17;35579:47;35643:131;35769:4;35643:131;:::i;:::-;35635:139;;35533:248;;;:::o;35787:222::-;35880:4;35918:2;35907:9;35903:18;35895:26;;35931:71;35999:1;35988:9;35984:17;35975:6;35931:71;:::i;:::-;35885:124;;;;:::o;36015:129::-;36049:6;36076:20;;:::i;:::-;36066:30;;36105:33;36133:4;36125:6;36105:33;:::i;:::-;36056:88;;;:::o;36150:75::-;36183:6;36216:2;36210:9;36200:19;;36190:35;:::o;36231:311::-;36308:4;36398:18;36390:6;36387:30;36384:2;;;36420:18;;:::i;:::-;36384:2;36470:4;36462:6;36458:17;36450:25;;36530:4;36524;36520:15;36512:23;;36313:229;;;:::o;36548:307::-;36609:4;36699:18;36691:6;36688:30;36685:2;;;36721:18;;:::i;:::-;36685:2;36759:29;36781:6;36759:29;:::i;:::-;36751:37;;36843:4;36837;36833:15;36825:23;;36614:241;;;:::o;36861:308::-;36923:4;37013:18;37005:6;37002:30;36999:2;;;37035:18;;:::i;:::-;36999:2;37073:29;37095:6;37073:29;:::i;:::-;37065:37;;37157:4;37151;37147:15;37139:23;;36928:241;;;:::o;37175:141::-;37224:4;37247:3;37239:11;;37270:3;37267:1;37260:14;37304:4;37301:1;37291:18;37283:26;;37229:87;;;:::o;37322:98::-;37373:6;37407:5;37401:12;37391:22;;37380:40;;;:::o;37426:99::-;37478:6;37512:5;37506:12;37496:22;;37485:40;;;:::o;37531:168::-;37614:11;37648:6;37643:3;37636:19;37688:4;37683:3;37679:14;37664:29;;37626:73;;;;:::o;37705:169::-;37789:11;37823:6;37818:3;37811:19;37863:4;37858:3;37854:14;37839:29;;37801:73;;;;:::o;37880:148::-;37982:11;38019:3;38004:18;;37994:34;;;;:::o;38034:305::-;38074:3;38093:20;38111:1;38093:20;:::i;:::-;38088:25;;38127:20;38145:1;38127:20;:::i;:::-;38122:25;;38281:1;38213:66;38209:74;38206:1;38203:81;38200:2;;;38287:18;;:::i;:::-;38200:2;38331:1;38328;38324:9;38317:16;;38078:261;;;;:::o;38345:185::-;38385:1;38402:20;38420:1;38402:20;:::i;:::-;38397:25;;38436:20;38454:1;38436:20;:::i;:::-;38431:25;;38475:1;38465:2;;38480:18;;:::i;:::-;38465:2;38522:1;38519;38515:9;38510:14;;38387:143;;;;:::o;38536:348::-;38576:7;38599:20;38617:1;38599:20;:::i;:::-;38594:25;;38633:20;38651:1;38633:20;:::i;:::-;38628:25;;38821:1;38753:66;38749:74;38746:1;38743:81;38738:1;38731:9;38724:17;38720:105;38717:2;;;38828:18;;:::i;:::-;38717:2;38876:1;38873;38869:9;38858:20;;38584:300;;;;:::o;38890:191::-;38930:4;38950:20;38968:1;38950:20;:::i;:::-;38945:25;;38984:20;39002:1;38984:20;:::i;:::-;38979:25;;39023:1;39020;39017:8;39014:2;;;39028:18;;:::i;:::-;39014:2;39073:1;39070;39066:9;39058:17;;38935:146;;;;:::o;39087:96::-;39124:7;39153:24;39171:5;39153:24;:::i;:::-;39142:35;;39132:51;;;:::o;39189:90::-;39223:7;39266:5;39259:13;39252:21;39241:32;;39231:48;;;:::o;39285:77::-;39322:7;39351:5;39340:16;;39330:32;;;:::o;39368:149::-;39404:7;39444:66;39437:5;39433:78;39422:89;;39412:105;;;:::o;39523:126::-;39560:7;39600:42;39593:5;39589:54;39578:65;;39568:81;;;:::o;39655:77::-;39692:7;39721:5;39710:16;;39700:32;;;:::o;39738:154::-;39822:6;39817:3;39812;39799:30;39884:1;39875:6;39870:3;39866:16;39859:27;39789:103;;;:::o;39898:307::-;39966:1;39976:113;39990:6;39987:1;39984:13;39976:113;;;40075:1;40070:3;40066:11;40060:18;40056:1;40051:3;40047:11;40040:39;40012:2;40009:1;40005:10;40000:15;;39976:113;;;40107:6;40104:1;40101:13;40098:2;;;40187:1;40178:6;40173:3;40169:16;40162:27;40098:2;39947:258;;;;:::o;40211:320::-;40255:6;40292:1;40286:4;40282:12;40272:22;;40339:1;40333:4;40329:12;40360:18;40350:2;;40416:4;40408:6;40404:17;40394:27;;40350:2;40478;40470:6;40467:14;40447:18;40444:38;40441:2;;;40497:18;;:::i;:::-;40441:2;40262:269;;;;:::o;40537:281::-;40620:27;40642:4;40620:27;:::i;:::-;40612:6;40608:40;40750:6;40738:10;40735:22;40714:18;40702:10;40699:34;40696:62;40693:2;;;40761:18;;:::i;:::-;40693:2;40801:10;40797:2;40790:22;40580:238;;;:::o;40824:233::-;40863:3;40886:24;40904:5;40886:24;:::i;:::-;40877:33;;40932:66;40925:5;40922:77;40919:2;;;41002:18;;:::i;:::-;40919:2;41049:1;41042:5;41038:13;41031:20;;40867:190;;;:::o;41063:100::-;41102:7;41131:26;41151:5;41131:26;:::i;:::-;41120:37;;41110:53;;;:::o;41169:94::-;41208:7;41237:20;41251:5;41237:20;:::i;:::-;41226:31;;41216:47;;;:::o;41269:176::-;41301:1;41318:20;41336:1;41318:20;:::i;:::-;41313:25;;41352:20;41370:1;41352:20;:::i;:::-;41347:25;;41391:1;41381:2;;41396:18;;:::i;:::-;41381:2;41437:1;41434;41430:9;41425:14;;41303:142;;;;:::o;41451:180::-;41499:77;41496:1;41489:88;41596:4;41593:1;41586:15;41620:4;41617:1;41610:15;41637:180;41685:77;41682:1;41675:88;41782:4;41779:1;41772:15;41806:4;41803:1;41796:15;41823:180;41871:77;41868:1;41861:88;41968:4;41965:1;41958:15;41992:4;41989:1;41982:15;42009:180;42057:77;42054:1;42047:88;42154:4;42151:1;42144:15;42178:4;42175:1;42168:15;42195:102;42236:6;42287:2;42283:7;42278:2;42271:5;42267:14;42263:28;42253:38;;42243:54;;;:::o;42303:94::-;42336:8;42384:5;42380:2;42376:14;42355:35;;42345:52;;;:::o;42403:161::-;42543:13;42539:1;42531:6;42527:14;42520:37;42509:55;:::o;42570:230::-;42710:34;42706:1;42698:6;42694:14;42687:58;42779:13;42774:2;42766:6;42762:15;42755:38;42676:124;:::o;42806:237::-;42946:34;42942:1;42934:6;42930:14;42923:58;43015:20;43010:2;43002:6;42998:15;42991:45;42912:131;:::o;43049:178::-;43189:30;43185:1;43177:6;43173:14;43166:54;43155:72;:::o;43233:225::-;43373:34;43369:1;43361:6;43357:14;43350:58;43442:8;43437:2;43429:6;43425:15;43418:33;43339:119;:::o;43464:178::-;43604:30;43600:1;43592:6;43588:14;43581:54;43570:72;:::o;43648:182::-;43788:34;43784:1;43776:6;43772:14;43765:58;43754:76;:::o;43836:223::-;43976:34;43972:1;43964:6;43960:14;43953:58;44045:6;44040:2;44032:6;44028:15;44021:31;43942:117;:::o;44065:175::-;44205:27;44201:1;44193:6;44189:14;44182:51;44171:69;:::o;44246:168::-;44386:20;44382:1;44374:6;44370:14;44363:44;44352:62;:::o;44420:181::-;44560:33;44556:1;44548:6;44544:14;44537:57;44526:75;:::o;44607:231::-;44747:34;44743:1;44735:6;44731:14;44724:58;44816:14;44811:2;44803:6;44799:15;44792:39;44713:125;:::o;44844:243::-;44984:34;44980:1;44972:6;44968:14;44961:58;45053:26;45048:2;45040:6;45036:15;45029:51;44950:137;:::o;45093:165::-;45233:17;45229:1;45221:6;45217:14;45210:41;45199:59;:::o;45264:229::-;45404:34;45400:1;45392:6;45388:14;45381:58;45473:12;45468:2;45460:6;45456:15;45449:37;45370:123;:::o;45499:228::-;45639:34;45635:1;45627:6;45623:14;45616:58;45708:11;45703:2;45695:6;45691:15;45684:36;45605:122;:::o;45733:223::-;45873:34;45869:1;45861:6;45857:14;45850:58;45942:6;45937:2;45929:6;45925:15;45918:31;45839:117;:::o;45962:182::-;46102:34;46098:1;46090:6;46086:14;46079:58;46068:76;:::o;46150:231::-;46290:34;46286:1;46278:6;46274:14;46267:58;46359:14;46354:2;46346:6;46342:15;46335:39;46256:125;:::o;46387:182::-;46527:34;46523:1;46515:6;46511:14;46504:58;46493:76;:::o;46575:228::-;46715:34;46711:1;46703:6;46699:14;46692:58;46784:11;46779:2;46771:6;46767:15;46760:36;46681:122;:::o;46809:234::-;46949:34;46945:1;46937:6;46933:14;46926:58;47018:17;47013:2;47005:6;47001:15;46994:42;46915:128;:::o;47049:220::-;47189:34;47185:1;47177:6;47173:14;47166:58;47258:3;47253:2;47245:6;47241:15;47234:28;47155:114;:::o;47275:236::-;47415:34;47411:1;47403:6;47399:14;47392:58;47484:19;47479:2;47471:6;47467:15;47460:44;47381:130;:::o;47517:231::-;47657:34;47653:1;47645:6;47641:14;47634:58;47726:14;47721:2;47713:6;47709:15;47702:39;47623:125;:::o;47754:182::-;47894:34;47890:1;47882:6;47878:14;47871:58;47860:76;:::o;47942:290::-;48082:34;48078:1;48070:6;48066:14;48059:58;48151:34;48146:2;48138:6;48134:15;48127:59;48220:4;48215:2;48207:6;48203:15;48196:29;48048:184;:::o;48238:122::-;48311:24;48329:5;48311:24;:::i;:::-;48304:5;48301:35;48291:2;;48350:1;48347;48340:12;48291:2;48281:79;:::o;48366:116::-;48436:21;48451:5;48436:21;:::i;:::-;48429:5;48426:32;48416:2;;48472:1;48469;48462:12;48416:2;48406:76;:::o;48488:122::-;48561:24;48579:5;48561:24;:::i;:::-;48554:5;48551:35;48541:2;;48600:1;48597;48590:12;48541:2;48531:79;:::o;48616:120::-;48688:23;48705:5;48688:23;:::i;:::-;48681:5;48678:34;48668:2;;48726:1;48723;48716:12;48668:2;48658:78;:::o;48742:122::-;48815:24;48833:5;48815:24;:::i;:::-;48808:5;48805:35;48795:2;;48854:1;48851;48844:12;48795:2;48785:79;:::o

Swarm Source

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