ETH Price: $3,419.29 (+4.14%)

Token

SushiCats (SC)
 

Overview

Max Total Supply

5,555 SC

Holders

2,709

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bayc5211.eth
Balance
2 SC
0x550349c5d1033314cfde1ba1d6bf7b10bd1d75bf
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SushiCats

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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);
    }

}

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);
            }
        }
    }
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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




pragma solidity ^0.8.0;

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

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;
    }
}


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, true);

        _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, true);

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

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

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

    function _burnSave(address owner, uint256 tokenId) internal virtual {

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

        // 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, true);

        // 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, bool isDelete) internal virtual { }
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


contract SushiCats is ERC721Enumerable, Ownable{

    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;

    uint public constant MAX_NFT_PURCHASE = 1;
    uint256 public MAX_SUPPLY = 5555;
    bool public saleIsActive = false;
    bool public whitelistSaleIsActive = false;
    string public PROVENANCE = "";

    uint256 public startingIndex;
    uint256 public startingIndexBlock;

    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;
    bytes32 private _merkleRoot;

    mapping(address => uint256) public whitelistClaimed;
    mapping(address => uint256) public pubClaimed;

    constructor() ERC721("SushiCats","SC"){
    }

    function setMerkleRoot(bytes32 rootHash) external onlyOwner {
        _merkleRoot = rootHash;
    }

    function verifyProof(bytes32[] memory _merkleProof) internal view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(_merkleProof, _merkleRoot, leaf);
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipWhitelistSaleState() public onlyOwner {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        PROVENANCE = provenanceHash;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

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

        if (startingIndexBlock == 0) {
            startingIndexBlock = block.number;
        }
    }

    function mint(uint numberOfTokens) public {
        require(!msg.sender.isContract(), "Owner should not be a contract");
        require(saleIsActive, "Sale is not active at the moment");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply");
        require(pubClaimed[msg.sender].add(numberOfTokens) <= 1, "Purchase would exceed your address's limit");
        require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 1 per purchase");

        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
        pubClaimed[msg.sender] = pubClaimed[msg.sender] + numberOfTokens;
    }

    function whitelistMint(uint numberOfTokens, bytes32[] calldata proof) public {
        require(!msg.sender.isContract(), "Owner should not be a contract");
        require(whitelistSaleIsActive, "Whitelist sale is not active at the moment");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply");
        require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 1 per purchase");
        require(whitelistClaimed[msg.sender].add(numberOfTokens) <= 2, "Purchase would exceed your address's limit");
        require(verifyProof(proof), "Not in the whitelist");

        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
        whitelistClaimed[msg.sender] = whitelistClaimed[msg.sender] + numberOfTokens;
    }

    function calcStartingIndex() public onlyOwner {
        require(startingIndex == 0, "Starting index has already been set");
        require(startingIndexBlock != 0, "Starting index has not been set yet");

        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if(block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY;
        }

        // To prevent original sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        startingIndexBlock = block.number;
    }

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

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","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":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pubClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"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":"saleIsActive","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b3600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600d908051906020019062000067929190620001d5565b503480156200007557600080fd5b506040518060400160405280600981526020017f53757368694361747300000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f53430000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000fa929190620001d5565b50806001908051906020019062000113929190620001d5565b505050600062000128620001cd60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002ea565b600033905090565b828054620001e39062000285565b90600052602060002090601f01602090048101928262000207576000855562000253565b82601f106200022257805160ff191683800117855562000253565b8280016001018555821562000253579182015b828111156200025257825182559160200191906001019062000235565b5b50905062000262919062000266565b5090565b5b808211156200028157600081600090555060010162000267565b5090565b600060028204905060018216806200029e57607f821691505b60208210811415620002b557620002b4620002bb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ec580620002fa6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806370a082311161013b578063cb774d47116100b8578063e13f351a1161007c578063e13f351a14610666578063e36d649814610670578063e985e9c51461068e578063eb8d2444146106be578063f2fde38b146106dc5761023d565b8063cb774d47146105d6578063d031370b146105f4578063d1beca6414610610578063d2cab0561461061a578063db4bec44146106365761023d565b806395d89b41116100ff57806395d89b4114610534578063a0712d6814610552578063a22cb4651461056e578063b88d4fde1461058a578063c87b56dd146105a65761023d565b806370a08231146104b6578063715018a6146104e65780637cb64759146104f05780637d17fcbe1461050c5780638da5cb5b146105165761023d565b806323b872dd116101c957806342842e0e1161018d57806342842e0e146104005780634f6ccce71461041c57806355f804b31461044c5780636352211e146104685780636373a6b1146104985761023d565b806323b872dd146103825780632f745c591461039e57806332cb6b0c146103ce57806334918dfd146103ec5780633ccfd60b146103f65761023d565b8063095ea7b311610210578063095ea7b3146102de57806310969523146102fa57806310b5454d1461031657806318160ddd14610334578063225dd847146103525761023d565b806301ffc9a714610242578063020b39cc1461027257806306fdde0314610290578063081812fc146102ae575b600080fd5b61025c60048036038101906102579190613905565b6106f8565b6040516102699190614621565b60405180910390f35b61027a610772565b60405161028791906149fe565b60405180910390f35b610298610777565b6040516102a5919061463c565b60405180910390f35b6102c860048036038101906102c39190613998565b610809565b6040516102d591906145ba565b60405180910390f35b6102f860048036038101906102f391906138a0565b61088e565b005b610314600480360381019061030f9190613957565b6109a6565b005b61031e610a3c565b60405161032b9190614621565b60405180910390f35b61033c610a4f565b60405161034991906149fe565b60405180910390f35b61036c60048036038101906103679190613735565b610a5c565b60405161037991906149fe565b60405180910390f35b61039c6004803603810190610397919061379a565b610a74565b005b6103b860048036038101906103b391906138a0565b610ad4565b6040516103c591906149fe565b60405180910390f35b6103d6610b79565b6040516103e391906149fe565b60405180910390f35b6103f4610b7f565b005b6103fe610c27565b005b61041a6004803603810190610415919061379a565b610cf2565b005b61043660048036038101906104319190613998565b610d12565b60405161044391906149fe565b60405180910390f35b61046660048036038101906104619190613957565b610da9565b005b610482600480360381019061047d9190613998565b610e3f565b60405161048f91906145ba565b60405180910390f35b6104a0610ef1565b6040516104ad919061463c565b60405180910390f35b6104d060048036038101906104cb9190613735565b610f7f565b6040516104dd91906149fe565b60405180910390f35b6104ee611037565b005b61050a600480360381019061050591906138dc565b611174565b005b6105146111fa565b005b61051e6112c4565b60405161052b91906145ba565b60405180910390f35b61053c6112ee565b604051610549919061463c565b60405180910390f35b61056c60048036038101906105679190613998565b611380565b005b61058860048036038101906105839190613864565b611669565b005b6105a4600480360381019061059f91906137e9565b6117ea565b005b6105c060048036038101906105bb9190613998565b61184c565b6040516105cd919061463c565b60405180910390f35b6105de6119bf565b6040516105eb91906149fe565b60405180910390f35b61060e60048036038101906106099190613998565b6119c5565b005b610618611a98565b005b610634600480360381019061062f91906139c1565b611b40565b005b610650600480360381019061064b9190613735565b611eb4565b60405161065d91906149fe565b60405180910390f35b61066e611ecc565b005b610678612059565b60405161068591906149fe565b60405180910390f35b6106a860048036038101906106a3919061375e565b61205f565b6040516106b59190614621565b60405180910390f35b6106c66120f3565b6040516106d39190614621565b60405180910390f35b6106f660048036038101906106f19190613735565b612106565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076b575061076a826122b2565b5b9050919050565b600181565b60606000805461078690614c68565b80601f01602080910402602001604051908101604052809291908181526020018280546107b290614c68565b80156107ff5780601f106107d4576101008083540402835291602001916107ff565b820191906000526020600020905b8154815290600101906020018083116107e257829003601f168201915b5050505050905090565b600061081482612394565b610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a9061489e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089982610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109019061491e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610929612400565b73ffffffffffffffffffffffffffffffffffffffff161480610958575061095781610952612400565b61205f565b5b610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e906147fe565b60405180910390fd5b6109a18383612408565b505050565b6109ae612400565b73ffffffffffffffffffffffffffffffffffffffff166109cc6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a19906148be565b60405180910390fd5b80600d9080519060200190610a389291906134fa565b5050565b600c60019054906101000a900460ff1681565b6000600880549050905090565b60146020528060005260406000206000915090505481565b610a85610a7f612400565b826124c1565b610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb9061497e565b60405180910390fd5b610acf83838361259f565b505050565b6000610adf83610f7f565b8210610b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b17906146fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610b87612400565b73ffffffffffffffffffffffffffffffffffffffff16610ba56112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf2906148be565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610c2f612400565b73ffffffffffffffffffffffffffffffffffffffff16610c4d6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a906148be565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cee573d6000803e3d6000fd5b5050565b610d0d838383604051806020016040528060008152506117ea565b505050565b6000610d1c610a4f565b8210610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061499e565b60405180910390fd5b60088281548110610d97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610db1612400565b73ffffffffffffffffffffffffffffffffffffffff16610dcf6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c906148be565b60405180910390fd5b8060109080519060200190610e3b9291906134fa565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf9061483e565b60405180910390fd5b80915050919050565b600d8054610efe90614c68565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2a90614c68565b8015610f775780601f10610f4c57610100808354040283529160200191610f77565b820191906000526020600020905b815481529060010190602001808311610f5a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061481e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61103f612400565b73ffffffffffffffffffffffffffffffffffffffff1661105d6112c4565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa906148be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61117c612400565b73ffffffffffffffffffffffffffffffffffffffff1661119a6112c4565b73ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e7906148be565b60405180910390fd5b8060128190555050565b611202612400565b73ffffffffffffffffffffffffffffffffffffffff166112206112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906148be565b60405180910390fd5b6000600e54146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b2906147de565b60405180910390fd5b43600f81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112fd90614c68565b80601f016020809104026020016040519081016040528092919081815260200182805461132990614c68565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b5050505050905090565b61139f3373ffffffffffffffffffffffffffffffffffffffff166127fd565b156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d69061469e565b60405180910390fd5b600c60009054906101000a900460ff1661142e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611425906149de565b60405180910390fd5b60008111611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906146be565b60405180910390fd5b600b5461148e82611480610a4f565b61281090919063ffffffff16565b11156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c69061485e565b60405180910390fd5b600161152382601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281090919063ffffffff16565b1115611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b906146de565b60405180910390fd5b60018111156115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061467e565b60405180910390fd5b60005b818110156115d7576115c4336115bf610a4f565b612826565b80806115cf90614c9a565b9150506115ab565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116239190614aed565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611671612400565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d69061479e565b60405180910390fd5b80600560006116ec612400565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611799612400565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117de9190614621565b60405180910390a35050565b6117fb6117f5612400565b836124c1565b61183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061497e565b60405180910390fd5b61184684848484612844565b50505050565b606061185782612394565b611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906148fe565b60405180910390fd5b60006011600084815260200190815260200160002080546118b690614c68565b80601f01602080910402602001604051908101604052809291908181526020018280546118e290614c68565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b5050505050905060006119406128a0565b90506000815114156119565781925050506119ba565b60008251111561198b578082604051602001611973929190614596565b604051602081830303815290604052925050506119ba565b8061199585612932565b6040516020016119a6929190614596565b604051602081830303815290604052925050505b919050565b600e5481565b6119cd612400565b73ffffffffffffffffffffffffffffffffffffffff166119eb6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a38906148be565b60405180910390fd5b6000611a4b610a4f565b905060005b82811015611a8057611a6d338284611a689190614aed565b612826565b8080611a7890614c9a565b915050611a50565b6000600f541415611a935743600f819055505b505050565b611aa0612400565b73ffffffffffffffffffffffffffffffffffffffff16611abe6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b906148be565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b611b5f3373ffffffffffffffffffffffffffffffffffffffff166127fd565b15611b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b969061469e565b60405180910390fd5b600c60019054906101000a900460ff16611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be59061495e565b60405180910390fd5b60008311611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c28906146be565b60405180910390fd5b600b54611c4e84611c40610a4f565b61281090919063ffffffff16565b1115611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c869061485e565b60405180910390fd5b6001831115611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca9061467e565b60405180910390fd5b6002611d2784601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281090919063ffffffff16565b1115611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f906146de565b60405180910390fd5b611db2828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612adf565b611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de89061493e565b60405180910390fd5b60005b83811015611e2057611e0d33611e08610a4f565b612826565b8080611e1890614c9a565b915050611df4565b5082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e6c9190614aed565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60136020528060005260406000206000915090505481565b611ed4612400565b73ffffffffffffffffffffffffffffffffffffffff16611ef26112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f906148be565b60405180910390fd5b6000600e5414611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906149be565b60405180910390fd5b6000600f541415611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca9061465e565b60405180910390fd5b600b54600f544060001c611fe79190614d11565b600e8190555060ff612004600f5443612b2090919063ffffffff16565b111561202f57600b5460014361201a9190614b74565b4060001c6120289190614d11565b600e819055505b6000600e541415612057576120506001600e5461281090919063ffffffff16565b600e819055505b565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b61210e612400565b73ffffffffffffffffffffffffffffffffffffffff1661212c6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614612182576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612179906148be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e99061473e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061237d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061238d575061238c82612b36565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661247b83610e3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124cc82612394565b61250b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612502906147be565b60405180910390fd5b600061251683610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061258557508373ffffffffffffffffffffffffffffffffffffffff1661256d84610809565b73ffffffffffffffffffffffffffffffffffffffff16145b806125965750612595818561205f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125bf82610e3f565b73ffffffffffffffffffffffffffffffffffffffff1614612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c906148de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267c9061477e565b60405180910390fd5b6126928383836001612ba0565b61269d600082612408565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ed9190614b74565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127449190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080823b905060008111915050919050565b6000818361281e9190614aed565b905092915050565b612840828260405180602001604052806000815250612cca565b5050565b61284f84848461259f565b61285b84848484612d25565b61289a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128919061471e565b60405180910390fd5b50505050565b6060601080546128af90614c68565b80601f01602080910402602001604051908101604052809291908181526020018280546128db90614c68565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b5050505050905090565b6060600082141561297a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ada565b600082905060005b600082146129ac57808061299590614c9a565b915050600a826129a59190614b43565b9150612982565b60008167ffffffffffffffff8111156129ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a205781602001600182028036833780820191505090505b5090505b60008514612ad357600182612a399190614b74565b9150600a85612a489190614d11565b6030612a549190614aed565b60f81b818381518110612a90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612acc9190614b43565b9450612a24565b8093505050505b919050565b60008033604051602001612af3919061454f565b604051602081830303815290604052805190602001209050612b188360125483612ebc565b915050919050565b60008183612b2e9190614b74565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bac84848484612ed3565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612bef57612bea82612ed9565b612c2e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612c2d57612c2c8483612f22565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612c675750805b15612c7a57612c758261308f565b612cc4565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612cb35750805b15612cc357612cc283836131d2565b5b5b50505050565b612cd48383613251565b612ce16000848484612d25565b612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d179061471e565b60405180910390fd5b505050565b6000612d468473ffffffffffffffffffffffffffffffffffffffff166127fd565b15612eaf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6f612400565b8786866040518563ffffffff1660e01b8152600401612d9194939291906145d5565b602060405180830381600087803b158015612dab57600080fd5b505af1925050508015612ddc57506040513d601f19601f82011682018060405250810190612dd9919061392e565b60015b612e5f573d8060008114612e0c576040519150601f19603f3d011682016040523d82523d6000602084013e612e11565b606091505b50600081511415612e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4e9061471e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eb4565b600190505b949350505050565b600082612ec98584613421565b1490509392505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f2f84610f7f565b612f399190614b74565b905060006007600084815260200190815260200160002054905081811461301e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130a39190614b74565b90506000600960008481526020019081526020016000205490506000600883815481106130f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613141577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131dd83610f7f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b89061487e565b60405180910390fd5b6132ca81612394565b1561330a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133019061475e565b60405180910390fd5b613318600083836001612ba0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133689190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008082905060005b84518110156134ef57600085828151811061346e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116134af57828160405160200161349292919061456a565b6040516020818303038152906040528051906020012092506134db565b80836040516020016134c292919061456a565b6040516020818303038152906040528051906020012092505b5080806134e790614c9a565b91505061342a565b508091505092915050565b82805461350690614c68565b90600052602060002090601f016020900481019282613528576000855561356f565b82601f1061354157805160ff191683800117855561356f565b8280016001018555821561356f579182015b8281111561356e578251825591602001919060010190613553565b5b50905061357c9190613580565b5090565b5b80821115613599576000816000905550600101613581565b5090565b60006135b06135ab84614a4a565b614a19565b9050828152602081018484840111156135c857600080fd5b6135d3848285614c26565b509392505050565b60006135ee6135e984614a7a565b614a19565b90508281526020810184848401111561360657600080fd5b613611848285614c26565b509392505050565b60008135905061362881614e1c565b92915050565b60008083601f84011261364057600080fd5b8235905067ffffffffffffffff81111561365957600080fd5b60208301915083602082028301111561367157600080fd5b9250929050565b60008135905061368781614e33565b92915050565b60008135905061369c81614e4a565b92915050565b6000813590506136b181614e61565b92915050565b6000815190506136c681614e61565b92915050565b600082601f8301126136dd57600080fd5b81356136ed84826020860161359d565b91505092915050565b600082601f83011261370757600080fd5b81356137178482602086016135db565b91505092915050565b60008135905061372f81614e78565b92915050565b60006020828403121561374757600080fd5b600061375584828501613619565b91505092915050565b6000806040838503121561377157600080fd5b600061377f85828601613619565b925050602061379085828601613619565b9150509250929050565b6000806000606084860312156137af57600080fd5b60006137bd86828701613619565b93505060206137ce86828701613619565b92505060406137df86828701613720565b9150509250925092565b600080600080608085870312156137ff57600080fd5b600061380d87828801613619565b945050602061381e87828801613619565b935050604061382f87828801613720565b925050606085013567ffffffffffffffff81111561384c57600080fd5b613858878288016136cc565b91505092959194509250565b6000806040838503121561387757600080fd5b600061388585828601613619565b925050602061389685828601613678565b9150509250929050565b600080604083850312156138b357600080fd5b60006138c185828601613619565b92505060206138d285828601613720565b9150509250929050565b6000602082840312156138ee57600080fd5b60006138fc8482850161368d565b91505092915050565b60006020828403121561391757600080fd5b6000613925848285016136a2565b91505092915050565b60006020828403121561394057600080fd5b600061394e848285016136b7565b91505092915050565b60006020828403121561396957600080fd5b600082013567ffffffffffffffff81111561398357600080fd5b61398f848285016136f6565b91505092915050565b6000602082840312156139aa57600080fd5b60006139b884828501613720565b91505092915050565b6000806000604084860312156139d657600080fd5b60006139e486828701613720565b935050602084013567ffffffffffffffff811115613a0157600080fd5b613a0d8682870161362e565b92509250509250925092565b613a2281614ba8565b82525050565b613a39613a3482614ba8565b614ce3565b82525050565b613a4881614bba565b82525050565b613a5f613a5a82614bc6565b614cf5565b82525050565b6000613a7082614aaa565b613a7a8185614ac0565b9350613a8a818560208601614c35565b613a9381614dfe565b840191505092915050565b6000613aa982614ab5565b613ab38185614ad1565b9350613ac3818560208601614c35565b613acc81614dfe565b840191505092915050565b6000613ae282614ab5565b613aec8185614ae2565b9350613afc818560208601614c35565b80840191505092915050565b6000613b15602383614ad1565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b7b602283614ad1565b91507f43616e206f6e6c79206d696e7420757020746f2031207065722070757263686160008301527f73650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613be1601e83614ad1565b91507f4f776e65722073686f756c64206e6f74206265206120636f6e747261637400006000830152602082019050919050565b6000613c21603383614ad1565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613c87602a83614ad1565b91507f507572636861736520776f756c642065786365656420796f757220616464726560008301527f73732773206c696d6974000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ced602b83614ad1565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d53603283614ad1565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613db9602683614ad1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e1f601c83614ad1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e5f602483614ad1565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ec5601983614ad1565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f05602c83614ad1565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f6b601d83614ad1565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000613fab603883614ad1565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614011602a83614ad1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614077602983614ad1565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140dd602083614ad1565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061411d602083614ad1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061415d602c83614ad1565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141c3602083614ad1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614203602983614ad1565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614269602f83614ad1565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142cf602183614ad1565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614335601483614ad1565b91507f4e6f7420696e207468652077686974656c6973740000000000000000000000006000830152602082019050919050565b6000614375602a83614ad1565b91507f57686974656c6973742073616c65206973206e6f74206163746976652061742060008301527f746865206d6f6d656e74000000000000000000000000000000000000000000006020830152604082019050919050565b60006143db603183614ad1565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614441602c83614ad1565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006144a7602383614ad1565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061450d602083614ad1565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b61454981614c1c565b82525050565b600061455b8284613a28565b60148201915081905092915050565b60006145768285613a4e565b6020820191506145868284613a4e565b6020820191508190509392505050565b60006145a28285613ad7565b91506145ae8284613ad7565b91508190509392505050565b60006020820190506145cf6000830184613a19565b92915050565b60006080820190506145ea6000830187613a19565b6145f76020830186613a19565b6146046040830185614540565b81810360608301526146168184613a65565b905095945050505050565b60006020820190506146366000830184613a3f565b92915050565b600060208201905081810360008301526146568184613a9e565b905092915050565b6000602082019050818103600083015261467781613b08565b9050919050565b6000602082019050818103600083015261469781613b6e565b9050919050565b600060208201905081810360008301526146b781613bd4565b9050919050565b600060208201905081810360008301526146d781613c14565b9050919050565b600060208201905081810360008301526146f781613c7a565b9050919050565b6000602082019050818103600083015261471781613ce0565b9050919050565b6000602082019050818103600083015261473781613d46565b9050919050565b6000602082019050818103600083015261475781613dac565b9050919050565b6000602082019050818103600083015261477781613e12565b9050919050565b6000602082019050818103600083015261479781613e52565b9050919050565b600060208201905081810360008301526147b781613eb8565b9050919050565b600060208201905081810360008301526147d781613ef8565b9050919050565b600060208201905081810360008301526147f781613f5e565b9050919050565b6000602082019050818103600083015261481781613f9e565b9050919050565b6000602082019050818103600083015261483781614004565b9050919050565b600060208201905081810360008301526148578161406a565b9050919050565b60006020820190508181036000830152614877816140d0565b9050919050565b6000602082019050818103600083015261489781614110565b9050919050565b600060208201905081810360008301526148b781614150565b9050919050565b600060208201905081810360008301526148d7816141b6565b9050919050565b600060208201905081810360008301526148f7816141f6565b9050919050565b600060208201905081810360008301526149178161425c565b9050919050565b60006020820190508181036000830152614937816142c2565b9050919050565b6000602082019050818103600083015261495781614328565b9050919050565b6000602082019050818103600083015261497781614368565b9050919050565b60006020820190508181036000830152614997816143ce565b9050919050565b600060208201905081810360008301526149b781614434565b9050919050565b600060208201905081810360008301526149d78161449a565b9050919050565b600060208201905081810360008301526149f781614500565b9050919050565b6000602082019050614a136000830184614540565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a4057614a3f614dcf565b5b8060405250919050565b600067ffffffffffffffff821115614a6557614a64614dcf565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a9557614a94614dcf565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614af882614c1c565b9150614b0383614c1c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b3857614b37614d42565b5b828201905092915050565b6000614b4e82614c1c565b9150614b5983614c1c565b925082614b6957614b68614d71565b5b828204905092915050565b6000614b7f82614c1c565b9150614b8a83614c1c565b925082821015614b9d57614b9c614d42565b5b828203905092915050565b6000614bb382614bfc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c53578082015181840152602081019050614c38565b83811115614c62576000848401525b50505050565b60006002820490506001821680614c8057607f821691505b60208210811415614c9457614c93614da0565b5b50919050565b6000614ca582614c1c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cd857614cd7614d42565b5b600182019050919050565b6000614cee82614cff565b9050919050565b6000819050919050565b6000614d0a82614e0f565b9050919050565b6000614d1c82614c1c565b9150614d2783614c1c565b925082614d3757614d36614d71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614e2581614ba8565b8114614e3057600080fd5b50565b614e3c81614bba565b8114614e4757600080fd5b50565b614e5381614bc6565b8114614e5e57600080fd5b50565b614e6a81614bd0565b8114614e7557600080fd5b50565b614e8181614c1c565b8114614e8c57600080fd5b5056fea26469706673582212203007777bf194fdbf0d2bcb5f2c33f65dac521dd43b56148570965a33fe60361564736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806370a082311161013b578063cb774d47116100b8578063e13f351a1161007c578063e13f351a14610666578063e36d649814610670578063e985e9c51461068e578063eb8d2444146106be578063f2fde38b146106dc5761023d565b8063cb774d47146105d6578063d031370b146105f4578063d1beca6414610610578063d2cab0561461061a578063db4bec44146106365761023d565b806395d89b41116100ff57806395d89b4114610534578063a0712d6814610552578063a22cb4651461056e578063b88d4fde1461058a578063c87b56dd146105a65761023d565b806370a08231146104b6578063715018a6146104e65780637cb64759146104f05780637d17fcbe1461050c5780638da5cb5b146105165761023d565b806323b872dd116101c957806342842e0e1161018d57806342842e0e146104005780634f6ccce71461041c57806355f804b31461044c5780636352211e146104685780636373a6b1146104985761023d565b806323b872dd146103825780632f745c591461039e57806332cb6b0c146103ce57806334918dfd146103ec5780633ccfd60b146103f65761023d565b8063095ea7b311610210578063095ea7b3146102de57806310969523146102fa57806310b5454d1461031657806318160ddd14610334578063225dd847146103525761023d565b806301ffc9a714610242578063020b39cc1461027257806306fdde0314610290578063081812fc146102ae575b600080fd5b61025c60048036038101906102579190613905565b6106f8565b6040516102699190614621565b60405180910390f35b61027a610772565b60405161028791906149fe565b60405180910390f35b610298610777565b6040516102a5919061463c565b60405180910390f35b6102c860048036038101906102c39190613998565b610809565b6040516102d591906145ba565b60405180910390f35b6102f860048036038101906102f391906138a0565b61088e565b005b610314600480360381019061030f9190613957565b6109a6565b005b61031e610a3c565b60405161032b9190614621565b60405180910390f35b61033c610a4f565b60405161034991906149fe565b60405180910390f35b61036c60048036038101906103679190613735565b610a5c565b60405161037991906149fe565b60405180910390f35b61039c6004803603810190610397919061379a565b610a74565b005b6103b860048036038101906103b391906138a0565b610ad4565b6040516103c591906149fe565b60405180910390f35b6103d6610b79565b6040516103e391906149fe565b60405180910390f35b6103f4610b7f565b005b6103fe610c27565b005b61041a6004803603810190610415919061379a565b610cf2565b005b61043660048036038101906104319190613998565b610d12565b60405161044391906149fe565b60405180910390f35b61046660048036038101906104619190613957565b610da9565b005b610482600480360381019061047d9190613998565b610e3f565b60405161048f91906145ba565b60405180910390f35b6104a0610ef1565b6040516104ad919061463c565b60405180910390f35b6104d060048036038101906104cb9190613735565b610f7f565b6040516104dd91906149fe565b60405180910390f35b6104ee611037565b005b61050a600480360381019061050591906138dc565b611174565b005b6105146111fa565b005b61051e6112c4565b60405161052b91906145ba565b60405180910390f35b61053c6112ee565b604051610549919061463c565b60405180910390f35b61056c60048036038101906105679190613998565b611380565b005b61058860048036038101906105839190613864565b611669565b005b6105a4600480360381019061059f91906137e9565b6117ea565b005b6105c060048036038101906105bb9190613998565b61184c565b6040516105cd919061463c565b60405180910390f35b6105de6119bf565b6040516105eb91906149fe565b60405180910390f35b61060e60048036038101906106099190613998565b6119c5565b005b610618611a98565b005b610634600480360381019061062f91906139c1565b611b40565b005b610650600480360381019061064b9190613735565b611eb4565b60405161065d91906149fe565b60405180910390f35b61066e611ecc565b005b610678612059565b60405161068591906149fe565b60405180910390f35b6106a860048036038101906106a3919061375e565b61205f565b6040516106b59190614621565b60405180910390f35b6106c66120f3565b6040516106d39190614621565b60405180910390f35b6106f660048036038101906106f19190613735565b612106565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076b575061076a826122b2565b5b9050919050565b600181565b60606000805461078690614c68565b80601f01602080910402602001604051908101604052809291908181526020018280546107b290614c68565b80156107ff5780601f106107d4576101008083540402835291602001916107ff565b820191906000526020600020905b8154815290600101906020018083116107e257829003601f168201915b5050505050905090565b600061081482612394565b610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a9061489e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089982610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109019061491e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610929612400565b73ffffffffffffffffffffffffffffffffffffffff161480610958575061095781610952612400565b61205f565b5b610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e906147fe565b60405180910390fd5b6109a18383612408565b505050565b6109ae612400565b73ffffffffffffffffffffffffffffffffffffffff166109cc6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a19906148be565b60405180910390fd5b80600d9080519060200190610a389291906134fa565b5050565b600c60019054906101000a900460ff1681565b6000600880549050905090565b60146020528060005260406000206000915090505481565b610a85610a7f612400565b826124c1565b610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb9061497e565b60405180910390fd5b610acf83838361259f565b505050565b6000610adf83610f7f565b8210610b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b17906146fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610b87612400565b73ffffffffffffffffffffffffffffffffffffffff16610ba56112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf2906148be565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610c2f612400565b73ffffffffffffffffffffffffffffffffffffffff16610c4d6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a906148be565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cee573d6000803e3d6000fd5b5050565b610d0d838383604051806020016040528060008152506117ea565b505050565b6000610d1c610a4f565b8210610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061499e565b60405180910390fd5b60088281548110610d97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610db1612400565b73ffffffffffffffffffffffffffffffffffffffff16610dcf6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c906148be565b60405180910390fd5b8060109080519060200190610e3b9291906134fa565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf9061483e565b60405180910390fd5b80915050919050565b600d8054610efe90614c68565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2a90614c68565b8015610f775780601f10610f4c57610100808354040283529160200191610f77565b820191906000526020600020905b815481529060010190602001808311610f5a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061481e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61103f612400565b73ffffffffffffffffffffffffffffffffffffffff1661105d6112c4565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa906148be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61117c612400565b73ffffffffffffffffffffffffffffffffffffffff1661119a6112c4565b73ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e7906148be565b60405180910390fd5b8060128190555050565b611202612400565b73ffffffffffffffffffffffffffffffffffffffff166112206112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906148be565b60405180910390fd5b6000600e54146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b2906147de565b60405180910390fd5b43600f81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112fd90614c68565b80601f016020809104026020016040519081016040528092919081815260200182805461132990614c68565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b5050505050905090565b61139f3373ffffffffffffffffffffffffffffffffffffffff166127fd565b156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d69061469e565b60405180910390fd5b600c60009054906101000a900460ff1661142e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611425906149de565b60405180910390fd5b60008111611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906146be565b60405180910390fd5b600b5461148e82611480610a4f565b61281090919063ffffffff16565b11156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c69061485e565b60405180910390fd5b600161152382601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281090919063ffffffff16565b1115611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b906146de565b60405180910390fd5b60018111156115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061467e565b60405180910390fd5b60005b818110156115d7576115c4336115bf610a4f565b612826565b80806115cf90614c9a565b9150506115ab565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116239190614aed565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611671612400565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d69061479e565b60405180910390fd5b80600560006116ec612400565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611799612400565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117de9190614621565b60405180910390a35050565b6117fb6117f5612400565b836124c1565b61183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061497e565b60405180910390fd5b61184684848484612844565b50505050565b606061185782612394565b611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906148fe565b60405180910390fd5b60006011600084815260200190815260200160002080546118b690614c68565b80601f01602080910402602001604051908101604052809291908181526020018280546118e290614c68565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b5050505050905060006119406128a0565b90506000815114156119565781925050506119ba565b60008251111561198b578082604051602001611973929190614596565b604051602081830303815290604052925050506119ba565b8061199585612932565b6040516020016119a6929190614596565b604051602081830303815290604052925050505b919050565b600e5481565b6119cd612400565b73ffffffffffffffffffffffffffffffffffffffff166119eb6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a38906148be565b60405180910390fd5b6000611a4b610a4f565b905060005b82811015611a8057611a6d338284611a689190614aed565b612826565b8080611a7890614c9a565b915050611a50565b6000600f541415611a935743600f819055505b505050565b611aa0612400565b73ffffffffffffffffffffffffffffffffffffffff16611abe6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b906148be565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b611b5f3373ffffffffffffffffffffffffffffffffffffffff166127fd565b15611b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b969061469e565b60405180910390fd5b600c60019054906101000a900460ff16611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be59061495e565b60405180910390fd5b60008311611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c28906146be565b60405180910390fd5b600b54611c4e84611c40610a4f565b61281090919063ffffffff16565b1115611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c869061485e565b60405180910390fd5b6001831115611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca9061467e565b60405180910390fd5b6002611d2784601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281090919063ffffffff16565b1115611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f906146de565b60405180910390fd5b611db2828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612adf565b611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de89061493e565b60405180910390fd5b60005b83811015611e2057611e0d33611e08610a4f565b612826565b8080611e1890614c9a565b915050611df4565b5082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e6c9190614aed565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60136020528060005260406000206000915090505481565b611ed4612400565b73ffffffffffffffffffffffffffffffffffffffff16611ef26112c4565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f906148be565b60405180910390fd5b6000600e5414611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906149be565b60405180910390fd5b6000600f541415611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca9061465e565b60405180910390fd5b600b54600f544060001c611fe79190614d11565b600e8190555060ff612004600f5443612b2090919063ffffffff16565b111561202f57600b5460014361201a9190614b74565b4060001c6120289190614d11565b600e819055505b6000600e541415612057576120506001600e5461281090919063ffffffff16565b600e819055505b565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b61210e612400565b73ffffffffffffffffffffffffffffffffffffffff1661212c6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614612182576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612179906148be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e99061473e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061237d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061238d575061238c82612b36565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661247b83610e3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124cc82612394565b61250b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612502906147be565b60405180910390fd5b600061251683610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061258557508373ffffffffffffffffffffffffffffffffffffffff1661256d84610809565b73ffffffffffffffffffffffffffffffffffffffff16145b806125965750612595818561205f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125bf82610e3f565b73ffffffffffffffffffffffffffffffffffffffff1614612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c906148de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267c9061477e565b60405180910390fd5b6126928383836001612ba0565b61269d600082612408565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ed9190614b74565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127449190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080823b905060008111915050919050565b6000818361281e9190614aed565b905092915050565b612840828260405180602001604052806000815250612cca565b5050565b61284f84848461259f565b61285b84848484612d25565b61289a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128919061471e565b60405180910390fd5b50505050565b6060601080546128af90614c68565b80601f01602080910402602001604051908101604052809291908181526020018280546128db90614c68565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b5050505050905090565b6060600082141561297a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ada565b600082905060005b600082146129ac57808061299590614c9a565b915050600a826129a59190614b43565b9150612982565b60008167ffffffffffffffff8111156129ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a205781602001600182028036833780820191505090505b5090505b60008514612ad357600182612a399190614b74565b9150600a85612a489190614d11565b6030612a549190614aed565b60f81b818381518110612a90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612acc9190614b43565b9450612a24565b8093505050505b919050565b60008033604051602001612af3919061454f565b604051602081830303815290604052805190602001209050612b188360125483612ebc565b915050919050565b60008183612b2e9190614b74565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bac84848484612ed3565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612bef57612bea82612ed9565b612c2e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612c2d57612c2c8483612f22565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612c675750805b15612c7a57612c758261308f565b612cc4565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612cb35750805b15612cc357612cc283836131d2565b5b5b50505050565b612cd48383613251565b612ce16000848484612d25565b612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d179061471e565b60405180910390fd5b505050565b6000612d468473ffffffffffffffffffffffffffffffffffffffff166127fd565b15612eaf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6f612400565b8786866040518563ffffffff1660e01b8152600401612d9194939291906145d5565b602060405180830381600087803b158015612dab57600080fd5b505af1925050508015612ddc57506040513d601f19601f82011682018060405250810190612dd9919061392e565b60015b612e5f573d8060008114612e0c576040519150601f19603f3d011682016040523d82523d6000602084013e612e11565b606091505b50600081511415612e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4e9061471e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eb4565b600190505b949350505050565b600082612ec98584613421565b1490509392505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f2f84610f7f565b612f399190614b74565b905060006007600084815260200190815260200160002054905081811461301e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130a39190614b74565b90506000600960008481526020019081526020016000205490506000600883815481106130f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613141577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131dd83610f7f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b89061487e565b60405180910390fd5b6132ca81612394565b1561330a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133019061475e565b60405180910390fd5b613318600083836001612ba0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133689190614aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008082905060005b84518110156134ef57600085828151811061346e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116134af57828160405160200161349292919061456a565b6040516020818303038152906040528051906020012092506134db565b80836040516020016134c292919061456a565b6040516020818303038152906040528051906020012092505b5080806134e790614c9a565b91505061342a565b508091505092915050565b82805461350690614c68565b90600052602060002090601f016020900481019282613528576000855561356f565b82601f1061354157805160ff191683800117855561356f565b8280016001018555821561356f579182015b8281111561356e578251825591602001919060010190613553565b5b50905061357c9190613580565b5090565b5b80821115613599576000816000905550600101613581565b5090565b60006135b06135ab84614a4a565b614a19565b9050828152602081018484840111156135c857600080fd5b6135d3848285614c26565b509392505050565b60006135ee6135e984614a7a565b614a19565b90508281526020810184848401111561360657600080fd5b613611848285614c26565b509392505050565b60008135905061362881614e1c565b92915050565b60008083601f84011261364057600080fd5b8235905067ffffffffffffffff81111561365957600080fd5b60208301915083602082028301111561367157600080fd5b9250929050565b60008135905061368781614e33565b92915050565b60008135905061369c81614e4a565b92915050565b6000813590506136b181614e61565b92915050565b6000815190506136c681614e61565b92915050565b600082601f8301126136dd57600080fd5b81356136ed84826020860161359d565b91505092915050565b600082601f83011261370757600080fd5b81356137178482602086016135db565b91505092915050565b60008135905061372f81614e78565b92915050565b60006020828403121561374757600080fd5b600061375584828501613619565b91505092915050565b6000806040838503121561377157600080fd5b600061377f85828601613619565b925050602061379085828601613619565b9150509250929050565b6000806000606084860312156137af57600080fd5b60006137bd86828701613619565b93505060206137ce86828701613619565b92505060406137df86828701613720565b9150509250925092565b600080600080608085870312156137ff57600080fd5b600061380d87828801613619565b945050602061381e87828801613619565b935050604061382f87828801613720565b925050606085013567ffffffffffffffff81111561384c57600080fd5b613858878288016136cc565b91505092959194509250565b6000806040838503121561387757600080fd5b600061388585828601613619565b925050602061389685828601613678565b9150509250929050565b600080604083850312156138b357600080fd5b60006138c185828601613619565b92505060206138d285828601613720565b9150509250929050565b6000602082840312156138ee57600080fd5b60006138fc8482850161368d565b91505092915050565b60006020828403121561391757600080fd5b6000613925848285016136a2565b91505092915050565b60006020828403121561394057600080fd5b600061394e848285016136b7565b91505092915050565b60006020828403121561396957600080fd5b600082013567ffffffffffffffff81111561398357600080fd5b61398f848285016136f6565b91505092915050565b6000602082840312156139aa57600080fd5b60006139b884828501613720565b91505092915050565b6000806000604084860312156139d657600080fd5b60006139e486828701613720565b935050602084013567ffffffffffffffff811115613a0157600080fd5b613a0d8682870161362e565b92509250509250925092565b613a2281614ba8565b82525050565b613a39613a3482614ba8565b614ce3565b82525050565b613a4881614bba565b82525050565b613a5f613a5a82614bc6565b614cf5565b82525050565b6000613a7082614aaa565b613a7a8185614ac0565b9350613a8a818560208601614c35565b613a9381614dfe565b840191505092915050565b6000613aa982614ab5565b613ab38185614ad1565b9350613ac3818560208601614c35565b613acc81614dfe565b840191505092915050565b6000613ae282614ab5565b613aec8185614ae2565b9350613afc818560208601614c35565b80840191505092915050565b6000613b15602383614ad1565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b7b602283614ad1565b91507f43616e206f6e6c79206d696e7420757020746f2031207065722070757263686160008301527f73650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613be1601e83614ad1565b91507f4f776e65722073686f756c64206e6f74206265206120636f6e747261637400006000830152602082019050919050565b6000613c21603383614ad1565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613c87602a83614ad1565b91507f507572636861736520776f756c642065786365656420796f757220616464726560008301527f73732773206c696d6974000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ced602b83614ad1565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d53603283614ad1565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613db9602683614ad1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e1f601c83614ad1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e5f602483614ad1565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ec5601983614ad1565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f05602c83614ad1565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f6b601d83614ad1565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000613fab603883614ad1565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614011602a83614ad1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614077602983614ad1565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140dd602083614ad1565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061411d602083614ad1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061415d602c83614ad1565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141c3602083614ad1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614203602983614ad1565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614269602f83614ad1565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142cf602183614ad1565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614335601483614ad1565b91507f4e6f7420696e207468652077686974656c6973740000000000000000000000006000830152602082019050919050565b6000614375602a83614ad1565b91507f57686974656c6973742073616c65206973206e6f74206163746976652061742060008301527f746865206d6f6d656e74000000000000000000000000000000000000000000006020830152604082019050919050565b60006143db603183614ad1565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614441602c83614ad1565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006144a7602383614ad1565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061450d602083614ad1565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b61454981614c1c565b82525050565b600061455b8284613a28565b60148201915081905092915050565b60006145768285613a4e565b6020820191506145868284613a4e565b6020820191508190509392505050565b60006145a28285613ad7565b91506145ae8284613ad7565b91508190509392505050565b60006020820190506145cf6000830184613a19565b92915050565b60006080820190506145ea6000830187613a19565b6145f76020830186613a19565b6146046040830185614540565b81810360608301526146168184613a65565b905095945050505050565b60006020820190506146366000830184613a3f565b92915050565b600060208201905081810360008301526146568184613a9e565b905092915050565b6000602082019050818103600083015261467781613b08565b9050919050565b6000602082019050818103600083015261469781613b6e565b9050919050565b600060208201905081810360008301526146b781613bd4565b9050919050565b600060208201905081810360008301526146d781613c14565b9050919050565b600060208201905081810360008301526146f781613c7a565b9050919050565b6000602082019050818103600083015261471781613ce0565b9050919050565b6000602082019050818103600083015261473781613d46565b9050919050565b6000602082019050818103600083015261475781613dac565b9050919050565b6000602082019050818103600083015261477781613e12565b9050919050565b6000602082019050818103600083015261479781613e52565b9050919050565b600060208201905081810360008301526147b781613eb8565b9050919050565b600060208201905081810360008301526147d781613ef8565b9050919050565b600060208201905081810360008301526147f781613f5e565b9050919050565b6000602082019050818103600083015261481781613f9e565b9050919050565b6000602082019050818103600083015261483781614004565b9050919050565b600060208201905081810360008301526148578161406a565b9050919050565b60006020820190508181036000830152614877816140d0565b9050919050565b6000602082019050818103600083015261489781614110565b9050919050565b600060208201905081810360008301526148b781614150565b9050919050565b600060208201905081810360008301526148d7816141b6565b9050919050565b600060208201905081810360008301526148f7816141f6565b9050919050565b600060208201905081810360008301526149178161425c565b9050919050565b60006020820190508181036000830152614937816142c2565b9050919050565b6000602082019050818103600083015261495781614328565b9050919050565b6000602082019050818103600083015261497781614368565b9050919050565b60006020820190508181036000830152614997816143ce565b9050919050565b600060208201905081810360008301526149b781614434565b9050919050565b600060208201905081810360008301526149d78161449a565b9050919050565b600060208201905081810360008301526149f781614500565b9050919050565b6000602082019050614a136000830184614540565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a4057614a3f614dcf565b5b8060405250919050565b600067ffffffffffffffff821115614a6557614a64614dcf565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a9557614a94614dcf565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614af882614c1c565b9150614b0383614c1c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b3857614b37614d42565b5b828201905092915050565b6000614b4e82614c1c565b9150614b5983614c1c565b925082614b6957614b68614d71565b5b828204905092915050565b6000614b7f82614c1c565b9150614b8a83614c1c565b925082821015614b9d57614b9c614d42565b5b828203905092915050565b6000614bb382614bfc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c53578082015181840152602081019050614c38565b83811115614c62576000848401525b50505050565b60006002820490506001821680614c8057607f821691505b60208210811415614c9457614c93614da0565b5b50919050565b6000614ca582614c1c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cd857614cd7614d42565b5b600182019050919050565b6000614cee82614cff565b9050919050565b6000819050919050565b6000614d0a82614e0f565b9050919050565b6000614d1c82614c1c565b9150614d2783614c1c565b925082614d3757614d36614d71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614e2581614ba8565b8114614e3057600080fd5b50565b614e3c81614bba565b8114614e4757600080fd5b50565b614e5381614bc6565b8114614e5e57600080fd5b50565b614e6a81614bd0565b8114614e7557600080fd5b50565b614e8181614c1c565b8114614e8c57600080fd5b5056fea26469706673582212203007777bf194fdbf0d2bcb5f2c33f65dac521dd43b56148570965a33fe60361564736f6c63430008000033

Deployed Bytecode Sourcemap

51218:5627:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42999:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51373:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30921:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32373:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31910:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52508:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51499:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43644:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51839:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33263:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43312:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51421:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52287:89;;;:::i;:::-;;52636:140;;;:::i;:::-;;33639:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43834:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55930:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30615:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51547:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30345:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28189:148;;;:::i;:::-;;51947:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55536:182;;;:::i;:::-;;27538:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31090:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53105:788;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32666:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33861:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56047:793;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51585:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52784:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52384:116;;;:::i;:::-;;53901:922;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51781:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54831:697;;;:::i;:::-;;51620:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33032:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51460:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28492:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42999:229;43101:4;43140:35;43125:50;;;:11;:50;;;;:95;;;;43184:36;43208:11;43184:23;:36::i;:::-;43125:95;43118:102;;42999:229;;;:::o;51373:41::-;51413:1;51373:41;:::o;30921:100::-;30975:13;31008:5;31001:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30921:100;:::o;32373:221::-;32449:7;32477:16;32485:7;32477;:16::i;:::-;32469:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32562:15;:24;32578:7;32562:24;;;;;;;;;;;;;;;;;;;;;32555:31;;32373:221;;;:::o;31910:397::-;31991:13;32007:23;32022:7;32007:14;:23::i;:::-;31991:39;;32055:5;32049:11;;:2;:11;;;;32041:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32135:5;32119:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32144:37;32161:5;32168:12;:10;:12::i;:::-;32144:16;:37::i;:::-;32119:62;32111:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32278:21;32287:2;32291:7;32278:8;:21::i;:::-;31910:397;;;:::o;52508:120::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52606:14:::1;52593:10;:27;;;;;;;;;;;;:::i;:::-;;52508:120:::0;:::o;51499:41::-;;;;;;;;;;;;;:::o;43644:113::-;43705:7;43732:10;:17;;;;43725:24;;43644:113;:::o;51839:45::-;;;;;;;;;;;;;;;;;:::o;33263:305::-;33424:41;33443:12;:10;:12::i;:::-;33457:7;33424:18;:41::i;:::-;33416:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33532:28;33542:4;33548:2;33552:7;33532:9;:28::i;:::-;33263:305;;;:::o;43312:256::-;43409:7;43445:23;43462:5;43445:16;:23::i;:::-;43437:5;:31;43429:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43534:12;:19;43547:5;43534:19;;;;;;;;;;;;;;;:26;43554:5;43534:26;;;;;;;;;;;;43527:33;;43312:256;;;;:::o;51421:32::-;;;;:::o;52287:89::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52356:12:::1;;;;;;;;;;;52355:13;52340:12;;:28;;;;;;;;;;;;;;;;;;52287:89::o:0;52636:140::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52684:12:::1;52699:21;52684:36;;52739:10;52731:28;;:37;52760:7;52731:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;27829:1;52636:140::o:0;33639:151::-;33743:39;33760:4;33766:2;33770:7;33743:39;;;;;;;;;;;;:16;:39::i;:::-;33639:151;;;:::o;43834:233::-;43909:7;43945:30;:28;:30::i;:::-;43937:5;:38;43929:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44042:10;44053:5;44042:17;;;;;;;;;;;;;;;;;;;;;;;;44035:24;;43834:233;;;:::o;55930:109::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56023:8:::1;56004:16;:27;;;;;;;;;;;;:::i;:::-;;55930:109:::0;:::o;30615:239::-;30687:7;30707:13;30723:7;:16;30731:7;30723:16;;;;;;;;;;;;;;;;;;;;;30707:32;;30775:1;30758:19;;:5;:19;;;;30750:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30841:5;30834:12;;;30615:239;;;:::o;51547:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30345:208::-;30417:7;30462:1;30445:19;;:5;:19;;;;30437:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30529:9;:16;30539:5;30529:16;;;;;;;;;;;;;;;;30522:23;;30345:208;;;:::o;28189:148::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28296:1:::1;28259:40;;28280:6;;;;;;;;;;;28259:40;;;;;;;;;;;;28327:1;28310:6;;:19;;;;;;;;;;;;;;;;;;28189:148::o:0;51947:101::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52032:8:::1;52018:11;:22;;;;51947:101:::0;:::o;55536:182::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55631:1:::1;55614:13;;:18;55606:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55698:12;55677:18;:33;;;;55536:182::o:0;27538:87::-;27584:7;27611:6;;;;;;;;;;;27604:13;;27538:87;:::o;31090:104::-;31146:13;31179:7;31172:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31090:104;:::o;53105:788::-;53167:23;:10;:21;;;:23::i;:::-;53166:24;53158:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;53244:12;;;;;;;;;;;53236:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53329:1;53312:14;:18;53304:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;53442:10;;53405:33;53423:14;53405:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;53397:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;53554:1;53508:42;53535:14;53508:10;:22;53519:10;53508:22;;;;;;;;;;;;;;;;:26;;:42;;;;:::i;:::-;:47;;53500:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51413:1;53621:14;:34;;53613:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53711:6;53706:105;53727:14;53723:1;:18;53706:105;;;53763:36;53773:10;53785:13;:11;:13::i;:::-;53763:9;:36::i;:::-;53743:3;;;;;:::i;:::-;;;;53706:105;;;;53871:14;53846:10;:22;53857:10;53846:22;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;53821:10;:22;53832:10;53821:22;;;;;;;;;;;;;;;:64;;;;53105:788;:::o;32666:295::-;32781:12;:10;:12::i;:::-;32769:24;;:8;:24;;;;32761:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32881:8;32836:18;:32;32855:12;:10;:12::i;:::-;32836:32;;;;;;;;;;;;;;;:42;32869:8;32836:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32934:8;32905:48;;32920:12;:10;:12::i;:::-;32905:48;;;32944:8;32905:48;;;;;;:::i;:::-;;;;;;;;32666:295;;:::o;33861:285::-;33993:41;34012:12;:10;:12::i;:::-;34026:7;33993:18;:41::i;:::-;33985:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34099:39;34113:4;34119:2;34123:7;34132:5;34099:13;:39::i;:::-;33861:285;;;;:::o;56047:793::-;56120:13;56154:16;56162:7;56154;:16::i;:::-;56146:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56235:23;56261:10;:19;56272:7;56261:19;;;;;;;;;;;56235:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56291:18;56312:10;:8;:10::i;:::-;56291:31;;56420:1;56404:4;56398:18;:23;56394:72;;;56445:9;56438:16;;;;;;56394:72;56596:1;56576:9;56570:23;:27;56566:108;;;56645:4;56651:9;56628:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56614:48;;;;;;56566:108;56806:4;56812:18;:7;:16;:18::i;:::-;56789:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56775:57;;;;56047:793;;;;:::o;51585:28::-;;;;:::o;52784:313::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52848:11:::1;52862:13;:11;:13::i;:::-;52848:27;;52886:6;52903:86;52919:3;52915:1;:7;52903:86;;;52944:33;52954:10;52975:1;52966:6;:10;;;;:::i;:::-;52944:9;:33::i;:::-;52924:3;;;;;:::i;:::-;;;;52903:86;;;53027:1;53005:18;;:23;53001:89;;;53066:12;53045:18;:33;;;;53001:89;27829:1;;52784:313:::0;:::o;52384:116::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52471:21:::1;;;;;;;;;;;52470:22;52446:21;;:46;;;;;;;;;;;;;;;;;;52384:116::o:0;53901:922::-;53998:23;:10;:21;;;:23::i;:::-;53997:24;53989:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54075:21;;;;;;;;;;;54067:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54179:1;54162:14;:18;54154:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;54292:10;;54255:33;54273:14;54255:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;54247:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;51413:1;54358:14;:34;;54350:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;54501:1;54449:48;54482:14;54449:16;:28;54466:10;54449:28;;;;;;;;;;;;;;;;:32;;:48;;;;:::i;:::-;:53;;54441:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;54568:18;54580:5;;54568:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:18::i;:::-;54560:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54629:6;54624:105;54645:14;54641:1;:18;54624:105;;;54681:36;54691:10;54703:13;:11;:13::i;:::-;54681:9;:36::i;:::-;54661:3;;;;;:::i;:::-;;;;54624:105;;;;54801:14;54770:16;:28;54787:10;54770:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;54739:16;:28;54756:10;54739:28;;;;;;;;;;;;;;;:76;;;;53901:922;;;:::o;51781:51::-;;;;;;;;;;;;;;;;;:::o;54831:697::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54913:1:::1;54896:13;;:18;54888:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54995:1;54973:18;;:23;;54965:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55103:10;;55080:18;;55070:29;55065:35;;:48;;;;:::i;:::-;55049:13;:64;;;;55287:3;55248:36;55265:18;;55248:12;:16;;:36;;;;:::i;:::-;:42;55245:136;;;55359:10;;55353:1;55338:12;:16;;;;:::i;:::-;55328:27;55323:33;;:46;;;;:::i;:::-;55307:13;:62;;;;55245:136;55455:1;55438:13;;:18;55434:87;;;55489:20;55507:1;55489:13;;:17;;:20;;;;:::i;:::-;55473:13;:36;;;;55434:87;54831:697::o:0;51620:33::-;;;;:::o;33032:164::-;33129:4;33153:18;:25;33172:5;33153:25;;;;;;;;;;;;;;;:35;33179:8;33153:35;;;;;;;;;;;;;;;;;;;;;;;;;33146:42;;33032:164;;;;:::o;51460:32::-;;;;;;;;;;;;;:::o;28492:244::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28601:1:::1;28581:22;;:8;:22;;;;28573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28691:8;28662:38;;28683:6;;;;;;;;;;;28662:38;;;;;;;;;;;;28720:8;28711:6;;:17;;;;;;;;;;;;;;;;;;28492:244:::0;:::o;30005:276::-;30107:4;30146:25;30131:40;;;:11;:40;;;;:97;;;;30195:33;30180:48;;;:11;:48;;;;30131:97;:142;;;;30237:36;30261:11;30237:23;:36::i;:::-;30131:142;30124:149;;30005:276;;;:::o;35613:127::-;35678:4;35730:1;35702:30;;:7;:16;35710:7;35702:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35695:37;;35613:127;;;:::o;26155:98::-;26208:7;26235:10;26228:17;;26155:98;:::o;39852:174::-;39954:2;39927:15;:24;39943:7;39927:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40010:7;40006:2;39972:46;;39981:23;39996:7;39981:14;:23::i;:::-;39972:46;;;;;;;;;;;;39852:174;;:::o;35907:348::-;36000:4;36025:16;36033:7;36025;:16::i;:::-;36017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36101:13;36117:23;36132:7;36117:14;:23::i;:::-;36101:39;;36170:5;36159:16;;:7;:16;;;:51;;;;36203:7;36179:31;;:20;36191:7;36179:11;:20::i;:::-;:31;;;36159:51;:87;;;;36214:32;36231:5;36238:7;36214:16;:32::i;:::-;36159:87;36151:96;;;35907:348;;;;:::o;39184:550::-;39309:4;39282:31;;:23;39297:7;39282:14;:23::i;:::-;:31;;;39274:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39392:1;39378:16;;:2;:16;;;;39370:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39448:45;39469:4;39475:2;39479:7;39488:4;39448:20;:45::i;:::-;39558:29;39575:1;39579:7;39558:8;:29::i;:::-;39619:1;39600:9;:15;39610:4;39600:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39648:1;39631:9;:13;39641:2;39631:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39679:2;39660:7;:16;39668:7;39660:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39718:7;39714:2;39699:27;;39708:4;39699:27;;;;;;;;;;;;39184:550;;;:::o;9617:422::-;9677:4;9885:12;9996:7;9984:20;9976:28;;10030:1;10023:4;:8;10016:15;;;9617:422;;;:::o;2659:98::-;2717:7;2748:1;2744;:5;;;;:::i;:::-;2737:12;;2659:98;;;;:::o;36597:110::-;36673:26;36683:2;36687:7;36673:26;;;;;;;;;;;;:9;:26::i;:::-;36597:110;;:::o;35028:272::-;35142:28;35152:4;35158:2;35162:7;35142:9;:28::i;:::-;35189:48;35212:4;35218:2;35222:7;35231:5;35189:22;:48::i;:::-;35181:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35028:272;;;;:::o;55726:117::-;55786:13;55819:16;55812:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55726:117;:::o;7152:723::-;7208:13;7438:1;7429:5;:10;7425:53;;;7456:10;;;;;;;;;;;;;;;;;;;;;7425:53;7488:12;7503:5;7488:20;;7519:14;7544:78;7559:1;7551:4;:9;7544:78;;7577:8;;;;;:::i;:::-;;;;7608:2;7600:10;;;;;:::i;:::-;;;7544:78;;;7632:19;7664:6;7654:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:39;;7682:154;7698:1;7689:5;:10;7682:154;;7726:1;7716:11;;;;;:::i;:::-;;;7793:2;7785:5;:10;;;;:::i;:::-;7772:2;:24;;;;:::i;:::-;7759:39;;7742:6;7749;7742:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7822:2;7813:11;;;;;:::i;:::-;;;7682:154;;;7860:6;7846:21;;;;;7152:723;;;;:::o;52056:223::-;52131:4;52148:12;52190:10;52173:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52163:39;;;;;;52148:54;;52220:51;52239:12;52253:11;;52266:4;52220:18;:51::i;:::-;52213:58;;;52056:223;;;:::o;3040:98::-;3098:7;3129:1;3125;:5;;;;:::i;:::-;3118:12;;3040:98;;;;:::o;19228:157::-;19313:4;19352:25;19337:40;;;:11;:40;;;;19330:47;;19228:157;;;:::o;44680:604::-;44805:55;44832:4;44838:2;44842:7;44851:8;44805:26;:55::i;:::-;44893:1;44877:18;;:4;:18;;;44873:187;;;44912:40;44944:7;44912:31;:40::i;:::-;44873:187;;;44982:2;44974:10;;:4;:10;;;44970:90;;45001:47;45034:4;45040:7;45001:32;:47::i;:::-;44970:90;44873:187;45088:1;45074:16;;:2;:16;;;:28;;;;;45094:8;45074:28;45070:207;;;45119:45;45156:7;45119:36;:45::i;:::-;45070:207;;;45192:4;45186:10;;:2;:10;;;;:22;;;;;45200:8;45186:22;45182:95;;;45225:40;45253:2;45257:7;45225:27;:40::i;:::-;45182:95;45070:207;44680:604;;;;:::o;36934:250::-;37030:18;37036:2;37040:7;37030:5;:18::i;:::-;37067:54;37098:1;37102:2;37106:7;37115:5;37067:22;:54::i;:::-;37059:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;36934:250;;;:::o;40591:839::-;40708:4;40734:15;:2;:13;;;:15::i;:::-;40730:693;;;40786:2;40770:36;;;40807:12;:10;:12::i;:::-;40821:4;40827:7;40836:5;40770:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40766:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41033:1;41016:6;:13;:18;41012:341;;;41059:60;;;;;;;;;;:::i;:::-;;;;;;;;41012:341;41303:6;41297:13;41288:6;41284:2;41280:15;41273:38;40766:602;40903:45;;;40893:55;;;:6;:55;;;;40886:62;;;;;40730:693;41407:4;41400:11;;40591:839;;;;;;;:::o;49929:190::-;50054:4;50107;50078:25;50091:5;50098:4;50078:12;:25::i;:::-;:33;50071:40;;49929:190;;;;;:::o;42043:108::-;;;;;:::o;46007:164::-;46111:10;:17;;;;46084:15;:24;46100:7;46084:24;;;;;;;;;;;:44;;;;46139:10;46155:7;46139:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46007:164;:::o;46798:988::-;47064:22;47114:1;47089:22;47106:4;47089:16;:22::i;:::-;:26;;;;:::i;:::-;47064:51;;47126:18;47147:17;:26;47165:7;47147:26;;;;;;;;;;;;47126:47;;47294:14;47280:10;:28;47276:328;;47325:19;47347:12;:18;47360:4;47347:18;;;;;;;;;;;;;;;:34;47366:14;47347:34;;;;;;;;;;;;47325:56;;47431:11;47398:12;:18;47411:4;47398:18;;;;;;;;;;;;;;;:30;47417:10;47398:30;;;;;;;;;;;:44;;;;47548:10;47515:17;:30;47533:11;47515:30;;;;;;;;;;;:43;;;;47276:328;;47700:17;:26;47718:7;47700:26;;;;;;;;;;;47693:33;;;47744:12;:18;47757:4;47744:18;;;;;;;;;;;;;;;:34;47763:14;47744:34;;;;;;;;;;;47737:41;;;46798:988;;;;:::o;48081:1079::-;48334:22;48379:1;48359:10;:17;;;;:21;;;;:::i;:::-;48334:46;;48391:18;48412:15;:24;48428:7;48412:24;;;;;;;;;;;;48391:45;;48763:19;48785:10;48796:14;48785:26;;;;;;;;;;;;;;;;;;;;;;;;48763:48;;48849:11;48824:10;48835;48824:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48960:10;48929:15;:28;48945:11;48929:28;;;;;;;;;;;:41;;;;49101:15;:24;49117:7;49101:24;;;;;;;;;;;49094:31;;;49136:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48081:1079;;;;:::o;45585:221::-;45670:14;45687:20;45704:2;45687:16;:20::i;:::-;45670:37;;45745:7;45718:12;:16;45731:2;45718:16;;;;;;;;;;;;;;;:24;45735:6;45718:24;;;;;;;;;;;:34;;;;45792:6;45763:17;:26;45781:7;45763:26;;;;;;;;;;;:35;;;;45585:221;;;:::o;37520:388::-;37614:1;37600:16;;:2;:16;;;;37592:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37673:16;37681:7;37673;:16::i;:::-;37672:17;37664:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37735:51;37764:1;37768:2;37772:7;37781:4;37735:20;:51::i;:::-;37816:1;37799:9;:13;37809:2;37799:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37847:2;37828:7;:16;37836:7;37828:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37892:7;37888:2;37867:33;;37884:1;37867:33;;;;;;;;;;;;37520:388;;:::o;50481:701::-;50564:7;50584:20;50607:4;50584:27;;50627:9;50622:523;50646:5;:12;50642:1;:16;50622:523;;;50680:20;50703:5;50709:1;50703:8;;;;;;;;;;;;;;;;;;;;;;50680:31;;50746:12;50730;:28;50726:408;;50900:12;50914;50883:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50873:55;;;;;;50858:70;;50726:408;;;51090:12;51104;51073:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51063:55;;;;;;51048:70;;50726:408;50622:523;50660:3;;;;;:::i;:::-;;;;50622:523;;;;51162:12;51155:19;;;50481:701;;;;:::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;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:262::-;;2650:2;2638:9;2629:7;2625:23;2621:32;2618:2;;;2666:1;2663;2656:12;2618:2;2709:1;2734:53;2779:7;2770:6;2759:9;2755:22;2734:53;:::i;:::-;2724:63;;2680:117;2608:196;;;;:::o;2810:407::-;;;2935:2;2923:9;2914:7;2910:23;2906:32;2903:2;;;2951:1;2948;2941:12;2903:2;2994:1;3019:53;3064:7;3055:6;3044:9;3040:22;3019:53;:::i;:::-;3009:63;;2965:117;3121:2;3147:53;3192:7;3183:6;3172:9;3168:22;3147:53;:::i;:::-;3137:63;;3092:118;2893:324;;;;;:::o;3223:552::-;;;;3365:2;3353:9;3344:7;3340:23;3336:32;3333:2;;;3381:1;3378;3371:12;3333:2;3424:1;3449:53;3494:7;3485:6;3474:9;3470:22;3449:53;:::i;:::-;3439:63;;3395:117;3551:2;3577:53;3622:7;3613:6;3602:9;3598:22;3577:53;:::i;:::-;3567:63;;3522:118;3679:2;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3650:118;3323:452;;;;;:::o;3781:809::-;;;;;3949:3;3937:9;3928:7;3924:23;3920:33;3917:2;;;3966:1;3963;3956:12;3917:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;4264:2;4290:53;4335:7;4326:6;4315:9;4311:22;4290:53;:::i;:::-;4280:63;;4235:118;4420:2;4409:9;4405:18;4392:32;4451:18;4443:6;4440:30;4437:2;;;4483:1;4480;4473:12;4437:2;4511:62;4565:7;4556:6;4545:9;4541:22;4511:62;:::i;:::-;4501:72;;4363:220;3907:683;;;;;;;:::o;4596:401::-;;;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4748:117;4904:2;4930:50;4972:7;4963:6;4952:9;4948:22;4930:50;:::i;:::-;4920:60;;4875:115;4676:321;;;;;:::o;5003:407::-;;;5128:2;5116:9;5107:7;5103:23;5099:32;5096:2;;;5144:1;5141;5134:12;5096:2;5187:1;5212:53;5257:7;5248:6;5237:9;5233:22;5212:53;:::i;:::-;5202:63;;5158:117;5314:2;5340:53;5385:7;5376:6;5365:9;5361:22;5340:53;:::i;:::-;5330:63;;5285:118;5086:324;;;;;:::o;5416:262::-;;5524:2;5512:9;5503:7;5499:23;5495:32;5492:2;;;5540:1;5537;5530:12;5492:2;5583:1;5608:53;5653:7;5644:6;5633:9;5629:22;5608:53;:::i;:::-;5598:63;;5554:117;5482:196;;;;:::o;5684:260::-;;5791:2;5779:9;5770:7;5766:23;5762:32;5759:2;;;5807:1;5804;5797:12;5759:2;5850:1;5875:52;5919:7;5910:6;5899:9;5895:22;5875:52;:::i;:::-;5865:62;;5821:116;5749:195;;;;:::o;5950:282::-;;6068:2;6056:9;6047:7;6043:23;6039:32;6036:2;;;6084:1;6081;6074:12;6036:2;6127:1;6152:63;6207:7;6198:6;6187:9;6183:22;6152:63;:::i;:::-;6142:73;;6098:127;6026:206;;;;:::o;6238:375::-;;6356:2;6344:9;6335:7;6331:23;6327:32;6324:2;;;6372:1;6369;6362:12;6324:2;6443:1;6432:9;6428:17;6415:31;6473:18;6465:6;6462:30;6459:2;;;6505:1;6502;6495:12;6459:2;6533:63;6588:7;6579:6;6568:9;6564:22;6533:63;:::i;:::-;6523:73;;6386:220;6314:299;;;;:::o;6619:262::-;;6727:2;6715:9;6706:7;6702:23;6698:32;6695:2;;;6743:1;6740;6733:12;6695:2;6786:1;6811:53;6856:7;6847:6;6836:9;6832:22;6811:53;:::i;:::-;6801:63;;6757:117;6685:196;;;;:::o;6887:570::-;;;;7047:2;7035:9;7026:7;7022:23;7018:32;7015:2;;;7063:1;7060;7053:12;7015:2;7106:1;7131:53;7176:7;7167:6;7156:9;7152:22;7131:53;:::i;:::-;7121:63;;7077:117;7261:2;7250:9;7246:18;7233:32;7292:18;7284:6;7281:30;7278:2;;;7324:1;7321;7314:12;7278:2;7360:80;7432:7;7423:6;7412:9;7408:22;7360:80;:::i;:::-;7342:98;;;;7204:246;7005:452;;;;;:::o;7463:118::-;7550:24;7568:5;7550:24;:::i;:::-;7545:3;7538:37;7528:53;;:::o;7587:157::-;7692:45;7712:24;7730:5;7712:24;:::i;:::-;7692:45;:::i;:::-;7687:3;7680:58;7670:74;;:::o;7750:109::-;7831:21;7846:5;7831:21;:::i;:::-;7826:3;7819:34;7809:50;;:::o;7865:157::-;7970:45;7990:24;8008:5;7990:24;:::i;:::-;7970:45;:::i;:::-;7965:3;7958:58;7948:74;;:::o;8028:360::-;;8142:38;8174:5;8142:38;:::i;:::-;8196:70;8259:6;8254:3;8196:70;:::i;:::-;8189:77;;8275:52;8320:6;8315:3;8308:4;8301:5;8297:16;8275:52;:::i;:::-;8352:29;8374:6;8352:29;:::i;:::-;8347:3;8343:39;8336:46;;8118:270;;;;;:::o;8394:364::-;;8510:39;8543:5;8510:39;:::i;:::-;8565:71;8629:6;8624:3;8565:71;:::i;:::-;8558:78;;8645:52;8690:6;8685:3;8678:4;8671:5;8667:16;8645:52;:::i;:::-;8722:29;8744:6;8722:29;:::i;:::-;8717:3;8713:39;8706:46;;8486:272;;;;;:::o;8764:377::-;;8898:39;8931:5;8898:39;:::i;:::-;8953:89;9035:6;9030:3;8953:89;:::i;:::-;8946:96;;9051:52;9096:6;9091:3;9084:4;9077:5;9073:16;9051:52;:::i;:::-;9128:6;9123:3;9119:16;9112:23;;8874:267;;;;;:::o;9147:367::-;;9310:67;9374:2;9369:3;9310:67;:::i;:::-;9303:74;;9407:34;9403:1;9398:3;9394:11;9387:55;9473:5;9468:2;9463:3;9459:12;9452:27;9505:2;9500:3;9496:12;9489:19;;9293:221;;;:::o;9520:366::-;;9683:67;9747:2;9742:3;9683:67;:::i;:::-;9676:74;;9780:34;9776:1;9771:3;9767:11;9760:55;9846:4;9841:2;9836:3;9832:12;9825:26;9877:2;9872:3;9868:12;9861:19;;9666:220;;;:::o;9892:328::-;;10055:67;10119:2;10114:3;10055:67;:::i;:::-;10048:74;;10152:32;10148:1;10143:3;10139:11;10132:53;10211:2;10206:3;10202:12;10195:19;;10038:182;;;:::o;10226:383::-;;10389:67;10453:2;10448:3;10389:67;:::i;:::-;10382:74;;10486:34;10482:1;10477:3;10473:11;10466:55;10552:21;10547:2;10542:3;10538:12;10531:43;10600:2;10595:3;10591:12;10584:19;;10372:237;;;:::o;10615:374::-;;10778:67;10842:2;10837:3;10778:67;:::i;:::-;10771:74;;10875:34;10871:1;10866:3;10862:11;10855:55;10941:12;10936:2;10931:3;10927:12;10920:34;10980:2;10975:3;10971:12;10964:19;;10761:228;;;:::o;10995:375::-;;11158:67;11222:2;11217:3;11158:67;:::i;:::-;11151:74;;11255:34;11251:1;11246:3;11242:11;11235:55;11321:13;11316:2;11311:3;11307:12;11300:35;11361:2;11356:3;11352:12;11345:19;;11141:229;;;:::o;11376:382::-;;11539:67;11603:2;11598:3;11539:67;:::i;:::-;11532:74;;11636:34;11632:1;11627:3;11623:11;11616:55;11702:20;11697:2;11692:3;11688:12;11681:42;11749:2;11744:3;11740:12;11733:19;;11522:236;;;:::o;11764:370::-;;11927:67;11991:2;11986:3;11927:67;:::i;:::-;11920:74;;12024:34;12020:1;12015:3;12011:11;12004:55;12090:8;12085:2;12080:3;12076:12;12069:30;12125:2;12120:3;12116:12;12109:19;;11910:224;;;:::o;12140:326::-;;12303:67;12367:2;12362:3;12303:67;:::i;:::-;12296:74;;12400:30;12396:1;12391:3;12387:11;12380:51;12457:2;12452:3;12448:12;12441:19;;12286:180;;;:::o;12472:368::-;;12635:67;12699:2;12694:3;12635:67;:::i;:::-;12628:74;;12732:34;12728:1;12723:3;12719:11;12712:55;12798:6;12793:2;12788:3;12784:12;12777:28;12831:2;12826:3;12822:12;12815:19;;12618:222;;;:::o;12846:323::-;;13009:67;13073:2;13068:3;13009:67;:::i;:::-;13002:74;;13106:27;13102:1;13097:3;13093:11;13086:48;13160:2;13155:3;13151:12;13144:19;;12992:177;;;:::o;13175:376::-;;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13435:34;13431:1;13426:3;13422:11;13415:55;13501:14;13496:2;13491:3;13487:12;13480:36;13542:2;13537:3;13533:12;13526:19;;13321:230;;;:::o;13557:327::-;;13720:67;13784:2;13779:3;13720:67;:::i;:::-;13713:74;;13817:31;13813:1;13808:3;13804:11;13797:52;13875:2;13870:3;13866:12;13859:19;;13703:181;;;:::o;13890:388::-;;14053:67;14117:2;14112:3;14053:67;:::i;:::-;14046:74;;14150:34;14146:1;14141:3;14137:11;14130:55;14216:26;14211:2;14206:3;14202:12;14195:48;14269:2;14264:3;14260:12;14253:19;;14036:242;;;:::o;14284:374::-;;14447:67;14511:2;14506:3;14447:67;:::i;:::-;14440:74;;14544:34;14540:1;14535:3;14531:11;14524:55;14610:12;14605:2;14600:3;14596:12;14589:34;14649:2;14644:3;14640:12;14633:19;;14430:228;;;:::o;14664:373::-;;14827:67;14891:2;14886:3;14827:67;:::i;:::-;14820:74;;14924:34;14920:1;14915:3;14911:11;14904:55;14990:11;14985:2;14980:3;14976:12;14969:33;15028:2;15023:3;15019:12;15012:19;;14810:227;;;:::o;15043:330::-;;15206:67;15270:2;15265:3;15206:67;:::i;:::-;15199:74;;15303:34;15299:1;15294:3;15290:11;15283:55;15364:2;15359:3;15355:12;15348:19;;15189:184;;;:::o;15379:330::-;;15542:67;15606:2;15601:3;15542:67;:::i;:::-;15535:74;;15639:34;15635:1;15630:3;15626:11;15619:55;15700:2;15695:3;15691:12;15684:19;;15525:184;;;:::o;15715:376::-;;15878:67;15942:2;15937:3;15878:67;:::i;:::-;15871:74;;15975:34;15971:1;15966:3;15962:11;15955:55;16041:14;16036:2;16031:3;16027:12;16020:36;16082:2;16077:3;16073:12;16066:19;;15861:230;;;:::o;16097:330::-;;16260:67;16324:2;16319:3;16260:67;:::i;:::-;16253:74;;16357:34;16353:1;16348:3;16344:11;16337:55;16418:2;16413:3;16409:12;16402:19;;16243:184;;;:::o;16433:373::-;;16596:67;16660:2;16655:3;16596:67;:::i;:::-;16589:74;;16693:34;16689:1;16684:3;16680:11;16673:55;16759:11;16754:2;16749:3;16745:12;16738:33;16797:2;16792:3;16788:12;16781:19;;16579:227;;;:::o;16812:379::-;;16975:67;17039:2;17034:3;16975:67;:::i;:::-;16968:74;;17072:34;17068:1;17063:3;17059:11;17052:55;17138:17;17133:2;17128:3;17124:12;17117:39;17182:2;17177:3;17173:12;17166:19;;16958:233;;;:::o;17197:365::-;;17360:67;17424:2;17419:3;17360:67;:::i;:::-;17353:74;;17457:34;17453:1;17448:3;17444:11;17437:55;17523:3;17518:2;17513:3;17509:12;17502:25;17553:2;17548:3;17544:12;17537:19;;17343:219;;;:::o;17568:318::-;;17731:67;17795:2;17790:3;17731:67;:::i;:::-;17724:74;;17828:22;17824:1;17819:3;17815:11;17808:43;17877:2;17872:3;17868:12;17861:19;;17714:172;;;:::o;17892:374::-;;18055:67;18119:2;18114:3;18055:67;:::i;:::-;18048:74;;18152:34;18148:1;18143:3;18139:11;18132:55;18218:12;18213:2;18208:3;18204:12;18197:34;18257:2;18252:3;18248:12;18241:19;;18038:228;;;:::o;18272:381::-;;18435:67;18499:2;18494:3;18435:67;:::i;:::-;18428:74;;18532:34;18528:1;18523:3;18519:11;18512:55;18598:19;18593:2;18588:3;18584:12;18577:41;18644:2;18639:3;18635:12;18628:19;;18418:235;;;:::o;18659:376::-;;18822:67;18886:2;18881:3;18822:67;:::i;:::-;18815:74;;18919:34;18915:1;18910:3;18906:11;18899:55;18985:14;18980:2;18975:3;18971:12;18964:36;19026:2;19021:3;19017:12;19010:19;;18805:230;;;:::o;19041:367::-;;19204:67;19268:2;19263:3;19204:67;:::i;:::-;19197:74;;19301:34;19297:1;19292:3;19288:11;19281:55;19367:5;19362:2;19357:3;19353:12;19346:27;19399:2;19394:3;19390:12;19383:19;;19187:221;;;:::o;19414:330::-;;19577:67;19641:2;19636:3;19577:67;:::i;:::-;19570:74;;19674:34;19670:1;19665:3;19661:11;19654:55;19735:2;19730:3;19726:12;19719:19;;19560:184;;;:::o;19750:118::-;19837:24;19855:5;19837:24;:::i;:::-;19832:3;19825:37;19815:53;;:::o;19874:256::-;;20001:75;20072:3;20063:6;20001:75;:::i;:::-;20101:2;20096:3;20092:12;20085:19;;20121:3;20114:10;;19990:140;;;;:::o;20136:397::-;;20291:75;20362:3;20353:6;20291:75;:::i;:::-;20391:2;20386:3;20382:12;20375:19;;20404:75;20475:3;20466:6;20404:75;:::i;:::-;20504:2;20499:3;20495:12;20488:19;;20524:3;20517:10;;20280:253;;;;;:::o;20539:435::-;;20741:95;20832:3;20823:6;20741:95;:::i;:::-;20734:102;;20853:95;20944:3;20935:6;20853:95;:::i;:::-;20846:102;;20965:3;20958:10;;20723:251;;;;;:::o;20980:222::-;;21111:2;21100:9;21096:18;21088:26;;21124:71;21192:1;21181:9;21177:17;21168:6;21124:71;:::i;:::-;21078:124;;;;:::o;21208:640::-;;21441:3;21430:9;21426:19;21418:27;;21455:71;21523:1;21512:9;21508:17;21499:6;21455:71;:::i;:::-;21536:72;21604:2;21593:9;21589:18;21580:6;21536:72;:::i;:::-;21618;21686:2;21675:9;21671:18;21662:6;21618:72;:::i;:::-;21737:9;21731:4;21727:20;21722:2;21711:9;21707:18;21700:48;21765:76;21836:4;21827:6;21765:76;:::i;:::-;21757:84;;21408:440;;;;;;;:::o;21854:210::-;;21979:2;21968:9;21964:18;21956:26;;21992:65;22054:1;22043:9;22039:17;22030:6;21992:65;:::i;:::-;21946:118;;;;:::o;22070:313::-;;22221:2;22210:9;22206:18;22198:26;;22270:9;22264:4;22260:20;22256:1;22245:9;22241:17;22234:47;22298:78;22371:4;22362:6;22298:78;:::i;:::-;22290:86;;22188:195;;;;:::o;22389:419::-;;22593:2;22582:9;22578:18;22570:26;;22642:9;22636:4;22632:20;22628:1;22617:9;22613:17;22606:47;22670:131;22796:4;22670:131;:::i;:::-;22662:139;;22560:248;;;:::o;22814:419::-;;23018:2;23007:9;23003:18;22995:26;;23067:9;23061:4;23057:20;23053:1;23042:9;23038:17;23031:47;23095:131;23221:4;23095:131;:::i;:::-;23087:139;;22985:248;;;:::o;23239:419::-;;23443:2;23432:9;23428:18;23420:26;;23492:9;23486:4;23482:20;23478:1;23467:9;23463:17;23456:47;23520:131;23646:4;23520:131;:::i;:::-;23512:139;;23410:248;;;:::o;23664:419::-;;23868:2;23857:9;23853:18;23845:26;;23917:9;23911:4;23907:20;23903:1;23892:9;23888:17;23881:47;23945:131;24071:4;23945:131;:::i;:::-;23937:139;;23835:248;;;:::o;24089:419::-;;24293:2;24282:9;24278:18;24270:26;;24342:9;24336:4;24332:20;24328:1;24317:9;24313:17;24306:47;24370:131;24496:4;24370:131;:::i;:::-;24362:139;;24260:248;;;:::o;24514:419::-;;24718:2;24707:9;24703:18;24695:26;;24767:9;24761:4;24757:20;24753:1;24742:9;24738:17;24731:47;24795:131;24921:4;24795:131;:::i;:::-;24787:139;;24685:248;;;:::o;24939:419::-;;25143:2;25132:9;25128:18;25120:26;;25192:9;25186:4;25182:20;25178:1;25167:9;25163:17;25156:47;25220:131;25346:4;25220:131;:::i;:::-;25212:139;;25110:248;;;:::o;25364:419::-;;25568:2;25557:9;25553:18;25545:26;;25617:9;25611:4;25607:20;25603:1;25592:9;25588:17;25581:47;25645:131;25771:4;25645:131;:::i;:::-;25637:139;;25535:248;;;:::o;25789:419::-;;25993:2;25982:9;25978:18;25970:26;;26042:9;26036:4;26032:20;26028:1;26017:9;26013:17;26006:47;26070:131;26196:4;26070:131;:::i;:::-;26062:139;;25960:248;;;:::o;26214:419::-;;26418:2;26407:9;26403:18;26395:26;;26467:9;26461:4;26457:20;26453:1;26442:9;26438:17;26431:47;26495:131;26621:4;26495:131;:::i;:::-;26487:139;;26385:248;;;:::o;26639:419::-;;26843:2;26832:9;26828:18;26820:26;;26892:9;26886:4;26882:20;26878:1;26867:9;26863:17;26856:47;26920:131;27046:4;26920:131;:::i;:::-;26912:139;;26810:248;;;:::o;27064:419::-;;27268:2;27257:9;27253:18;27245:26;;27317:9;27311:4;27307:20;27303:1;27292:9;27288:17;27281:47;27345:131;27471:4;27345:131;:::i;:::-;27337:139;;27235:248;;;:::o;27489:419::-;;27693:2;27682:9;27678:18;27670:26;;27742:9;27736:4;27732:20;27728:1;27717:9;27713:17;27706:47;27770:131;27896:4;27770:131;:::i;:::-;27762:139;;27660:248;;;:::o;27914:419::-;;28118:2;28107:9;28103:18;28095:26;;28167:9;28161:4;28157:20;28153:1;28142:9;28138:17;28131:47;28195:131;28321:4;28195:131;:::i;:::-;28187:139;;28085:248;;;:::o;28339:419::-;;28543:2;28532:9;28528:18;28520:26;;28592:9;28586:4;28582:20;28578:1;28567:9;28563:17;28556:47;28620:131;28746:4;28620:131;:::i;:::-;28612:139;;28510:248;;;:::o;28764:419::-;;28968:2;28957:9;28953:18;28945:26;;29017:9;29011:4;29007:20;29003:1;28992:9;28988:17;28981:47;29045:131;29171:4;29045:131;:::i;:::-;29037:139;;28935:248;;;:::o;29189:419::-;;29393:2;29382:9;29378:18;29370:26;;29442:9;29436:4;29432:20;29428:1;29417:9;29413:17;29406:47;29470:131;29596:4;29470:131;:::i;:::-;29462:139;;29360:248;;;:::o;29614:419::-;;29818:2;29807:9;29803:18;29795:26;;29867:9;29861:4;29857:20;29853:1;29842:9;29838:17;29831:47;29895:131;30021:4;29895:131;:::i;:::-;29887:139;;29785:248;;;:::o;30039:419::-;;30243:2;30232:9;30228:18;30220:26;;30292:9;30286:4;30282:20;30278:1;30267:9;30263:17;30256:47;30320:131;30446:4;30320:131;:::i;:::-;30312:139;;30210:248;;;:::o;30464:419::-;;30668:2;30657:9;30653:18;30645:26;;30717:9;30711:4;30707:20;30703:1;30692:9;30688:17;30681:47;30745:131;30871:4;30745:131;:::i;:::-;30737:139;;30635:248;;;:::o;30889:419::-;;31093:2;31082:9;31078:18;31070:26;;31142:9;31136:4;31132:20;31128:1;31117:9;31113:17;31106:47;31170:131;31296:4;31170:131;:::i;:::-;31162:139;;31060:248;;;:::o;31314:419::-;;31518:2;31507:9;31503:18;31495:26;;31567:9;31561:4;31557:20;31553:1;31542:9;31538:17;31531:47;31595:131;31721:4;31595:131;:::i;:::-;31587:139;;31485:248;;;:::o;31739:419::-;;31943:2;31932:9;31928:18;31920:26;;31992:9;31986:4;31982:20;31978:1;31967:9;31963:17;31956:47;32020:131;32146:4;32020:131;:::i;:::-;32012:139;;31910:248;;;:::o;32164:419::-;;32368:2;32357:9;32353:18;32345:26;;32417:9;32411:4;32407:20;32403:1;32392:9;32388:17;32381:47;32445:131;32571:4;32445:131;:::i;:::-;32437:139;;32335:248;;;:::o;32589:419::-;;32793:2;32782:9;32778:18;32770:26;;32842:9;32836:4;32832:20;32828:1;32817:9;32813:17;32806:47;32870:131;32996:4;32870:131;:::i;:::-;32862:139;;32760:248;;;:::o;33014:419::-;;33218:2;33207:9;33203:18;33195:26;;33267:9;33261:4;33257:20;33253:1;33242:9;33238:17;33231:47;33295:131;33421:4;33295:131;:::i;:::-;33287:139;;33185:248;;;:::o;33439:419::-;;33643:2;33632:9;33628:18;33620:26;;33692:9;33686:4;33682:20;33678:1;33667:9;33663:17;33656:47;33720:131;33846:4;33720:131;:::i;:::-;33712:139;;33610:248;;;:::o;33864:419::-;;34068:2;34057:9;34053:18;34045:26;;34117:9;34111:4;34107:20;34103:1;34092:9;34088:17;34081:47;34145:131;34271:4;34145:131;:::i;:::-;34137:139;;34035:248;;;:::o;34289:419::-;;34493:2;34482:9;34478:18;34470:26;;34542:9;34536:4;34532:20;34528:1;34517:9;34513:17;34506:47;34570:131;34696:4;34570:131;:::i;:::-;34562:139;;34460:248;;;:::o;34714:222::-;;34845:2;34834:9;34830:18;34822:26;;34858:71;34926:1;34915:9;34911:17;34902:6;34858:71;:::i;:::-;34812:124;;;;:::o;34942:283::-;;35008:2;35002:9;34992:19;;35050:4;35042:6;35038:17;35157:6;35145:10;35142:22;35121:18;35109:10;35106:34;35103:62;35100:2;;;35168:18;;:::i;:::-;35100:2;35208:10;35204:2;35197:22;34982:243;;;;:::o;35231:331::-;;35382:18;35374:6;35371:30;35368:2;;;35404:18;;:::i;:::-;35368:2;35489:4;35485:9;35478:4;35470:6;35466:17;35462:33;35454:41;;35550:4;35544;35540:15;35532:23;;35297:265;;;:::o;35568:332::-;;35720:18;35712:6;35709:30;35706:2;;;35742:18;;:::i;:::-;35706:2;35827:4;35823:9;35816:4;35808:6;35804:17;35800:33;35792:41;;35888:4;35882;35878:15;35870:23;;35635:265;;;:::o;35906:98::-;;35991:5;35985:12;35975:22;;35964:40;;;:::o;36010:99::-;;36096:5;36090:12;36080:22;;36069:40;;;:::o;36115:168::-;;36232:6;36227:3;36220:19;36272:4;36267:3;36263:14;36248:29;;36210:73;;;;:::o;36289:169::-;;36407:6;36402:3;36395:19;36447:4;36442:3;36438:14;36423:29;;36385:73;;;;:::o;36464:148::-;;36603:3;36588:18;;36578:34;;;;:::o;36618:305::-;;36677:20;36695:1;36677:20;:::i;:::-;36672:25;;36711:20;36729:1;36711:20;:::i;:::-;36706:25;;36865:1;36797:66;36793:74;36790:1;36787:81;36784:2;;;36871:18;;:::i;:::-;36784:2;36915:1;36912;36908:9;36901:16;;36662:261;;;;:::o;36929:185::-;;36986:20;37004:1;36986:20;:::i;:::-;36981:25;;37020:20;37038:1;37020:20;:::i;:::-;37015:25;;37059:1;37049:2;;37064:18;;:::i;:::-;37049:2;37106:1;37103;37099:9;37094:14;;36971:143;;;;:::o;37120:191::-;;37180:20;37198:1;37180:20;:::i;:::-;37175:25;;37214:20;37232:1;37214:20;:::i;:::-;37209:25;;37253:1;37250;37247:8;37244:2;;;37258:18;;:::i;:::-;37244:2;37303:1;37300;37296:9;37288:17;;37165:146;;;;:::o;37317:96::-;;37383:24;37401:5;37383:24;:::i;:::-;37372:35;;37362:51;;;:::o;37419:90::-;;37496:5;37489:13;37482:21;37471:32;;37461:48;;;:::o;37515:77::-;;37581:5;37570:16;;37560:32;;;:::o;37598:149::-;;37674:66;37667:5;37663:78;37652:89;;37642:105;;;:::o;37753:126::-;;37830:42;37823:5;37819:54;37808:65;;37798:81;;;:::o;37885:77::-;;37951:5;37940:16;;37930:32;;;:::o;37968:154::-;38052:6;38047:3;38042;38029:30;38114:1;38105:6;38100:3;38096:16;38089:27;38019:103;;;:::o;38128:307::-;38196:1;38206:113;38220:6;38217:1;38214:13;38206:113;;;38305:1;38300:3;38296:11;38290:18;38286:1;38281:3;38277:11;38270:39;38242:2;38239:1;38235:10;38230:15;;38206:113;;;38337:6;38334:1;38331:13;38328:2;;;38417:1;38408:6;38403:3;38399:16;38392:27;38328:2;38177:258;;;;:::o;38441:320::-;;38522:1;38516:4;38512:12;38502:22;;38569:1;38563:4;38559:12;38590:18;38580:2;;38646:4;38638:6;38634:17;38624:27;;38580:2;38708;38700:6;38697:14;38677:18;38674:38;38671:2;;;38727:18;;:::i;:::-;38671:2;38492:269;;;;:::o;38767:233::-;;38829:24;38847:5;38829:24;:::i;:::-;38820:33;;38875:66;38868:5;38865:77;38862:2;;;38945:18;;:::i;:::-;38862:2;38992:1;38985:5;38981:13;38974:20;;38810:190;;;:::o;39006:100::-;;39074:26;39094:5;39074:26;:::i;:::-;39063:37;;39053:53;;;:::o;39112:79::-;;39180:5;39169:16;;39159:32;;;:::o;39197:94::-;;39265:20;39279:5;39265:20;:::i;:::-;39254:31;;39244:47;;;:::o;39297:176::-;;39346:20;39364:1;39346:20;:::i;:::-;39341:25;;39380:20;39398:1;39380:20;:::i;:::-;39375:25;;39419:1;39409:2;;39424:18;;:::i;:::-;39409:2;39465:1;39462;39458:9;39453:14;;39331:142;;;;:::o;39479:180::-;39527:77;39524:1;39517:88;39624:4;39621:1;39614:15;39648:4;39645:1;39638:15;39665:180;39713:77;39710:1;39703:88;39810:4;39807:1;39800:15;39834:4;39831:1;39824:15;39851:180;39899:77;39896:1;39889:88;39996:4;39993:1;39986:15;40020:4;40017:1;40010:15;40037:180;40085:77;40082:1;40075:88;40182:4;40179:1;40172:15;40206:4;40203:1;40196:15;40223:102;;40315:2;40311:7;40306:2;40299:5;40295:14;40291:28;40281:38;;40271:54;;;:::o;40331:94::-;;40412:5;40408:2;40404:14;40383:35;;40373:52;;;:::o;40431:122::-;40504:24;40522:5;40504:24;:::i;:::-;40497:5;40494:35;40484:2;;40543:1;40540;40533:12;40484:2;40474:79;:::o;40559:116::-;40629:21;40644:5;40629:21;:::i;:::-;40622:5;40619:32;40609:2;;40665:1;40662;40655:12;40609:2;40599:76;:::o;40681:122::-;40754:24;40772:5;40754:24;:::i;:::-;40747:5;40744:35;40734:2;;40793:1;40790;40783:12;40734:2;40724:79;:::o;40809:120::-;40881:23;40898:5;40881:23;:::i;:::-;40874:5;40871:34;40861:2;;40919:1;40916;40909:12;40861:2;40851:78;:::o;40935:122::-;41008:24;41026:5;41008:24;:::i;:::-;41001:5;40998:35;40988:2;;41047:1;41044;41037:12;40988:2;40978:79;:::o

Swarm Source

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