ETH Price: $3,966.72 (+1.92%)

Token

PiratesOfThePandemic (POTP)
 

Overview

Max Total Supply

690 POTP

Holders

172

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 POTP
0x28c185c8623bb480033993932e639ed8a8dd226f
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:
PiratesOfThePandemic

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-11
*/

// SPDX-License-Identifier: MIT


/*
    ███████     ████████   ████████   ███████     
    ██     ██   ██    ██      ██      ██     ██
    ██     ██   ██    ██      ██      ██     ██
    ███████     ██    ██      ██      ███████
    ██          ██    ██      ██      ██
    ██          ████████      ██      ██        
*/


pragma solidity ^0.8.0;

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

/**
 * @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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle 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)
        }
    }
}

// File: contracts/Tiny_Frens.sol


// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/contract.sol


contract PiratesOfThePandemic is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  
  uint256 public presaleCost = 0.1 ether;
  uint256 public publicSaleCost = 0.15 ether;
  uint256 public maxSupply = 4444;
  uint256 public maxMintAmountPerTx = 2;

  bool public paused = true;
  bool public presaleActive = true;

  bytes32 public merkleRoot = 0x0de6c9f4b501d88b442db96c4f3653e394ef2ce0c67fc9d33527d625663f633c;

  constructor() ERC721("PiratesOfThePandemic", "POTP") {
    _mintLoop(msg.sender,10);
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(bytes32[] calldata _merkleProof, uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");

    if(presaleActive==true){
      require(msg.value >= presaleCost * _mintAmount, "Insufficient funds!");
      //verify the provided _merkleProof
      bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
      require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not part of the Presale whitelist.");
    }
    else{
      require(msg.value >= publicSaleCost * _mintAmount, "Insufficient funds!");
    }
    _mintLoop(msg.sender, _mintAmount);
  }

  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

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

  function setPublicSaleCost(uint256 _publicSaleCost) public onlyOwner {
    publicSaleCost = _publicSaleCost;
  }

  function setPresaleCost(uint256 _presaleCost) public onlyOwner {
    presaleCost = _presaleCost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }
 
  function endPresale() public onlyOwner {
    presaleActive=false;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function withdraw() public onlyOwner {
    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"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":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleCost","type":"uint256"}],"name":"setPublicSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b929190620007a3565b5067016345785d8a0000600955670214e8348c4f0000600a5561115c600b556002600c556001600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055507f0de6c9f4b501d88b442db96c4f3653e394ef2ce0c67fc9d33527d625663f633c60001b600e55348015620000b957600080fd5b506040518060400160405280601481526020017f506972617465734f6654686550616e64656d69630000000000000000000000008152506040518060400160405280600481526020017f504f54500000000000000000000000000000000000000000000000000000000081525081600090805190602001906200013e929190620007a3565b50806001908051906020019062000157929190620007a3565b5050506200017a6200016e6200019360201b60201c565b6200019b60201b60201c565b6200018d33600a6200026160201b60201c565b62000d0b565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015620002c257620002846007620002c760201b62001ba91760201c565b620002ac83620002a06007620002dd60201b62001bbf1760201c565b620002eb60201b60201c565b8080620002b99062000b8e565b91505062000264565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6200030d8282604051806020016040528060008152506200031160201b60201c565b5050565b6200032383836200037f60201b60201c565b6200033860008484846200056560201b60201c565b6200037a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037190620009c8565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e99062000a0c565b60405180910390fd5b62000403816200071f60201b60201c565b1562000446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043d90620009ea565b60405180910390fd5b6200045a600083836200078b60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004ac919062000a5b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005938473ffffffffffffffffffffffffffffffffffffffff166200079060201b62001bcd1760201c565b1562000712578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005c56200019360201b60201c565b8786866040518563ffffffff1660e01b8152600401620005e9949392919062000974565b602060405180830381600087803b1580156200060457600080fd5b505af19250505080156200063857506040513d601f19601f820116820180604052508101906200063591906200086a565b60015b620006c1573d80600081146200066b576040519150601f19603f3d011682016040523d82523d6000602084013e62000670565b606091505b50600081511415620006b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006b090620009c8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000717565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b828054620007b19062000b58565b90600052602060002090601f016020900481019282620007d5576000855562000821565b82601f10620007f057805160ff191683800117855562000821565b8280016001018555821562000821579182015b828111156200082057825182559160200191906001019062000803565b5b50905062000830919062000834565b5090565b5b808211156200084f57600081600090555060010162000835565b5090565b600081519050620008648162000cf1565b92915050565b60006020828403121562000883576200088262000c3a565b5b6000620008938482850162000853565b91505092915050565b620008a78162000ab8565b82525050565b6000620008ba8262000a2e565b620008c6818562000a39565b9350620008d881856020860162000b22565b620008e38162000c3f565b840191505092915050565b6000620008fd60328362000a4a565b91506200090a8262000c50565b604082019050919050565b600062000924601c8362000a4a565b9150620009318262000c9f565b602082019050919050565b60006200094b60208362000a4a565b9150620009588262000cc8565b602082019050919050565b6200096e8162000b18565b82525050565b60006080820190506200098b60008301876200089c565b6200099a60208301866200089c565b620009a9604083018562000963565b8181036060830152620009bd8184620008ad565b905095945050505050565b60006020820190508181036000830152620009e381620008ee565b9050919050565b6000602082019050818103600083015262000a058162000915565b9050919050565b6000602082019050818103600083015262000a27816200093c565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000a688262000b18565b915062000a758362000b18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000aad5762000aac62000bdc565b5b828201905092915050565b600062000ac58262000af8565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b4257808201518184015260208101905062000b25565b8381111562000b52576000848401525b50505050565b6000600282049050600182168062000b7157607f821691505b6020821081141562000b885762000b8762000c0b565b5b50919050565b600062000b9b8262000b18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000bd15762000bd062000bdc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000cfc8162000acc565b811462000d0857600080fd5b50565b6143a38062000d1b6000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610742578063d5abeb011461077f578063e985e9c5146107aa578063efbd73f4146107e7578063f2fde38b146108105761020f565b8063a22cb465146106b0578063a43be57b146106d9578063b071401b146106f0578063b88d4fde146107195761020f565b80638da5cb5b116100e75780638da5cb5b146105dd5780638dbb7c06146106085780638fdcf9421461063157806394354fd01461065a57806395d89b41146106855761020f565b806370a0823114610537578063715018a6146105745780637cb647591461058b5780637ec4a659146105b45761020f565b80633ccfd60b1161019b57806345de0d9b1161016a57806345de0d9b1461045d57806353135ca0146104795780635c975abb146104a457806362b99ad4146104cf5780636352211e146104fa5761020f565b80633ccfd60b146103b557806342842e0e146103cc578063438b6300146103f5578063453afb0f146104325761020f565b806316c38b3c116101e257806316c38b3c146102e257806318160ddd1461030b57806323b872dd146103365780632a23d07d1461035f5780632eb4a7ab1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612ecd565b610839565b6040516102489190613565565b60405180910390f35b34801561025d57600080fd5b5061026661091b565b604051610273919061359b565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612f70565b6109ad565b6040516102b091906134dc565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612dd3565b610a32565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612e73565b610b4a565b005b34801561031757600080fd5b50610320610be3565b60405161032d919061385d565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190612cbd565b610bf4565b005b34801561036b57600080fd5b50610374610c54565b604051610381919061385d565b60405180910390f35b34801561039657600080fd5b5061039f610c5a565b6040516103ac9190613580565b60405180910390f35b3480156103c157600080fd5b506103ca610c60565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612cbd565b610d5c565b005b34801561040157600080fd5b5061041c60048036038101906104179190612c50565b610d7c565b6040516104299190613543565b60405180910390f35b34801561043e57600080fd5b50610447610e87565b604051610454919061385d565b60405180910390f35b61047760048036038101906104729190612e13565b610e8d565b005b34801561048557600080fd5b5061048e611113565b60405161049b9190613565565b60405180910390f35b3480156104b057600080fd5b506104b9611126565b6040516104c69190613565565b60405180910390f35b3480156104db57600080fd5b506104e4611139565b6040516104f1919061359b565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190612f70565b6111c7565b60405161052e91906134dc565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612c50565b611279565b60405161056b919061385d565b60405180910390f35b34801561058057600080fd5b50610589611331565b005b34801561059757600080fd5b506105b260048036038101906105ad9190612ea0565b6113b9565b005b3480156105c057600080fd5b506105db60048036038101906105d69190612f27565b61143f565b005b3480156105e957600080fd5b506105f26114d5565b6040516105ff91906134dc565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190612f70565b6114ff565b005b34801561063d57600080fd5b5061065860048036038101906106539190612f70565b611585565b005b34801561066657600080fd5b5061066f61160b565b60405161067c919061385d565b60405180910390f35b34801561069157600080fd5b5061069a611611565b6040516106a7919061359b565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612d93565b6116a3565b005b3480156106e557600080fd5b506106ee6116b9565b005b3480156106fc57600080fd5b5061071760048036038101906107129190612f70565b611752565b005b34801561072557600080fd5b50610740600480360381019061073b9190612d10565b6117d8565b005b34801561074e57600080fd5b5061076960048036038101906107649190612f70565b61183a565b604051610776919061359b565b60405180910390f35b34801561078b57600080fd5b506107946118e1565b6040516107a1919061385d565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190612c7d565b6118e7565b6040516107de9190613565565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612f9d565b61197b565b005b34801561081c57600080fd5b5061083760048036038101906108329190612c50565b611ab1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610914575061091382611be0565b5b9050919050565b60606000805461092a90613b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613b5b565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b5050505050905090565b60006109b882611c4a565b6109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee9061373d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3d826111c7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa5906137dd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610acd611cb6565b73ffffffffffffffffffffffffffffffffffffffff161480610afc5750610afb81610af6611cb6565b6118e7565b5b610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b32906136bd565b60405180910390fd5b610b458383611cbe565b505050565b610b52611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610b706114d5565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd9061375d565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6000610bef6007611bbf565b905090565b610c05610bff611cb6565b82611d77565b610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b9061381d565b60405180910390fd5b610c4f838383611e55565b505050565b60095481565b600e5481565b610c68611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610c866114d5565b73ffffffffffffffffffffffffffffffffffffffff1614610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061375d565b60405180910390fd5b6000610ce66114d5565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d09906134c7565b60006040518083038185875af1925050503d8060008114610d46576040519150601f19603f3d011682016040523d82523d6000602084013e610d4b565b606091505b5050905080610d5957600080fd5b50565b610d77838383604051806020016040528060008152506117d8565b505050565b60606000610d8983611279565b905060008167ffffffffffffffff811115610da757610da6613d18565b5b604051908082528060200260200182016040528015610dd55781602001602082028036833780820191505090505b50905060006001905060005b8381108015610df25750600b548211155b15610e7b576000610e02836111c7565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e675782848381518110610e4c57610e4b613ce9565b5b6020026020010181815250508180610e6390613bbe565b9250505b8280610e7290613bbe565b93505050610de1565b82945050505050919050565b600a5481565b80600081118015610ea05750600c548111155b610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed69061361d565b60405180910390fd5b600b5481610eed6007611bbf565b610ef79190613986565b1115610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906137fd565b60405180910390fd5b600d60009054906101000a900460ff1615610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f9061377d565b60405180910390fd5b60011515600d60019054906101000a900460ff16151514156110b25781600954610fb29190613a0d565b341015610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb9061383d565b60405180910390fd5b600033604051602001611007919061347d565b60405160208183030381529060405280519060200120905061106d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836120b1565b6110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061369d565b60405180910390fd5b50611103565b81600a546110c09190613a0d565b341015611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f99061383d565b60405180910390fd5b5b61110d33836120c8565b50505050565b600d60019054906101000a900460ff1681565b600d60009054906101000a900460ff1681565b6008805461114690613b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461117290613b5b565b80156111bf5780601f10611194576101008083540402835291602001916111bf565b820191906000526020600020905b8154815290600101906020018083116111a257829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906136fd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e1906136dd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611339611cb6565b73ffffffffffffffffffffffffffffffffffffffff166113576114d5565b73ffffffffffffffffffffffffffffffffffffffff16146113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a49061375d565b60405180910390fd5b6113b76000612108565b565b6113c1611cb6565b73ffffffffffffffffffffffffffffffffffffffff166113df6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c9061375d565b60405180910390fd5b80600e8190555050565b611447611cb6565b73ffffffffffffffffffffffffffffffffffffffff166114656114d5565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061375d565b60405180910390fd5b80600890805190602001906114d19291906129f9565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611507611cb6565b73ffffffffffffffffffffffffffffffffffffffff166115256114d5565b73ffffffffffffffffffffffffffffffffffffffff161461157b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115729061375d565b60405180910390fd5b80600a8190555050565b61158d611cb6565b73ffffffffffffffffffffffffffffffffffffffff166115ab6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f89061375d565b60405180910390fd5b8060098190555050565b600c5481565b60606001805461162090613b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461164c90613b5b565b80156116995780601f1061166e57610100808354040283529160200191611699565b820191906000526020600020905b81548152906001019060200180831161167c57829003601f168201915b5050505050905090565b6116b56116ae611cb6565b83836121ce565b5050565b6116c1611cb6565b73ffffffffffffffffffffffffffffffffffffffff166116df6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061375d565b60405180910390fd5b6000600d60016101000a81548160ff021916908315150217905550565b61175a611cb6565b73ffffffffffffffffffffffffffffffffffffffff166117786114d5565b73ffffffffffffffffffffffffffffffffffffffff16146117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c59061375d565b60405180910390fd5b80600c8190555050565b6117e96117e3611cb6565b83611d77565b611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061381d565b60405180910390fd5b6118348484848461233b565b50505050565b606061184582611c4a565b611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b906137bd565b60405180910390fd5b600061188e612397565b905060008151116118ae57604051806020016040528060008152506118d9565b806118b884612429565b6040516020016118c9929190613498565b6040516020818303038152906040525b915050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561198e5750600c548111155b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c49061361d565b60405180910390fd5b600b54816119db6007611bbf565b6119e59190613986565b1115611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d906137fd565b60405180910390fd5b611a2e611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611a4c6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a999061375d565b60405180910390fd5b611aac82846120c8565b505050565b611ab9611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611ad76114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b249061375d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906135dd565b60405180910390fd5b611ba681612108565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d31836111c7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d8282611c4a565b611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db89061367d565b60405180910390fd5b6000611dcc836111c7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e3b57508373ffffffffffffffffffffffffffffffffffffffff16611e23846109ad565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e4c5750611e4b81856118e7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e75826111c7565b73ffffffffffffffffffffffffffffffffffffffff1614611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec29061379d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f329061363d565b60405180910390fd5b611f4683838361258a565b611f51600082611cbe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa19190613a67565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff89190613986565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826120be858461258f565b1490509392505050565b60005b81811015612103576120dd6007611ba9565b6120f0836120eb6007611bbf565b612604565b80806120fb90613bbe565b9150506120cb565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122349061365d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161232e9190613565565b60405180910390a3505050565b612346848484611e55565b61235284848484612622565b612391576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612388906135bd565b60405180910390fd5b50505050565b6060600880546123a690613b5b565b80601f01602080910402602001604051908101604052809291908181526020018280546123d290613b5b565b801561241f5780601f106123f45761010080835404028352916020019161241f565b820191906000526020600020905b81548152906001019060200180831161240257829003601f168201915b5050505050905090565b60606000821415612471576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612585565b600082905060005b600082146124a357808061248c90613bbe565b915050600a8261249c91906139dc565b9150612479565b60008167ffffffffffffffff8111156124bf576124be613d18565b5b6040519080825280601f01601f1916602001820160405280156124f15781602001600182028036833780820191505090505b5090505b6000851461257e5760018261250a9190613a67565b9150600a856125199190613c2b565b60306125259190613986565b60f81b81838151811061253b5761253a613ce9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257791906139dc565b94506124f5565b8093505050505b919050565b505050565b60008082905060005b84518110156125f95760008582815181106125b6576125b5613ce9565b5b602002602001015190508083116125d8576125d183826127b9565b92506125e5565b6125e281846127b9565b92505b5080806125f190613bbe565b915050612598565b508091505092915050565b61261e8282604051806020016040528060008152506127d0565b5050565b60006126438473ffffffffffffffffffffffffffffffffffffffff16611bcd565b156127ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261266c611cb6565b8786866040518563ffffffff1660e01b815260040161268e94939291906134f7565b602060405180830381600087803b1580156126a857600080fd5b505af19250505080156126d957506040513d601f19601f820116820180604052508101906126d69190612efa565b60015b61275c573d8060008114612709576040519150601f19603f3d011682016040523d82523d6000602084013e61270e565b606091505b50600081511415612754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274b906135bd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127b1565b600190505b949350505050565b600082600052816020526040600020905092915050565b6127da838361282b565b6127e76000848484612622565b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d906135bd565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128929061371d565b60405180910390fd5b6128a481611c4a565b156128e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128db906135fd565b60405180910390fd5b6128f06000838361258a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129409190613986565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612a0590613b5b565b90600052602060002090601f016020900481019282612a275760008555612a6e565b82601f10612a4057805160ff1916838001178555612a6e565b82800160010185558215612a6e579182015b82811115612a6d578251825591602001919060010190612a52565b5b509050612a7b9190612a7f565b5090565b5b80821115612a98576000816000905550600101612a80565b5090565b6000612aaf612aaa8461389d565b613878565b905082815260208101848484011115612acb57612aca613d56565b5b612ad6848285613b19565b509392505050565b6000612af1612aec846138ce565b613878565b905082815260208101848484011115612b0d57612b0c613d56565b5b612b18848285613b19565b509392505050565b600081359050612b2f816142fa565b92915050565b60008083601f840112612b4b57612b4a613d4c565b5b8235905067ffffffffffffffff811115612b6857612b67613d47565b5b602083019150836020820283011115612b8457612b83613d51565b5b9250929050565b600081359050612b9a81614311565b92915050565b600081359050612baf81614328565b92915050565b600081359050612bc48161433f565b92915050565b600081519050612bd98161433f565b92915050565b600082601f830112612bf457612bf3613d4c565b5b8135612c04848260208601612a9c565b91505092915050565b600082601f830112612c2257612c21613d4c565b5b8135612c32848260208601612ade565b91505092915050565b600081359050612c4a81614356565b92915050565b600060208284031215612c6657612c65613d60565b5b6000612c7484828501612b20565b91505092915050565b60008060408385031215612c9457612c93613d60565b5b6000612ca285828601612b20565b9250506020612cb385828601612b20565b9150509250929050565b600080600060608486031215612cd657612cd5613d60565b5b6000612ce486828701612b20565b9350506020612cf586828701612b20565b9250506040612d0686828701612c3b565b9150509250925092565b60008060008060808587031215612d2a57612d29613d60565b5b6000612d3887828801612b20565b9450506020612d4987828801612b20565b9350506040612d5a87828801612c3b565b925050606085013567ffffffffffffffff811115612d7b57612d7a613d5b565b5b612d8787828801612bdf565b91505092959194509250565b60008060408385031215612daa57612da9613d60565b5b6000612db885828601612b20565b9250506020612dc985828601612b8b565b9150509250929050565b60008060408385031215612dea57612de9613d60565b5b6000612df885828601612b20565b9250506020612e0985828601612c3b565b9150509250929050565b600080600060408486031215612e2c57612e2b613d60565b5b600084013567ffffffffffffffff811115612e4a57612e49613d5b565b5b612e5686828701612b35565b93509350506020612e6986828701612c3b565b9150509250925092565b600060208284031215612e8957612e88613d60565b5b6000612e9784828501612b8b565b91505092915050565b600060208284031215612eb657612eb5613d60565b5b6000612ec484828501612ba0565b91505092915050565b600060208284031215612ee357612ee2613d60565b5b6000612ef184828501612bb5565b91505092915050565b600060208284031215612f1057612f0f613d60565b5b6000612f1e84828501612bca565b91505092915050565b600060208284031215612f3d57612f3c613d60565b5b600082013567ffffffffffffffff811115612f5b57612f5a613d5b565b5b612f6784828501612c0d565b91505092915050565b600060208284031215612f8657612f85613d60565b5b6000612f9484828501612c3b565b91505092915050565b60008060408385031215612fb457612fb3613d60565b5b6000612fc285828601612c3b565b9250506020612fd385828601612b20565b9150509250929050565b6000612fe9838361345f565b60208301905092915050565b612ffe81613a9b565b82525050565b61301561301082613a9b565b613c07565b82525050565b60006130268261390f565b613030818561393d565b935061303b836138ff565b8060005b8381101561306c5781516130538882612fdd565b975061305e83613930565b92505060018101905061303f565b5085935050505092915050565b61308281613aad565b82525050565b61309181613ab9565b82525050565b60006130a28261391a565b6130ac818561394e565b93506130bc818560208601613b28565b6130c581613d65565b840191505092915050565b60006130db82613925565b6130e5818561396a565b93506130f5818560208601613b28565b6130fe81613d65565b840191505092915050565b600061311482613925565b61311e818561397b565b935061312e818560208601613b28565b80840191505092915050565b600061314760328361396a565b915061315282613d83565b604082019050919050565b600061316a60268361396a565b915061317582613dd2565b604082019050919050565b600061318d601c8361396a565b915061319882613e21565b602082019050919050565b60006131b060148361396a565b91506131bb82613e4a565b602082019050919050565b60006131d360248361396a565b91506131de82613e73565b604082019050919050565b60006131f660198361396a565b915061320182613ec2565b602082019050919050565b6000613219602c8361396a565b915061322482613eeb565b604082019050919050565b600061323c60228361396a565b915061324782613f3a565b604082019050919050565b600061325f60388361396a565b915061326a82613f89565b604082019050919050565b6000613282602a8361396a565b915061328d82613fd8565b604082019050919050565b60006132a560298361396a565b91506132b082614027565b604082019050919050565b60006132c860208361396a565b91506132d382614076565b602082019050919050565b60006132eb602c8361396a565b91506132f68261409f565b604082019050919050565b600061330e60058361397b565b9150613319826140ee565b600582019050919050565b600061333160208361396a565b915061333c82614117565b602082019050919050565b600061335460178361396a565b915061335f82614140565b602082019050919050565b600061337760298361396a565b915061338282614169565b604082019050919050565b600061339a602f8361396a565b91506133a5826141b8565b604082019050919050565b60006133bd60218361396a565b91506133c882614207565b604082019050919050565b60006133e060008361395f565b91506133eb82614256565b600082019050919050565b600061340360148361396a565b915061340e82614259565b602082019050919050565b600061342660318361396a565b915061343182614282565b604082019050919050565b600061344960138361396a565b9150613454826142d1565b602082019050919050565b61346881613b0f565b82525050565b61347781613b0f565b82525050565b60006134898284613004565b60148201915081905092915050565b60006134a48285613109565b91506134b08284613109565b91506134bb82613301565b91508190509392505050565b60006134d2826133d3565b9150819050919050565b60006020820190506134f16000830184612ff5565b92915050565b600060808201905061350c6000830187612ff5565b6135196020830186612ff5565b613526604083018561346e565b81810360608301526135388184613097565b905095945050505050565b6000602082019050818103600083015261355d818461301b565b905092915050565b600060208201905061357a6000830184613079565b92915050565b60006020820190506135956000830184613088565b92915050565b600060208201905081810360008301526135b581846130d0565b905092915050565b600060208201905081810360008301526135d68161313a565b9050919050565b600060208201905081810360008301526135f68161315d565b9050919050565b6000602082019050818103600083015261361681613180565b9050919050565b60006020820190508181036000830152613636816131a3565b9050919050565b60006020820190508181036000830152613656816131c6565b9050919050565b60006020820190508181036000830152613676816131e9565b9050919050565b600060208201905081810360008301526136968161320c565b9050919050565b600060208201905081810360008301526136b68161322f565b9050919050565b600060208201905081810360008301526136d681613252565b9050919050565b600060208201905081810360008301526136f681613275565b9050919050565b6000602082019050818103600083015261371681613298565b9050919050565b60006020820190508181036000830152613736816132bb565b9050919050565b60006020820190508181036000830152613756816132de565b9050919050565b6000602082019050818103600083015261377681613324565b9050919050565b6000602082019050818103600083015261379681613347565b9050919050565b600060208201905081810360008301526137b68161336a565b9050919050565b600060208201905081810360008301526137d68161338d565b9050919050565b600060208201905081810360008301526137f6816133b0565b9050919050565b60006020820190508181036000830152613816816133f6565b9050919050565b6000602082019050818103600083015261383681613419565b9050919050565b600060208201905081810360008301526138568161343c565b9050919050565b6000602082019050613872600083018461346e565b92915050565b6000613882613893565b905061388e8282613b8d565b919050565b6000604051905090565b600067ffffffffffffffff8211156138b8576138b7613d18565b5b6138c182613d65565b9050602081019050919050565b600067ffffffffffffffff8211156138e9576138e8613d18565b5b6138f282613d65565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061399182613b0f565b915061399c83613b0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139d1576139d0613c5c565b5b828201905092915050565b60006139e782613b0f565b91506139f283613b0f565b925082613a0257613a01613c8b565b5b828204905092915050565b6000613a1882613b0f565b9150613a2383613b0f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5c57613a5b613c5c565b5b828202905092915050565b6000613a7282613b0f565b9150613a7d83613b0f565b925082821015613a9057613a8f613c5c565b5b828203905092915050565b6000613aa682613aef565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b46578082015181840152602081019050613b2b565b83811115613b55576000848401525b50505050565b60006002820490506001821680613b7357607f821691505b60208210811415613b8757613b86613cba565b5b50919050565b613b9682613d65565b810181811067ffffffffffffffff82111715613bb557613bb4613d18565b5b80604052505050565b6000613bc982613b0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bfc57613bfb613c5c565b5b600182019050919050565b6000613c1282613c19565b9050919050565b6000613c2482613d76565b9050919050565b6000613c3682613b0f565b9150613c4183613b0f565b925082613c5157613c50613c8b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f742070617274206f66207468652050726573616c652077686974656c697360008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61430381613a9b565b811461430e57600080fd5b50565b61431a81613aad565b811461432557600080fd5b50565b61433181613ab9565b811461433c57600080fd5b50565b61434881613ac3565b811461435357600080fd5b50565b61435f81613b0f565b811461436a57600080fd5b5056fea2646970667358221220a6e88b78cdd6b4ff463ff7b8964ac5e4f65b083732768ed2feaf1ed0317003e264736f6c63430008070033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610742578063d5abeb011461077f578063e985e9c5146107aa578063efbd73f4146107e7578063f2fde38b146108105761020f565b8063a22cb465146106b0578063a43be57b146106d9578063b071401b146106f0578063b88d4fde146107195761020f565b80638da5cb5b116100e75780638da5cb5b146105dd5780638dbb7c06146106085780638fdcf9421461063157806394354fd01461065a57806395d89b41146106855761020f565b806370a0823114610537578063715018a6146105745780637cb647591461058b5780637ec4a659146105b45761020f565b80633ccfd60b1161019b57806345de0d9b1161016a57806345de0d9b1461045d57806353135ca0146104795780635c975abb146104a457806362b99ad4146104cf5780636352211e146104fa5761020f565b80633ccfd60b146103b557806342842e0e146103cc578063438b6300146103f5578063453afb0f146104325761020f565b806316c38b3c116101e257806316c38b3c146102e257806318160ddd1461030b57806323b872dd146103365780632a23d07d1461035f5780632eb4a7ab1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612ecd565b610839565b6040516102489190613565565b60405180910390f35b34801561025d57600080fd5b5061026661091b565b604051610273919061359b565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612f70565b6109ad565b6040516102b091906134dc565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612dd3565b610a32565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612e73565b610b4a565b005b34801561031757600080fd5b50610320610be3565b60405161032d919061385d565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190612cbd565b610bf4565b005b34801561036b57600080fd5b50610374610c54565b604051610381919061385d565b60405180910390f35b34801561039657600080fd5b5061039f610c5a565b6040516103ac9190613580565b60405180910390f35b3480156103c157600080fd5b506103ca610c60565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612cbd565b610d5c565b005b34801561040157600080fd5b5061041c60048036038101906104179190612c50565b610d7c565b6040516104299190613543565b60405180910390f35b34801561043e57600080fd5b50610447610e87565b604051610454919061385d565b60405180910390f35b61047760048036038101906104729190612e13565b610e8d565b005b34801561048557600080fd5b5061048e611113565b60405161049b9190613565565b60405180910390f35b3480156104b057600080fd5b506104b9611126565b6040516104c69190613565565b60405180910390f35b3480156104db57600080fd5b506104e4611139565b6040516104f1919061359b565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190612f70565b6111c7565b60405161052e91906134dc565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612c50565b611279565b60405161056b919061385d565b60405180910390f35b34801561058057600080fd5b50610589611331565b005b34801561059757600080fd5b506105b260048036038101906105ad9190612ea0565b6113b9565b005b3480156105c057600080fd5b506105db60048036038101906105d69190612f27565b61143f565b005b3480156105e957600080fd5b506105f26114d5565b6040516105ff91906134dc565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190612f70565b6114ff565b005b34801561063d57600080fd5b5061065860048036038101906106539190612f70565b611585565b005b34801561066657600080fd5b5061066f61160b565b60405161067c919061385d565b60405180910390f35b34801561069157600080fd5b5061069a611611565b6040516106a7919061359b565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612d93565b6116a3565b005b3480156106e557600080fd5b506106ee6116b9565b005b3480156106fc57600080fd5b5061071760048036038101906107129190612f70565b611752565b005b34801561072557600080fd5b50610740600480360381019061073b9190612d10565b6117d8565b005b34801561074e57600080fd5b5061076960048036038101906107649190612f70565b61183a565b604051610776919061359b565b60405180910390f35b34801561078b57600080fd5b506107946118e1565b6040516107a1919061385d565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190612c7d565b6118e7565b6040516107de9190613565565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612f9d565b61197b565b005b34801561081c57600080fd5b5061083760048036038101906108329190612c50565b611ab1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610914575061091382611be0565b5b9050919050565b60606000805461092a90613b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613b5b565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b5050505050905090565b60006109b882611c4a565b6109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee9061373d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3d826111c7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa5906137dd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610acd611cb6565b73ffffffffffffffffffffffffffffffffffffffff161480610afc5750610afb81610af6611cb6565b6118e7565b5b610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b32906136bd565b60405180910390fd5b610b458383611cbe565b505050565b610b52611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610b706114d5565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd9061375d565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6000610bef6007611bbf565b905090565b610c05610bff611cb6565b82611d77565b610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b9061381d565b60405180910390fd5b610c4f838383611e55565b505050565b60095481565b600e5481565b610c68611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610c866114d5565b73ffffffffffffffffffffffffffffffffffffffff1614610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061375d565b60405180910390fd5b6000610ce66114d5565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d09906134c7565b60006040518083038185875af1925050503d8060008114610d46576040519150601f19603f3d011682016040523d82523d6000602084013e610d4b565b606091505b5050905080610d5957600080fd5b50565b610d77838383604051806020016040528060008152506117d8565b505050565b60606000610d8983611279565b905060008167ffffffffffffffff811115610da757610da6613d18565b5b604051908082528060200260200182016040528015610dd55781602001602082028036833780820191505090505b50905060006001905060005b8381108015610df25750600b548211155b15610e7b576000610e02836111c7565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e675782848381518110610e4c57610e4b613ce9565b5b6020026020010181815250508180610e6390613bbe565b9250505b8280610e7290613bbe565b93505050610de1565b82945050505050919050565b600a5481565b80600081118015610ea05750600c548111155b610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed69061361d565b60405180910390fd5b600b5481610eed6007611bbf565b610ef79190613986565b1115610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906137fd565b60405180910390fd5b600d60009054906101000a900460ff1615610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f9061377d565b60405180910390fd5b60011515600d60019054906101000a900460ff16151514156110b25781600954610fb29190613a0d565b341015610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb9061383d565b60405180910390fd5b600033604051602001611007919061347d565b60405160208183030381529060405280519060200120905061106d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836120b1565b6110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061369d565b60405180910390fd5b50611103565b81600a546110c09190613a0d565b341015611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f99061383d565b60405180910390fd5b5b61110d33836120c8565b50505050565b600d60019054906101000a900460ff1681565b600d60009054906101000a900460ff1681565b6008805461114690613b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461117290613b5b565b80156111bf5780601f10611194576101008083540402835291602001916111bf565b820191906000526020600020905b8154815290600101906020018083116111a257829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906136fd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e1906136dd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611339611cb6565b73ffffffffffffffffffffffffffffffffffffffff166113576114d5565b73ffffffffffffffffffffffffffffffffffffffff16146113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a49061375d565b60405180910390fd5b6113b76000612108565b565b6113c1611cb6565b73ffffffffffffffffffffffffffffffffffffffff166113df6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c9061375d565b60405180910390fd5b80600e8190555050565b611447611cb6565b73ffffffffffffffffffffffffffffffffffffffff166114656114d5565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061375d565b60405180910390fd5b80600890805190602001906114d19291906129f9565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611507611cb6565b73ffffffffffffffffffffffffffffffffffffffff166115256114d5565b73ffffffffffffffffffffffffffffffffffffffff161461157b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115729061375d565b60405180910390fd5b80600a8190555050565b61158d611cb6565b73ffffffffffffffffffffffffffffffffffffffff166115ab6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f89061375d565b60405180910390fd5b8060098190555050565b600c5481565b60606001805461162090613b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461164c90613b5b565b80156116995780601f1061166e57610100808354040283529160200191611699565b820191906000526020600020905b81548152906001019060200180831161167c57829003601f168201915b5050505050905090565b6116b56116ae611cb6565b83836121ce565b5050565b6116c1611cb6565b73ffffffffffffffffffffffffffffffffffffffff166116df6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061375d565b60405180910390fd5b6000600d60016101000a81548160ff021916908315150217905550565b61175a611cb6565b73ffffffffffffffffffffffffffffffffffffffff166117786114d5565b73ffffffffffffffffffffffffffffffffffffffff16146117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c59061375d565b60405180910390fd5b80600c8190555050565b6117e96117e3611cb6565b83611d77565b611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061381d565b60405180910390fd5b6118348484848461233b565b50505050565b606061184582611c4a565b611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b906137bd565b60405180910390fd5b600061188e612397565b905060008151116118ae57604051806020016040528060008152506118d9565b806118b884612429565b6040516020016118c9929190613498565b6040516020818303038152906040525b915050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561198e5750600c548111155b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c49061361d565b60405180910390fd5b600b54816119db6007611bbf565b6119e59190613986565b1115611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d906137fd565b60405180910390fd5b611a2e611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611a4c6114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a999061375d565b60405180910390fd5b611aac82846120c8565b505050565b611ab9611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611ad76114d5565b73ffffffffffffffffffffffffffffffffffffffff1614611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b249061375d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906135dd565b60405180910390fd5b611ba681612108565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d31836111c7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d8282611c4a565b611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db89061367d565b60405180910390fd5b6000611dcc836111c7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e3b57508373ffffffffffffffffffffffffffffffffffffffff16611e23846109ad565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e4c5750611e4b81856118e7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e75826111c7565b73ffffffffffffffffffffffffffffffffffffffff1614611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec29061379d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f329061363d565b60405180910390fd5b611f4683838361258a565b611f51600082611cbe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa19190613a67565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff89190613986565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826120be858461258f565b1490509392505050565b60005b81811015612103576120dd6007611ba9565b6120f0836120eb6007611bbf565b612604565b80806120fb90613bbe565b9150506120cb565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122349061365d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161232e9190613565565b60405180910390a3505050565b612346848484611e55565b61235284848484612622565b612391576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612388906135bd565b60405180910390fd5b50505050565b6060600880546123a690613b5b565b80601f01602080910402602001604051908101604052809291908181526020018280546123d290613b5b565b801561241f5780601f106123f45761010080835404028352916020019161241f565b820191906000526020600020905b81548152906001019060200180831161240257829003601f168201915b5050505050905090565b60606000821415612471576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612585565b600082905060005b600082146124a357808061248c90613bbe565b915050600a8261249c91906139dc565b9150612479565b60008167ffffffffffffffff8111156124bf576124be613d18565b5b6040519080825280601f01601f1916602001820160405280156124f15781602001600182028036833780820191505090505b5090505b6000851461257e5760018261250a9190613a67565b9150600a856125199190613c2b565b60306125259190613986565b60f81b81838151811061253b5761253a613ce9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257791906139dc565b94506124f5565b8093505050505b919050565b505050565b60008082905060005b84518110156125f95760008582815181106125b6576125b5613ce9565b5b602002602001015190508083116125d8576125d183826127b9565b92506125e5565b6125e281846127b9565b92505b5080806125f190613bbe565b915050612598565b508091505092915050565b61261e8282604051806020016040528060008152506127d0565b5050565b60006126438473ffffffffffffffffffffffffffffffffffffffff16611bcd565b156127ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261266c611cb6565b8786866040518563ffffffff1660e01b815260040161268e94939291906134f7565b602060405180830381600087803b1580156126a857600080fd5b505af19250505080156126d957506040513d601f19601f820116820180604052508101906126d69190612efa565b60015b61275c573d8060008114612709576040519150601f19603f3d011682016040523d82523d6000602084013e61270e565b606091505b50600081511415612754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274b906135bd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127b1565b600190505b949350505050565b600082600052816020526040600020905092915050565b6127da838361282b565b6127e76000848484612622565b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d906135bd565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128929061371d565b60405180910390fd5b6128a481611c4a565b156128e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128db906135fd565b60405180910390fd5b6128f06000838361258a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129409190613986565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612a0590613b5b565b90600052602060002090601f016020900481019282612a275760008555612a6e565b82601f10612a4057805160ff1916838001178555612a6e565b82800160010185558215612a6e579182015b82811115612a6d578251825591602001919060010190612a52565b5b509050612a7b9190612a7f565b5090565b5b80821115612a98576000816000905550600101612a80565b5090565b6000612aaf612aaa8461389d565b613878565b905082815260208101848484011115612acb57612aca613d56565b5b612ad6848285613b19565b509392505050565b6000612af1612aec846138ce565b613878565b905082815260208101848484011115612b0d57612b0c613d56565b5b612b18848285613b19565b509392505050565b600081359050612b2f816142fa565b92915050565b60008083601f840112612b4b57612b4a613d4c565b5b8235905067ffffffffffffffff811115612b6857612b67613d47565b5b602083019150836020820283011115612b8457612b83613d51565b5b9250929050565b600081359050612b9a81614311565b92915050565b600081359050612baf81614328565b92915050565b600081359050612bc48161433f565b92915050565b600081519050612bd98161433f565b92915050565b600082601f830112612bf457612bf3613d4c565b5b8135612c04848260208601612a9c565b91505092915050565b600082601f830112612c2257612c21613d4c565b5b8135612c32848260208601612ade565b91505092915050565b600081359050612c4a81614356565b92915050565b600060208284031215612c6657612c65613d60565b5b6000612c7484828501612b20565b91505092915050565b60008060408385031215612c9457612c93613d60565b5b6000612ca285828601612b20565b9250506020612cb385828601612b20565b9150509250929050565b600080600060608486031215612cd657612cd5613d60565b5b6000612ce486828701612b20565b9350506020612cf586828701612b20565b9250506040612d0686828701612c3b565b9150509250925092565b60008060008060808587031215612d2a57612d29613d60565b5b6000612d3887828801612b20565b9450506020612d4987828801612b20565b9350506040612d5a87828801612c3b565b925050606085013567ffffffffffffffff811115612d7b57612d7a613d5b565b5b612d8787828801612bdf565b91505092959194509250565b60008060408385031215612daa57612da9613d60565b5b6000612db885828601612b20565b9250506020612dc985828601612b8b565b9150509250929050565b60008060408385031215612dea57612de9613d60565b5b6000612df885828601612b20565b9250506020612e0985828601612c3b565b9150509250929050565b600080600060408486031215612e2c57612e2b613d60565b5b600084013567ffffffffffffffff811115612e4a57612e49613d5b565b5b612e5686828701612b35565b93509350506020612e6986828701612c3b565b9150509250925092565b600060208284031215612e8957612e88613d60565b5b6000612e9784828501612b8b565b91505092915050565b600060208284031215612eb657612eb5613d60565b5b6000612ec484828501612ba0565b91505092915050565b600060208284031215612ee357612ee2613d60565b5b6000612ef184828501612bb5565b91505092915050565b600060208284031215612f1057612f0f613d60565b5b6000612f1e84828501612bca565b91505092915050565b600060208284031215612f3d57612f3c613d60565b5b600082013567ffffffffffffffff811115612f5b57612f5a613d5b565b5b612f6784828501612c0d565b91505092915050565b600060208284031215612f8657612f85613d60565b5b6000612f9484828501612c3b565b91505092915050565b60008060408385031215612fb457612fb3613d60565b5b6000612fc285828601612c3b565b9250506020612fd385828601612b20565b9150509250929050565b6000612fe9838361345f565b60208301905092915050565b612ffe81613a9b565b82525050565b61301561301082613a9b565b613c07565b82525050565b60006130268261390f565b613030818561393d565b935061303b836138ff565b8060005b8381101561306c5781516130538882612fdd565b975061305e83613930565b92505060018101905061303f565b5085935050505092915050565b61308281613aad565b82525050565b61309181613ab9565b82525050565b60006130a28261391a565b6130ac818561394e565b93506130bc818560208601613b28565b6130c581613d65565b840191505092915050565b60006130db82613925565b6130e5818561396a565b93506130f5818560208601613b28565b6130fe81613d65565b840191505092915050565b600061311482613925565b61311e818561397b565b935061312e818560208601613b28565b80840191505092915050565b600061314760328361396a565b915061315282613d83565b604082019050919050565b600061316a60268361396a565b915061317582613dd2565b604082019050919050565b600061318d601c8361396a565b915061319882613e21565b602082019050919050565b60006131b060148361396a565b91506131bb82613e4a565b602082019050919050565b60006131d360248361396a565b91506131de82613e73565b604082019050919050565b60006131f660198361396a565b915061320182613ec2565b602082019050919050565b6000613219602c8361396a565b915061322482613eeb565b604082019050919050565b600061323c60228361396a565b915061324782613f3a565b604082019050919050565b600061325f60388361396a565b915061326a82613f89565b604082019050919050565b6000613282602a8361396a565b915061328d82613fd8565b604082019050919050565b60006132a560298361396a565b91506132b082614027565b604082019050919050565b60006132c860208361396a565b91506132d382614076565b602082019050919050565b60006132eb602c8361396a565b91506132f68261409f565b604082019050919050565b600061330e60058361397b565b9150613319826140ee565b600582019050919050565b600061333160208361396a565b915061333c82614117565b602082019050919050565b600061335460178361396a565b915061335f82614140565b602082019050919050565b600061337760298361396a565b915061338282614169565b604082019050919050565b600061339a602f8361396a565b91506133a5826141b8565b604082019050919050565b60006133bd60218361396a565b91506133c882614207565b604082019050919050565b60006133e060008361395f565b91506133eb82614256565b600082019050919050565b600061340360148361396a565b915061340e82614259565b602082019050919050565b600061342660318361396a565b915061343182614282565b604082019050919050565b600061344960138361396a565b9150613454826142d1565b602082019050919050565b61346881613b0f565b82525050565b61347781613b0f565b82525050565b60006134898284613004565b60148201915081905092915050565b60006134a48285613109565b91506134b08284613109565b91506134bb82613301565b91508190509392505050565b60006134d2826133d3565b9150819050919050565b60006020820190506134f16000830184612ff5565b92915050565b600060808201905061350c6000830187612ff5565b6135196020830186612ff5565b613526604083018561346e565b81810360608301526135388184613097565b905095945050505050565b6000602082019050818103600083015261355d818461301b565b905092915050565b600060208201905061357a6000830184613079565b92915050565b60006020820190506135956000830184613088565b92915050565b600060208201905081810360008301526135b581846130d0565b905092915050565b600060208201905081810360008301526135d68161313a565b9050919050565b600060208201905081810360008301526135f68161315d565b9050919050565b6000602082019050818103600083015261361681613180565b9050919050565b60006020820190508181036000830152613636816131a3565b9050919050565b60006020820190508181036000830152613656816131c6565b9050919050565b60006020820190508181036000830152613676816131e9565b9050919050565b600060208201905081810360008301526136968161320c565b9050919050565b600060208201905081810360008301526136b68161322f565b9050919050565b600060208201905081810360008301526136d681613252565b9050919050565b600060208201905081810360008301526136f681613275565b9050919050565b6000602082019050818103600083015261371681613298565b9050919050565b60006020820190508181036000830152613736816132bb565b9050919050565b60006020820190508181036000830152613756816132de565b9050919050565b6000602082019050818103600083015261377681613324565b9050919050565b6000602082019050818103600083015261379681613347565b9050919050565b600060208201905081810360008301526137b68161336a565b9050919050565b600060208201905081810360008301526137d68161338d565b9050919050565b600060208201905081810360008301526137f6816133b0565b9050919050565b60006020820190508181036000830152613816816133f6565b9050919050565b6000602082019050818103600083015261383681613419565b9050919050565b600060208201905081810360008301526138568161343c565b9050919050565b6000602082019050613872600083018461346e565b92915050565b6000613882613893565b905061388e8282613b8d565b919050565b6000604051905090565b600067ffffffffffffffff8211156138b8576138b7613d18565b5b6138c182613d65565b9050602081019050919050565b600067ffffffffffffffff8211156138e9576138e8613d18565b5b6138f282613d65565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061399182613b0f565b915061399c83613b0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139d1576139d0613c5c565b5b828201905092915050565b60006139e782613b0f565b91506139f283613b0f565b925082613a0257613a01613c8b565b5b828204905092915050565b6000613a1882613b0f565b9150613a2383613b0f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5c57613a5b613c5c565b5b828202905092915050565b6000613a7282613b0f565b9150613a7d83613b0f565b925082821015613a9057613a8f613c5c565b5b828203905092915050565b6000613aa682613aef565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b46578082015181840152602081019050613b2b565b83811115613b55576000848401525b50505050565b60006002820490506001821680613b7357607f821691505b60208210811415613b8757613b86613cba565b5b50919050565b613b9682613d65565b810181811067ffffffffffffffff82111715613bb557613bb4613d18565b5b80604052505050565b6000613bc982613b0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bfc57613bfb613c5c565b5b600182019050919050565b6000613c1282613c19565b9050919050565b6000613c2482613d76565b9050919050565b6000613c3682613b0f565b9150613c4183613b0f565b925082613c5157613c50613c8b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f742070617274206f66207468652050726573616c652077686974656c697360008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61430381613a9b565b811461430e57600080fd5b50565b61431a81613aad565b811461432557600080fd5b50565b61433181613ab9565b811461433c57600080fd5b50565b61434881613ac3565b811461435357600080fd5b50565b61435f81613b0f565b811461436a57600080fd5b5056fea2646970667358221220a6e88b78cdd6b4ff463ff7b8964ac5e4f65b083732768ed2feaf1ed0317003e264736f6c63430008070033

Deployed Bytecode Sourcemap

41001:4363:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28524:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29469:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31028:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30551:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44392:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41878:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31778:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41202:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41441:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44579:462;;;;;;;;;;;;;:::i;:::-;;32188:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42777:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41245:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41973:637;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41402:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41372:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41165:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29163:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28893:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9512:103;;;;;;;;;;;;;:::i;:::-;;44475:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44286:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8861:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43844:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43964:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41328:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29638:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31321:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44209:71;;;;;;;;;;;;;:::i;:::-;;44072:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32444:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43418:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41292:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31547:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42616:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9770:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28524:305;28626:4;28678:25;28663:40;;;:11;:40;;;;:105;;;;28735:33;28720:48;;;:11;:48;;;;28663:105;:158;;;;28785:36;28809:11;28785:23;:36::i;:::-;28663:158;28643:178;;28524:305;;;:::o;29469:100::-;29523:13;29556:5;29549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29469:100;:::o;31028:221::-;31104:7;31132:16;31140:7;31132;:16::i;:::-;31124:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31217:15;:24;31233:7;31217:24;;;;;;;;;;;;;;;;;;;;;31210:31;;31028:221;;;:::o;30551:411::-;30632:13;30648:23;30663:7;30648:14;:23::i;:::-;30632:39;;30696:5;30690:11;;:2;:11;;;;30682:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30790:5;30774:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30799:37;30816:5;30823:12;:10;:12::i;:::-;30799:16;:37::i;:::-;30774:62;30752:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30933:21;30942:2;30946:7;30933:8;:21::i;:::-;30621:341;30551:411;;:::o;44392:77::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44457:6:::1;44448;;:15;;;;;;;;;;;;;;;;;;44392:77:::0;:::o;41878:89::-;41922:7;41945:16;:6;:14;:16::i;:::-;41938:23;;41878:89;:::o;31778:339::-;31973:41;31992:12;:10;:12::i;:::-;32006:7;31973:18;:41::i;:::-;31965:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32081:28;32091:4;32097:2;32101:7;32081:9;:28::i;:::-;31778:339;;;:::o;41202:38::-;;;;:::o;41441:94::-;;;;:::o;44579:462::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44863:7:::1;44884;:5;:7::i;:::-;44876:21;;44905;44876:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44862:69;;;44946:2;44938:11;;;::::0;::::1;;44616:425;44579:462::o:0;32188:185::-;32326:39;32343:4;32349:2;32353:7;32326:39;;;;;;;;;;;;:16;:39::i;:::-;32188:185;;;:::o;42777:635::-;42852:16;42880:23;42906:17;42916:6;42906:9;:17::i;:::-;42880:43;;42930:30;42977:15;42963:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42930:63;;43000:22;43025:1;43000:26;;43033:23;43069:309;43094:15;43076;:33;:64;;;;;43131:9;;43113:14;:27;;43076:64;43069:309;;;43151:25;43179:23;43187:14;43179:7;:23::i;:::-;43151:51;;43238:6;43217:27;;:17;:27;;;43213:131;;;43290:14;43257:13;43271:15;43257:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;43317:17;;;;;:::i;:::-;;;;43213:131;43354:16;;;;;:::i;:::-;;;;43142:236;43069:309;;;43393:13;43386:20;;;;;;42777:635;;;:::o;41245:42::-;;;;:::o;41973:637::-;42071:11;41712:1;41698:11;:15;:52;;;;;41732:18;;41717:11;:33;;41698:52;41690:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41824:9;;41809:11;41790:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;41782:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42100:6:::1;;;;;;;;;;;42099:7;42091:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;42161:4;42146:19;;:13;;;;;;;;;;;:19;;;42143:421;;;42210:11;42196;;:25;;;;:::i;:::-;42183:9;:38;;42175:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;42296:12;42338:10;42321:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;42311:39;;;;;;42296:54;;42367:50;42386:12;;42367:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42400:10;;42412:4;42367:18;:50::i;:::-;42359:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;42166:298;42143:421;;;42521:11;42504:14;;:28;;;;:::i;:::-;42491:9;:41;;42483:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42143:421;42570:34;42580:10;42592:11;42570:9;:34::i;:::-;41973:637:::0;;;;:::o;41402:32::-;;;;;;;;;;;;;:::o;41372:25::-;;;;;;;;;;;;;:::o;41165:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29163:239::-;29235:7;29255:13;29271:7;:16;29279:7;29271:16;;;;;;;;;;;;;;;;;;;;;29255:32;;29323:1;29306:19;;:5;:19;;;;29298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29389:5;29382:12;;;29163:239;;;:::o;28893:208::-;28965:7;29010:1;28993:19;;:5;:19;;;;28985:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29077:9;:16;29087:5;29077:16;;;;;;;;;;;;;;;;29070:23;;28893:208;;;:::o;9512:103::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9577:30:::1;9604:1;9577:18;:30::i;:::-;9512:103::o:0;44475:98::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44556:11:::1;44543:10;:24;;;;44475:98:::0;:::o;44286:100::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44370:10:::1;44358:9;:22;;;;;;;;;;;;:::i;:::-;;44286:100:::0;:::o;8861:87::-;8907:7;8934:6;;;;;;;;;;;8927:13;;8861:87;:::o;43844:114::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43937:15:::1;43920:14;:32;;;;43844:114:::0;:::o;43964:102::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44048:12:::1;44034:11;:26;;;;43964:102:::0;:::o;41328:37::-;;;;:::o;29638:104::-;29694:13;29727:7;29720:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29638:104;:::o;31321:155::-;31416:52;31435:12;:10;:12::i;:::-;31449:8;31459;31416:18;:52::i;:::-;31321:155;;:::o;44209:71::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44269:5:::1;44255:13;;:19;;;;;;;;;;;;;;;;;;44209:71::o:0;44072:130::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44177:19:::1;44156:18;:40;;;;44072:130:::0;:::o;32444:328::-;32619:41;32638:12;:10;:12::i;:::-;32652:7;32619:18;:41::i;:::-;32611:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32725:39;32739:4;32745:2;32749:7;32758:5;32725:13;:39::i;:::-;32444:328;;;;:::o;43418:420::-;43517:13;43558:17;43566:8;43558:7;:17::i;:::-;43542:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;43649:28;43680:10;:8;:10::i;:::-;43649:41;;43735:1;43710:14;43704:28;:32;:128;;;;;;;;;;;;;;;;;43772:14;43788:19;:8;:17;:19::i;:::-;43755:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43704:128;43697:135;;;43418:420;;;:::o;41292:31::-;;;;:::o;31547:164::-;31644:4;31668:18;:25;31687:5;31668:25;;;;;;;;;;;;;;;:35;31694:8;31668:35;;;;;;;;;;;;;;;;;;;;;;;;;31661:42;;31547:164;;;;:::o;42616:155::-;42702:11;41712:1;41698:11;:15;:52;;;;;41732:18;;41717:11;:33;;41698:52;41690:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41824:9;;41809:11;41790:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;41782:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;9092:12:::1;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42732:33:::2;42742:9;42753:11;42732:9;:33::i;:::-;42616:155:::0;;;:::o;9770:201::-;9092:12;:10;:12::i;:::-;9081:23;;:7;:5;:7::i;:::-;:23;;;9073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9879:1:::1;9859:22;;:8;:22;;;;9851:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9935:28;9954:8;9935:18;:28::i;:::-;9770:201:::0;:::o;4311:127::-;4418:1;4400:7;:14;;;:19;;;;;;;;;;;4311:127;:::o;4189:114::-;4254:7;4281;:14;;;4274:21;;4189:114;;;:::o;11149:387::-;11209:4;11417:12;11484:7;11472:20;11464:28;;11527:1;11520:4;:8;11513:15;;;11149:387;;;:::o;21293:157::-;21378:4;21417:25;21402:40;;;:11;:40;;;;21395:47;;21293:157;;;:::o;34282:127::-;34347:4;34399:1;34371:30;;:7;:16;34379:7;34371:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34364:37;;34282:127;;;:::o;7585:98::-;7638:7;7665:10;7658:17;;7585:98;:::o;38264:174::-;38366:2;38339:15;:24;38355:7;38339:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38422:7;38418:2;38384:46;;38393:23;38408:7;38393:14;:23::i;:::-;38384:46;;;;;;;;;;;;38264:174;;:::o;34576:348::-;34669:4;34694:16;34702:7;34694;:16::i;:::-;34686:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34770:13;34786:23;34801:7;34786:14;:23::i;:::-;34770:39;;34839:5;34828:16;;:7;:16;;;:51;;;;34872:7;34848:31;;:20;34860:7;34848:11;:20::i;:::-;:31;;;34828:51;:87;;;;34883:32;34900:5;34907:7;34883:16;:32::i;:::-;34828:87;34820:96;;;34576:348;;;;:::o;37568:578::-;37727:4;37700:31;;:23;37715:7;37700:14;:23::i;:::-;:31;;;37692:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37810:1;37796:16;;:2;:16;;;;37788:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37866:39;37887:4;37893:2;37897:7;37866:20;:39::i;:::-;37970:29;37987:1;37991:7;37970:8;:29::i;:::-;38031:1;38012:9;:15;38022:4;38012:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38060:1;38043:9;:13;38053:2;38043:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38091:2;38072:7;:16;38080:7;38072:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38130:7;38126:2;38111:27;;38120:4;38111:27;;;;;;;;;;;;37568:578;;;:::o;1813:190::-;1938:4;1991;1962:25;1975:5;1982:4;1962:12;:25::i;:::-;:33;1955:40;;1813:190;;;;;:::o;45047:204::-;45127:9;45122:124;45146:11;45142:1;:15;45122:124;;;45173:18;:6;:16;:18::i;:::-;45200:38;45210:9;45221:16;:6;:14;:16::i;:::-;45200:9;:38::i;:::-;45159:3;;;;;:::i;:::-;;;;45122:124;;;;45047:204;;:::o;10131:191::-;10205:16;10224:6;;;;;;;;;;;10205:25;;10250:8;10241:6;;:17;;;;;;;;;;;;;;;;;;10305:8;10274:40;;10295:8;10274:40;;;;;;;;;;;;10194:128;10131:191;:::o;38580:315::-;38735:8;38726:17;;:5;:17;;;;38718:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38822:8;38784:18;:25;38803:5;38784:25;;;;;;;;;;;;;;;:35;38810:8;38784:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38868:8;38846:41;;38861:5;38846:41;;;38878:8;38846:41;;;;;;:::i;:::-;;;;;;;;38580:315;;;:::o;33654:::-;33811:28;33821:4;33827:2;33831:7;33811:9;:28::i;:::-;33858:48;33881:4;33887:2;33891:7;33900:5;33858:22;:48::i;:::-;33850:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33654:315;;;;:::o;45257:104::-;45317:13;45346:9;45339:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45257:104;:::o;5147:723::-;5203:13;5433:1;5424:5;:10;5420:53;;;5451:10;;;;;;;;;;;;;;;;;;;;;5420:53;5483:12;5498:5;5483:20;;5514:14;5539:78;5554:1;5546:4;:9;5539:78;;5572:8;;;;;:::i;:::-;;;;5603:2;5595:10;;;;;:::i;:::-;;;5539:78;;;5627:19;5659:6;5649:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5627:39;;5677:154;5693:1;5684:5;:10;5677:154;;5721:1;5711:11;;;;;:::i;:::-;;;5788:2;5780:5;:10;;;;:::i;:::-;5767:2;:24;;;;:::i;:::-;5754:39;;5737:6;5744;5737:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5817:2;5808:11;;;;;:::i;:::-;;;5677:154;;;5855:6;5841:21;;;;;5147:723;;;;:::o;40831:126::-;;;;:::o;2364:675::-;2447:7;2467:20;2490:4;2467:27;;2510:9;2505:497;2529:5;:12;2525:1;:16;2505:497;;;2563:20;2586:5;2592:1;2586:8;;;;;;;;:::i;:::-;;;;;;;;2563:31;;2629:12;2613;:28;2609:382;;2756:42;2771:12;2785;2756:14;:42::i;:::-;2741:57;;2609:382;;;2933:42;2948:12;2962;2933:14;:42::i;:::-;2918:57;;2609:382;2548:454;2543:3;;;;;:::i;:::-;;;;2505:497;;;;3019:12;3012:19;;;2364:675;;;;:::o;35266:110::-;35342:26;35352:2;35356:7;35342:26;;;;;;;;;;;;:9;:26::i;:::-;35266:110;;:::o;39460:799::-;39615:4;39636:15;:2;:13;;;:15::i;:::-;39632:620;;;39688:2;39672:36;;;39709:12;:10;:12::i;:::-;39723:4;39729:7;39738:5;39672:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39668:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39931:1;39914:6;:13;:18;39910:272;;;39957:60;;;;;;;;;;:::i;:::-;;;;;;;;39910:272;40132:6;40126:13;40117:6;40113:2;40109:15;40102:38;39668:529;39805:41;;;39795:51;;;:6;:51;;;;39788:58;;;;;39632:620;40236:4;40229:11;;39460:799;;;;;;;:::o;3047:224::-;3115:13;3178:1;3172:4;3165:15;3207:1;3201:4;3194:15;3248:4;3242;3232:21;3223:30;;3047:224;;;;:::o;35603:321::-;35733:18;35739:2;35743:7;35733:5;:18::i;:::-;35784:54;35815:1;35819:2;35823:7;35832:5;35784:22;:54::i;:::-;35762:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35603:321;;;:::o;36260:382::-;36354:1;36340:16;;:2;:16;;;;36332:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36413:16;36421:7;36413;:16::i;:::-;36412:17;36404:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36475:45;36504:1;36508:2;36512:7;36475:20;:45::i;:::-;36550:1;36533:9;:13;36543:2;36533:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36581:2;36562:7;:16;36570:7;36562:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36626:7;36622:2;36601:33;;36618:1;36601:33;;;;;;;;;;;;36260:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:704::-;6451:6;6459;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6670:1;6659:9;6655:17;6642:31;6700:18;6692:6;6689:30;6686:117;;;6722:79;;:::i;:::-;6686:117;6835:80;6907:7;6898:6;6887:9;6883:22;6835:80;:::i;:::-;6817:98;;;;6613:312;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6356:704;;;;;:::o;7066:323::-;7122:6;7171:2;7159:9;7150:7;7146:23;7142:32;7139:119;;;7177:79;;:::i;:::-;7139:119;7297:1;7322:50;7364:7;7355:6;7344:9;7340:22;7322:50;:::i;:::-;7312:60;;7268:114;7066:323;;;;:::o;7395:329::-;7454:6;7503:2;7491:9;7482:7;7478:23;7474:32;7471:119;;;7509:79;;:::i;:::-;7471:119;7629:1;7654:53;7699:7;7690:6;7679:9;7675:22;7654:53;:::i;:::-;7644:63;;7600:117;7395:329;;;;:::o;7730:327::-;7788:6;7837:2;7825:9;7816:7;7812:23;7808:32;7805:119;;;7843:79;;:::i;:::-;7805:119;7963:1;7988:52;8032:7;8023:6;8012:9;8008:22;7988:52;:::i;:::-;7978:62;;7934:116;7730:327;;;;:::o;8063:349::-;8132:6;8181:2;8169:9;8160:7;8156:23;8152:32;8149:119;;;8187:79;;:::i;:::-;8149:119;8307:1;8332:63;8387:7;8378:6;8367:9;8363:22;8332:63;:::i;:::-;8322:73;;8278:127;8063:349;;;;:::o;8418:509::-;8487:6;8536:2;8524:9;8515:7;8511:23;8507:32;8504:119;;;8542:79;;:::i;:::-;8504:119;8690:1;8679:9;8675:17;8662:31;8720:18;8712:6;8709:30;8706:117;;;8742:79;;:::i;:::-;8706:117;8847:63;8902:7;8893:6;8882:9;8878:22;8847:63;:::i;:::-;8837:73;;8633:287;8418:509;;;;:::o;8933:329::-;8992:6;9041:2;9029:9;9020:7;9016:23;9012:32;9009:119;;;9047:79;;:::i;:::-;9009:119;9167:1;9192:53;9237:7;9228:6;9217:9;9213:22;9192:53;:::i;:::-;9182:63;;9138:117;8933:329;;;;:::o;9268:474::-;9336:6;9344;9393:2;9381:9;9372:7;9368:23;9364:32;9361:119;;;9399:79;;:::i;:::-;9361:119;9519:1;9544:53;9589:7;9580:6;9569:9;9565:22;9544:53;:::i;:::-;9534:63;;9490:117;9646:2;9672:53;9717:7;9708:6;9697:9;9693:22;9672:53;:::i;:::-;9662:63;;9617:118;9268:474;;;;;:::o;9748:179::-;9817:10;9838:46;9880:3;9872:6;9838:46;:::i;:::-;9916:4;9911:3;9907:14;9893:28;;9748:179;;;;:::o;9933:118::-;10020:24;10038:5;10020:24;:::i;:::-;10015:3;10008:37;9933:118;;:::o;10057:157::-;10162:45;10182:24;10200:5;10182:24;:::i;:::-;10162:45;:::i;:::-;10157:3;10150:58;10057:157;;:::o;10250:732::-;10369:3;10398:54;10446:5;10398:54;:::i;:::-;10468:86;10547:6;10542:3;10468:86;:::i;:::-;10461:93;;10578:56;10628:5;10578:56;:::i;:::-;10657:7;10688:1;10673:284;10698:6;10695:1;10692:13;10673:284;;;10774:6;10768:13;10801:63;10860:3;10845:13;10801:63;:::i;:::-;10794:70;;10887:60;10940:6;10887:60;:::i;:::-;10877:70;;10733:224;10720:1;10717;10713:9;10708:14;;10673:284;;;10677:14;10973:3;10966:10;;10374:608;;;10250:732;;;;:::o;10988:109::-;11069:21;11084:5;11069:21;:::i;:::-;11064:3;11057:34;10988:109;;:::o;11103:118::-;11190:24;11208:5;11190:24;:::i;:::-;11185:3;11178:37;11103:118;;:::o;11227:360::-;11313:3;11341:38;11373:5;11341:38;:::i;:::-;11395:70;11458:6;11453:3;11395:70;:::i;:::-;11388:77;;11474:52;11519:6;11514:3;11507:4;11500:5;11496:16;11474:52;:::i;:::-;11551:29;11573:6;11551:29;:::i;:::-;11546:3;11542:39;11535:46;;11317:270;11227:360;;;;:::o;11593:364::-;11681:3;11709:39;11742:5;11709:39;:::i;:::-;11764:71;11828:6;11823:3;11764:71;:::i;:::-;11757:78;;11844:52;11889:6;11884:3;11877:4;11870:5;11866:16;11844:52;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11685:272;11593:364;;;;:::o;11963:377::-;12069:3;12097:39;12130:5;12097:39;:::i;:::-;12152:89;12234:6;12229:3;12152:89;:::i;:::-;12145:96;;12250:52;12295:6;12290:3;12283:4;12276:5;12272:16;12250:52;:::i;:::-;12327:6;12322:3;12318:16;12311:23;;12073:267;11963:377;;;;:::o;12346:366::-;12488:3;12509:67;12573:2;12568:3;12509:67;:::i;:::-;12502:74;;12585:93;12674:3;12585:93;:::i;:::-;12703:2;12698:3;12694:12;12687:19;;12346:366;;;:::o;12718:::-;12860:3;12881:67;12945:2;12940:3;12881:67;:::i;:::-;12874:74;;12957:93;13046:3;12957:93;:::i;:::-;13075:2;13070:3;13066:12;13059:19;;12718:366;;;:::o;13090:::-;13232:3;13253:67;13317:2;13312:3;13253:67;:::i;:::-;13246:74;;13329:93;13418:3;13329:93;:::i;:::-;13447:2;13442:3;13438:12;13431:19;;13090:366;;;:::o;13462:::-;13604:3;13625:67;13689:2;13684:3;13625:67;:::i;:::-;13618:74;;13701:93;13790:3;13701:93;:::i;:::-;13819:2;13814:3;13810:12;13803:19;;13462:366;;;:::o;13834:::-;13976:3;13997:67;14061:2;14056:3;13997:67;:::i;:::-;13990:74;;14073:93;14162:3;14073:93;:::i;:::-;14191:2;14186:3;14182:12;14175:19;;13834:366;;;:::o;14206:::-;14348:3;14369:67;14433:2;14428:3;14369:67;:::i;:::-;14362:74;;14445:93;14534:3;14445:93;:::i;:::-;14563:2;14558:3;14554:12;14547:19;;14206:366;;;:::o;14578:::-;14720:3;14741:67;14805:2;14800:3;14741:67;:::i;:::-;14734:74;;14817:93;14906:3;14817:93;:::i;:::-;14935:2;14930:3;14926:12;14919:19;;14578:366;;;:::o;14950:::-;15092:3;15113:67;15177:2;15172:3;15113:67;:::i;:::-;15106:74;;15189:93;15278:3;15189:93;:::i;:::-;15307:2;15302:3;15298:12;15291:19;;14950:366;;;:::o;15322:::-;15464:3;15485:67;15549:2;15544:3;15485:67;:::i;:::-;15478:74;;15561:93;15650:3;15561:93;:::i;:::-;15679:2;15674:3;15670:12;15663:19;;15322:366;;;:::o;15694:::-;15836:3;15857:67;15921:2;15916:3;15857:67;:::i;:::-;15850:74;;15933:93;16022:3;15933:93;:::i;:::-;16051:2;16046:3;16042:12;16035:19;;15694:366;;;:::o;16066:::-;16208:3;16229:67;16293:2;16288:3;16229:67;:::i;:::-;16222:74;;16305:93;16394:3;16305:93;:::i;:::-;16423:2;16418:3;16414:12;16407:19;;16066:366;;;:::o;16438:::-;16580:3;16601:67;16665:2;16660:3;16601:67;:::i;:::-;16594:74;;16677:93;16766:3;16677:93;:::i;:::-;16795:2;16790:3;16786:12;16779:19;;16438:366;;;:::o;16810:::-;16952:3;16973:67;17037:2;17032:3;16973:67;:::i;:::-;16966:74;;17049:93;17138:3;17049:93;:::i;:::-;17167:2;17162:3;17158:12;17151:19;;16810:366;;;:::o;17182:400::-;17342:3;17363:84;17445:1;17440:3;17363:84;:::i;:::-;17356:91;;17456:93;17545:3;17456:93;:::i;:::-;17574:1;17569:3;17565:11;17558:18;;17182:400;;;:::o;17588:366::-;17730:3;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17588:366;;;:::o;17960:::-;18102:3;18123:67;18187:2;18182:3;18123:67;:::i;:::-;18116:74;;18199:93;18288:3;18199:93;:::i;:::-;18317:2;18312:3;18308:12;18301:19;;17960:366;;;:::o;18332:::-;18474:3;18495:67;18559:2;18554:3;18495:67;:::i;:::-;18488:74;;18571:93;18660:3;18571:93;:::i;:::-;18689:2;18684:3;18680:12;18673:19;;18332:366;;;:::o;18704:::-;18846:3;18867:67;18931:2;18926:3;18867:67;:::i;:::-;18860:74;;18943:93;19032:3;18943:93;:::i;:::-;19061:2;19056:3;19052:12;19045:19;;18704:366;;;:::o;19076:::-;19218:3;19239:67;19303:2;19298:3;19239:67;:::i;:::-;19232:74;;19315:93;19404:3;19315:93;:::i;:::-;19433:2;19428:3;19424:12;19417:19;;19076:366;;;:::o;19448:398::-;19607:3;19628:83;19709:1;19704:3;19628:83;:::i;:::-;19621:90;;19720:93;19809:3;19720:93;:::i;:::-;19838:1;19833:3;19829:11;19822:18;;19448:398;;;:::o;19852:366::-;19994:3;20015:67;20079:2;20074:3;20015:67;:::i;:::-;20008:74;;20091:93;20180:3;20091:93;:::i;:::-;20209:2;20204:3;20200:12;20193:19;;19852:366;;;:::o;20224:::-;20366:3;20387:67;20451:2;20446:3;20387:67;:::i;:::-;20380:74;;20463:93;20552:3;20463:93;:::i;:::-;20581:2;20576:3;20572:12;20565:19;;20224:366;;;:::o;20596:::-;20738:3;20759:67;20823:2;20818:3;20759:67;:::i;:::-;20752:74;;20835:93;20924:3;20835:93;:::i;:::-;20953:2;20948:3;20944:12;20937:19;;20596:366;;;:::o;20968:108::-;21045:24;21063:5;21045:24;:::i;:::-;21040:3;21033:37;20968:108;;:::o;21082:118::-;21169:24;21187:5;21169:24;:::i;:::-;21164:3;21157:37;21082:118;;:::o;21206:256::-;21318:3;21333:75;21404:3;21395:6;21333:75;:::i;:::-;21433:2;21428:3;21424:12;21417:19;;21453:3;21446:10;;21206:256;;;;:::o;21468:701::-;21749:3;21771:95;21862:3;21853:6;21771:95;:::i;:::-;21764:102;;21883:95;21974:3;21965:6;21883:95;:::i;:::-;21876:102;;21995:148;22139:3;21995:148;:::i;:::-;21988:155;;22160:3;22153:10;;21468:701;;;;;:::o;22175:379::-;22359:3;22381:147;22524:3;22381:147;:::i;:::-;22374:154;;22545:3;22538:10;;22175:379;;;:::o;22560:222::-;22653:4;22691:2;22680:9;22676:18;22668:26;;22704:71;22772:1;22761:9;22757:17;22748:6;22704:71;:::i;:::-;22560:222;;;;:::o;22788:640::-;22983:4;23021:3;23010:9;23006:19;22998:27;;23035:71;23103:1;23092:9;23088:17;23079:6;23035:71;:::i;:::-;23116:72;23184:2;23173:9;23169:18;23160:6;23116:72;:::i;:::-;23198;23266:2;23255:9;23251:18;23242:6;23198:72;:::i;:::-;23317:9;23311:4;23307:20;23302:2;23291:9;23287:18;23280:48;23345:76;23416:4;23407:6;23345:76;:::i;:::-;23337:84;;22788:640;;;;;;;:::o;23434:373::-;23577:4;23615:2;23604:9;23600:18;23592:26;;23664:9;23658:4;23654:20;23650:1;23639:9;23635:17;23628:47;23692:108;23795:4;23786:6;23692:108;:::i;:::-;23684:116;;23434:373;;;;:::o;23813:210::-;23900:4;23938:2;23927:9;23923:18;23915:26;;23951:65;24013:1;24002:9;23998:17;23989:6;23951:65;:::i;:::-;23813:210;;;;:::o;24029:222::-;24122:4;24160:2;24149:9;24145:18;24137:26;;24173:71;24241:1;24230:9;24226:17;24217:6;24173:71;:::i;:::-;24029:222;;;;:::o;24257:313::-;24370:4;24408:2;24397:9;24393:18;24385:26;;24457:9;24451:4;24447:20;24443:1;24432:9;24428:17;24421:47;24485:78;24558:4;24549:6;24485:78;:::i;:::-;24477:86;;24257:313;;;;:::o;24576:419::-;24742:4;24780:2;24769:9;24765:18;24757:26;;24829:9;24823:4;24819:20;24815:1;24804:9;24800:17;24793:47;24857:131;24983:4;24857:131;:::i;:::-;24849:139;;24576:419;;;:::o;25001:::-;25167:4;25205:2;25194:9;25190:18;25182:26;;25254:9;25248:4;25244:20;25240:1;25229:9;25225:17;25218:47;25282:131;25408:4;25282:131;:::i;:::-;25274:139;;25001:419;;;:::o;25426:::-;25592:4;25630:2;25619:9;25615:18;25607:26;;25679:9;25673:4;25669:20;25665:1;25654:9;25650:17;25643:47;25707:131;25833:4;25707:131;:::i;:::-;25699:139;;25426:419;;;:::o;25851:::-;26017:4;26055:2;26044:9;26040:18;26032:26;;26104:9;26098:4;26094:20;26090:1;26079:9;26075:17;26068:47;26132:131;26258:4;26132:131;:::i;:::-;26124:139;;25851:419;;;:::o;26276:::-;26442:4;26480:2;26469:9;26465:18;26457:26;;26529:9;26523:4;26519:20;26515:1;26504:9;26500:17;26493:47;26557:131;26683:4;26557:131;:::i;:::-;26549:139;;26276:419;;;:::o;26701:::-;26867:4;26905:2;26894:9;26890:18;26882:26;;26954:9;26948:4;26944:20;26940:1;26929:9;26925:17;26918:47;26982:131;27108:4;26982:131;:::i;:::-;26974:139;;26701:419;;;:::o;27126:::-;27292:4;27330:2;27319:9;27315:18;27307:26;;27379:9;27373:4;27369:20;27365:1;27354:9;27350:17;27343:47;27407:131;27533:4;27407:131;:::i;:::-;27399:139;;27126:419;;;:::o;27551:::-;27717:4;27755:2;27744:9;27740:18;27732:26;;27804:9;27798:4;27794:20;27790:1;27779:9;27775:17;27768:47;27832:131;27958:4;27832:131;:::i;:::-;27824:139;;27551:419;;;:::o;27976:::-;28142:4;28180:2;28169:9;28165:18;28157:26;;28229:9;28223:4;28219:20;28215:1;28204:9;28200:17;28193:47;28257:131;28383:4;28257:131;:::i;:::-;28249:139;;27976:419;;;:::o;28401:::-;28567:4;28605:2;28594:9;28590:18;28582:26;;28654:9;28648:4;28644:20;28640:1;28629:9;28625:17;28618:47;28682:131;28808:4;28682:131;:::i;:::-;28674:139;;28401:419;;;:::o;28826:::-;28992:4;29030:2;29019:9;29015:18;29007:26;;29079:9;29073:4;29069:20;29065:1;29054:9;29050:17;29043:47;29107:131;29233:4;29107:131;:::i;:::-;29099:139;;28826:419;;;:::o;29251:::-;29417:4;29455:2;29444:9;29440:18;29432:26;;29504:9;29498:4;29494:20;29490:1;29479:9;29475:17;29468:47;29532:131;29658:4;29532:131;:::i;:::-;29524:139;;29251:419;;;:::o;29676:::-;29842:4;29880:2;29869:9;29865:18;29857:26;;29929:9;29923:4;29919:20;29915:1;29904:9;29900:17;29893:47;29957:131;30083:4;29957:131;:::i;:::-;29949:139;;29676:419;;;:::o;30101:::-;30267:4;30305:2;30294:9;30290:18;30282:26;;30354:9;30348:4;30344:20;30340:1;30329:9;30325:17;30318:47;30382:131;30508:4;30382:131;:::i;:::-;30374:139;;30101:419;;;:::o;30526:::-;30692:4;30730:2;30719:9;30715:18;30707:26;;30779:9;30773:4;30769:20;30765:1;30754:9;30750:17;30743:47;30807:131;30933:4;30807:131;:::i;:::-;30799:139;;30526:419;;;:::o;30951:::-;31117:4;31155:2;31144:9;31140:18;31132:26;;31204:9;31198:4;31194:20;31190:1;31179:9;31175:17;31168:47;31232:131;31358:4;31232:131;:::i;:::-;31224:139;;30951:419;;;:::o;31376:::-;31542:4;31580:2;31569:9;31565:18;31557:26;;31629:9;31623:4;31619:20;31615:1;31604:9;31600:17;31593:47;31657:131;31783:4;31657:131;:::i;:::-;31649:139;;31376:419;;;:::o;31801:::-;31967:4;32005:2;31994:9;31990:18;31982:26;;32054:9;32048:4;32044:20;32040:1;32029:9;32025:17;32018:47;32082:131;32208:4;32082:131;:::i;:::-;32074:139;;31801:419;;;:::o;32226:::-;32392:4;32430:2;32419:9;32415:18;32407:26;;32479:9;32473:4;32469:20;32465:1;32454:9;32450:17;32443:47;32507:131;32633:4;32507:131;:::i;:::-;32499:139;;32226:419;;;:::o;32651:::-;32817:4;32855:2;32844:9;32840:18;32832:26;;32904:9;32898:4;32894:20;32890:1;32879:9;32875:17;32868:47;32932:131;33058:4;32932:131;:::i;:::-;32924:139;;32651:419;;;:::o;33076:::-;33242:4;33280:2;33269:9;33265:18;33257:26;;33329:9;33323:4;33319:20;33315:1;33304:9;33300:17;33293:47;33357:131;33483:4;33357:131;:::i;:::-;33349:139;;33076:419;;;:::o;33501:222::-;33594:4;33632:2;33621:9;33617:18;33609:26;;33645:71;33713:1;33702:9;33698:17;33689:6;33645:71;:::i;:::-;33501:222;;;;:::o;33729:129::-;33763:6;33790:20;;:::i;:::-;33780:30;;33819:33;33847:4;33839:6;33819:33;:::i;:::-;33729:129;;;:::o;33864:75::-;33897:6;33930:2;33924:9;33914:19;;33864:75;:::o;33945:307::-;34006:4;34096:18;34088:6;34085:30;34082:56;;;34118:18;;:::i;:::-;34082:56;34156:29;34178:6;34156:29;:::i;:::-;34148:37;;34240:4;34234;34230:15;34222:23;;33945:307;;;:::o;34258:308::-;34320:4;34410:18;34402:6;34399:30;34396:56;;;34432:18;;:::i;:::-;34396:56;34470:29;34492:6;34470:29;:::i;:::-;34462:37;;34554:4;34548;34544:15;34536:23;;34258:308;;;:::o;34572:132::-;34639:4;34662:3;34654:11;;34692:4;34687:3;34683:14;34675:22;;34572:132;;;:::o;34710:114::-;34777:6;34811:5;34805:12;34795:22;;34710:114;;;:::o;34830:98::-;34881:6;34915:5;34909:12;34899:22;;34830:98;;;:::o;34934:99::-;34986:6;35020:5;35014:12;35004:22;;34934:99;;;:::o;35039:113::-;35109:4;35141;35136:3;35132:14;35124:22;;35039:113;;;:::o;35158:184::-;35257:11;35291:6;35286:3;35279:19;35331:4;35326:3;35322:14;35307:29;;35158:184;;;;:::o;35348:168::-;35431:11;35465:6;35460:3;35453:19;35505:4;35500:3;35496:14;35481:29;;35348:168;;;;:::o;35522:147::-;35623:11;35660:3;35645:18;;35522:147;;;;:::o;35675:169::-;35759:11;35793:6;35788:3;35781:19;35833:4;35828:3;35824:14;35809:29;;35675:169;;;;:::o;35850:148::-;35952:11;35989:3;35974:18;;35850:148;;;;:::o;36004:305::-;36044:3;36063:20;36081:1;36063:20;:::i;:::-;36058:25;;36097:20;36115:1;36097:20;:::i;:::-;36092:25;;36251:1;36183:66;36179:74;36176:1;36173:81;36170:107;;;36257:18;;:::i;:::-;36170:107;36301:1;36298;36294:9;36287:16;;36004:305;;;;:::o;36315:185::-;36355:1;36372:20;36390:1;36372:20;:::i;:::-;36367:25;;36406:20;36424:1;36406:20;:::i;:::-;36401:25;;36445:1;36435:35;;36450:18;;:::i;:::-;36435:35;36492:1;36489;36485:9;36480:14;;36315:185;;;;:::o;36506:348::-;36546:7;36569:20;36587:1;36569:20;:::i;:::-;36564:25;;36603:20;36621:1;36603:20;:::i;:::-;36598:25;;36791:1;36723:66;36719:74;36716:1;36713:81;36708:1;36701:9;36694:17;36690:105;36687:131;;;36798:18;;:::i;:::-;36687:131;36846:1;36843;36839:9;36828:20;;36506:348;;;;:::o;36860:191::-;36900:4;36920:20;36938:1;36920:20;:::i;:::-;36915:25;;36954:20;36972:1;36954:20;:::i;:::-;36949:25;;36993:1;36990;36987:8;36984:34;;;36998:18;;:::i;:::-;36984:34;37043:1;37040;37036:9;37028:17;;36860:191;;;;:::o;37057:96::-;37094:7;37123:24;37141:5;37123:24;:::i;:::-;37112:35;;37057:96;;;:::o;37159:90::-;37193:7;37236:5;37229:13;37222:21;37211:32;;37159:90;;;:::o;37255:77::-;37292:7;37321:5;37310:16;;37255:77;;;:::o;37338:149::-;37374:7;37414:66;37407:5;37403:78;37392:89;;37338:149;;;:::o;37493:126::-;37530:7;37570:42;37563:5;37559:54;37548:65;;37493:126;;;:::o;37625:77::-;37662:7;37691:5;37680:16;;37625:77;;;:::o;37708:154::-;37792:6;37787:3;37782;37769:30;37854:1;37845:6;37840:3;37836:16;37829:27;37708:154;;;:::o;37868:307::-;37936:1;37946:113;37960:6;37957:1;37954:13;37946:113;;;38045:1;38040:3;38036:11;38030:18;38026:1;38021:3;38017:11;38010:39;37982:2;37979:1;37975:10;37970:15;;37946:113;;;38077:6;38074:1;38071:13;38068:101;;;38157:1;38148:6;38143:3;38139:16;38132:27;38068:101;37917:258;37868:307;;;:::o;38181:320::-;38225:6;38262:1;38256:4;38252:12;38242:22;;38309:1;38303:4;38299:12;38330:18;38320:81;;38386:4;38378:6;38374:17;38364:27;;38320:81;38448:2;38440:6;38437:14;38417:18;38414:38;38411:84;;;38467:18;;:::i;:::-;38411:84;38232:269;38181:320;;;:::o;38507:281::-;38590:27;38612:4;38590:27;:::i;:::-;38582:6;38578:40;38720:6;38708:10;38705:22;38684:18;38672:10;38669:34;38666:62;38663:88;;;38731:18;;:::i;:::-;38663:88;38771:10;38767:2;38760:22;38550:238;38507:281;;:::o;38794:233::-;38833:3;38856:24;38874:5;38856:24;:::i;:::-;38847:33;;38902:66;38895:5;38892:77;38889:103;;;38972:18;;:::i;:::-;38889:103;39019:1;39012:5;39008:13;39001:20;;38794:233;;;:::o;39033:100::-;39072:7;39101:26;39121:5;39101:26;:::i;:::-;39090:37;;39033:100;;;:::o;39139:94::-;39178:7;39207:20;39221:5;39207:20;:::i;:::-;39196:31;;39139:94;;;:::o;39239:176::-;39271:1;39288:20;39306:1;39288:20;:::i;:::-;39283:25;;39322:20;39340:1;39322:20;:::i;:::-;39317:25;;39361:1;39351:35;;39366:18;;:::i;:::-;39351:35;39407:1;39404;39400:9;39395:14;;39239:176;;;;:::o;39421:180::-;39469:77;39466:1;39459:88;39566:4;39563:1;39556:15;39590:4;39587:1;39580:15;39607:180;39655:77;39652:1;39645:88;39752:4;39749:1;39742:15;39776:4;39773:1;39766:15;39793:180;39841:77;39838:1;39831:88;39938:4;39935:1;39928:15;39962:4;39959:1;39952:15;39979:180;40027:77;40024:1;40017:88;40124:4;40121:1;40114:15;40148:4;40145:1;40138:15;40165:180;40213:77;40210:1;40203:88;40310:4;40307:1;40300:15;40334:4;40331:1;40324:15;40351:117;40460:1;40457;40450:12;40474:117;40583:1;40580;40573:12;40597:117;40706:1;40703;40696:12;40720:117;40829:1;40826;40819:12;40843:117;40952:1;40949;40942:12;40966:117;41075:1;41072;41065:12;41089:102;41130:6;41181:2;41177:7;41172:2;41165:5;41161:14;41157:28;41147:38;;41089:102;;;:::o;41197:94::-;41230:8;41278:5;41274:2;41270:14;41249:35;;41197:94;;;:::o;41297:237::-;41437:34;41433:1;41425:6;41421:14;41414:58;41506:20;41501:2;41493:6;41489:15;41482:45;41297:237;:::o;41540:225::-;41680:34;41676:1;41668:6;41664:14;41657:58;41749:8;41744:2;41736:6;41732:15;41725:33;41540:225;:::o;41771:178::-;41911:30;41907:1;41899:6;41895:14;41888:54;41771:178;:::o;41955:170::-;42095:22;42091:1;42083:6;42079:14;42072:46;41955:170;:::o;42131:223::-;42271:34;42267:1;42259:6;42255:14;42248:58;42340:6;42335:2;42327:6;42323:15;42316:31;42131:223;:::o;42360:175::-;42500:27;42496:1;42488:6;42484:14;42477:51;42360:175;:::o;42541:231::-;42681:34;42677:1;42669:6;42665:14;42658:58;42750:14;42745:2;42737:6;42733:15;42726:39;42541:231;:::o;42778:221::-;42918:34;42914:1;42906:6;42902:14;42895:58;42987:4;42982:2;42974:6;42970:15;42963:29;42778:221;:::o;43005:243::-;43145:34;43141:1;43133:6;43129:14;43122:58;43214:26;43209:2;43201:6;43197:15;43190:51;43005:243;:::o;43254:229::-;43394:34;43390:1;43382:6;43378:14;43371:58;43463:12;43458:2;43450:6;43446:15;43439:37;43254:229;:::o;43489:228::-;43629:34;43625:1;43617:6;43613:14;43606:58;43698:11;43693:2;43685:6;43681:15;43674:36;43489:228;:::o;43723:182::-;43863:34;43859:1;43851:6;43847:14;43840:58;43723:182;:::o;43911:231::-;44051:34;44047:1;44039:6;44035:14;44028:58;44120:14;44115:2;44107:6;44103:15;44096:39;43911:231;:::o;44148:155::-;44288:7;44284:1;44276:6;44272:14;44265:31;44148:155;:::o;44309:182::-;44449:34;44445:1;44437:6;44433:14;44426:58;44309:182;:::o;44497:173::-;44637:25;44633:1;44625:6;44621:14;44614:49;44497:173;:::o;44676:228::-;44816:34;44812:1;44804:6;44800:14;44793:58;44885:11;44880:2;44872:6;44868:15;44861:36;44676:228;:::o;44910:234::-;45050:34;45046:1;45038:6;45034:14;45027:58;45119:17;45114:2;45106:6;45102:15;45095:42;44910:234;:::o;45150:220::-;45290:34;45286:1;45278:6;45274:14;45267:58;45359:3;45354:2;45346:6;45342:15;45335:28;45150:220;:::o;45376:114::-;;:::o;45496:170::-;45636:22;45632:1;45624:6;45620:14;45613:46;45496:170;:::o;45672:236::-;45812:34;45808:1;45800:6;45796:14;45789:58;45881:19;45876:2;45868:6;45864:15;45857:44;45672:236;:::o;45914:169::-;46054:21;46050:1;46042:6;46038:14;46031:45;45914:169;:::o;46089:122::-;46162:24;46180:5;46162:24;:::i;:::-;46155:5;46152:35;46142:63;;46201:1;46198;46191:12;46142:63;46089:122;:::o;46217:116::-;46287:21;46302:5;46287:21;:::i;:::-;46280:5;46277:32;46267:60;;46323:1;46320;46313:12;46267:60;46217:116;:::o;46339:122::-;46412:24;46430:5;46412:24;:::i;:::-;46405:5;46402:35;46392:63;;46451:1;46448;46441:12;46392:63;46339:122;:::o;46467:120::-;46539:23;46556:5;46539:23;:::i;:::-;46532:5;46529:34;46519:62;;46577:1;46574;46567:12;46519:62;46467:120;:::o;46593:122::-;46666:24;46684:5;46666:24;:::i;:::-;46659:5;46656:35;46646:63;;46705:1;46702;46695:12;46646:63;46593:122;:::o

Swarm Source

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