ETH Price: $3,270.41 (-4.11%)
Gas: 10 Gwei

Token

GradientSquares (SQUARES)
 

Overview

Max Total Supply

976 SQUARES

Holders

320

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
herotruck.eth
Balance
1 SQUARES
0x35aA3f733958b7416669303945093C98819F77A6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 2500 Gradient Squares created by Cryptomoron

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GradientSquares

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-01
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT
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/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/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/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/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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/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/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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/GradientSquares.sol
pragma solidity ^0.8.0;
contract GradientSquares is ERC721Enumerable, Ownable {
    uint256 public constant MAX_NFT_SUPPLY = 2500;
    uint public constant MAX_PURCHASABLE = 20;
    uint256 public NFT_PRICE = 50000000000000000; // 0.05 ETH
    bool public saleStarted = false;
    string public PROVENANCE_HASH = "";

    constructor() ERC721("GradientSquares", "SQUARES") {
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return "https://api.gradientsquares.xyz/";
    }

    function getTokenURI(uint256 tokenId) public view returns (string memory) {
        return tokenURI(tokenId);
    }

   function mint(uint256 amountToMint) public payable {
        require(saleStarted == true, "This sale has not started.");
        require(totalSupply() < MAX_NFT_SUPPLY, "All NFTs have been minted.");
        require(amountToMint > 0, "You must mint at least one Gradient Square.");
        require(amountToMint <= MAX_PURCHASABLE, "You cannot mint more than 20 Gradient Squares.");
        require(totalSupply() + amountToMint <= MAX_NFT_SUPPLY, "The amount of Gradient Squares you are trying to mint exceeds the MAX_NFT_SUPPLY.");
        
        require(NFT_PRICE * amountToMint == msg.value, "Incorrect Ether value.");

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

   function reserveTokens() public onlyOwner {        
        for (uint256 i = 0; i < 200; i++) {
           uint256 mintIndex = totalSupply();
           _safeMint(msg.sender, mintIndex);
        }
    }
    

    function startSale() public onlyOwner {
        saleStarted = true;
    }

    function pauseSale() public onlyOwner {
        saleStarted = false;
    }
    
    function setProvenanceHash(string memory _hash) public onlyOwner {
        PROVENANCE_HASH = _hash;
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASABLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266b1a2bc2ec50000600b556000600c60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600d908051906020019062000051929190620001bf565b503480156200005f57600080fd5b506040518060400160405280600f81526020017f4772616469656e745371756172657300000000000000000000000000000000008152506040518060400160405280600781526020017f53515541524553000000000000000000000000000000000000000000000000008152508160009080519060200190620000e4929190620001bf565b508060019080519060200190620000fd929190620001bf565b505050600062000112620001b760201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002d4565b600033905090565b828054620001cd906200026f565b90600052602060002090601f016020900481019282620001f157600085556200023d565b82601f106200020c57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023c5782518255916020019190600101906200021f565b5b5090506200024c919062000250565b5090565b5b808211156200026b57600081600090555060010162000251565b5090565b600060028204905060018216806200028857607f821691505b602082108114156200029f576200029e620002a5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61408c80620002e46000396000f3fe6080604052600436106101d85760003560e01c80635c474f9e11610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610658578063e985e9c514610695578063f2fde38b146106d2578063ff1b6556146106fb576101d8565b8063a22cb465146105c4578063b5077f44146105ed578063b66a0e5d14610618578063b88d4fde1461062f576101d8565b8063715018a6116100d1578063715018a61461053b5780638da5cb5b1461055257806395d89b411461057d578063a0712d68146105a8576101d8565b80635c474f9e1461046b5780636352211e14610496578063676dd563146104d357806370a08231146104fe576101d8565b806323b872dd1161017a5780633ccfd60b116101495780633ccfd60b146103e457806342842e0e146103ee5780634f6ccce71461041757806355367ba914610454576101d8565b806323b872dd1461032a57806327ac36c4146103535780632f745c591461036a5780633bb3a24d146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806310969523146102ab578063119e4398146102d457806318160ddd146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612dc7565b610726565b604051610211919061388a565b60405180910390f35b34801561022657600080fd5b5061022f6107a0565b60405161023c91906138a5565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612e5a565b610832565b6040516102799190613823565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612d8b565b6108b7565b005b3480156102b757600080fd5b506102d260048036038101906102cd9190612e19565b6109cf565b005b3480156102e057600080fd5b506102e9610a65565b6040516102f69190613bc7565b60405180910390f35b34801561030b57600080fd5b50610314610a6a565b6040516103219190613bc7565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190612c85565b610a77565b005b34801561035f57600080fd5b50610368610ad7565b005b34801561037657600080fd5b50610391600480360381019061038c9190612d8b565b610b8c565b60405161039e9190613bc7565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190612e5a565b610c31565b6040516103db91906138a5565b60405180910390f35b6103ec610c43565b005b3480156103fa57600080fd5b5061041560048036038101906104109190612c85565b610cff565b005b34801561042357600080fd5b5061043e60048036038101906104399190612e5a565b610d1f565b60405161044b9190613bc7565b60405180910390f35b34801561046057600080fd5b50610469610db6565b005b34801561047757600080fd5b50610480610e4f565b60405161048d919061388a565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190612e5a565b610e62565b6040516104ca9190613823565b60405180910390f35b3480156104df57600080fd5b506104e8610f14565b6040516104f59190613bc7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612c20565b610f1a565b6040516105329190613bc7565b60405180910390f35b34801561054757600080fd5b50610550610fd2565b005b34801561055e57600080fd5b5061056761110f565b6040516105749190613823565b60405180910390f35b34801561058957600080fd5b50610592611139565b60405161059f91906138a5565b60405180910390f35b6105c260048036038101906105bd9190612e5a565b6111cb565b005b3480156105d057600080fd5b506105eb60048036038101906105e69190612d4f565b6113d2565b005b3480156105f957600080fd5b50610602611553565b60405161060f9190613bc7565b60405180910390f35b34801561062457600080fd5b5061062d611559565b005b34801561063b57600080fd5b5061065660048036038101906106519190612cd4565b6115f2565b005b34801561066457600080fd5b5061067f600480360381019061067a9190612e5a565b611654565b60405161068c91906138a5565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190612c49565b6116fb565b6040516106c9919061388a565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190612c20565b61178f565b005b34801561070757600080fd5b5061071061193b565b60405161071d91906138a5565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107995750610798826119c9565b5b9050919050565b6060600080546107af90613e81565b80601f01602080910402602001604051908101604052809291908181526020018280546107db90613e81565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b5050505050905090565b600061083d82611aab565b61087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390613aa7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c282610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90613b67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610952611b17565b73ffffffffffffffffffffffffffffffffffffffff16148061098157506109808161097b611b17565b6116fb565b5b6109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b790613a07565b60405180910390fd5b6109ca8383611b1f565b505050565b6109d7611b17565b73ffffffffffffffffffffffffffffffffffffffff166109f561110f565b73ffffffffffffffffffffffffffffffffffffffff1614610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290613ac7565b60405180910390fd5b80600d9080519060200190610a61929190612a44565b5050565b601481565b6000600880549050905090565b610a88610a82611b17565b82611bd8565b610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613b87565b60405180910390fd5b610ad2838383611cb6565b505050565b610adf611b17565b73ffffffffffffffffffffffffffffffffffffffff16610afd61110f565b73ffffffffffffffffffffffffffffffffffffffff1614610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90613ac7565b60405180910390fd5b60005b60c8811015610b89576000610b69610a6a565b9050610b753382611f12565b508080610b8190613eb3565b915050610b56565b50565b6000610b9783610f1a565b8210610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf906138e7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610c3c82611654565b9050919050565b610c4b611b17565b73ffffffffffffffffffffffffffffffffffffffff16610c6961110f565b73ffffffffffffffffffffffffffffffffffffffff1614610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690613ac7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cfd57600080fd5b565b610d1a838383604051806020016040528060008152506115f2565b505050565b6000610d29610a6a565b8210610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190613ba7565b60405180910390fd5b60088281548110610da4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610dbe611b17565b73ffffffffffffffffffffffffffffffffffffffff16610ddc61110f565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2990613ac7565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290613a47565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290613a27565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fda611b17565b73ffffffffffffffffffffffffffffffffffffffff16610ff861110f565b73ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613ac7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114890613e81565b80601f016020809104026020016040519081016040528092919081815260200182805461117490613e81565b80156111c15780601f10611196576101008083540402835291602001916111c1565b820191906000526020600020905b8154815290600101906020018083116111a457829003601f168201915b5050505050905090565b60011515600c60009054906101000a900460ff16151514611221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611218906138c7565b60405180910390fd5b6109c461122c610a6a565b1061126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906139c7565b60405180910390fd5b600081116112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690613b47565b60405180910390fd5b60148111156112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90613b27565b60405180910390fd5b6109c4816112ff610a6a565b6113099190613cb6565b111561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190613967565b60405180910390fd5b3481600b546113599190613d3d565b14611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613a67565b60405180910390fd5b60005b818110156113ce5760006113ae610a6a565b90506113ba3382611f12565b5080806113c690613eb3565b91505061139c565b5050565b6113da611b17565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906139a7565b60405180910390fd5b8060056000611455611b17565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611502611b17565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611547919061388a565b60405180910390a35050565b6109c481565b611561611b17565b73ffffffffffffffffffffffffffffffffffffffff1661157f61110f565b73ffffffffffffffffffffffffffffffffffffffff16146115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc90613ac7565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6116036115fd611b17565b83611bd8565b611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613b87565b60405180910390fd5b61164e84848484611f30565b50505050565b606061165f82611aab565b61169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613b07565b60405180910390fd5b60006116a8611f8c565b905060008151116116c857604051806020016040528060008152506116f3565b806116d284611fc9565b6040516020016116e39291906137ff565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611797611b17565b73ffffffffffffffffffffffffffffffffffffffff166117b561110f565b73ffffffffffffffffffffffffffffffffffffffff161461180b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180290613ac7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561187b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187290613927565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d805461194890613e81565b80601f016020809104026020016040519081016040528092919081815260200182805461197490613e81565b80156119c15780601f10611996576101008083540402835291602001916119c1565b820191906000526020600020905b8154815290600101906020018083116119a457829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a9457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611aa45750611aa382612176565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b9283610e62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611be382611aab565b611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c19906139e7565b60405180910390fd5b6000611c2d83610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9c57508373ffffffffffffffffffffffffffffffffffffffff16611c8484610832565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cad5750611cac81856116fb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd682610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613ae7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390613987565b60405180910390fd5b611da78383836121e0565b611db2600082611b1f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e029190613d97565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e599190613cb6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f2c8282604051806020016040528060008152506122f4565b5050565b611f3b848484611cb6565b611f478484848461234f565b611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90613907565b60405180910390fd5b50505050565b60606040518060400160405280602081526020017f68747470733a2f2f6170692e6772616469656e74737175617265732e78797a2f815250905090565b60606000821415612011576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612171565b600082905060005b6000821461204357808061202c90613eb3565b915050600a8261203c9190613d0c565b9150612019565b60008167ffffffffffffffff811115612085577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120b75781602001600182028036833780820191505090505b5090505b6000851461216a576001826120d09190613d97565b9150600a856120df9190613efc565b60306120eb9190613cb6565b60f81b818381518110612127577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121639190613d0c565b94506120bb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121eb8383836124e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561222e57612229816124eb565b61226d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461226c5761226b8382612534565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b0576122ab816126a1565b6122ef565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ee576122ed82826127e4565b5b5b505050565b6122fe8383612863565b61230b600084848461234f565b61234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613907565b60405180910390fd5b505050565b60006123708473ffffffffffffffffffffffffffffffffffffffff16612a31565b156124d9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612399611b17565b8786866040518563ffffffff1660e01b81526004016123bb949392919061383e565b602060405180830381600087803b1580156123d557600080fd5b505af192505050801561240657506040513d601f19601f820116820180604052508101906124039190612df0565b60015b612489573d8060008114612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b50600081511415612481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247890613907565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124de565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254184610f1a565b61254b9190613d97565b9050600060076000848152602001908152602001600020549050818114612630576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126b59190613d97565b905060006009600084815260200190815260200160002054905060006008838154811061270b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612753577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127ef83610f1a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ca90613a87565b60405180910390fd5b6128dc81611aab565b1561291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291390613947565b60405180910390fd5b612928600083836121e0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129789190613cb6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5090613e81565b90600052602060002090601f016020900481019282612a725760008555612ab9565b82601f10612a8b57805160ff1916838001178555612ab9565b82800160010185558215612ab9579182015b82811115612ab8578251825591602001919060010190612a9d565b5b509050612ac69190612aca565b5090565b5b80821115612ae3576000816000905550600101612acb565b5090565b6000612afa612af584613c13565b613be2565b905082815260208101848484011115612b1257600080fd5b612b1d848285613e3f565b509392505050565b6000612b38612b3384613c43565b613be2565b905082815260208101848484011115612b5057600080fd5b612b5b848285613e3f565b509392505050565b600081359050612b7281613ffa565b92915050565b600081359050612b8781614011565b92915050565b600081359050612b9c81614028565b92915050565b600081519050612bb181614028565b92915050565b600082601f830112612bc857600080fd5b8135612bd8848260208601612ae7565b91505092915050565b600082601f830112612bf257600080fd5b8135612c02848260208601612b25565b91505092915050565b600081359050612c1a8161403f565b92915050565b600060208284031215612c3257600080fd5b6000612c4084828501612b63565b91505092915050565b60008060408385031215612c5c57600080fd5b6000612c6a85828601612b63565b9250506020612c7b85828601612b63565b9150509250929050565b600080600060608486031215612c9a57600080fd5b6000612ca886828701612b63565b9350506020612cb986828701612b63565b9250506040612cca86828701612c0b565b9150509250925092565b60008060008060808587031215612cea57600080fd5b6000612cf887828801612b63565b9450506020612d0987828801612b63565b9350506040612d1a87828801612c0b565b925050606085013567ffffffffffffffff811115612d3757600080fd5b612d4387828801612bb7565b91505092959194509250565b60008060408385031215612d6257600080fd5b6000612d7085828601612b63565b9250506020612d8185828601612b78565b9150509250929050565b60008060408385031215612d9e57600080fd5b6000612dac85828601612b63565b9250506020612dbd85828601612c0b565b9150509250929050565b600060208284031215612dd957600080fd5b6000612de784828501612b8d565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ba2565b91505092915050565b600060208284031215612e2b57600080fd5b600082013567ffffffffffffffff811115612e4557600080fd5b612e5184828501612be1565b91505092915050565b600060208284031215612e6c57600080fd5b6000612e7a84828501612c0b565b91505092915050565b612e8c81613dcb565b82525050565b612e9b81613ddd565b82525050565b6000612eac82613c73565b612eb68185613c89565b9350612ec6818560208601613e4e565b612ecf81613fe9565b840191505092915050565b6000612ee582613c7e565b612eef8185613c9a565b9350612eff818560208601613e4e565b612f0881613fe9565b840191505092915050565b6000612f1e82613c7e565b612f288185613cab565b9350612f38818560208601613e4e565b80840191505092915050565b6000612f51601a83613c9a565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612f91602b83613c9a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612ff7603283613c9a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061305d602683613c9a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130c3601c83613c9a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613103605183613c9a565b91507f54686520616d6f756e74206f66204772616469656e742053717561726573207960008301527f6f752061726520747279696e6720746f206d696e74206578636565647320746860208301527f65204d41585f4e46545f535550504c592e0000000000000000000000000000006040830152606082019050919050565b600061318f602483613c9a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131f5601983613c9a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613235601a83613c9a565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000613275602c83613c9a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006132db603883613c9a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613341602a83613c9a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006133a7602983613c9a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061340d601683613c9a565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b600061344d602083613c9a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061348d602c83613c9a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006134f3602083613c9a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613533602983613c9a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613599602f83613c9a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006135ff602e83613c9a565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2032302047726160008301527f6469656e7420537175617265732e0000000000000000000000000000000000006020830152604082019050919050565b6000613665602b83613c9a565b91507f596f75206d757374206d696e74206174206c65617374206f6e6520477261646960008301527f656e74205371756172652e0000000000000000000000000000000000000000006020830152604082019050919050565b60006136cb602183613c9a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613731603183613c9a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613797602c83613c9a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6137f981613e35565b82525050565b600061380b8285612f13565b91506138178284612f13565b91508190509392505050565b60006020820190506138386000830184612e83565b92915050565b60006080820190506138536000830187612e83565b6138606020830186612e83565b61386d60408301856137f0565b818103606083015261387f8184612ea1565b905095945050505050565b600060208201905061389f6000830184612e92565b92915050565b600060208201905081810360008301526138bf8184612eda565b905092915050565b600060208201905081810360008301526138e081612f44565b9050919050565b6000602082019050818103600083015261390081612f84565b9050919050565b6000602082019050818103600083015261392081612fea565b9050919050565b6000602082019050818103600083015261394081613050565b9050919050565b60006020820190508181036000830152613960816130b6565b9050919050565b60006020820190508181036000830152613980816130f6565b9050919050565b600060208201905081810360008301526139a081613182565b9050919050565b600060208201905081810360008301526139c0816131e8565b9050919050565b600060208201905081810360008301526139e081613228565b9050919050565b60006020820190508181036000830152613a0081613268565b9050919050565b60006020820190508181036000830152613a20816132ce565b9050919050565b60006020820190508181036000830152613a4081613334565b9050919050565b60006020820190508181036000830152613a608161339a565b9050919050565b60006020820190508181036000830152613a8081613400565b9050919050565b60006020820190508181036000830152613aa081613440565b9050919050565b60006020820190508181036000830152613ac081613480565b9050919050565b60006020820190508181036000830152613ae0816134e6565b9050919050565b60006020820190508181036000830152613b0081613526565b9050919050565b60006020820190508181036000830152613b208161358c565b9050919050565b60006020820190508181036000830152613b40816135f2565b9050919050565b60006020820190508181036000830152613b6081613658565b9050919050565b60006020820190508181036000830152613b80816136be565b9050919050565b60006020820190508181036000830152613ba081613724565b9050919050565b60006020820190508181036000830152613bc08161378a565b9050919050565b6000602082019050613bdc60008301846137f0565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613c0957613c08613fba565b5b8060405250919050565b600067ffffffffffffffff821115613c2e57613c2d613fba565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c5e57613c5d613fba565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cc182613e35565b9150613ccc83613e35565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d0157613d00613f2d565b5b828201905092915050565b6000613d1782613e35565b9150613d2283613e35565b925082613d3257613d31613f5c565b5b828204905092915050565b6000613d4882613e35565b9150613d5383613e35565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d8c57613d8b613f2d565b5b828202905092915050565b6000613da282613e35565b9150613dad83613e35565b925082821015613dc057613dbf613f2d565b5b828203905092915050565b6000613dd682613e15565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e6c578082015181840152602081019050613e51565b83811115613e7b576000848401525b50505050565b60006002820490506001821680613e9957607f821691505b60208210811415613ead57613eac613f8b565b5b50919050565b6000613ebe82613e35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ef157613ef0613f2d565b5b600182019050919050565b6000613f0782613e35565b9150613f1283613e35565b925082613f2257613f21613f5c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61400381613dcb565b811461400e57600080fd5b50565b61401a81613ddd565b811461402557600080fd5b50565b61403181613de9565b811461403c57600080fd5b50565b61404881613e35565b811461405357600080fd5b5056fea2646970667358221220f7acc8d6af36c7c51551701247825fbd42b8a5183744702027a3502246f25fed64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80635c474f9e11610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610658578063e985e9c514610695578063f2fde38b146106d2578063ff1b6556146106fb576101d8565b8063a22cb465146105c4578063b5077f44146105ed578063b66a0e5d14610618578063b88d4fde1461062f576101d8565b8063715018a6116100d1578063715018a61461053b5780638da5cb5b1461055257806395d89b411461057d578063a0712d68146105a8576101d8565b80635c474f9e1461046b5780636352211e14610496578063676dd563146104d357806370a08231146104fe576101d8565b806323b872dd1161017a5780633ccfd60b116101495780633ccfd60b146103e457806342842e0e146103ee5780634f6ccce71461041757806355367ba914610454576101d8565b806323b872dd1461032a57806327ac36c4146103535780632f745c591461036a5780633bb3a24d146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806310969523146102ab578063119e4398146102d457806318160ddd146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612dc7565b610726565b604051610211919061388a565b60405180910390f35b34801561022657600080fd5b5061022f6107a0565b60405161023c91906138a5565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612e5a565b610832565b6040516102799190613823565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612d8b565b6108b7565b005b3480156102b757600080fd5b506102d260048036038101906102cd9190612e19565b6109cf565b005b3480156102e057600080fd5b506102e9610a65565b6040516102f69190613bc7565b60405180910390f35b34801561030b57600080fd5b50610314610a6a565b6040516103219190613bc7565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190612c85565b610a77565b005b34801561035f57600080fd5b50610368610ad7565b005b34801561037657600080fd5b50610391600480360381019061038c9190612d8b565b610b8c565b60405161039e9190613bc7565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190612e5a565b610c31565b6040516103db91906138a5565b60405180910390f35b6103ec610c43565b005b3480156103fa57600080fd5b5061041560048036038101906104109190612c85565b610cff565b005b34801561042357600080fd5b5061043e60048036038101906104399190612e5a565b610d1f565b60405161044b9190613bc7565b60405180910390f35b34801561046057600080fd5b50610469610db6565b005b34801561047757600080fd5b50610480610e4f565b60405161048d919061388a565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190612e5a565b610e62565b6040516104ca9190613823565b60405180910390f35b3480156104df57600080fd5b506104e8610f14565b6040516104f59190613bc7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612c20565b610f1a565b6040516105329190613bc7565b60405180910390f35b34801561054757600080fd5b50610550610fd2565b005b34801561055e57600080fd5b5061056761110f565b6040516105749190613823565b60405180910390f35b34801561058957600080fd5b50610592611139565b60405161059f91906138a5565b60405180910390f35b6105c260048036038101906105bd9190612e5a565b6111cb565b005b3480156105d057600080fd5b506105eb60048036038101906105e69190612d4f565b6113d2565b005b3480156105f957600080fd5b50610602611553565b60405161060f9190613bc7565b60405180910390f35b34801561062457600080fd5b5061062d611559565b005b34801561063b57600080fd5b5061065660048036038101906106519190612cd4565b6115f2565b005b34801561066457600080fd5b5061067f600480360381019061067a9190612e5a565b611654565b60405161068c91906138a5565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190612c49565b6116fb565b6040516106c9919061388a565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190612c20565b61178f565b005b34801561070757600080fd5b5061071061193b565b60405161071d91906138a5565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107995750610798826119c9565b5b9050919050565b6060600080546107af90613e81565b80601f01602080910402602001604051908101604052809291908181526020018280546107db90613e81565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b5050505050905090565b600061083d82611aab565b61087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390613aa7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c282610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90613b67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610952611b17565b73ffffffffffffffffffffffffffffffffffffffff16148061098157506109808161097b611b17565b6116fb565b5b6109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b790613a07565b60405180910390fd5b6109ca8383611b1f565b505050565b6109d7611b17565b73ffffffffffffffffffffffffffffffffffffffff166109f561110f565b73ffffffffffffffffffffffffffffffffffffffff1614610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290613ac7565b60405180910390fd5b80600d9080519060200190610a61929190612a44565b5050565b601481565b6000600880549050905090565b610a88610a82611b17565b82611bd8565b610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613b87565b60405180910390fd5b610ad2838383611cb6565b505050565b610adf611b17565b73ffffffffffffffffffffffffffffffffffffffff16610afd61110f565b73ffffffffffffffffffffffffffffffffffffffff1614610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90613ac7565b60405180910390fd5b60005b60c8811015610b89576000610b69610a6a565b9050610b753382611f12565b508080610b8190613eb3565b915050610b56565b50565b6000610b9783610f1a565b8210610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf906138e7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610c3c82611654565b9050919050565b610c4b611b17565b73ffffffffffffffffffffffffffffffffffffffff16610c6961110f565b73ffffffffffffffffffffffffffffffffffffffff1614610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690613ac7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cfd57600080fd5b565b610d1a838383604051806020016040528060008152506115f2565b505050565b6000610d29610a6a565b8210610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190613ba7565b60405180910390fd5b60088281548110610da4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610dbe611b17565b73ffffffffffffffffffffffffffffffffffffffff16610ddc61110f565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2990613ac7565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290613a47565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290613a27565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fda611b17565b73ffffffffffffffffffffffffffffffffffffffff16610ff861110f565b73ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613ac7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114890613e81565b80601f016020809104026020016040519081016040528092919081815260200182805461117490613e81565b80156111c15780601f10611196576101008083540402835291602001916111c1565b820191906000526020600020905b8154815290600101906020018083116111a457829003601f168201915b5050505050905090565b60011515600c60009054906101000a900460ff16151514611221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611218906138c7565b60405180910390fd5b6109c461122c610a6a565b1061126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906139c7565b60405180910390fd5b600081116112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690613b47565b60405180910390fd5b60148111156112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90613b27565b60405180910390fd5b6109c4816112ff610a6a565b6113099190613cb6565b111561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190613967565b60405180910390fd5b3481600b546113599190613d3d565b14611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613a67565b60405180910390fd5b60005b818110156113ce5760006113ae610a6a565b90506113ba3382611f12565b5080806113c690613eb3565b91505061139c565b5050565b6113da611b17565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906139a7565b60405180910390fd5b8060056000611455611b17565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611502611b17565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611547919061388a565b60405180910390a35050565b6109c481565b611561611b17565b73ffffffffffffffffffffffffffffffffffffffff1661157f61110f565b73ffffffffffffffffffffffffffffffffffffffff16146115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc90613ac7565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6116036115fd611b17565b83611bd8565b611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613b87565b60405180910390fd5b61164e84848484611f30565b50505050565b606061165f82611aab565b61169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613b07565b60405180910390fd5b60006116a8611f8c565b905060008151116116c857604051806020016040528060008152506116f3565b806116d284611fc9565b6040516020016116e39291906137ff565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611797611b17565b73ffffffffffffffffffffffffffffffffffffffff166117b561110f565b73ffffffffffffffffffffffffffffffffffffffff161461180b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180290613ac7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561187b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187290613927565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d805461194890613e81565b80601f016020809104026020016040519081016040528092919081815260200182805461197490613e81565b80156119c15780601f10611996576101008083540402835291602001916119c1565b820191906000526020600020905b8154815290600101906020018083116119a457829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a9457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611aa45750611aa382612176565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b9283610e62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611be382611aab565b611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c19906139e7565b60405180910390fd5b6000611c2d83610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9c57508373ffffffffffffffffffffffffffffffffffffffff16611c8484610832565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cad5750611cac81856116fb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd682610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613ae7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390613987565b60405180910390fd5b611da78383836121e0565b611db2600082611b1f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e029190613d97565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e599190613cb6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f2c8282604051806020016040528060008152506122f4565b5050565b611f3b848484611cb6565b611f478484848461234f565b611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90613907565b60405180910390fd5b50505050565b60606040518060400160405280602081526020017f68747470733a2f2f6170692e6772616469656e74737175617265732e78797a2f815250905090565b60606000821415612011576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612171565b600082905060005b6000821461204357808061202c90613eb3565b915050600a8261203c9190613d0c565b9150612019565b60008167ffffffffffffffff811115612085577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120b75781602001600182028036833780820191505090505b5090505b6000851461216a576001826120d09190613d97565b9150600a856120df9190613efc565b60306120eb9190613cb6565b60f81b818381518110612127577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121639190613d0c565b94506120bb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121eb8383836124e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561222e57612229816124eb565b61226d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461226c5761226b8382612534565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b0576122ab816126a1565b6122ef565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ee576122ed82826127e4565b5b5b505050565b6122fe8383612863565b61230b600084848461234f565b61234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613907565b60405180910390fd5b505050565b60006123708473ffffffffffffffffffffffffffffffffffffffff16612a31565b156124d9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612399611b17565b8786866040518563ffffffff1660e01b81526004016123bb949392919061383e565b602060405180830381600087803b1580156123d557600080fd5b505af192505050801561240657506040513d601f19601f820116820180604052508101906124039190612df0565b60015b612489573d8060008114612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b50600081511415612481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247890613907565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124de565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254184610f1a565b61254b9190613d97565b9050600060076000848152602001908152602001600020549050818114612630576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126b59190613d97565b905060006009600084815260200190815260200160002054905060006008838154811061270b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612753577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127ef83610f1a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ca90613a87565b60405180910390fd5b6128dc81611aab565b1561291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291390613947565b60405180910390fd5b612928600083836121e0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129789190613cb6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5090613e81565b90600052602060002090601f016020900481019282612a725760008555612ab9565b82601f10612a8b57805160ff1916838001178555612ab9565b82800160010185558215612ab9579182015b82811115612ab8578251825591602001919060010190612a9d565b5b509050612ac69190612aca565b5090565b5b80821115612ae3576000816000905550600101612acb565b5090565b6000612afa612af584613c13565b613be2565b905082815260208101848484011115612b1257600080fd5b612b1d848285613e3f565b509392505050565b6000612b38612b3384613c43565b613be2565b905082815260208101848484011115612b5057600080fd5b612b5b848285613e3f565b509392505050565b600081359050612b7281613ffa565b92915050565b600081359050612b8781614011565b92915050565b600081359050612b9c81614028565b92915050565b600081519050612bb181614028565b92915050565b600082601f830112612bc857600080fd5b8135612bd8848260208601612ae7565b91505092915050565b600082601f830112612bf257600080fd5b8135612c02848260208601612b25565b91505092915050565b600081359050612c1a8161403f565b92915050565b600060208284031215612c3257600080fd5b6000612c4084828501612b63565b91505092915050565b60008060408385031215612c5c57600080fd5b6000612c6a85828601612b63565b9250506020612c7b85828601612b63565b9150509250929050565b600080600060608486031215612c9a57600080fd5b6000612ca886828701612b63565b9350506020612cb986828701612b63565b9250506040612cca86828701612c0b565b9150509250925092565b60008060008060808587031215612cea57600080fd5b6000612cf887828801612b63565b9450506020612d0987828801612b63565b9350506040612d1a87828801612c0b565b925050606085013567ffffffffffffffff811115612d3757600080fd5b612d4387828801612bb7565b91505092959194509250565b60008060408385031215612d6257600080fd5b6000612d7085828601612b63565b9250506020612d8185828601612b78565b9150509250929050565b60008060408385031215612d9e57600080fd5b6000612dac85828601612b63565b9250506020612dbd85828601612c0b565b9150509250929050565b600060208284031215612dd957600080fd5b6000612de784828501612b8d565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ba2565b91505092915050565b600060208284031215612e2b57600080fd5b600082013567ffffffffffffffff811115612e4557600080fd5b612e5184828501612be1565b91505092915050565b600060208284031215612e6c57600080fd5b6000612e7a84828501612c0b565b91505092915050565b612e8c81613dcb565b82525050565b612e9b81613ddd565b82525050565b6000612eac82613c73565b612eb68185613c89565b9350612ec6818560208601613e4e565b612ecf81613fe9565b840191505092915050565b6000612ee582613c7e565b612eef8185613c9a565b9350612eff818560208601613e4e565b612f0881613fe9565b840191505092915050565b6000612f1e82613c7e565b612f288185613cab565b9350612f38818560208601613e4e565b80840191505092915050565b6000612f51601a83613c9a565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612f91602b83613c9a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612ff7603283613c9a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061305d602683613c9a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130c3601c83613c9a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613103605183613c9a565b91507f54686520616d6f756e74206f66204772616469656e742053717561726573207960008301527f6f752061726520747279696e6720746f206d696e74206578636565647320746860208301527f65204d41585f4e46545f535550504c592e0000000000000000000000000000006040830152606082019050919050565b600061318f602483613c9a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131f5601983613c9a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613235601a83613c9a565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000613275602c83613c9a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006132db603883613c9a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613341602a83613c9a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006133a7602983613c9a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061340d601683613c9a565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b600061344d602083613c9a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061348d602c83613c9a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006134f3602083613c9a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613533602983613c9a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613599602f83613c9a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006135ff602e83613c9a565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2032302047726160008301527f6469656e7420537175617265732e0000000000000000000000000000000000006020830152604082019050919050565b6000613665602b83613c9a565b91507f596f75206d757374206d696e74206174206c65617374206f6e6520477261646960008301527f656e74205371756172652e0000000000000000000000000000000000000000006020830152604082019050919050565b60006136cb602183613c9a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613731603183613c9a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613797602c83613c9a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6137f981613e35565b82525050565b600061380b8285612f13565b91506138178284612f13565b91508190509392505050565b60006020820190506138386000830184612e83565b92915050565b60006080820190506138536000830187612e83565b6138606020830186612e83565b61386d60408301856137f0565b818103606083015261387f8184612ea1565b905095945050505050565b600060208201905061389f6000830184612e92565b92915050565b600060208201905081810360008301526138bf8184612eda565b905092915050565b600060208201905081810360008301526138e081612f44565b9050919050565b6000602082019050818103600083015261390081612f84565b9050919050565b6000602082019050818103600083015261392081612fea565b9050919050565b6000602082019050818103600083015261394081613050565b9050919050565b60006020820190508181036000830152613960816130b6565b9050919050565b60006020820190508181036000830152613980816130f6565b9050919050565b600060208201905081810360008301526139a081613182565b9050919050565b600060208201905081810360008301526139c0816131e8565b9050919050565b600060208201905081810360008301526139e081613228565b9050919050565b60006020820190508181036000830152613a0081613268565b9050919050565b60006020820190508181036000830152613a20816132ce565b9050919050565b60006020820190508181036000830152613a4081613334565b9050919050565b60006020820190508181036000830152613a608161339a565b9050919050565b60006020820190508181036000830152613a8081613400565b9050919050565b60006020820190508181036000830152613aa081613440565b9050919050565b60006020820190508181036000830152613ac081613480565b9050919050565b60006020820190508181036000830152613ae0816134e6565b9050919050565b60006020820190508181036000830152613b0081613526565b9050919050565b60006020820190508181036000830152613b208161358c565b9050919050565b60006020820190508181036000830152613b40816135f2565b9050919050565b60006020820190508181036000830152613b6081613658565b9050919050565b60006020820190508181036000830152613b80816136be565b9050919050565b60006020820190508181036000830152613ba081613724565b9050919050565b60006020820190508181036000830152613bc08161378a565b9050919050565b6000602082019050613bdc60008301846137f0565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613c0957613c08613fba565b5b8060405250919050565b600067ffffffffffffffff821115613c2e57613c2d613fba565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c5e57613c5d613fba565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cc182613e35565b9150613ccc83613e35565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d0157613d00613f2d565b5b828201905092915050565b6000613d1782613e35565b9150613d2283613e35565b925082613d3257613d31613f5c565b5b828204905092915050565b6000613d4882613e35565b9150613d5383613e35565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d8c57613d8b613f2d565b5b828202905092915050565b6000613da282613e35565b9150613dad83613e35565b925082821015613dc057613dbf613f2d565b5b828203905092915050565b6000613dd682613e15565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e6c578082015181840152602081019050613e51565b83811115613e7b576000848401525b50505050565b60006002820490506001821680613e9957607f821691505b60208210811415613ead57613eac613f8b565b5b50919050565b6000613ebe82613e35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ef157613ef0613f2d565b5b600182019050919050565b6000613f0782613e35565b9150613f1283613e35565b925082613f2257613f21613f5c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61400381613dcb565b811461400e57600080fd5b50565b61401a81613ddd565b811461402557600080fd5b50565b61403181613de9565b811461403c57600080fd5b50565b61404881613e35565b811461405357600080fd5b5056fea2646970667358221220f7acc8d6af36c7c51551701247825fbd42b8a5183744702027a3502246f25fed64736f6c63430008000033

Deployed Bytecode Sourcemap

42799:2073:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34308:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21513:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22973:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22510:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44634:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42912:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34961:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23863:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44242:207;;;;;;;;;;;;;:::i;:::-;;34629:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43314:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44749:120;;;:::i;:::-;;24239:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35151:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44546:76;;;;;;;;;;;;;:::i;:::-;;43023:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21207:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42960:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20937:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42180:148;;;;;;;;;;;;;:::i;:::-;;41529:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21682:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43438:797;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23266:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42860:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44463:75;;;;;;;;;;;;;:::i;:::-;;24461:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21857:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23632:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42483:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43061:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34308:237;34410:4;34449:35;34434:50;;;:11;:50;;;;:103;;;;34501:36;34525:11;34501:23;:36::i;:::-;34434:103;34427:110;;34308:237;;;:::o;21513:100::-;21567:13;21600:5;21593:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21513:100;:::o;22973:221::-;23049:7;23077:16;23085:7;23077;:16::i;:::-;23069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23162:15;:24;23178:7;23162:24;;;;;;;;;;;;;;;;;;;;;23155:31;;22973:221;;;:::o;22510:397::-;22591:13;22607:23;22622:7;22607:14;:23::i;:::-;22591:39;;22655:5;22649:11;;:2;:11;;;;22641:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22735:5;22719:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22744:37;22761:5;22768:12;:10;:12::i;:::-;22744:16;:37::i;:::-;22719:62;22711:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22878:21;22887:2;22891:7;22878:8;:21::i;:::-;22510:397;;;:::o;44634:107::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44728:5:::1;44710:15;:23;;;;;;;;;;;;:::i;:::-;;44634:107:::0;:::o;42912:41::-;42951:2;42912:41;:::o;34961:113::-;35022:7;35049:10;:17;;;;35042:24;;34961:113;:::o;23863:305::-;24024:41;24043:12;:10;:12::i;:::-;24057:7;24024:18;:41::i;:::-;24016:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24132:28;24142:4;24148:2;24152:7;24132:9;:28::i;:::-;23863:305;;;:::o;44242:207::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44308:9:::1;44303:139;44327:3;44323:1;:7;44303:139;;;44351:17;44371:13;:11;:13::i;:::-;44351:33;;44398:32;44408:10;44420:9;44398;:32::i;:::-;44303:139;44332:3;;;;;:::i;:::-;;;;44303:139;;;;44242:207::o:0;34629:256::-;34726:7;34762:23;34779:5;34762:16;:23::i;:::-;34754:5;:31;34746:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34851:12;:19;34864:5;34851:19;;;;;;;;;;;;;;;:26;34871:5;34851:26;;;;;;;;;;;;34844:33;;34629:256;;;;:::o;43314:117::-;43373:13;43406:17;43415:7;43406:8;:17::i;:::-;43399:24;;43314:117;;;:::o;44749:120::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44821:10:::1;44813:24;;:47;44838:21;44813:47;;;;;;;;;;;;;;;;;;;;;;;44805:56;;;::::0;::::1;;44749:120::o:0;24239:151::-;24343:39;24360:4;24366:2;24370:7;24343:39;;;;;;;;;;;;:16;:39::i;:::-;24239:151;;;:::o;35151:233::-;35226:7;35262:30;:28;:30::i;:::-;35254:5;:38;35246:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35359:10;35370:5;35359:17;;;;;;;;;;;;;;;;;;;;;;;;35352:24;;35151:233;;;:::o;44546:76::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44609:5:::1;44595:11;;:19;;;;;;;;;;;;;;;;;;44546:76::o:0;43023:31::-;;;;;;;;;;;;;:::o;21207:239::-;21279:7;21299:13;21315:7;:16;21323:7;21315:16;;;;;;;;;;;;;;;;;;;;;21299:32;;21367:1;21350:19;;:5;:19;;;;21342:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21433:5;21426:12;;;21207:239;;;:::o;42960:44::-;;;;:::o;20937:208::-;21009:7;21054:1;21037:19;;:5;:19;;;;21029:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21121:9;:16;21131:5;21121:16;;;;;;;;;;;;;;;;21114:23;;20937:208;;;:::o;42180:148::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42287:1:::1;42250:40;;42271:6;;;;;;;;;;;42250:40;;;;;;;;;;;;42318:1;42301:6;;:19;;;;;;;;;;;;;;;;;;42180:148::o:0;41529:87::-;41575:7;41602:6;;;;;;;;;;;41595:13;;41529:87;:::o;21682:104::-;21738:13;21771:7;21764:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21682:104;:::o;43438:797::-;43523:4;43508:19;;:11;;;;;;;;;;;:19;;;43500:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42901:4;43577:13;:11;:13::i;:::-;:30;43569:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43672:1;43657:12;:16;43649:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42951:2;43740:12;:31;;43732:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;42901:4;43857:12;43841:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;43833:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;44030:9;44014:12;44002:9;;:24;;;;:::i;:::-;:37;43994:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44084:9;44079:150;44103:12;44099:1;:16;44079:150;;;44137:17;44157:13;:11;:13::i;:::-;44137:33;;44185:32;44195:10;44207:9;44185;:32::i;:::-;44079:150;44117:3;;;;;:::i;:::-;;;;44079:150;;;;43438:797;:::o;23266:295::-;23381:12;:10;:12::i;:::-;23369:24;;:8;:24;;;;23361:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23481:8;23436:18;:32;23455:12;:10;:12::i;:::-;23436:32;;;;;;;;;;;;;;;:42;23469:8;23436:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23534:8;23505:48;;23520:12;:10;:12::i;:::-;23505:48;;;23544:8;23505:48;;;;;;:::i;:::-;;;;;;;;23266:295;;:::o;42860:45::-;42901:4;42860:45;:::o;44463:75::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44526:4:::1;44512:11;;:18;;;;;;;;;;;;;;;;;;44463:75::o:0;24461:285::-;24593:41;24612:12;:10;:12::i;:::-;24626:7;24593:18;:41::i;:::-;24585:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24699:39;24713:4;24719:2;24723:7;24732:5;24699:13;:39::i;:::-;24461:285;;;;:::o;21857:360::-;21930:13;21964:16;21972:7;21964;:16::i;:::-;21956:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22045:21;22069:10;:8;:10::i;:::-;22045:34;;22121:1;22103:7;22097:21;:25;:112;;;;;;;;;;;;;;;;;22162:7;22171:18;:7;:16;:18::i;:::-;22145:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22097:112;22090:119;;;21857:360;;;:::o;23632:164::-;23729:4;23753:18;:25;23772:5;23753:25;;;;;;;;;;;;;;;:35;23779:8;23753:35;;;;;;;;;;;;;;;;;;;;;;;;;23746:42;;23632:164;;;;:::o;42483:244::-;41760:12;:10;:12::i;:::-;41749:23;;:7;:5;:7::i;:::-;:23;;;41741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42592:1:::1;42572:22;;:8;:22;;;;42564:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42682:8;42653:38;;42674:6;;;;;;;;;;;42653:38;;;;;;;;;;;;42711:8;42702:6;;:17;;;;;;;;;;;;;;;;;;42483:244:::0;:::o;43061:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20581:292::-;20683:4;20722:25;20707:40;;;:11;:40;;;;:105;;;;20779:33;20764:48;;;:11;:48;;;;20707:105;:158;;;;20829:36;20853:11;20829:23;:36::i;:::-;20707:158;20700:165;;20581:292;;;:::o;26213:127::-;26278:4;26330:1;26302:30;;:7;:16;26310:7;26302:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26295:37;;26213:127;;;:::o;15869:98::-;15922:7;15949:10;15942:17;;15869:98;:::o;30090:174::-;30192:2;30165:15;:24;30181:7;30165:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30248:7;30244:2;30210:46;;30219:23;30234:7;30219:14;:23::i;:::-;30210:46;;;;;;;;;;;;30090:174;;:::o;26507:348::-;26600:4;26625:16;26633:7;26625;:16::i;:::-;26617:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26701:13;26717:23;26732:7;26717:14;:23::i;:::-;26701:39;;26770:5;26759:16;;:7;:16;;;:51;;;;26803:7;26779:31;;:20;26791:7;26779:11;:20::i;:::-;:31;;;26759:51;:87;;;;26814:32;26831:5;26838:7;26814:16;:32::i;:::-;26759:87;26751:96;;;26507:348;;;;:::o;29428:544::-;29553:4;29526:31;;:23;29541:7;29526:14;:23::i;:::-;:31;;;29518:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29636:1;29622:16;;:2;:16;;;;29614:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29692:39;29713:4;29719:2;29723:7;29692:20;:39::i;:::-;29796:29;29813:1;29817:7;29796:8;:29::i;:::-;29857:1;29838:9;:15;29848:4;29838:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29886:1;29869:9;:13;29879:2;29869:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29917:2;29898:7;:16;29906:7;29898:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29956:7;29952:2;29937:27;;29946:4;29937:27;;;;;;;;;;;;29428:544;;;:::o;27197:110::-;27273:26;27283:2;27287:7;27273:26;;;;;;;;;;;;:9;:26::i;:::-;27197:110;;:::o;25628:272::-;25742:28;25752:4;25758:2;25762:7;25742:9;:28::i;:::-;25789:48;25812:4;25818:2;25822:7;25831:5;25789:22;:48::i;:::-;25781:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25628:272;;;;:::o;43171:135::-;43231:13;43257:41;;;;;;;;;;;;;;;;;;;43171:135;:::o;16524:723::-;16580:13;16810:1;16801:5;:10;16797:53;;;16828:10;;;;;;;;;;;;;;;;;;;;;16797:53;16860:12;16875:5;16860:20;;16891:14;16916:78;16931:1;16923:4;:9;16916:78;;16949:8;;;;;:::i;:::-;;;;16980:2;16972:10;;;;;:::i;:::-;;;16916:78;;;17004:19;17036:6;17026:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17004:39;;17054:154;17070:1;17061:5;:10;17054:154;;17098:1;17088:11;;;;;:::i;:::-;;;17165:2;17157:5;:10;;;;:::i;:::-;17144:2;:24;;;;:::i;:::-;17131:39;;17114:6;17121;17114:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17194:2;17185:11;;;;;:::i;:::-;;;17054:154;;;17232:6;17218:21;;;;;16524:723;;;;:::o;19079:157::-;19164:4;19203:25;19188:40;;;:11;:40;;;;19181:47;;19079:157;;;:::o;35997:555::-;36107:45;36134:4;36140:2;36144:7;36107:26;:45::i;:::-;36185:1;36169:18;;:4;:18;;;36165:187;;;36204:40;36236:7;36204:31;:40::i;:::-;36165:187;;;36274:2;36266:10;;:4;:10;;;36262:90;;36293:47;36326:4;36332:7;36293:32;:47::i;:::-;36262:90;36165:187;36380:1;36366:16;;:2;:16;;;36362:183;;;36399:45;36436:7;36399:36;:45::i;:::-;36362:183;;;36472:4;36466:10;;:2;:10;;;36462:83;;36493:40;36521:2;36525:7;36493:27;:40::i;:::-;36462:83;36362:183;35997:555;;;:::o;27534:250::-;27630:18;27636:2;27640:7;27630:5;:18::i;:::-;27667:54;27698:1;27702:2;27706:7;27715:5;27667:22;:54::i;:::-;27659:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27534:250;;;:::o;30829:843::-;30950:4;30976:15;:2;:13;;;:15::i;:::-;30972:693;;;31028:2;31012:36;;;31049:12;:10;:12::i;:::-;31063:4;31069:7;31078:5;31012:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31008:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31275:1;31258:6;:13;:18;31254:341;;;31301:60;;;;;;;;;;:::i;:::-;;;;;;;;31254:341;31545:6;31539:13;31530:6;31526:2;31522:15;31515:38;31008:602;31145:45;;;31135:55;;;:6;:55;;;;31128:62;;;;;30972:693;31649:4;31642:11;;30829:843;;;;;;;:::o;32285:93::-;;;;:::o;37275:164::-;37379:10;:17;;;;37352:15;:24;37368:7;37352:24;;;;;;;;;;;:44;;;;37407:10;37423:7;37407:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37275:164;:::o;38066:988::-;38332:22;38382:1;38357:22;38374:4;38357:16;:22::i;:::-;:26;;;;:::i;:::-;38332:51;;38394:18;38415:17;:26;38433:7;38415:26;;;;;;;;;;;;38394:47;;38562:14;38548:10;:28;38544:328;;38593:19;38615:12;:18;38628:4;38615:18;;;;;;;;;;;;;;;:34;38634:14;38615:34;;;;;;;;;;;;38593:56;;38699:11;38666:12;:18;38679:4;38666:18;;;;;;;;;;;;;;;:30;38685:10;38666:30;;;;;;;;;;;:44;;;;38816:10;38783:17;:30;38801:11;38783:30;;;;;;;;;;;:43;;;;38544:328;;38968:17;:26;38986:7;38968:26;;;;;;;;;;;38961:33;;;39012:12;:18;39025:4;39012:18;;;;;;;;;;;;;;;:34;39031:14;39012:34;;;;;;;;;;;39005:41;;;38066:988;;;;:::o;39349:1079::-;39602:22;39647:1;39627:10;:17;;;;:21;;;;:::i;:::-;39602:46;;39659:18;39680:15;:24;39696:7;39680:24;;;;;;;;;;;;39659:45;;40031:19;40053:10;40064:14;40053:26;;;;;;;;;;;;;;;;;;;;;;;;40031:48;;40117:11;40092:10;40103;40092:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40228:10;40197:15;:28;40213:11;40197:28;;;;;;;;;;;:41;;;;40369:15;:24;40385:7;40369:24;;;;;;;;;;;40362:31;;;40404:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39349:1079;;;;:::o;36853:221::-;36938:14;36955:20;36972:2;36955:16;:20::i;:::-;36938:37;;37013:7;36986:12;:16;36999:2;36986:16;;;;;;;;;;;;;;;:24;37003:6;36986:24;;;;;;;;;;;:34;;;;37060:6;37031:17;:26;37049:7;37031:26;;;;;;;;;;;:35;;;;36853:221;;;:::o;28120:382::-;28214:1;28200:16;;:2;:16;;;;28192:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28273:16;28281:7;28273;:16::i;:::-;28272:17;28264:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28335:45;28364:1;28368:2;28372:7;28335:20;:45::i;:::-;28410:1;28393:9;:13;28403:2;28393:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28441:2;28422:7;:16;28430:7;28422:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28486:7;28482:2;28461:33;;28478:1;28461:33;;;;;;;;;;;;28120:382;;:::o;7986:422::-;8046:4;8254:12;8365:7;8353:20;8345:28;;8399:1;8392:4;:8;8385:15;;;7986:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:324::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:28;7698:1;7693:3;7689:11;7682:49;7757:2;7752:3;7748:12;7741:19;;7588:178;;;:::o;7772:375::-;;7935:67;7999:2;7994:3;7935:67;:::i;:::-;7928:74;;8032:34;8028:1;8023:3;8019:11;8012:55;8098:13;8093:2;8088:3;8084:12;8077:35;8138:2;8133:3;8129:12;8122:19;;7918:229;;;:::o;8153:382::-;;8316:67;8380:2;8375:3;8316:67;:::i;:::-;8309:74;;8413:34;8409:1;8404:3;8400:11;8393:55;8479:20;8474:2;8469:3;8465:12;8458:42;8526:2;8521:3;8517:12;8510:19;;8299:236;;;:::o;8541:370::-;;8704:67;8768:2;8763:3;8704:67;:::i;:::-;8697:74;;8801:34;8797:1;8792:3;8788:11;8781:55;8867:8;8862:2;8857:3;8853:12;8846:30;8902:2;8897:3;8893:12;8886:19;;8687:224;;;:::o;8917:326::-;;9080:67;9144:2;9139:3;9080:67;:::i;:::-;9073:74;;9177:30;9173:1;9168:3;9164:11;9157:51;9234:2;9229:3;9225:12;9218:19;;9063:180;;;:::o;9249:447::-;;9412:67;9476:2;9471:3;9412:67;:::i;:::-;9405:74;;9509:34;9505:1;9500:3;9496:11;9489:55;9575:34;9570:2;9565:3;9561:12;9554:56;9641:19;9636:2;9631:3;9627:12;9620:41;9687:2;9682:3;9678:12;9671:19;;9395:301;;;:::o;9702:368::-;;9865:67;9929:2;9924:3;9865:67;:::i;:::-;9858:74;;9962:34;9958:1;9953:3;9949:11;9942:55;10028:6;10023:2;10018:3;10014:12;10007:28;10061:2;10056:3;10052:12;10045:19;;9848:222;;;:::o;10076:323::-;;10239:67;10303:2;10298:3;10239:67;:::i;:::-;10232:74;;10336:27;10332:1;10327:3;10323:11;10316:48;10390:2;10385:3;10381:12;10374:19;;10222:177;;;:::o;10405:324::-;;10568:67;10632:2;10627:3;10568:67;:::i;:::-;10561:74;;10665:28;10661:1;10656:3;10652:11;10645:49;10720:2;10715:3;10711:12;10704:19;;10551:178;;;:::o;10735:376::-;;10898:67;10962:2;10957:3;10898:67;:::i;:::-;10891:74;;10995:34;10991:1;10986:3;10982:11;10975:55;11061:14;11056:2;11051:3;11047:12;11040:36;11102:2;11097:3;11093:12;11086:19;;10881:230;;;:::o;11117:388::-;;11280:67;11344:2;11339:3;11280:67;:::i;:::-;11273:74;;11377:34;11373:1;11368:3;11364:11;11357:55;11443:26;11438:2;11433:3;11429:12;11422:48;11496:2;11491:3;11487:12;11480:19;;11263:242;;;:::o;11511:374::-;;11674:67;11738:2;11733:3;11674:67;:::i;:::-;11667:74;;11771:34;11767:1;11762:3;11758:11;11751:55;11837:12;11832:2;11827:3;11823:12;11816:34;11876:2;11871:3;11867:12;11860:19;;11657:228;;;:::o;11891:373::-;;12054:67;12118:2;12113:3;12054:67;:::i;:::-;12047:74;;12151:34;12147:1;12142:3;12138:11;12131:55;12217:11;12212:2;12207:3;12203:12;12196:33;12255:2;12250:3;12246:12;12239:19;;12037:227;;;:::o;12270:320::-;;12433:67;12497:2;12492:3;12433:67;:::i;:::-;12426:74;;12530:24;12526:1;12521:3;12517:11;12510:45;12581:2;12576:3;12572:12;12565:19;;12416:174;;;:::o;12596:330::-;;12759:67;12823:2;12818:3;12759:67;:::i;:::-;12752:74;;12856:34;12852:1;12847:3;12843:11;12836:55;12917:2;12912:3;12908:12;12901:19;;12742:184;;;:::o;12932:376::-;;13095:67;13159:2;13154:3;13095:67;:::i;:::-;13088:74;;13192:34;13188:1;13183:3;13179:11;13172:55;13258:14;13253:2;13248:3;13244:12;13237:36;13299:2;13294:3;13290:12;13283:19;;13078:230;;;:::o;13314:330::-;;13477:67;13541:2;13536:3;13477:67;:::i;:::-;13470:74;;13574:34;13570:1;13565:3;13561:11;13554:55;13635:2;13630:3;13626:12;13619:19;;13460:184;;;:::o;13650:373::-;;13813:67;13877:2;13872:3;13813:67;:::i;:::-;13806:74;;13910:34;13906:1;13901:3;13897:11;13890:55;13976:11;13971:2;13966:3;13962:12;13955:33;14014:2;14009:3;14005:12;13998:19;;13796:227;;;:::o;14029:379::-;;14192:67;14256:2;14251:3;14192:67;:::i;:::-;14185:74;;14289:34;14285:1;14280:3;14276:11;14269:55;14355:17;14350:2;14345:3;14341:12;14334:39;14399:2;14394:3;14390:12;14383:19;;14175:233;;;:::o;14414:378::-;;14577:67;14641:2;14636:3;14577:67;:::i;:::-;14570:74;;14674:34;14670:1;14665:3;14661:11;14654:55;14740:16;14735:2;14730:3;14726:12;14719:38;14783:2;14778:3;14774:12;14767:19;;14560:232;;;:::o;14798:375::-;;14961:67;15025:2;15020:3;14961:67;:::i;:::-;14954:74;;15058:34;15054:1;15049:3;15045:11;15038:55;15124:13;15119:2;15114:3;15110:12;15103:35;15164:2;15159:3;15155:12;15148:19;;14944:229;;;:::o;15179:365::-;;15342:67;15406:2;15401:3;15342:67;:::i;:::-;15335:74;;15439:34;15435:1;15430:3;15426:11;15419:55;15505:3;15500:2;15495:3;15491:12;15484:25;15535:2;15530:3;15526:12;15519:19;;15325:219;;;:::o;15550:381::-;;15713:67;15777:2;15772:3;15713:67;:::i;:::-;15706:74;;15810:34;15806:1;15801:3;15797:11;15790:55;15876:19;15871:2;15866:3;15862:12;15855:41;15922:2;15917:3;15913:12;15906:19;;15696:235;;;:::o;15937:376::-;;16100:67;16164:2;16159:3;16100:67;:::i;:::-;16093:74;;16197:34;16193:1;16188:3;16184:11;16177:55;16263:14;16258:2;16253:3;16249:12;16242:36;16304:2;16299:3;16295:12;16288:19;;16083:230;;;:::o;16319:118::-;16406:24;16424:5;16406:24;:::i;:::-;16401:3;16394:37;16384:53;;:::o;16443:435::-;;16645:95;16736:3;16727:6;16645:95;:::i;:::-;16638:102;;16757:95;16848:3;16839:6;16757:95;:::i;:::-;16750:102;;16869:3;16862:10;;16627:251;;;;;:::o;16884:222::-;;17015:2;17004:9;17000:18;16992:26;;17028:71;17096:1;17085:9;17081:17;17072:6;17028:71;:::i;:::-;16982:124;;;;:::o;17112:640::-;;17345:3;17334:9;17330:19;17322:27;;17359:71;17427:1;17416:9;17412:17;17403:6;17359:71;:::i;:::-;17440:72;17508:2;17497:9;17493:18;17484:6;17440:72;:::i;:::-;17522;17590:2;17579:9;17575:18;17566:6;17522:72;:::i;:::-;17641:9;17635:4;17631:20;17626:2;17615:9;17611:18;17604:48;17669:76;17740:4;17731:6;17669:76;:::i;:::-;17661:84;;17312:440;;;;;;;:::o;17758:210::-;;17883:2;17872:9;17868:18;17860:26;;17896:65;17958:1;17947:9;17943:17;17934:6;17896:65;:::i;:::-;17850:118;;;;:::o;17974:313::-;;18125:2;18114:9;18110:18;18102:26;;18174:9;18168:4;18164:20;18160:1;18149:9;18145:17;18138:47;18202:78;18275:4;18266:6;18202:78;:::i;:::-;18194:86;;18092:195;;;;:::o;18293:419::-;;18497:2;18486:9;18482:18;18474:26;;18546:9;18540:4;18536:20;18532:1;18521:9;18517:17;18510:47;18574:131;18700:4;18574:131;:::i;:::-;18566:139;;18464:248;;;:::o;18718:419::-;;18922:2;18911:9;18907:18;18899:26;;18971:9;18965:4;18961:20;18957:1;18946:9;18942:17;18935:47;18999:131;19125:4;18999:131;:::i;:::-;18991:139;;18889:248;;;:::o;19143:419::-;;19347:2;19336:9;19332:18;19324:26;;19396:9;19390:4;19386:20;19382:1;19371:9;19367:17;19360:47;19424:131;19550:4;19424:131;:::i;:::-;19416:139;;19314:248;;;:::o;19568:419::-;;19772:2;19761:9;19757:18;19749:26;;19821:9;19815:4;19811:20;19807:1;19796:9;19792:17;19785:47;19849:131;19975:4;19849:131;:::i;:::-;19841:139;;19739:248;;;:::o;19993:419::-;;20197:2;20186:9;20182:18;20174:26;;20246:9;20240:4;20236:20;20232:1;20221:9;20217:17;20210:47;20274:131;20400:4;20274:131;:::i;:::-;20266:139;;20164:248;;;:::o;20418:419::-;;20622:2;20611:9;20607:18;20599:26;;20671:9;20665:4;20661:20;20657:1;20646:9;20642:17;20635:47;20699:131;20825:4;20699:131;:::i;:::-;20691:139;;20589:248;;;:::o;20843:419::-;;21047:2;21036:9;21032:18;21024:26;;21096:9;21090:4;21086:20;21082:1;21071:9;21067:17;21060:47;21124:131;21250:4;21124:131;:::i;:::-;21116:139;;21014:248;;;:::o;21268:419::-;;21472:2;21461:9;21457:18;21449:26;;21521:9;21515:4;21511:20;21507:1;21496:9;21492:17;21485:47;21549:131;21675:4;21549:131;:::i;:::-;21541:139;;21439:248;;;:::o;21693:419::-;;21897:2;21886:9;21882:18;21874:26;;21946:9;21940:4;21936:20;21932:1;21921:9;21917:17;21910:47;21974:131;22100:4;21974:131;:::i;:::-;21966:139;;21864:248;;;:::o;22118:419::-;;22322:2;22311:9;22307:18;22299:26;;22371:9;22365:4;22361:20;22357:1;22346:9;22342:17;22335:47;22399:131;22525:4;22399:131;:::i;:::-;22391:139;;22289:248;;;:::o;22543:419::-;;22747:2;22736:9;22732:18;22724:26;;22796:9;22790:4;22786:20;22782:1;22771:9;22767:17;22760:47;22824:131;22950:4;22824:131;:::i;:::-;22816:139;;22714:248;;;:::o;22968:419::-;;23172:2;23161:9;23157:18;23149:26;;23221:9;23215:4;23211:20;23207:1;23196:9;23192:17;23185:47;23249:131;23375:4;23249:131;:::i;:::-;23241:139;;23139:248;;;:::o;23393:419::-;;23597:2;23586:9;23582:18;23574:26;;23646:9;23640:4;23636:20;23632:1;23621:9;23617:17;23610:47;23674:131;23800:4;23674:131;:::i;:::-;23666:139;;23564:248;;;:::o;23818:419::-;;24022:2;24011:9;24007:18;23999:26;;24071:9;24065:4;24061:20;24057:1;24046:9;24042:17;24035:47;24099:131;24225:4;24099:131;:::i;:::-;24091:139;;23989:248;;;:::o;24243:419::-;;24447:2;24436:9;24432:18;24424:26;;24496:9;24490:4;24486:20;24482:1;24471:9;24467:17;24460:47;24524:131;24650:4;24524:131;:::i;:::-;24516:139;;24414:248;;;:::o;24668:419::-;;24872:2;24861:9;24857:18;24849:26;;24921:9;24915:4;24911:20;24907:1;24896:9;24892:17;24885:47;24949:131;25075:4;24949:131;:::i;:::-;24941:139;;24839:248;;;:::o;25093:419::-;;25297:2;25286:9;25282:18;25274:26;;25346:9;25340:4;25336:20;25332:1;25321:9;25317:17;25310:47;25374:131;25500:4;25374:131;:::i;:::-;25366:139;;25264:248;;;:::o;25518:419::-;;25722:2;25711:9;25707:18;25699:26;;25771:9;25765:4;25761:20;25757:1;25746:9;25742:17;25735:47;25799:131;25925:4;25799:131;:::i;:::-;25791:139;;25689:248;;;:::o;25943:419::-;;26147:2;26136:9;26132:18;26124:26;;26196:9;26190:4;26186:20;26182:1;26171:9;26167:17;26160:47;26224:131;26350:4;26224:131;:::i;:::-;26216:139;;26114:248;;;:::o;26368:419::-;;26572:2;26561:9;26557:18;26549:26;;26621:9;26615:4;26611:20;26607:1;26596:9;26592:17;26585:47;26649:131;26775:4;26649:131;:::i;:::-;26641:139;;26539:248;;;:::o;26793:419::-;;26997:2;26986:9;26982:18;26974:26;;27046:9;27040:4;27036:20;27032:1;27021:9;27017:17;27010:47;27074:131;27200:4;27074:131;:::i;:::-;27066:139;;26964:248;;;:::o;27218:419::-;;27422:2;27411:9;27407:18;27399:26;;27471:9;27465:4;27461:20;27457:1;27446:9;27442:17;27435:47;27499:131;27625:4;27499:131;:::i;:::-;27491:139;;27389:248;;;:::o;27643:419::-;;27847:2;27836:9;27832:18;27824:26;;27896:9;27890:4;27886:20;27882:1;27871:9;27867:17;27860:47;27924:131;28050:4;27924:131;:::i;:::-;27916:139;;27814:248;;;:::o;28068:419::-;;28272:2;28261:9;28257:18;28249:26;;28321:9;28315:4;28311:20;28307:1;28296:9;28292:17;28285:47;28349:131;28475:4;28349:131;:::i;:::-;28341:139;;28239:248;;;:::o;28493:222::-;;28624:2;28613:9;28609:18;28601:26;;28637:71;28705:1;28694:9;28690:17;28681:6;28637:71;:::i;:::-;28591:124;;;;:::o;28721:283::-;;28787:2;28781:9;28771:19;;28829:4;28821:6;28817:17;28936:6;28924:10;28921:22;28900:18;28888:10;28885:34;28882:62;28879:2;;;28947:18;;:::i;:::-;28879:2;28987:10;28983:2;28976:22;28761:243;;;;:::o;29010:331::-;;29161:18;29153:6;29150:30;29147:2;;;29183:18;;:::i;:::-;29147:2;29268:4;29264:9;29257:4;29249:6;29245:17;29241:33;29233:41;;29329:4;29323;29319:15;29311:23;;29076:265;;;:::o;29347:332::-;;29499:18;29491:6;29488:30;29485:2;;;29521:18;;:::i;:::-;29485:2;29606:4;29602:9;29595:4;29587:6;29583:17;29579:33;29571:41;;29667:4;29661;29657:15;29649:23;;29414:265;;;:::o;29685:98::-;;29770:5;29764:12;29754:22;;29743:40;;;:::o;29789:99::-;;29875:5;29869:12;29859:22;;29848:40;;;:::o;29894:168::-;;30011:6;30006:3;29999:19;30051:4;30046:3;30042:14;30027:29;;29989:73;;;;:::o;30068:169::-;;30186:6;30181:3;30174:19;30226:4;30221:3;30217:14;30202:29;;30164:73;;;;:::o;30243:148::-;;30382:3;30367:18;;30357:34;;;;:::o;30397:305::-;;30456:20;30474:1;30456:20;:::i;:::-;30451:25;;30490:20;30508:1;30490:20;:::i;:::-;30485:25;;30644:1;30576:66;30572:74;30569:1;30566:81;30563:2;;;30650:18;;:::i;:::-;30563:2;30694:1;30691;30687:9;30680:16;;30441:261;;;;:::o;30708:185::-;;30765:20;30783:1;30765:20;:::i;:::-;30760:25;;30799:20;30817:1;30799:20;:::i;:::-;30794:25;;30838:1;30828:2;;30843:18;;:::i;:::-;30828:2;30885:1;30882;30878:9;30873:14;;30750:143;;;;:::o;30899:348::-;;30962:20;30980:1;30962:20;:::i;:::-;30957:25;;30996:20;31014:1;30996:20;:::i;:::-;30991:25;;31184:1;31116:66;31112:74;31109:1;31106:81;31101:1;31094:9;31087:17;31083:105;31080:2;;;31191:18;;:::i;:::-;31080:2;31239:1;31236;31232:9;31221:20;;30947:300;;;;:::o;31253:191::-;;31313:20;31331:1;31313:20;:::i;:::-;31308:25;;31347:20;31365:1;31347:20;:::i;:::-;31342:25;;31386:1;31383;31380:8;31377:2;;;31391:18;;:::i;:::-;31377:2;31436:1;31433;31429:9;31421:17;;31298:146;;;;:::o;31450:96::-;;31516:24;31534:5;31516:24;:::i;:::-;31505:35;;31495:51;;;:::o;31552:90::-;;31629:5;31622:13;31615:21;31604:32;;31594:48;;;:::o;31648:149::-;;31724:66;31717:5;31713:78;31702:89;;31692:105;;;:::o;31803:126::-;;31880:42;31873:5;31869:54;31858:65;;31848:81;;;:::o;31935:77::-;;32001:5;31990:16;;31980:32;;;:::o;32018:154::-;32102:6;32097:3;32092;32079:30;32164:1;32155:6;32150:3;32146:16;32139:27;32069:103;;;:::o;32178:307::-;32246:1;32256:113;32270:6;32267:1;32264:13;32256:113;;;32355:1;32350:3;32346:11;32340:18;32336:1;32331:3;32327:11;32320:39;32292:2;32289:1;32285:10;32280:15;;32256:113;;;32387:6;32384:1;32381:13;32378:2;;;32467:1;32458:6;32453:3;32449:16;32442:27;32378:2;32227:258;;;;:::o;32491:320::-;;32572:1;32566:4;32562:12;32552:22;;32619:1;32613:4;32609:12;32640:18;32630:2;;32696:4;32688:6;32684:17;32674:27;;32630:2;32758;32750:6;32747:14;32727:18;32724:38;32721:2;;;32777:18;;:::i;:::-;32721:2;32542:269;;;;:::o;32817:233::-;;32879:24;32897:5;32879:24;:::i;:::-;32870:33;;32925:66;32918:5;32915:77;32912:2;;;32995:18;;:::i;:::-;32912:2;33042:1;33035:5;33031:13;33024:20;;32860:190;;;:::o;33056:176::-;;33105:20;33123:1;33105:20;:::i;:::-;33100:25;;33139:20;33157:1;33139:20;:::i;:::-;33134:25;;33178:1;33168:2;;33183:18;;:::i;:::-;33168:2;33224:1;33221;33217:9;33212:14;;33090:142;;;;:::o;33238:180::-;33286:77;33283:1;33276:88;33383:4;33380:1;33373:15;33407:4;33404:1;33397:15;33424:180;33472:77;33469:1;33462:88;33569:4;33566:1;33559:15;33593:4;33590:1;33583:15;33610:180;33658:77;33655:1;33648:88;33755:4;33752:1;33745:15;33779:4;33776:1;33769:15;33796:180;33844:77;33841:1;33834:88;33941:4;33938:1;33931:15;33965:4;33962:1;33955:15;33982:102;;34074:2;34070:7;34065:2;34058:5;34054:14;34050:28;34040:38;;34030:54;;;:::o;34090:122::-;34163:24;34181:5;34163:24;:::i;:::-;34156:5;34153:35;34143:2;;34202:1;34199;34192:12;34143:2;34133:79;:::o;34218:116::-;34288:21;34303:5;34288:21;:::i;:::-;34281:5;34278:32;34268:2;;34324:1;34321;34314:12;34268:2;34258:76;:::o;34340:120::-;34412:23;34429:5;34412:23;:::i;:::-;34405:5;34402:34;34392:2;;34450:1;34447;34440:12;34392:2;34382:78;:::o;34466:122::-;34539:24;34557:5;34539:24;:::i;:::-;34532:5;34529:35;34519:2;;34578:1;34575;34568:12;34519:2;34509:79;:::o

Swarm Source

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